IMU数学模型详细推导

1|0旋转运动学

质量块在body坐标系下的坐标为:
在这里插入图片描述
body坐标系为imu坐标系 惯性系为世界坐标系
只考虑旋转 旋转到惯性系下:
在这里插入图片描述
对时间求导 如下:
在这里插入图片描述
其中
在这里插入图片描述
R的求导 有如下推导:
在这里插入图片描述
其中[wb]×=w
[wb]×r=wb×r
对坐标求二阶导 得出:
在这里插入图片描述
其中R˙ibwb=Rib[wb]×wb=Ribwb×wb=0 自身和自身的叉乘为零

2|0imu测量模型

imu中包含两种测量模型:加速度计和陀螺仪
加速度计用来测量加速度的大小 陀螺仪用来测量角速度的大小

2|1加速度计

这里用弹簧模型理解 实际中会使用电容器
在这里插入图片描述
加速度的坐标系通常为东北天坐标系:

g=(0,0,9.81)T

在这里插入图片描述
静止时 加速度计测得加速度为0 重力加速度为g
自由落体时 加速度计测得加速度为g 重力加速度为0
加速度计不需要考虑科氏力的影响 因为在某一时刻科氏力会等于0 达到平衡状态

2|2陀螺仪

在这里插入图片描述
测量 a 和 v 可以求出 w
但是会受到科氏力的影响 所以会采用音叉陀螺 将科氏力抵消掉
在这里插入图片描述

3|0误差模型

IMU误差分为确定性误差和随机误差

3|1确定性误差

确定性误差主要分为:bias和scale
bias即经常说的零偏:理论上没有外力作用时 IMU的传感器输出应为0 但实际上会出现一个偏置bias
scale可以看成实际数据与传感器输出数据之间的一个比值
以及还有xyz轴不重合的误差
在这里插入图片描述
常使用六面法标定加速度计和陀螺仪 不过多介绍

3|2随机误差(重点)

随机误差分为高斯白噪声和bias随机游走

1|0连续时间上的随机误差

1|0高斯白噪声:

在这里插入图片描述
狄拉克函数:当t1=t2时为1 其他时刻均为0 说明了每段时间的独立性

1|0bias随机游走:

在这里插入图片描述
我们认为它的导数为高斯白噪声 w为方差为1均值为0的白噪声

1|0离散时间上的随机误差

一个单轴角速度受到高斯白噪声和bias的影响:
在这里插入图片描述
当传感器采集信号时 认为采样时间段内信息为常数在这里插入图片描述
我们无法确定随机误差的积分是否为常数 所以单独对这两种随机误差进行分别积分:

1|0高斯白噪声:

在这里插入图片描述
高斯白噪声的方差(这里为什么要平方? 因为这就是方差的定义 详见《矩阵分析与应用》)
在这里插入图片描述
我们认为:

在这里插入图片描述
其中:
在这里插入图片描述
可以得出结论:对比高斯白噪声的连续时间和离散时间的nd[k],高斯白噪声的连续时间和离散时间相差一个1Δt 其中Δt为传感器的采集时间(1/HZ)

1|0bias随机游走:

bias积分部分:
在这里插入图片描述
协方差为:
在这里插入图片描述
在这里插入图片描述
上面都不重要
结果:
在这里插入图片描述
其中:
在这里插入图片描述
得出结论:同样这里对比的是bd[k] bias随机游走的噪声方差从连续时间到离散时间需要乘以一个Δt
实际操作时 我们会使用kalibr_allan对imu进行标定 算出高斯白噪声误差和bias随机游走误差(即σ
使用ROS 生成imu数据包 再使用kalibr_allan将数据包转换为mat文件 再输入进kalibr_allan

4|0IMU模型

在这里插入图片描述
其中b为bias随机游走误差 n为高斯白噪声
wb为理想值 w~b为测量值 a同理

5|0运动模型的离散积分

5|1欧拉法

在这里插入图片描述
其中
在这里插入图片描述
对应到代码:

//delta_q = [1 , 1/2 * thetax , 1/2 * theta_y, 1/2 * theta_z] Eigen::Quaterniond dq; Eigen::Vector3d dtheta_half = imupose.imu_gyro * dt /2.0; dq.w() = 1; dq.x() = dtheta_half.x(); dq.y() = dtheta_half.y(); dq.z() = dtheta_half.z(); dq.normalize(); /// imu 动力学模型 欧拉积分 Eigen::Vector3d acc_w = Qwb * (imupose.imu_acc) + gw; // aw = Rwb * ( acc_body - acc_bias ) + gw Qwb = Qwb * dq; Pwb = Pwb + Vw * dt + 0.5 * dt * dt * acc_w; Vw = Vw + acc_w * dt;

5|2中值法

在这里插入图片描述
其中
在这里插入图片描述
对应到代码:

//delta_q = [1 , 1/2 * thetax , 1/2 * theta_y, 1/2 * theta_z] Eigen::Quaterniond dq; Eigen::Vector3d dtheta_half = (imupose.imu_gyro + imudata[i - 1].imu_gyro)/2.0 * dt /2.0; dq.w() = 1; dq.x() = dtheta_half.x(); dq.y() = dtheta_half.y(); dq.z() = dtheta_half.z(); dq.normalize(); /// 中值积分 Eigen::Vector3d acc_w = (Qwb * dq * imupose.imu_acc + gw + Qwb * imudata[i - 1].imu_acc + gw)/2.0; Qwb = Qwb * dq; Pwb = Pwb + Vw * dt + 0.5 * dt * dt * acc_w; Vw = Vw + acc_w * dt;

__EOF__

本文作者铃灵狗的水墨书香
本文链接https://www.cnblogs.com/linglingdog/p/15936721.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   铃灵狗  阅读(1338)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示