2n_UKF:无迹卡尔曼滤波标准实现教程
项目介绍
本项目提供了一个面向 MATLAB 初学者的标准无迹卡尔曼滤波(Unscented Kalman Filter, UKF)算法实现。通过一个典型的非线性目标跟踪场景,展示了如何利用无迹变换(Unscented Transform)来处理非线性状态转移和观测问题。相比于传统的扩展卡尔曼滤波(EKF),本实现通过捕获高斯分布的均值和协方差信息,能够有效规避雅可比矩阵计算的复杂性,并在处理高非线性系统时提供更高的估计精度和更好的稳定性。
功能特性
- 标准无迹变换(UT):实现了经典的权重计算方法,支持通过 alpha、kappa 和 beta 参数调节 sigma 点的分布。
- 模块化预测与更新:将算法严谨地划分为 sigma 点生成、状态预测、协方差传播、观测更新等核心步骤。
- 非线性模型支持:内置恒速运动(CV)模型作为状态转移函数,并配套极坐标下的距离与方位角观测模型。
- 全流程仿真框架:包含了从真实轨迹生成、含噪声观测值模拟到滤波器状态估计的完整闭环流程。
- 科学可视化:提供多维度的结果分析图表,涵盖轨迹对比、误差分布、收敛性分析以及原始数据比对。
系统要求
- 软件环境:MATLAB R2016a 或更高版本。
- 工具箱需求:无需特殊工具箱,代码基于标准 MATLAB 矩阵运算编写。
实现逻辑与算法细节
#### 1. 初始化阶段
程序首先定义仿真基础参数,采样间隔设为 0.1s,总仿真步数为 500 步。
- 状态模型:定义为 4 维空间,包含 X 轴位置、X 轴速度、Y 轴位置、Y 轴速度。
- 观测模型:定义为 2 维空间,包含传感器到目标的距离以及目标相对于传感器的方位角。
- 缩放参数:
* alpha (1e-3):控制 sigma 点的散布。
* kappa (0):辅助缩放参数。
* beta (2):用于引入状态分布的先验信息。
* lambda:综合缩放因子,用于均衡权重分布。
#### 2. 权重计算
根据标准 UKF 公式计算两组权重:
- 均值权重 (w_m):用于计算预测状态和预测观测的均值。
- 协方差权重 (w_c):用于计算预测协方差、观测协方差及互协方差,其中第一个点的权重包含了针对高斯分布的校正项。
#### 3. 递归滤波循环
每一采样时刻,滤波器执行以下核心逻辑:
- Sigma 点生成:利用 Cholesky 分解计算协方差矩阵的平方根,在当前估计值周围产生 2L+1 个 sigma 点(L 为状态维度)。
- 状态预测:将这些点通过非线性状态方程(恒速运动模型)进行传递,通过加权求和得到预测均值,并累加过程噪声 Q 得到预测协方差。
- 重新采样与观测映射:为了提高精度,代码在预测步骤后重新对预测协方差进行采样,产生新的 sigma 点,并将其通过非线性观测方程转换到观测空间(极坐标)。
- 增益与修正:
* 计算观测协方差 Pzz(包含观测噪声 R)和状态-观测互协方差 Pxz。
* 计算卡尔曼增益 K = Pxz / Pzz。
* 根据观测残差更新状态估计值,并修正误差协方差矩阵。
#### 4. 内置非线性函数
- 状态方程:实现恒速运动(Constant Velocity)逻辑,位置随速度和时间线性增加,速度保持恒定(通过 Q 矩阵引入扰动)。
- 观测方程:实现复杂的非线性转换,将笛卡尔坐标系下的位置信息转换为雷达等传感器常用的距离(平方和开根号)和角度(反正切)。
可视化说明
仿真结束后,程序会自动生成包含四个子图的分析画布:
- 轨迹对比图:展示系统真实运动路径与 UKF 估计路径的重合度,验证滤波器的位置跟踪能力。
- 误差分布图:实时记录 X 和 Y 轴位置估计误差的变化过程。
- 收敛分析图:通过绘制误差协方差矩阵 P 的迹(Trace),展示算法从初始不确定状态到逐步收敛的过程。
- 原始观测对比:对比传感器测量的原始带噪声距离数据与真实距离的差异。
使用方法
- 打开 MATLAB。
- 将项目代码文件放在 MATLAB 当前工作路径下。
- 直接在命令行窗口键入主函数名并运行。
- 观察弹出的可视化图表,评估定位与跟踪效果。
- 用户可以通过修改代码底部的非线性模型函数,快速将该算法迁移至自己的研究领域(如无人机定位、机器人导航等)。