1. 为什么我们需要误差卡尔曼滤波器(ESKF)?
如果你玩过无人机或者研究过机器人导航,肯定对IMU(惯性测量单元)不陌生。这玩意儿能提供角速度和加速度数据,理论上积分一下就能知道自己的位置、姿态和速度。但实际操作过的人都知道,纯靠IMU积分,不出几秒钟,轨迹就飘到姥姥家去了。这背后的罪魁祸首,就是IMU无法避免的零偏和噪声。
传统的做法是用卡尔曼滤波器(KF)或者扩展卡尔曼滤波器(EKF)来融合IMU和其他传感器(比如GPS、视觉)的数据,得到一个更靠谱的状态估计。但这里有个老大难问题:状态变量里的旋转,用啥来表示?用欧拉角?有万向节死锁。用旋转矩阵?9个参数,冗余又麻烦。用四元数?4个参数,但更新时得保证单位约束,线性化也不方便。
这时候,误差卡尔曼滤波器(Error State Kalman Filter, ESKF)就闪亮登场了。我第一次在项目里用ESKF替换掉传统的EKF时,感觉就像给算法换上了一双更合脚的鞋——不仅跑得更稳,代码也清爽多了。它的核心思想特别巧妙:我们不直接估计完整的状态(名义状态),而是去估计这个状态的误差部分(误差状态)。
想象一下,名义状态就像你手机上的导航地图,它根据IMU数据快速但粗糙地更新你的位置。而这个“粗糙”带来的偏差和错误,被单独拎出来,作为一个“小量”放在ESKF里进行精细估计和修正。因为误差总是很小的,所以很多复杂的数学关系在小量假设下变得极其简单,甚至可以直接用单位矩阵近似,计算量一下子就降下来了。更重要的是,对于旋转,我们可以用最小的3维向量(旋转向量)来表达这个误差,完美避开了四元数的约束和奇异性问题。这种“大状态粗推,小误差精修”的两级策略,正是ESKF在自动驾驶、机器人定位领域备受青睐的原因。
2. 拆解ESKF:名义状态、误差状态与完整流程
要搞懂ESKF,得先分清它舞台上的两个主角:名义状态(Nominal State) 和 误差状态(Error State)。
名义状态 x 就是我们最关心的那些量:位置 p、速度 v、旋转 R(用旋转矩阵表示)、陀螺仪零偏 b_g、加速度计零偏 b_a,有时还会把重力向量 g 也放进去。它的更新非常“豪放”,直接使用IMU的原始测量值进行积分,完全忽略噪声。所以它的轨迹漂得很快,但计算也很快,可以看作一个“开环”的预测。
误差状态 δx 则是名义状态的“影子”,它包含了名义状态与真实状态之间的所有微小偏差:位置误差 δp、速度误差 δv、姿态误差 δθ(一个3维旋转向量),以及各种零偏的误差 δb_g, δb_a 和重力误差 δg。这个误差状态被我们放在一个卡尔曼滤波器的框架里进行估计,它会严格地考虑IMU的噪声模型,并且接受其他传感器观测的修正。
整个ESKF的运作流程,就像一个高效的流水线,我习惯用下面这几个步骤来理解:
- IMU预测(名义状态积分):新的IMU数据来了,直接积分到名义状态
x里。这一步很快,但结果会因噪声和零偏而逐渐偏离真实。 - 误差状态预测:在ESKF内部,我们根据误差状态的运动学方程,预测误差状态
δx和它的不确定性(协方差矩阵P)会如何随时间演变。注意,此时误差状态的均值通常被设为零(因为我们认为名义状态就是最好的猜测,误差为零)。 - 外部观测更新:当GPS、视觉里程计等其他传感器提供观测数据
z时,我们用它来修正误差状态。计算观测z与基于当前名义状态

在IMU状态估计中的高效实现与优化&spm=1001.2101.3001.5002&articleId=154475732&d=1&t=3&u=7208c7b5edf6436592b27edd32aaf280)
2632

被折叠的 条评论
为什么被折叠?



