ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

扩展卡尔曼滤波EKF的MATLAB实现与工程实战:从原理到工具箱设计

扩展卡尔曼滤波EKF的MATLAB实现与工程实战:从原理到工具箱设计 做状态估计的同行应该都有同感线性卡尔曼滤波KF是入门教材里的明星但一到实际工程项目系统稍微带点非线性教材里那套标准公式就推不动了。这时候扩展卡尔曼滤波EKF就成了最顺手的工具。最近我把手头积累的EKF相关代码、调参经验整理成了一套MATLAB下的卡尔曼工具箱正好借这篇博文把里面的设计思路、关键实现和踩过的坑完整梳理一遍。文章核心围绕EKF算法源码展开从原理拆解到MATLAB实现再到雷达目标跟踪的完整案例适合正在做导航定位、目标跟踪、状态估计的工程师也适合研究生刚接触滤波算法、想快速把理论跑通的初学者。先说结论EKF本质上就是“对非线性系统做一阶泰勒展开然后套用线性卡尔曼的框架”。但实际工程里光知道这个结论远远不够。雅可比矩阵怎么求、噪声协方差怎么定、滤波发散怎么排查、工具箱怎么封装才能在不同项目里复用这些才是真正决定算法能不能上线的关键。我整理这套工具箱的目标就是把这些经验固化成代码让EKF不再是论文里的公式而是可以随手调用的工具。1. 从线性卡尔曼到扩展卡尔曼弄懂EKF到底是什么很多初学者上来就背EKF公式结果调参时一塌糊涂。所以我建议先把原理背后的“为什么”搞清楚后面写代码、调bug才会有方向感。1.1 线性卡尔曼的两步黄金流程标准的线性卡尔曼滤波解决的是这样一个问题系统状态随时间线性演化观测也是状态的线性函数。它的核心流程只有两步。预测步用上一时刻的状态估计和协方差矩阵推算当前时刻的先验估计x_pri F * x_post P_pri F * P_post * F Q更新步用当前时刻的观测值修正先验估计得到后验估计K P_pri * H * inv(H * P_pri * H R) x_post x_pri K * (z - H * x_pri) P_post (I - K * H) * P_pri这里的F是状态转移矩阵H是观测矩阵Q是过程噪声协方差R是观测噪声协方差。这个框架极其优雅估计值的不确定度用协方差矩阵显式表达卡尔曼增益K则负责权衡“相信模型预测”还是“相信观测数据”。但问题来了实际工程里F和H往往不是常数矩阵。目标做转弯机动时状态方程带三角函数雷达测距测角时观测方程带根号和反正切。这时候线性卡尔曼直接失效EKF就是为此而生的。1.2 EKF改了什么雅可比矩阵与一阶线性化EKF的思想非常朴素既然系统是非线性的那就把它在当前状态估计点附近做一阶泰勒展开用雅可比矩阵代替原来的常数矩阵F和H。具体来说非线性状态方程和观测方程可以写成x_k f(x_{k-1}) w_k z_k h(x_k) v_k其中w和v分别表示过程噪声和观测噪声。EKF在预测步里用f直接传播状态均值但协方差的传播需要用到f对状态的雅可比矩阵F_k更新步里观测预测值由h直接计算但协方差和增益的计算需要用到h对状态的雅可比矩阵H_k。这个“用雅可比矩阵代替常数矩阵”的做法就是全部的秘密。理解了这一点你就知道EKF代码里最核心的工作其实是两件事推导雅可比矩阵、写对矩阵更新公式。1.3 为什么工程上更常用EKF而不是UKF/PF做项目时会有人问既然EKF要做线性化近似存在截断误差为什么不直接用无迹卡尔曼滤波UKF或者粒子滤波PF我的经验是EKF在工程中的统治地位靠的不是精度而是性价比。UKF不需要求雅可比矩阵对强非线性系统精度更好但计算量大约是EKF的3到5倍状态维数一高差距更明显。粒子滤波理论上能处理任意非线性非高斯系统但粒子数和实时性之间的博弈在嵌入式平台上往往不可调和而且粒子退化问题本身就够头疼的。实际项目中大部分系统的非线性程度并没有那么夸张。只要采样时间足够短、线性化点在真实状态附近EKF的精度完全够用。更重要的是EKF的雅可比导数信息本身就是一种系统可观性分析的依据对工程调试非常有价值。所以我做工具箱时优先把EKF做扎实UKF作为扩展接口预留而不是反过来。2. 卡尔曼工具箱的设计思路与实现细节工具箱这东西最忌讳的是把代码写得只能在某个项目里跑通。我做这套工具箱时定了一个原则核心滤波逻辑与具体问题完全解耦换一个场景只需要替换状态方程和观测方程两个函数。下面说说具体怎么设计。2.1 工具箱的整体架构函数式封装与句柄传参MATLAB里面实现EKF我看过很多种写法。有人喜欢写一个大脚本从数据生成到滤波到画图全塞在一起有人喜欢用面向对象的方式写滤波器类。我的选择是折中用函数式封装状态方程、观测方程和雅可比矩阵全部用函数句柄传入滤波核心是一个独立函数。这样做的好处有三个。第一每个函数职责单一出了问题单独调试第二滤波核心代码不涉及具体业务逻辑可以跨项目复用第三函数句柄的传参方式让工具箱像插件一样灵活换模型不需要动核心代码。工具箱的文件结构大致如下kalman_toolbox/ ├── ekf_predict.m % 预测步 ├── ekf_update.m % 更新步 ├── ekf_run.m % 串联预测和更新的主循环 ├── ex_radar_tracking.m % 雷达目标跟踪示例 └── utils/ ├── jacobian_numerical.m % 数值雅可比 └── check_positive_definite.m % 协方差正定性检查2.2 核心函数接口设计预测步函数的设计思路是不关心你的系统长什么样只要给我当前状态、协方差、状态方程雅可比和过程噪声协方差我就帮你把预测算完。function [x_pri, P_pri] ekf_predict(x_post, P_post, f, F_x, Q, dt) % EKF预测步 % 输入: % x_post - 上一时刻后验状态向量 (n x 1) % P_post - 上一时刻后验协方差矩阵 (n x n) % f - 状态方程函数句柄 (x, dt) % F_x - 状态转移雅可比矩阵 (n x n) % Q - 过程噪声协方差矩阵 (n x n) % dt - 采样时间 % 输出: % x_pri - 先验状态估计 % P_pri - 先验协方差矩阵 x_pri f(x_post, dt); P_pri F_x * P_post * F_x Q; end更新步同样保持纯粹function [x_post, P_post, K] ekf_update(x_pri, P_pri, h, H_x, z, R) % EKF更新步 % 输入: % x_pri - 先验状态估计 (n x 1) % P_pri - 先验协方差矩阵 (n x n) % h - 观测方程函数句柄 (x) % H_x - 观测雅可比矩阵 (m x n) % z - 当前观测向量 (m x 1) % R - 观测噪声协方差矩阵 (m x m) % 输出: % x_post - 后验状态估计 % P_post - 后验协方差矩阵 % K - 卡尔曼增益 z_hat h(x_pri); S H_x * P_pri * H_x R; K P_pri * H_x / S; % 用右除代替inv数值更稳定 x_post x_pri K * (z - z_hat); P_post (eye(size(x_pri, 1)) - K * H_x) * P_pri; end注意这里的两个工程细节。一是用矩阵右除/代替inv求逆MATLAB里inv(S)不仅慢数值稳定性也差右除的效果好很多二是更新步的协方差公式用的是(I - K*H)*P_pri这个经典形式虽然在某些极端数值条件下可能导致对称性丢失但配合后面的对称化处理整体效果更稳定。主循环ekf_run就纯粹是串联工作了function result ekf_run(zs, dt, x0, P0, f, h, Fx_func, Hx_func, Q, R) % EKF主循环 % 输入: % zs - 观测序列 (m x N) % dt - 采样时间 % x0 - 初始状态 % P0 - 初始协方差 % f, h - 状态方程、观测方程句柄 % Fx_func - 返回雅可比矩阵的函数句柄 (x, dt) % Hx_func - 返回观测雅可比矩阵的函数句柄 (x) % Q, R - 过程、观测噪声协方差 % 输出: % result - 结构体包含滤波状态和协方差序列 N size(zs, 2); n length(x0); xs zeros(n, N); Ps zeros(n, n, N); x_post x0; P_post P0; xs(:, 1) x_post; Ps(:, :, 1) P_post; for k 2:N Fx Fx_func(x_post, dt); [x_pri, P_pri] ekf_predict(x_post, P_post, f, Fx, Q, dt); Hx Hx_func(x_pri); [x_post, P_post, ~] ekf_update(x_pri, P_pri, h, Hx, zs(:, k), R); P_post 0.5 * (P_post P_post); % 强制对称 xs(:, k) x_post; Ps(:, :, k) P_post; end result.xs xs; result.Ps Ps; end2.3 协方差矩阵初始化与噪声调参的实战经验工具箱写好了但真正决定滤波效果的是参数。很多人在这一步翻车我单独拎出来说。初始协方差P0怎么设我的建议是不要设得太小也不要太大。太小会让滤波器过早自信后续观测一旦有偏差就很难纠正太大会让滤波器前期过度依赖观测估计值抖动剧烈。比较合理的做法是根据物理量纲估算比如位置初始误差按“最大可能偏差”的三分之一方差来设速度按类似逻辑折算。如果你完全没底取观测噪声R对角元的10倍起调通常不会出大乱子。过程噪声Q是EKF调参的重中之重。Q描述了模型本身的可信程度——模型对运动规律的近似越粗糙Q就应该越大。在雷达跟踪例子里如果目标做匀速直线运动但你用CV模型建模Q就要留出足够余量来吸收机动带来的偏差。Q太小会导致滤波发散Q太大会让滤波输出跟着观测噪声跑平滑效果尽失。观测噪声R一般可以直接从传感器手册或者标定数据拿到。雷达测距的噪声标准差可能是几米测角噪声可能是零点几度。需要注意的是把角度单位换算成弧度这个细节看着不起眼实际因为单位问题导致R和H对不上而发散的情况我见过太多次了。提示调EKF一定要养成画残差图的习惯。所谓残差就是z - h(x_pri)也就是新息。正常情况下新息应该是一个零均值的高斯白噪声序列。如果你的新息明显有偏或者存在相关性基本可以断定状态方程建模或者噪声协方差设置有偏差。3. 实战案例雷达目标跟踪的EKF实现理论讲完必须上手来一发。这个例子是我做工具箱时用的标准验证场景用雷达跟踪一个做近似匀速运动的空中目标。雷达观测量是距离和方位角状态量包括位置和速度。距离和方位角与位置之间是典型的非线性关系正好发挥EKF的作用。3.1 问题建模极坐标观测下的匀速运动目标目标在二维平面内运动状态向量取x [px, py, vx, vy]其中px和py是目标在x轴和y轴上的位置vx和vy是对应方向的速度。假设采样间隔内目标做匀速直线运动离散化后的状态转移方程是px_new px vx * dt py_new py vy * dt vx_new vx vy_new vy状态方程f函数写出来就是function x_new cv_model(x, dt) F [1 0 dt 0; 0 1 0 dt; 0 0 1 0; 0 0 0 1]; x_new F * x; end虽然这个模型本身是线性的但观测方程是非线性的。传感器返回目标的距离r和方位角thetar sqrt(px^2 py^2) theta atan2(py, px)这个从状态到观测的映射必须用非线性函数来描述function z radar_measurement(x) px x(1); py x(2); z [sqrt(px^2 py^2); atan2(py, px)]; end现在关键来了求雅可比矩阵。状态转移雅可比F_x因为是线性模型直接就是上面的常数矩阵F。观测雅可比H_x需要对h函数求偏导H_x [px/r, py/r, 0, 0; -py/r^2, px/r^2, 0, 0]注意第二行的量纲是1/长度因为角度对方位的偏导需要除以距离的平方。这些细节非常容易算错我一般建议手推一遍之后再用数值雅可比做交叉验证。function H radar_jacobian(x) px x(1); py x(2); r sqrt(px^2 py^2); r2 r^2; H [px/r, py/r, 0, 0; -py/r2, px/r2, 0, 0]; end3.2 完整MATLAB代码与逐段解读下面直接上完整的主脚本。这个脚本生成真实轨迹和带噪声的观测然后用EKF工具箱做滤波最后画图对比。%% EKF示例雷达目标跟踪 clear; clc; close all; addpath(utils); % 工具箱工具函数 % 仿真参数设置 dt 0.1; % 采样周期单位秒 T 50; % 仿真时间单位秒 N T / dt; % 总采样点数 % 真实轨迹参数沿x方向运动带一点y方向漂移 t (0:N-1) * dt; px_true 1000 50 * t; py_true 2000 20 * t 0.05 * t.^2; vx_true 80 * ones(1, N); vy_true 20 0.1 * t; % 生成量测距离 方位角 r_true sqrt(px_true.^2 py_true.^2); theta_true atan2(py_true, px_true); % 噪声参数 sigma_r 15; % 距离噪声标准差单位米 sigma_theta 1 * pi / 180; % 方位角噪声标准差单位弧度 R diag([sigma_r^2, sigma_theta^2]); r_meas r_true sigma_r * randn(1, N); theta_meas theta_true sigma_theta * randn(1, N); zs [r_meas; theta_meas]; % 初始状态与协方差 x0 [r_meas(1) * cos(theta_meas(1)); r_meas(1) * sin(theta_meas(1)); 0; 0]; % 初始速度设为0 P0 diag([100, 100, 100, 100]); % 位置和速度都不确定 % 过程噪声协方差 q 2; % 加速度噪声强度 Q diag([q^2, q^2, q^2, q^2]); % 运行EKF result ekf_run(zs, dt, x0, P0, cv_model, radar_measurement, ... (x, dt) cv_model_jacobian(x), radar_jacobian, Q, R); xs result.xs; % 画图 figure(Position, [100 100 800 300]); subplot(1, 2, 1); plot(px_true, py_true, k--, LineWidth, 1.5); hold on; px_meas r_meas .* cos(theta_meas); py_meas r_meas .* sin(theta_meas); plot(px_meas, py_meas, ., MarkerSize, 3); plot(xs(1, :), xs(2, :), r-, LineWidth, 1); legend(真实轨迹, 观测位置, EKF估计, Location, best); xlabel(x方向位置/m); ylabel(y方向位置/m); title(雷达目标跟踪轨迹); grid on; axis equal; subplot(1, 2, 2); pos_error sqrt((xs(1, :) - px_true).^2 (xs(2, :) - py_true).^2); plot(t, pos_error, b-, LineWidth, 1); xlabel(时间/s); ylabel(位置误差/m); title(EKF位置估计误差); grid on;这里有两个辅助函数没有在代码里完整列出一个是cv_model_jacobian直接返回CV模型的常数矩阵F另一个是数值雅可比函数用于交叉验证。前者很简单function F cv_model_jacobian(~, dt) F [1 0 dt 0; 0 1 0 dt; 0 0 1 0; 0 0 0 1]; end3.3 结果分析与精度评估跑完上面的代码你会看到两条核心结论。第一滤波轨迹明显比原始观测点平滑得多说明EKF有效利用了运动模型的先验约束第二位置误差曲线在初始阶段有一个明显的收敛过程然后稳定在一个水平附近说明滤波器进入了稳态。稳态误差大概在什么量级这是衡量滤波器是否调好的关键指标。先算一下理论下界位置观测噪声标准差约15米由于观测更新是每秒10次dt0.1而且有位置和角度两个维度的信息约束稳态位置误差一般能压缩到5到8米左右。如果实际误差明显大于这个数优先检查Q是否设置过大导致滤波输出追着观测噪声走。还有一个细节值得注意方位角噪声对横向位置的扰动与距离相关。距离越远同样的角度噪声换算到位置域就越大。这个效应在画误差椭圆时特别明显距离目标较远时椭圆会被拉得很长。我在工具箱里加了一个绘制协方差椭圆的小工具用P矩阵的两个特征值决定椭圆长短轴方向能够直观看到每个时刻的不确定度分布对分析滤波器行为帮助很大。function plot_error_ellipse(ax, P_xy, mu_xy, n_std, color) % 在指定坐标轴上绘制误差椭圆 % P_xy : 位置子块的协方差矩阵 % mu_xy : 位置均值 [px; py] % n_std : 椭圆尺寸单位标准差倍数通常取3) [V, D] eig(P_xy); theta linspace(0, 2*pi, 100); ellipse V * sqrt(D) * [n_std*cos(theta); n_std*sin(theta)]; plot(ax, mu_xy(1) ellipse(1, :), mu_xy(2) ellipse(2, :), color, LineWidth, 1); end3.4 案例扩展从雷达跟踪到电池SOC估计雷达目标跟踪只是工具箱的第一个应用场景。让工具箱真正复用起来的关键是理解“状态方程观测方程”这一组合如何迁移到其他问题。比如热词里频繁出现的电池SOC估计问题。电池的荷电状态无法直接测量我们能拿到的是端电压和电流。把SOC作为状态量状态方程可以简化为库仑计数模型SOC_new SOC_old - I * dt / Q_battery观测方程则是开路电压与SOC之间的非线性映射关系通常用多项式或查表表示。整个EKF框架原封不动只需要替换掉f和h两个函数以及对应的雅可比矩阵。我自己做过一个锂电池SOC估计项目用EKF处理带噪声的电压电流数据SOC估计误差能控制在3%以内而纯库仑计数法因为电流采样误差积累半小时后就飘得没法看了。这就是EKF“用模型修正观测、用观测修正模型”这个闭环带来的核心价值。工具箱里预留了电池模型的示例目录把cv_model和radar_measurement替换成电池模型和电压方程即可复用。4. 工具箱扩展从EKF到UKF与工程部署衔接工具箱如果只停留在算法验证阶段价值就打折了。实际项目中滤波器最终要跑在实时系统上要和Simulink模型联调甚至要部署到嵌入式设备里。这一章我讲讲扩展和衔接的几个方向。4.1 基于工具箱扩展到UKFEKF的雅可比矩阵是手推的容易出错而且对强非线性系统精度有限。工具库里我预留了UKF的接口逻辑很简单既然EKF的预测和更新分别需要F_x和H_x而UKF通过Sigma点传播来隐式处理非线性那么只需要把ekf_predict和ekf_update替换成ukf_predict和ukf_update即可。UKF不需要求雅可比矩阵但对非线性函数的调用次数会明显增多状态维数为n时每个周期至少需要生成2n1个Sigma点并分别通过f和h传播。以4维状态为例EKF每个周期只需要一次f和一次h计算UKF则需要9次f和9次h计算计算量差距就在这。我的建议是如果系统非线性程度较低、雅可比矩阵推导简单用EKF如果系统的非线性函数包含强非线性项比如姿态四元数、大角度机动或者雅可比矩阵推导实在算不清楚切换成UKF工具箱里两条路径共用同一套主循环接口切换成本几乎为零。4.2 与Simulink的联合仿真很多工程师习惯用Simulink搭系统模型但EKF算法放在MATLAB脚本里更方便调试。我的做法是用MATLAB Function模块把滤波核心做成一个可调用的函数在Simulink的每个采样周期里调用ekf_predict和ekf_update。这里有一个很重要的实践建议不要把整个工具箱的代码都塞进MATLAB Function模块Simulink的代码生成对这个有限制。正确做法是把ekf_predict.m和ekf_update.m两个核心文件放到一个单独的目录在模型的MATLAB Function里引用它们并且确保所有输入输出维度固定不出现动态大小的数组。这样才能为后续的代码生成和硬件在环测试铺平道路。联合仿真还有一个好处可以用Simulink自带的可变步长求解器验证EKF在不同采样时间下的表现这对确定实际系统的采样周期上限很有参考价值。4.3 与外部代码的衔接热词里面有几个关于MATLAB与C交互的搜索我在项目里也遇到类似需求。EKF最终要在嵌入式平台上运行常见的方法有两种一是用MATLAB Coder对滤波核心代码生成C代码二是在C工程里自行移植算法。用MATLAB Coder这条路要求你在写工具箱的时候就注意代码的可生成性。比如尽量避免在核心函数里动态分配数组、尽量用定长数组、不要用eval这类运行时反射机制。我在工具箱里特意把核心函数都写成这种风格实测下来用MATLAB Coder生成C代码几乎不需要额外修改只不过生成后的代码里矩阵运算展开成多层循环性能反而比MATLAB里跑还要快。如果你不想用代码生成纯手写C移植也不难。EKF算法本地化之后总共就这么几个矩阵运算矩阵乘法、矩阵转置、矩阵求逆。嵌入式平台上的线性代数库比如Eigen能把这些运算封装得很好。之前做过一个基于STM32的无人机姿态估计项目就是用Eigen库手写了EKF核心代码量不到300行跑在180MHz的MCU上完全无压力。5. 常见问题与调试实录工具箱给同事用过几轮之后我发现大家遇到的问题出奇地一致。这一章把高频踩坑点按症状、原因、解决方案整理成表格多数是我自己调过的真实情况。症状可能原因排查与解决滤波发散估计值直接飞掉Q设置过小模型不确定性被低估逐步增大Q观察发散速度是否减缓滤波结果剧烈抖动Q设置过大滤波器过度信任新息减小Q增大R或者检查观测方程是否写错估计值收敛到错误值初始协方差P0过小滤波器过早自信增大P0强制滤波器前期多采信观测数据角度在±π附近跳变导致残差巨大角度归一化处理缺失对角度残差做wrap to [-pi, pi]处理新息序列明显偏置状态方程与真实运动模式不符检查是否漏了加速度项或者需要引入机动模型协方差矩阵非正定数值误差累积P失去了对称性每个周期强制对称化必要时加一个极小值对角扰动角度归一化的问题值得单独说。雷达方位角的观测值和预测值可能在π附近出现“跳变”比如真实角度是179度预测值是-179度直接相减得到358度的残差滤波器会被这个假残差带偏。处理方式很粗暴也有效残差计算完之后对角度分量做atan2(sin(residual), cos(residual))把残差限制在-π到π之间。这个细节在EKF实现里极其常见几乎每本教材都没写但实际调代码时必踩。数值雅可比是排查雅可比错误的神器。手推雅可比矩阵很容易错一两个符号或者漏掉一个链式法则项。我在调试工具箱时习惯用差分法做一次交叉验证function H_num numerical_jacobian(h, x, eps) % 数值雅可比用中心差分近似偏导数 n length(x); H_num zeros(length(h(x)), n); for i 1:n xp x; xm x; xp(i) xp(i) eps; xm(i) xm(i) - eps; H_num(:, i) (h(xp) - h(xm)) / (2 * eps); end end把解析雅可比和数值雅可比的结果放在一起对比如果差异小于1e-6基本可以放心如果差异明显就逐个元素检查偏导求解过程。这个交叉验证虽然不能放到实时系统里但作为调试验证代码如下值得长期保留。还有一个容易忽略的点Q矩阵和R矩阵必须保证正定。MATLAB里不用管但做代码生成或者移植到C时如果矩阵经过多次乘法后失去了正定性会导致Cholesky分解失败。工具箱里的check_positive_definite函数会在每个周期检查特征值一旦发现零或负特征值就给出警告并做对角扰动处理防止滤波静默失效。另外提醒一句如果你从网上下载“MATLAB 2026b密钥”或者“linux matlab 2021b密钥”这类资源风险很高。且不论版权问题很多来路不明的安装包和破解文件本身就带木马编译器性能、随机数种子都会受影响滤波结果根本没法保证可靠。MATLAB官方对学生和开源开发者有价格友好的授权渠道这部分成本不该省。6. 工具箱的使用心得与未来扩展最后聊几点个人体会都是整理这套工具箱时最深的感受。第一EKF最难的从来不是公式推导而是建模和调参。公式就那几次矩阵运算半天能写完代码。但状态变量怎么选、噪声协方差怎么设、采样时间怎么定每一个都直接决定滤波效果。这些经验无法从教材里直接学到必须在具体项目里反复打磨。第二工具箱的价值在于积累。我最早写的EKF代码也是一坨脚本状态更新和画图全混在一起。后来做了几个项目慢慢把公共部分抽出来才有了现在这套干净接口。建议读者自己也建立这样的习惯每次做完一个滤波项目把状态方程、观测方程、雅可比矩阵这些模型相关的代码和滤波主循环分开沉淀成自己的工具库。几个月后你会发现新项目上手速度提升的不止一倍。第三EKF和数据驱动方法不是互斥的。最近深度学习、BILSTM这类方法在SOC估计和状态预测领域非常火很多人的第一反应是用神经网络完全替代传统滤波。但我实际做下来更稳的路线是把EKF和数据驱动结合起来——用神经网络学习系统的未建模残差EKF负责处理随机噪声和状态约束。工具箱里的EKF核心完全可以用作这个混合方案的状态估计底座。这套卡尔曼工具箱我还在持续完善下一步计划就是把更多传感器融合场景加进去比如GPS与惯导的组合导航、视觉与里程计的融合定位。无论是做研究还是做工程EKF作为状态估计的基石值得每个从业者把它用扎实。希望这篇博文能帮你少踩一些我踩过的坑快速把算法跑起来、调通、落地。
返回列表