扩展卡尔曼滤波(EKF)基础学习与仿真平台
项目介绍
本项目是一个专门为学习和理解扩展卡尔曼滤波(EKF)设计的MATLAB仿真环境。它聚焦于解决非线性系统中的状态估计挑战,特别是在目标跟踪领域中常见的“线性运动模型+非线性观测模型”场景。通过该平台,用户可以直观地观察到滤波器如何通过雅可比矩阵对非线性测量方程进行实时线性化,并实现对目标位置和速度的精确估计。
功能特性
- 非线性模型演示:实现了从笛卡尔坐标系状态(位置与速度)到极坐标系观测(距离与角度)的非线性映射。
- 实时线性化过程:在每个时间步长动态计算观测矩阵的雅可比矩阵,展示一阶泰勒展开的应用。
- 完整的误差分析:程序自动计算并输出位置与速度的均方根误差(RMSE),评估滤波性能。
- 多维度可视化:提供二维跟踪轨迹图、带有3-sigma置信区间的误差收敛图,以及 Jacobians 分量的演变趋势图。
- 异常处理机制:内置观测剩余误差的角度截断处理(Wrap to Pi),防止非线性角度更新时的阶跃问题。
系统要求
- 软件环境:MATLAB R2016b 及以上版本。
- 必备工具箱:基础 MATLAB 运行环境即可,无需特殊工具箱。
核心实现逻辑
算法通过一个封闭的仿真循环运行,逻辑分为以下几个核心阶段:
- 参数初始化:
* 设定仿真步长(0.1秒)与总时长(50秒)。
* 配置过程噪声矩阵 Q,采用基于加速度扰动的连续时间模型离散化形式。
* 配置测量噪声矩阵 R,定义雷达测距和测角的标准差。
* 设置初始状态估计值,并故意引入偏差以观察滤波器的收敛过程。
- 真实轨迹与观测生成:
* 利用匀速模型更新目标的真实状态。
* 在真实状态基础上叠加过程噪声。
* 通过观测函数生成极坐标数据,并注入测量噪声模拟真实雷达信号。
- EKF 预测更新循环:
*
预测步:利用线性状态转移矩阵推算下一时刻的状态预测值和协方差预测值。
*
线性化步:在预测点处计算观测方程的雅可比矩阵 H,将非线性观测空间局部线性化。
*
增益计算:根据预测协方差、雅可比矩阵和测量噪声矩阵计算卡尔曼增益 K。
*
更新步:计算观测残差(对角度误差进行 [-pi, pi] 限制),结合增益更新状态估计值和协方差矩阵。
- 数据记录与评估:
* 全程记录真实值、估计值、原始观测点以及协方差矩阵的对角线元素(用于绘制误差边界)。
关键函数与算法细节
采用匀速直线运动(CV)模型,状态向量包含 X轴位置、Y轴位置、X轴速度、Y轴速度。由于运动模型本身是线性的,状态转移雅可比矩阵 F 是一个常系数矩阵。
观测函数将目标的位置信息转换为雷达可感知的距离(Range)和方位角(Bearing)。这是一种典型的非线性映射,其数学表达涉及到平方根和反正切运算。
这是 EKF 的核心技术点。程序实现了对偏导数的解析求导,计算了距离和角度相对于位置分量的偏导。在计算过程中加入了奇异点处理(当目标距离原点极近时),确保数值计算的稳定性。
通过提取协方差矩阵 P 的对角线元素,程序动态生成了 3倍标准差(3-sigma)包络线。如果滤波算法正常工作,估计误差应绝大部分落在该包络线之内,这为验证滤波器的收敛性和一致性提供了科学依据。
在非线性更新中,角度观测存在 2pi 周期性问题。通过专门的归一化函数处理观测残差,确保了在目标跨越正负 pi 边界时滤波器不会产生错误的修正方向。
使用方法
- 启动 MATLAB 软件。
- 将项目代码文件所在的文件夹设为当前工作目录。
- 在命令行窗口输入 main 并回车。
- 程序将自动执行 500 个步长的仿真,并依次弹出三个分析图表。
- 通过修改代码初期的噪声参数(q_std, r_std, theta_std),您可以观察到不同噪声条件下滤波器鲁棒性的变化。