介绍
rednose 项目中描述的卡尔曼滤波框架是一种非常强大的优化工具,尤其适用于视觉里程计、传感器融合定位或建图(SLAM)。这个框架旨在提供非常准确的结果,无论是在线还是离线工作都能保持相当高的计算效率。此外,它在Python中设计滤波器也相当简便。
功能概览
使用符号雅可比矩阵计算的扩展卡尔曼滤波器
大多数动态系统可以被描述为隐马尔科夫过程。而为了用嘈杂的测量数据估计这样一个系统的状态,可以使用递归贝叶斯估计器。对于线性马尔科夫过程,普通线性卡尔曼滤波器是最优的。然而,很多系统是非线性的。扩展卡尔曼滤波器通过在每一步对非线性系统进行线性化建模,为大多数应用提供接近最优的估计器。传统上,扩展卡尔曼滤波器通过书写系统的动态方程然后手动计算用于线性化的雅可比矩阵,这对复杂系统来说非常耗费时间且容易出现计算错误。这个库利用sympy符号计算雅可比矩阵,简化了系统的定义并消除了计算错误的可能性。
错误状态卡尔曼滤波器
3D定位算法通常还需要估计物体在3D空间中的方向。方向通常由欧拉角或四元数表示。欧拉角有多个问题,存在表示同一方向的多途方式,万向节锁会导致自由度的丢失,并且在误差较大时其行为非常非线性。严格正维度的四元数不存在这些问题,但四元数还有其他问题。四元数需要被归一化,否则它们会无限增长,但这无法在卡尔曼滤波器中清楚地强制执行。重要的是,四元数有四个维度,但只表示三个自由度,因此存在一个冗余维度。
卡尔曼滤波器旨在最小化系统状态的误差。可以有一个用于状态和状态误差在不同空间中表示的卡尔曼滤波器,只要有一个误差函数可以根据真实状态和估计的状态计算误差。在卡尔曼滤波器的误差中有冗余维度是有问题的,但在状态中不是。因此,一个很好的折中方案是使用四元数表示系统的姿态状态,并使用欧拉角描述姿态误差。这个库支持在不同于状态的空间中定义任意误差。
多状态约束卡尔曼滤波器
如何将基于特征的视觉里程计与卡尔曼滤波器集成?问题在于无法为图像空间中的2D特征观测编写一个本地化卡尔曼滤波器的观测方程。需要给特征观测提供一个深度以确保它具有3D位置,然后就可以在卡尔曼滤波器中编写一个观测方程。通过跟踪特征跨帧并估计深度可以做到这一点。然而解决方案并不简单,深度通过跟踪跨帧特征估计取决于这些帧中相机的位置,从而影响卡尔曼滤波器的状态。这导致了一个正反馈回路,卡尔曼滤波器错误地对其位置产生信心,因为特征位置更新强化了它。
解决方案是使用多状态约束卡尔曼滤波器(MSCKF),这个库完全支持这一功能。
Rauch–Tung–Striebel 平滑
在使用卡尔曼滤波器进行离线估计时,可能会出现状态估计不佳的初始化期。全局估计器没有这种困扰,为了让我们的卡尔曼滤波器与全局优化器竞争,我们可以使用RTS平滑器倒退运行滤波器。这些与可能的多次前向和后向数据遍历相结合,应使性能非常接近全局优化。
马氏距离离群点拒绝器
许多测量数据不来源于高斯分布,因此存在不符合卡尔曼滤波器统计模型的离群点。如果不加以处理,这会导致很多性能问题。这个库允许对输入测量使用马氏距离统计检验来处理这一问题。需要注意的是良好的初始化对于防止好的测量被拒绝至关重要。