【使用卡尔曼滤波器将陀螺仪和加速度计的读数融合,以获取IMU的姿态(四元数)】实现了所谓的“零速度更新”算法,用于行人跟踪(步态跟踪)(Matlab代码实现)

简介: 【使用卡尔曼滤波器将陀螺仪和加速度计的读数融合,以获取IMU的姿态(四元数)】实现了所谓的“零速度更新”算法,用于行人跟踪(步态跟踪)(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

⛳️赠与读者

👨‍💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。当哲学课上老师问你什么是科学,什么是电的时候,不要觉得这些问题搞笑。哲学是科学之母,哲学就是追究终极问题,寻找那些不言自明只有小孩子会问的但是你却回答不出来的问题。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能让人胸中升起一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它居然给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。

    或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎

💥1 概述

使用卡尔曼滤波器融合陀螺仪和加速度计数据实现零速度更新的IMU姿态估计与行人跟踪研究

摘要

本研究提出了一种基于卡尔曼滤波器融合陀螺仪和加速度计数据以获取IMU(惯性测量单元)姿态(四元数表示)的方法,并结合零速度更新(ZUPT)算法,实现了高精度的行人跟踪(步态跟踪)。实验结果表明,该方法能有效抑制误差累积,提高姿态和位置估计的准确性,为室内定位、运动分析等领域的应用提供了可靠的技术支持。

1. 引言

行人跟踪在室内定位、虚拟现实、运动健康监测等领域具有广泛的应用需求。IMU作为常用的传感器,包含陀螺仪和加速度计,能够实时获取行人的运动信息。然而,陀螺仪存在漂移误差,加速度计易受噪声和运动干扰,单一传感器难以提供准确、稳定的姿态和位置信息。因此,融合陀螺仪和加速度计数据,并结合零速度更新算法,成为提高行人跟踪精度的关键。

2. 系统模型与方法

2.1 卡尔曼滤波器原理

卡尔曼滤波器是一种最优估计算法,能够有效地融合来自不同传感器的数据,并根据噪声特性进行最优估计。在IMU姿态估计中,卡尔曼滤波器通过预测和更新两个步骤,不断修正姿态估计值。

  • 预测步骤:根据上一时刻的状态估计值和系统模型,预测当前时刻的状态估计值及其协方差矩阵。
  • 更新步骤:结合当前时刻的传感器测量值,修正预测值,得到最终的状态估计值。

2.2 系统状态定义

系统状态通常选择为四元数,表示物体的姿态。四元数具有简洁性和不易产生奇点的优点,适合表示三维旋转。系统状态向量定义为:

image.gif 编辑

2.3 状态方程

状态方程描述了系统状态随时间的变化,考虑了陀螺仪的测量值和过程噪声。由于陀螺仪测量的是角速度,需要将其积分才能得到姿态变化。常用的积分方法包括一阶积分和四元数积分。四元数积分可以更好地处理较大的角速度变化,避免出现奇点问题。因此,状态方程可以表示为:

image.gif 编辑

2.4 测量方程

测量方程描述了传感器测量值与系统状态之间的关系。在IMU姿态估计中,测量方程包含加速度计的测量值。加速度计测量的是物体在三维空间中的线性加速度,可用于检测行人的运动状态和重力加速度方向。通过加速度计测量值与重力加速度方向的对比,可以修正姿态估计值。

2.5 零速度更新(ZUPT)算法

在行人行走过程中,当足部与地面接触时,可近似认为该时刻足部的速度为零,即零速度时刻。零速度检测是零速度更新算法的关键步骤,常用的检测方法包括基于加速度计和压力传感器的方法。

  • 基于加速度计的方法:通过分析加速度计数据的特征,如加速度的幅值、方差等,判断足部是否处于静止状态。当加速度计测量的加速度在某一时间段内幅值较小且方差稳定时,可认为处于零速度时刻。
  • 结合压力传感器的方法:当压力传感器检测到足部与地面接触且压力达到一定阈值时,辅助确定零速度时刻,提高检测的准确性。

在零速度时刻,利用卡尔曼滤波器对系统状态进行修正,抑制误差累积。具体实现时,可以将零速度时刻的测量值设为零速度向量,通过测量更新步骤修正姿态估计值。

3. 实验与结果分析

3.1 实验设置

为了验证所提方法的有效性,进行了行人步态跟踪实验。实验中,行人佩戴IMU传感器,行走在室内环境中。IMU传感器同时采集陀螺仪和加速度计数据,采样频率为100Hz。

3.2 实验结果

实验结果表明,基于卡尔曼滤波器融合陀螺仪和加速度计数据,并结合零速度更新算法的方法,能有效提高行人姿态和位置估计的准确性。与单一传感器方法相比,该方法在姿态估计精度、位置估计精度和实时性等方面均表现出显著优势。

  • 姿态估计精度:通过四元数表示的姿态估计值与真实值之间的误差明显减小,特别是在长时间行走过程中,误差累积得到有效抑制。
  • 位置估计精度:结合零速度更新算法后,位置估计的漂移现象得到显著改善,能够满足室内定位等应用场景的需求。
  • 实时性:卡尔曼滤波器的计算效率较高,能够满足实时性要求,适用于实际应用场景。

3.3 与其他方法的比较

与传统的松耦合和紧耦合多传感器融合方法相比,本研究提出的方法在计算复杂度和融合精度之间取得了良好的平衡。松耦合方法虽然计算简单,但融合精度较低;紧耦合方法虽然融合精度高,但计算复杂度较大,对计算平台要求较高。本研究提出的方法通过合理的系统建模和参数选择,实现了高精度的姿态估计,同时保持了较低的计算复杂度。

4. 讨论与展望

4.1 局限性

尽管本研究提出的方法在行人步态跟踪中取得了良好效果,但仍存在一些局限性:

  • 噪声分布假设:卡尔曼滤波器假设系统噪声服从高斯分布,而在实际应用中,噪声的分布可能并非严格的高斯分布,这可能影响滤波器的性能。
  • 计算效率:在高采样率下,卡尔曼滤波器的计算量相对较大,需要考虑计算效率问题。
  • 传感器标定:IMU姿态估计的精度受传感器本身的精度和安装精度影响,需要进行精确的传感器标定。

4.2 未来研究方向

针对上述局限性,未来的研究可以从以下几个方面展开:

  • 非线性滤波算法:探索非线性滤波算法,如扩展卡尔曼滤波(EKF)、无迹卡尔曼滤波(UKF)等,以适应非线性系统,提高融合精度。
  • 多传感器融合技术:融合更多传感器数据,如磁力计、气压计等,提升行人跟踪系统的性能。
  • 算法优化与部署:研究算法在实际应用场景中的部署和优化,推动其在商业产品中的广泛应用。
  • 鲁棒步态特征提取:研究更鲁棒的步态特征提取方法,提高行人识别和步态分析的准确性。

📚2 运行结果

EKF IMU Fusion Algorithms

orien.m 使用卡尔曼滤波器将陀螺仪和加速度计的读数融合,以获取IMU的姿态(四元数)。

zupt.m 实现了所谓的“零速度更新”算法,用于行人跟踪(步态跟踪),它也是一个扩展卡尔曼滤波器。

“零速度更新”算法是一种常用于惯性测量单元(IMU)姿态估计的技术,特别是在行人跟踪和步态跟踪等领域。这种算法利用了在特定条件下(通常是在步行过程中)传感器读数的特性。

在实现“零速度更新”算法时,通常会结合卡尔曼滤波器,将陀螺仪和加速度计的读数融合,以估计设备的姿态,通常以四元数的形式表示。

image.gif 编辑

image.gif 编辑

image.gif 编辑

image.gif 编辑

image.gif 编辑

image.gif 编辑

部分代码:

% Propagate the state and covariance

   x = F * x;

   x = x / norm(x);    % Normalize the quaternion

   P = F * P * F' + Q;

   

   

   %--- 2. Update----------------------------------

   % Accelerometer measurements

   a = imu_data(k, 5:7);

   a = a - bias_a;

       

   % We use the unit vector of acceleration as observation

   ea = a' / norm(a);

   ea_prediction = [2*(x(2)*x(4)-x(1)*x(3)); ...

                    2*(x(3)*x(4)+x(1)*x(2)); ...

                    x(1)^2-x(2)^2-x(3)^2+x(4)^2];

   

   % Residual

   y = ea - ea_prediction;

   

   % Compute the measurement matrix H

   H = 2*[-x(3)    x(4)    -x(1)   x(2); ...

           x(2)    x(1)     x(4)   x(3); ...

           x(1)   -x(2)    -x(3)   x(4)];

       

   % Measurement noise R

   R_internal = (noise_accel / norm(a))^2 * eye(3);

   R_external = (1-gravity/norm(a))^2 * eye(3);

   R = R_internal + R_external;

   

   % Update

   S = H * P * H' + R;

   K = P * H' / S;

   x = x + K * y;

   P = (eye(4) - K * H) * P;

   

   

   % 3. Ending

   x = x / norm(x);    % Normalize the quaternion

   P = (P + P') / 2;   % Make sure that covariance matrix is symmetric

   allX(k,:) = x';     % Save the result

   

end

%--- Compare the results with ground truth

q_Ws0 = quatinv(grt_q(1,:));

for i=1:N

   grt_q(i,:) = quatmultiply(q_Ws0, grt_q(i,:));

   allX(i,:) = quatmultiply(q_Ws0, allX(i,:));

end

[psi, theta, phi] = quat2angle(allX);

[grt_psi, grt_theta, grt_phi] = quat2angle(grt_q);

figure, hold on

plot(1:N, psi,   'r-.', 1:N, grt_psi,   'r');

plot(1:N, theta, 'g-.', 1:N, grt_theta, 'g');

plot(1:N, phi,   'b-.', 1:N, grt_phi,   'b');

🎉3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

[1]贾浩男.室内行人自主定位算法的研究与实现[D].哈尔滨工程大学,2017.DOI:CNKI:CDMD:2.1018.082519.

[2]林连秀.融合IMU的移动机器人SLAM系统研究与实现[J].福州大学, 2017.

[3]丛明,温旭,王明昊,等.基于迭代卡尔曼滤波器的GPS-激光-IMU融合建图算法[J].华南理工大学学报(自然科学版), 2024

相关文章
|
9天前
|
存储 算法 调度
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
107 26
|
9天前
|
存储 编解码 算法
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
|
6天前
|
机器学习/深度学习 人工智能 搜索推荐
从零构建短视频推荐系统:双塔算法架构解析与代码实现
短视频推荐看似“读心”,实则依赖双塔推荐系统:用户塔与物品塔分别将行为与内容编码为向量,通过相似度匹配实现精准推送。本文解析其架构原理、技术实现与工程挑战,揭秘抖音等平台如何用AI抓住你的注意力。
126 6
从零构建短视频推荐系统:双塔算法架构解析与代码实现
|
9天前
|
机器学习/深度学习 传感器 算法
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
91 14
|
9天前
|
机器学习/深度学习 运维 算法
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
|
10天前
|
算法 计算机视觉
【MPDR & SMI】失配广义夹角随输入信噪比变化趋势、输出信干噪比随输入信噪比变化趋势研究(Matlab代码实现)
【MPDR & SMI】失配广义夹角随输入信噪比变化趋势、输出信干噪比随输入信噪比变化趋势研究(Matlab代码实现)
|
10天前
|
编解码 人工智能 算法
【采用BPSK或GMSK的Turbo码】MSK、GMSK调制二比特差分解调、turbo+BPSK、turbo+GMSK研究(Matlab代码实现)
【采用BPSK或GMSK的Turbo码】MSK、GMSK调制二比特差分解调、turbo+BPSK、turbo+GMSK研究(Matlab代码实现)
|
10天前
|
机器学习/深度学习 编解码 并行计算
【改进引导滤波器】各向异性引导滤波器,利用加权平均来实现最大扩散,同时保持图像中的强边缘,实现强各向异性滤波,同时保持原始引导滤波器的低低计算成本(Matlab代码实现)
【改进引导滤波器】各向异性引导滤波器,利用加权平均来实现最大扩散,同时保持图像中的强边缘,实现强各向异性滤波,同时保持原始引导滤波器的低低计算成本(Matlab代码实现)
|
10天前
|
机器学习/深度学习 传感器 边缘计算
【故障诊断】基于时滞反馈随机共振的增强型旋转电机故障诊断(Matlab代码实现)
【故障诊断】基于时滞反馈随机共振的增强型旋转电机故障诊断(Matlab代码实现)
|
10天前
|
传感器 机器学习/深度学习 算法
【UASNs、AUV】无人机自主水下传感网络中遗传算法的路径规划问题研究(Matlab代码实现)
【UASNs、AUV】无人机自主水下传感网络中遗传算法的路径规划问题研究(Matlab代码实现)

热门文章

最新文章