IMU校正以及姿态融合

本文为博主“声时刻”原创文章,未经博主允许不得转载。
联系方式:shenshikexmu@163.com

缘起
有缘在简极科技兼职两年。接触了IMU,我去的时候那家公司还是一个要把IMU放进足球的公司,祝愿简极越来越好。IMU校正算法大概是接触传感器三个月做出来的,博客IMU加速度、磁力计校正--椭球拟合的内容,那时只是把校准问题当作椭球拟合问题。融合算法大概是接触IMU一年做出来的,中途学习了kalman滤波。在安卓上的实时算法一年半完成,视频
IMUCalibration-Gesture换了一个更好的校正算法,滤波算法不变。愿和大家一起学习并讨论。有些朋友邮件上问我问题,真的给我很大的鼓励。
2021年4月,我自己的论文TII《Low-cost IMU Calibration with Nonlinear Scale Factors》

校正
这边有一篇讲IMU误差的很好的博客,直接引用了,IMU误差模型和校准。也是在《A Robust and Easy to implement method for imu calibration without External Equipments》框架下解释误差的。
这里写图片描述
图源于IMU误差模型和校准
加速度
参照ICRA2014论文:《A Robust and Easy to implement method for imu calibration without External Equipments》
说明
摘数据的部分我没有按照ICRA2014的算法写,而是自己写了FindFixData这样一个函数。ICRA2014的摘数据的算法我也拿matlab写了一遍,算方差实在是太花时间了(可能我的那个算法需要优化),FindFixData算法轻便一些,就是要人为的设置参数,ICRA2014不需要人为设置参数。摘出的稳定数据校正角速度参数和磁力计参数,摘出的运动的数据用来校正角速度传感器。
角速度
参照ICRA2014论文:《A Robust and Easy to implement method for im calibration without External Equipments》
磁力计
算法1:mag2acc_matrix,假设重力与磁向量的夹角不变。

算法2:Cal_mag4acc_frame,利用不同姿态下传感器感受的磁通向量的变化与姿态变化的相关性,计算参数。

说明
算法中的校正传感器为MPU9250,这个传感器的加速度坐标系与磁力计坐标系的z轴反向。在校正时,把变换矩阵的 T 33 T_{33} T33位置设为-1,如果其他传感器z轴相同, T 33 T_{33} T33设为1.

这里写图片描述
MPU9250
T m 2 a = [ T 11 T 12 T 13 T 21 T 22 T 23 T 31 T 32 − 1 ] Tm2a=\begin{bmatrix} T_{11} & T_{12} &T_{13} \\T_{21} & T_{22}&T_{23} \\T_{31} &T_{32}&-1\end{bmatrix} Tm2a=T11T21T31T12T22T32T13T231

其他,是1还是-1,这个要看传感器资料了 。
T m 2 a = [ T 11 T 12 T 13 T 21 T 22 T 23 T 31 T 32 1 ] Tm2a=\begin{bmatrix}T_{11} & T_{12} &T_{13} \\T_{21} & T_{22}&T_{23} \\T_{31} &T_{32}&1\end{bmatrix} Tm2a=T11T21T31T12T22T32T13T231
参数
c a l a c c = T a ∗ K a ∗ ( r a w a c c + B a ) cal_{acc}=Ta*Ka*(raw_{acc}+Ba) calacc=TaKa(rawacc+Ba)
c a l g y r o = T g ∗ K g ∗ ( r a w g y r o + B g ) cal_{gyro}=Tg*Kg*(raw_{gyro}+Bg) calgyro=TgKg(rawgyro+Bg)
c a l m a g = T m 2 a ∗ ( r a w m a g + B m ) cal_{mag}=Tm2a*(raw_{mag}+Bm) calmag=Tm2a(rawmag+Bm)

LM算法

增加了我自己写的Levenberg-Marquardt算法,matlab自带的lsqnonlin函数被注释,可以选择注释我手写的LM算法,选择取消注释lsqnonlin函数。

姿态
Mahony filter
参考 《Nonlinear Complementery Filters on the Special Orthogonal Group》
受启发于 http://blog.csdn.net/luoshi006/article/details/51513580
EKF
参考 《A Double-Stage Kalman Filter for Orientation Tracking with an Integrated Processor in 9-D IMU》

High Low pass
Gyro进行高通滤波器,Accelerate & Magnetic进行低通滤波。

滤波结果
滤波结果
校正与融合

imuCalibration-Gesture

开源代码
具体请参考github开源代码:IMUCalibration-Gesture.

如果您觉得此文对您所要做的工作有帮助,欢迎在github上标星星。

欢迎在“知识星球”更深入地探讨问题。

知识星球


  • 99
    点赞
  • 554
    收藏
    觉得还不错? 一键收藏
  • 231
    评论
在Matlab中进行IMU里程计数据融合通常涉及以下步骤: 1. 数据预处理:首先,你需要对IMU传感器数据进行预处理,包括去除噪声、校准传感器偏差和误差等。这可以通过使用滤波器(例如卡尔曼滤波器)和传感器校准算法来实现。 2. 姿态估计:使用预处理的IMU数据来估计车辆的姿态(如欧拉角或四元数)。常用的方法包括互补滤波器、扩展卡尔曼滤波器等。 3. 运动集成:通过对估计的姿态进行运动集成,可以得到车辆的位移和速度信息。这可以通过积分加速度计数据来计算。 4. 修正和校正:使用其他传感器(如GPS、激光雷达等)来修正和校正IMU数据的误差。这通常涉及到姿态对齐、位置校正等步骤。 以下是一个简单示例,展示了如何使用卡尔曼滤波器进行IMU里程计数据融合: ```matlab % 初始化卡尔曼滤波器参数 dt = 0.01; % 采样时间间隔 A = [1 dt; 0 1]; % 状态转移矩阵 B = [dt^2/2; dt]; % 输入矩阵 C = [1 0]; % 观测矩阵 Q = eye(2); % 状态噪声协方差矩阵 R = 1; % 观测噪声协方差 % 初始化状态向量和协方差矩阵 x = [0; 0]; % 初始状态向量 P = eye(2); % 初始协方差矩阵 % 读取IMU数据(加速度计和陀螺仪) % 加速度计数据存储在accel_data变量中 % 陀螺仪数据存储在gyro_data变量中 % 数据融合 for i = 1:length(accel_data) % 预测步骤 x = A * x + B * accel_data(i); P = A * P * A' + Q; % 更新步骤 K = P * C' / (C * P * C' + R); x = x + K * (gyro_data(i) - C * x); P = (eye(2) - K * C) * P; % 存储融合后的数据(位置和速度) position(i) = x(1); velocity(i) = x(2); end % 可视化结果 t = dt * (1:length(accel_data)); figure; subplot(2,1,1); plot(t, position); xlabel('Time'); ylabel('Position'); subplot(2,1,2); plot(t, velocity); xlabel('Time'); ylabel('Velocity'); ``` 这只是一个简单的示例,实际的IMU里程计数据融合可能需要更复杂的算法和步骤。你可以根据你的应用需求对代码进行修改和扩展。
评论 231
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值