资讯动态

从可观测性看EKF-SLAM不一致性:约束修正与Matlab实现

发布时间:2026/10/21 15:42:44 来源:尧图企业网站定制
之前在仿真环境里调EKF-SLAM的时候碰到过一个特别诡异的现象机器人明明在直线行驶地图里的路标点却慢慢往一侧漂而且协方差椭圆越缩越小看起来“非常确定”但实际位置误差早就超出了3σ范围。当时第一反应是调过程噪声、换传感器模型参数折腾了好几天都没用。后来才意识到问题根本不在这——是滤波器本身产生了一致性问题而根源藏在可观测性分析里。这篇文章就是围绕“从可观测性角度研究EKF-SLAM中的不一致性问题”这个主题写的。我会从理论基础讲到Matlab实现重点解释为什么标准EKF会不一致、如何通过可观测性约束来修正、以及代码层面到底改了什么。适合正在做移动机器人定位、SLAM算法研究或者想深入理解EKF本质的开发者。1. EKF-SLAM不一致性问题的本质1.1 什么是一致性为什么它比误差大小更重要先说一个基本概念滤波器的一致性consistency指的是滤波器对自己状态估计的不确定度估计是否真实可信。换句话说滤波器不仅输出一个估计值还输出一个协方差矩阵来告诉我们“这个估计有多可信”。如果协方差矩阵给出的不确定度和真实误差是匹配的那就是一致的如果滤波器说“误差只有0.1米”而实际误差是1米那就是不一致的。在SLAM场景里一致性问题尤其致命。因为SLAM是一个增量式的地图构建过程每一帧的估计都依赖于之前所有的状态。如果某一帧出现了过度自信的错误估计这个错误会通过状态协方差传播出去影响后续所有的路标位置和机器人位姿估计。更麻烦的是协方差一旦被“压缩”到不合理的小范围后面几乎不可能自动恢复——滤波器会对错误的估计越来越有信心。实际中评判一致性的常用手段是归一化估计误差平方NEES。对机器人位姿部分的NEES计算公式如下NEES (x_true - x_est) * P^(-1) * (x_true - x_est)如果滤波器是一致的NEES的期望值应该等于状态维数。对二维平面SLAM机器人位姿是3维x, y, θ那NEES的期望值就是3。实际测试时跑N次蒙特卡洛仿真然后求平均NEES。如果平均值显著大于3说明滤波器过于自信、不一致如果显著小于3则说明太保守虽然保守比激进好一些但也说明噪声建模有问题。1.2 标准EKF-SLAM的流程回顾理解了“一致性”是什么我们再快速过一遍标准EKF-SLAM的核心流程后面所有的修正方案都建立在这套流程之上。EKF-SLAM的状态向量由两部分组成机器人状态和所有路标位置。在二维平面中机器人状态通常是(x, y, θ)即位置和航向角。每个路标用(x_i, y_i)表示其坐标。假设有N个路标总状态维度是3 2N。预测阶段运动模型根据控制输入比如线速度和角速度预测机器人状态同时更新协方差x_pred f(x_est, u) P_pred F * P * F Q这里F是运动模型的雅可比矩阵Q是过程噪声协方差。注意在标准EKF中F是在当前估计值处线性化得到的。更新阶段当机器人观测量到某个路标时用观测模型计算预测观测量然后计算卡尔曼增益并更新z_pred h(x_pred, p_i) S H * P_pred * H R K P_pred * H * inv(S) x_new x_pred K * (z - z_pred) P_new (I - K * H) * P_predH是观测模型的雅可比矩阵R是观测噪声协方差。这套流程看起来逻辑自洽数学上也无懈可击。但问题恰恰出在“线性化”这一步。2. 从可观测性角度剖析不一致性的根源2.1 可观测性与SLAM的本质约束可观测性分析回答的问题是系统的状态能否通过观测数据唯一确定。在SLAM中存在一些本质上不可观测的量——最典型的是机器人的全局位置坐标和全局航向角。这里需要停下来想清楚。机器人和路标的相对位置是可以通过传感器观测到的但它们在全局坐标系下的绝对位置在没有任何外部绝对参考的情况下是永远无法唯一确定的。想象一个非常简单的场景机器人看到一个路标它测量得到“路标在我前方3米偏左30度”但它并不知道自己在全局坐标系的哪里也不确定自己的朝向。那么路标的全局坐标依赖于机器人的全局坐标和航向这三者之间存在一个耦合关系无法分开求解。这个“无法分开求解”的特性用数学语言描述就是系统的可观测性矩阵存在一个非空的零空间null space。这个零空间对应的方向就是系统无法观测到的状态变化方向。在二维SLAM中这个不可观测子空间通常是3维的分别对应全局平移x方向、y方向和全局旋转θ方向。2.2 线性化如何破坏不可观测子空间了解了理想情况下的不可观测子空间我们来看标准EKF的核心缺陷。EKF的线性化是基于当前状态估计值展开的。这个“基于当前估计值”有致命缺陷——因为估计值本身在变化每一步的线性化点都不同导致雅可比矩阵描述的“局部线性系统”的可观测性与真实非线性系统不一致。具体来说EKF-SLAM中可观测性矩阵的零空间维度会被错误地压缩。这意味着滤波器认为某些状态方向是“部分可观测”的而实际上它们是完全不可观测的。一旦滤波器认为某个方向可观测它就会用观测数据去“修正”这个方向上的状态同时缩小对应的协方差。但这个修正方向是虚假的因为它基于的是一个错误的可观测性假设最终导致协方差分布产生物理上不存在的收缩。举个直观的例子。机器人做匀速直线运动时由于传感器只能测到路标相对于自身的距离和方位机器人的绝对航向角是不可观测的。但标准EKF的线性化操作会让可观测性矩阵出现一个额外方向的“可观测性”增长导致滤波器开始错误地“修正”航向角的漂移同时压缩航向角的方差。真实系统中航向角的不确定性明明在持续增长但滤波器却认为它越来越确定——这就是典型的过度自信也就是我们说的不一致性。为了把这个问题看清楚可以引入可观测性矩阵来定量分析。对离散时间非线性系统线性化后可观测性矩阵的形式为O [H1; H2 * F1; H3 * F2 * F1; ... Hk * F(k-1) * ... * F1]其中Hk是k时刻观测模型雅可比矩阵Fk是k时刻状态转移雅可比矩阵。零空间维度 状态维度 - rank(O)。理论上SLAM系统在任何时刻可观测性矩阵的零空间维度都应该是3对应全局平移加旋转。但标准EKF在经历多次预测-更新循环后计算得到rank(O)往往大于理论值意味着零空间维度小于3说明某些不可观测的方向“泄漏”成了“可观测”。2.3 信息矩阵视角下的“虚假信息”换个角度看这个问题。EKF更新中信息矩阵协方差的逆会随着观测不断累积。在标准EKF中可观测性矩阵泄露的额外方向会让信息矩阵在这些方向上出现非零的信息量积累。这些信息量不是来自于真实的观测而是来自于线性化过程中人为引入的约束。打个比方你在昏暗的房间里手里只有一个手电筒光线照到的范围是有限的。理论上手电筒照不到的区域你是不应该有任何“认知”的。但如果你拿到一张纸纸上写着一行字“墙壁离你5米远”这张纸带给你的是对房间结构的信息——但问题是这张纸是别人随便写的不是真实测量得到的。EKF里“别人随便写的纸”就是线性化过程中的虚假信息。标准EKF的问题在于它在每个时刻都会“写一张纸”而且随着状态的估计值不断更新纸上的内容也在变化导致虚假信息被不断注入滤波器最终严重破坏一致性。3. 一致性修正的可行方案与工具选型3.1 修正思路一可观测性约束Observability Constraint理解了问题根源解决方案也就清晰了——让线性化后的系统可观测性矩阵保持与真实系统相同的零空间维度。这就是可观测性约束方法的核心思想。具体实施时做法是调整状态转移雅可比矩阵F和观测雅可比矩阵H使得每个时刻的可观测性矩阵满足约束条件。数学上就是要保证可观测性矩阵的零空间始终包含真实系统的不可观测子空间NO_matrix * N 0即可观测性矩阵与不可观测子空间的张成方向正交。这样滤波器就不会在不可观测方向上产生虚假的信息积累。实现上通常是先计算理论上的不可观测子空间基向量对二维SLAM就是全局平移和全局旋转对应的3个基向量然后在每个时刻对雅可比矩阵进行修正。修正的方式不止一种常见做法是找出雅可比矩阵在不可观测子空间方向上的分量然后把该分量剔除。这本质上是一个约束最小化问题——在保持雅可比矩阵尽可能接近原值的前提下让它满足零空间正交条件。3.2 修正思路二FEJFirst Estimates Jacobian如果说可观测性约束是一套系统化的修正框架那FEJ首次估计雅可比就是一套极其优雅的简化方案。它的核心思想非常朴素计算雅可比矩阵时不在当前估计值处线性化而是在第一次估计到相关状态时的那个估计值处线性化。这就解决了“每个时刻线性化点不同导致可观测性被破坏”的核心问题。因为FEJ在整个滤波过程中把线性化点固定住了可观测性矩阵的结构随之稳定零空间维度不会随迭代过程慢慢“泄漏”。关于FEJ的物理直觉可以这么理解既然全局位置和航向角本质不可观测那么涉及这些量的导数信息就应该基于这些量还没被“修正”过的初始估计来计算避免滤波器用观测数据“自证”其可观测性。3.3 方案对比与选型建议用表格总结一下两种方案的核心区别方案核心思想实现难度计算开销适用场景可观测性约束修正F和H使线性化系统零空间与真实系统一致较高需要推导零空间基向量中等需要额外的矩阵运算对精度要求高、状态维度较大、想从理论上严格保证一致性的场合FEJ固定雅可比计算点使用首次估计值较低改动量少很低只需记住初次估计值工程实现、快速验证、系统规模可控的场景我个人在实际项目中的体会是FEJ虽然理论上对特定系统如下文提到的“某一被研究系统”有严格的一致性保证但在通用SLAM场景中可观测性约束的适用范围更广因为它不依赖于具体的运动模型结构。不过FEJ胜在实现简单、改动量小特别适合快速验证一致性是否真的是问题所在——先跑一版FEJ如果NEES显著改善了再考虑进阶的可观测性约束修正。4. Matlab代码实现与关键环节拆解4.1 整体框架仿真系统搭建我们先搭建一个完整的仿真环境来验证不一致性问题。环境包含一个二维平面中的机器人机器人在平面上运动同时观测周围的路标点。传感器提供距离和方位角信息带有高斯噪声。初始化时定义仿真区域、真实路标位置、机器人真实轨迹预设的运动控制输入然后运行标准EKF进行SLAM记录每一时刻的估计误差和协方差计算NEES来评估一致性。随后加入可观测性约束对比两种方案的NEES表现。先给出运动模型和观测模型的代码骨架% 运动模型: 机器人状态 [x; y; theta] % 控制输入 u [v; omega] 线速度和角速度 % dt 为时间步长 function x_next motion_model(x, u, dt) x_next zeros(3, 1); v u(1); omega u(2); if abs(omega) 1e-6 % 转弯运动模型 x_next(1) x(1) - v/omega * sin(x(3)) v/omega * sin(x(3) omega*dt); x_next(2) x(2) v/omega * cos(x(3)) - v/omega * cos(x(3) omega*dt); x_next(3) x(3) omega * dt; else % 直线运动模型 x_next(1) x(1) v * cos(x(3)) * dt; x_next(2) x(2) v * sin(x(3)) * dt; x_next(3) x(3); end end观测模型是路标相对于机器人的距离和方位角% 观测模型: 观测到路标点 [lm_x; lm_y] % 输出 z [r; phi] 距离和方位角 function z observation_model(x, lm) dx lm(1) - x(1); dy lm(2) - x(2); r sqrt(dx^2 dy^2); phi atan2(dy, dx) - x(3); % 角度归一化到 [-pi, pi) phi wrapToPi(phi); z [r; phi]; end4.2 核心关键点雅可比矩阵的计算在标准EKF中每一步都要计算运动模型和观测模型的雅可比矩阵。这两个矩阵的计算方式直接决定了线性化系统的可观测性。运动模型雅可比矩阵F对机器人状态求导function F calc_jacobian_motion(x, u, dt) v u(1); omega u(2); F eye(3); % 状态只包含机器人位姿暂时不含路标 if abs(omega) 1e-6 F(1, 3) -v/omega * cos(x(3)) v/omega * cos(x(3) omega*dt); F(2, 3) -v/omega * sin(x(3)) v/omega * sin(x(3) omega*dt); else F(1, 3) -v * sin(x(3)) * dt; F(2, 3) v * cos(x(3)) * dt; end end观测模型雅可比矩阵H对机器人状态和路标状态求导。设状态向量为 [xr; yr; theta; lm_x; lm_y]观测为 [r; phi]function H calc_jacobian_observation(x, lm) dx lm(1) - x(1); dy lm(2) - x(2); r sqrt(dx^2 dy^2); H zeros(2, 5); H(1, 1) -dx / r; H(1, 2) -dy / r; H(1, 4) dx / r; H(1, 5) dy / r; H(2, 1) dy / r^2; H(2, 2) -dx / r^2; H(2, 3) -1; H(2, 4) -dy / r^2; H(2, 5) dx / r^2; end这里有一个非常关键且容易踩坑的点观测模型的雅可比矩阵H在计算时用到的(x, y, theta)到底是预测值还是当前估计值。标准EKF用的是预测值但这里的“预测值”本质上也是当前估计状态的函数随着滤波进行它本身也在不断变化。这正是导致可观测性不一致的微观机制之一。4.3 可观测性矩阵的计算与零空间提取我们来写一个函数计算从时刻0到k的累积可观测性矩阵并提取零空间基向量。function [O, null_space] compute_observability(F_list, H_list) % F_list: 1xk的cell数组每个元素是状态转移雅可比矩阵 % H_list: 1xk的cell数组每个元素是观测雅可比矩阵 % 返回可观测性矩阵O和其零空间的基向量 k length(H_list); % 计算总的可观测性矩阵 O []; % 计算状态维度 n size(H_list{1}, 2); for i 1:k % 计算从时刻0到i的累积转移矩阵 Psi_i F(i-1) * ... * F(1) * F(0) Psi eye(n); for j 1:i Psi F_list{j} * Psi; end O_i H_list{i} * Psi; O [O; O_i]; end % 对O做奇异值分解找零空间 [~, S, V] svd(O); % 奇异值接近0的列向量为零空间基 tol max(size(O)) * eps * max(diag(S)); null_dim sum(diag(S) tol); if null_dim 0 null_space V(:, end-null_dim1:end); else null_space zeros(n, 0); end end这里用了奇异值分解SVD来求零空间比直接在Matlab里用null函数更灵活——你可以自己控制截断阈值对数值稳定性有更好的把握。实践中我建议一定设置基于机器精度的容差而不是直接用默认的null函数否则在大型矩阵下容易漏掉某些零空间方向。4.4 一致性修正的核心实现可观测性约束现在进入本文的核心代码实现。我们的目标是在每一步得到F和H之后对它们进行修正使得累积可观测性矩阵的零空间包含理论推导的不可观测子空间。二维SLAM的不可观测子空间由3个基向量张成对应全局平移x、全局平移y、全局旋转。这3个向量在代码中直接构造% 总状态向量为 [x_robot; y_robot; theta_robot; lm_1_x; lm_1_y; lm_2_x; lm_2_y; ...] % 不可观测子空间基向量对每个路标平移的影响一致 % N1: 全局x方向平移 [1; 0; 0; 1; 0; 1; 0; ...] % N2: 全局y方向平移 [0; 1; 0; 0; 1; 0; 1; ...] % N3: 全局旋转 [0; 0; 1; -y0_1; x0_1; -y0_2; x0_2; ...] % 注意N3需要用到首次观测时的位置 num_landmarks ...; % 路标数量 N zeros(32*num_landmarks, 3); N(1, 1) 1; N(4:2:end, 1) 1; % x平移 N(2, 2) 1; N(5:2:end, 2) 1; % y平移 N(3, 3) 1; % 旋转部分 % 对于旋转需要基于路标首次观测位置来填充分量 for i 1:num_landmarks idx 3 2*(i-1); N(idx1, 3) -initial_lm_y(i); N(idx2, 3) initial_lm_x(i); end这一步有几个容易出错的细节我分开说旋转方向不可观测子空间的基向量不是常数它依赖路标在首次观测时刻的全局位置。这和FEJ的思想一脉相承这个“首次观测时的位置”在整个滤波过程中应该保持不变否则零空间方向会偏移。平移基向量N1和N2看似简单但实际代码中要检查每个路标状态索引是否正确。状态向量里路标坐标是成对出现的一旦索引错位零空间计算出来的结果会完全错误还很难排查。有了零空间基向量N接下来对F和H进行修正。修正的核心是确保如下条件成立O * N 0即H_i * Psi_i * N 0对每个时刻i都成立。实际工程中更常用的是直接对单个雅可比矩阵做投影修正下面是实现方法% 对雅可比矩阵AF或H做零空间约束修正 function A_corrected null_space_projection(A, N) % A: 原始雅可比矩阵 % N: 不可观测子空间基向量列向量张成零空间 % 思路A_corrected A - A * N * pinv(N) % 使得 A_corrected * N 0 N_pinv pinv(N); A_corrected A - (A * N) * N_pinv; end这个修正是这么运作的A * N表示雅可比矩阵在不可观测方向上的响应如果它不是零说明雅可比矩阵错误地“感知”了不可观测的变化。我们要做的就是把这个错误的响应从A中减去。(A * N) * pinv(N)就是A在N方向上的分量重构减去它即剔除了该方向上的错误信息。实际使用时对F和H都要做这个修正修正后系统的可观测性矩阵零空间才会被约束在正确的维度。注意上面只是修正单个雅可比矩阵更严谨的做法还需要考虑累积转移矩阵中的交叉项但实践中最有效的经验法则是——每个时刻分别修正F和H效果已经足够好累积约束的额外提升通常不明显但实现复杂度会高很多。4.5 FEJ方案的Matlab实现FEJ的实现比可观测性约束要简单得多。核心是记住每个状态变量首次被估计到的值然后在所有后续的雅可比计算中用这个“首次估计值”代替当前估计值。在Matlab里可以用一个数组存储首次估计值% 初始化 fej_first_estimate zeros(n, 1); fej_initialized false(n, 1); % 在每个时刻的雅可比计算中 function F calc_jacobian_motion_fej(x_fej, u, dt) % x_fej 是当前状态对应的首次估计值 % 其余计算逻辑与标准雅可比计算完全相同 % 但一律使用 x_fej 代替当前估计 ... end整个代码唯一的改动在于传参标准EKF传当前估计值x_estFEJ传x_fej。最关键的一点是FEJ中状态向量中每个部分机器人位姿、每个路标的首次估计值必须在它第一次被加入状态向量时就固定下来。路标的首次估计值通常是在首次观测到这个路标时通过逆观测模型计算得到的即landmark initialization机器人位姿的首次估计值则是滤波开始时的初始状态。这里有一个容易忽视的工程细节路标初始化时用逆观测模型计算位置这个值后续会被状态更新反复修正。如果存储首次估计值的代码不小心用了修正后的值比如变量覆盖FEJ就失效了而且这种失效非常隐蔽——NEES只是轻微劣化不会剧烈发散很容易被误认为参数调优的问题。4.6 完整仿真流程组装最后把上面的组件组装成完整的仿真脚本。流程如下% 主循环 for k 1:total_steps % 1. 预测 u control_input(:, k); x_pred motion_model(x_est, u, dt); F calc_jacobian_motion(x_est, u, dt); % 可观测性约束修正F F null_space_projection(F, N); % 完整状态向量需要扩展F到包含路标维度的雅可比矩阵 F_full expand_F(F, num_landmarks); P_pred F_full * P * F_full Q_full; % 2. 数据关联与更新 for j 1:observed_landmarks_count lm_id observed_ids(j); lm_pos x_est(3 2*(lm_id-1) (1:2)); H calc_jacobian_observation(x_pred(1:3), lm_pos); % 扩展H到全状态维度只与机器人状态和当前路标相关 H_full expand_H(H, lm_id, num_landmarks); % 可观测性约束修正H H_full null_space_projection(H_full, N); % 标准卡尔曼更新 z_pred observation_model(x_pred(1:3), lm_pos); S H_full * P_pred * H_full R; K P_pred * H_full / S; x_est x_pred K * (z_measured(:, k) - z_pred); P_pred (eye(n) - K * H_full) * P_pred; end % 3. 计算NEES nees_values(k) calc_nees(x_est, P_pred, x_true(:, k)); end关于expand_F和expand_H这两个函数本质是把只针对机器人状态的雅可比矩阵扩展到全状态维度路标状态部分对应位置补零F或仅在当前观测路标处填入非零块H。下图大致描述状态向量和雅可比矩阵的维度关系不需要额外工具直接用矩阵索引操作即可。运行仿真后对比标准EKF和加约束方案的结果。用100次蒙特卡洛仿真计算平均NEES通常的结果是标准EKF的平均NEES远大於理论值3比如十几甚至几十且随滤波步数持续增长呈现明显的发散趋势。可观测性约束方案的平均NEES贴近理论值3波动在可接受范围内。FEJ方案的效果取决于具体运动轨迹的实验设定在一些设定下几乎与可观测性约束方案相当。5. 常见坑与排查技巧实录5.1 可观测性矩阵的数值稳定性问题这是我在实际操作中踩过最大的坑。直接用null(O)函数求零空间时由于状态维度增大和多次矩阵乘法累积的数值误差真正应该为零的奇异值可能会变成很小的非零值导致零空间维度判断错误。解决办法是手动控制奇异值截断阈值。推荐的做法是tol max(size(O)) * eps(max(S)); null_dim sum(diag(S) tol);这个阈值公式来自数值线性代数的标准实践比固定阈值比如1e-10可靠得多。如果你发现NEES在某些路标数量下时好时坏先检查这一步。5.2 NEES结果不稳定时的排查思路有次我跑仿真发现可观测性约束方案的NEES依然偏大排查了很久后发现是路标首次观测位置的存储出了问题。具体表现是算法在一开始对路标位置的初始估计不太准后续修正后存储的“首次估计值”被覆盖成了较准的值导致零空间基向量在滤波过程中发生了偏移。而一旦零空间方向不稳定整个约束修正就形同虚设。排查这类问题有一个很实用的诊断方法把每一步修正前后的可观测性矩阵零空间维度打印出来和理论值对比。如果修正后的零空间维度仍然在不断变化说明约束没有正确施加几乎可以断定是零空间基向量N的计算或存储有问题。5.3 数据关联错误与一致性耦合还有一个经常被忽略的点EKF-SLAM中数据关联Data Association错误会直接影响可观测性分析的有效性。上述所有分析都假设观测数据正确地对应到了已知路标。一旦数据关联出错系统模型本身就错了后续的可观测性约束即使正确实现也无法挽回。我的建议是做仿真验证时先用简单的最近邻数据关联并加入距离门限gating确保关联正确后再评价一致性。否则你分不清NEES劣化到底是来自一致性修正失效还是单纯的数据关联错误。5.4 一个容易被忽视的初始化顺序问题FEJ和可观测性约束都依赖于“首次观测时的位置”。但标准EKF中路标的首次观测值是通过逆观测模型计算得到的这个逆观测模型计算使用当前机器人状态估计。如果机器人的初始位姿误差比较大路标的首次估计值也会误差很大而FEJ把这个不准的值固定下来用于所有后续雅可比计算可能导致滤波整个发飘。经验做法是开始滤波前先用一小段轨迹和足够多的观测做一个简单的批处理初始化比如用最小二乘估计机器人初始位姿和初始路标位置让首次估计值不至于离谱。我试过在初始化误差较大的情况下FEJ方案的性能反而比标准EKF更差——理论上的优势只有在初始化合理时才能兑现。5.5 仿真中的轨迹设计设计仿真轨迹时最好覆盖多种运动模式直线、转弯、原地旋转等。不同运动模式下系统的可观测性结构会有微妙差异一致性修正的效果也不同。一种偷懒但有效的方法是设计一个“8”字形轨迹同时保证机器人在运动过程中能反复观测到相同的路标——这样可以充分触发滤波器的信息积累过程让不一致性问题更容易暴露。6. 拓展这套分析思路能用到哪可观测性视角的价值不局限于EKF-SLAM本身。任何基于EKF的估计问题都可以用这套分析框架来审视一致性只要系统存在本质不可观测的方向而你又用EKF这种基于线性化的方法去估计不一致性问题就潜在地存在。典型的例子包括惯性导航与视觉里程计融合VIO全局位置和姿态的某些分量在特定运动下不可观测而EKF线性化会引入虚假信息。可观测性约束的方法在这里同样可以移植而且效果显著。多机器人协同SLAM多机相对位姿的可观测性分析更复杂但方法论的思路完全一致。带有回环检测的SLAM系统回环本质上是一个更强的观测它确实能增强可观测性。但如果不做可观测性约束修正回环检测后的协方差更新同样会带着线性化误差只是问题被回环修正掩盖了。在我看来做SLAM算法优化的核心能力之一就是能从“滤波器输出看起来合理”的表面现象中识别出背后的一致性隐患。可观测性分析提供了一套数学工具让你能定量地评估“盲目自信”到底有多严重并且给出了一条明确的修正路径。这篇文章涉及的Matlab代码框架可以直接作为实验平台来运行。建议你按文中的步骤自己实现一遍标准EKF-SLAM然后加入可观测性约束对比NEES的变化曲线。当你亲眼看到NEES从十几降回到3附近那种对滤波器内部机理的理解深度是任何理论推导都替代不了的。这也是我当初坚持下去、最终真正弄懂这个问题的最大动力。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑