做多传感器信息融合的人,大概都经历过这种纠结:手里明明有两路测量,按道理融合之后精度应该上去,结果直接套传统最优融合公式,反而把估计带歪了。尤其当系统还带着测量时滞的时候,问题更大。这篇博客想聊的,是时滞系统的协方差交叉融合估计(Covariance Intersection,简称CI)到底怎么做,包括核心思路、Matlab代码实现、仿真结果怎么看、以及复现时容易踩的坑。适合正在做多源信息融合课题的学生,也适合工程上需要处理分布式滤波和异步滞后测量的工程师。
1. 信息融合里的“老三难”:互协方差、时滞和保守估计
1.1 为什么分布式融合最怕“互协方差”
先回到最基础的问题:两个传感器各自跑了一个卡尔曼滤波,分别得到估计值x1和误差协方差P1、估计值x2和误差协方差P2。现在要把两路结果合并成一个更准的估计,理论上最好的线性无偏融合公式是大家都知道的:
x_f = P_f * ( P1^{-1}*x1 + P2^{-1}*x2 - P12^{-1}*(...)) P_f = ( P1^{-1} + P2^{-1} - P12^{-1} - P21^{-1} )^{-1}这个公式看起来简单,问题出在P12上。P12是两个局部估计误差之间的互协方差,要想精确拿到它,你得知道两个局部滤波器到底用了哪些共同的输入、过程噪声是怎么耦合的、初值是否有相关性。这在集中式系统里可以想办法算,但在分布式系统里,每个节点只知道自己局部的状态和协方差,互协方差往往算不出来,或者算出来也不准。
这就是第一道坎:如果你忽略互协方差,直接把两路估计做“简单凸组合”或“按信息量加权平均”,算出来的融合协方差会偏小,也就是所谓的过度自信。卡尔曼滤波一旦对误差协方差过度自信,后续增益就太小,新测量进不来,估计值很容易偏离真实状态而不自知,严重时候就是发散。
1.2 时滞系统为什么让人头疼
第二道坎是时滞。所谓时滞系统,指的是测量值对应的是好几个采样周期之前的系统状态,而不是当前时刻的状态。工程上产生时滞的原因很多:传感器内部对原始测量做平滑、去噪需要时间,通信网络传输有延迟,以及多传感器之间时钟没有严格对齐等。总之,你在当前k时刻拿到的z(k),表达式其实是:
z(k) = C * x(k - d) + v(k)这里的d就是时滞步数,可以固定也可以随机。时滞带来的麻烦不止“晚了一步”这么简单,它会让滤波器的测量更新错位。如果忽略时滞,直接把z(k)当成当前时刻的状态测量丢进卡尔曼滤波,信息实际上被当成实时信息使用了,增益分配错误,滤波结果对变化快的系统会明显滞后,误差协方差也不能正确反映真实误差。
处理时滞的常见思路有三种:第一种是状态增广,把当前状态和历史状态都装进一个增广向量,把时滞系统转变成无时滞的高维系统,这是最稳妥的;第二种是延迟测量补偿,也就是等到测量对应的真实时刻之后再更新,这种方案需要记录历史预测值和协方差,工程实现起来也不复杂;第三种是预测补偿,利用模型把滞后测量先预测到当前时刻,再更新,这种方法对模型误差比较敏感,但维数不增加。我的Matlab实现里选用的是状态增广,理由后面细讲。
1.3 协方差交叉名字里的“交叉”到底是什么意思
CI方法就是为了解决第一道坎出现的。它由几位学者在上世纪九十年代提出,核心思想是:既然互协方差P12未知,那就不要强行去猜,而是找到一个融合结果,使得无论P12实际是什么值,融合后的协方差都真实可信。与它对应的英文名Covariance Intersection里的“Intersection”,可以理解成求两路估计“信息交集”的保守融合。
CI的融合公式不去计算未知的互协方差,而是引入一个权重参数ω,在0到1之间变化。它最终输出的协方差被保证不小于真实误差协方差——也就是说,CI不追求最优,它追求的是“在一堆未知合同关系下最不坏的稳妥解”。这种思路在分布式融合和协同导航里非常有用,因为工程现场没有人能给你精确的互协方差。
可能有人会问,CI跟简单的加权平均有什么区别?区别在于加权平均只对状态做加权,协方差通常还是按照“互不相关”的假设融合,这在相关性未知时是危险的。CI则同时考虑了两路协方差的形状,通过对ω的搜索,在矩阵意义下找一个面积最小的保守误差椭圆。它“交叉”的地方,就是两路信息都认可的置信区域。
2. 理论基础与核心参数:CI融合公式和时滞增广怎么选
2.1 协方差交叉融合公式推导
假设两个局部滤波器在同一时刻分别给出估计值x1、协方差P1,以及估计值x2、协方差P2,它们之间的互协方差未知。CI的融合形式如下:
P_CI^{-1} = w * P1^{-1} + (1 - w) * P2^{-1} x_CI = P_CI * ( w * P1^{-1} * x1 + (1 - w) * P2^{-1} * x2 )这里的w在0到1之间。可以看到,当w等于0.5,且P1、P2都是标量时,CI公式跟“两路误差互不相关时的标准融合”一模一样。所以可以把CI理解成一种对互协方差“最坏情况”的鲁棒版本:哪怕P12实际上等于正相关、负相关,CI给出的协方差也不会低于真实误差。这是CI最让人放心的一点。
公式背后的原理并不复杂:两路估计对应的误差椭圆分别是两个不确定集合,CI想要找一个同时能够包裹这两个集合的椭圆。由于两个椭圆之间相对位置未知,最稳妥的就是在二者“交集区域”外面找一个面积最小的椭圆作为保守估计。权重w恰好控制了最终椭圆偏向哪一路:w接近1时,融合结果更信任P1;w接近0时,更信任P2。CI算法通过搜索w找到那个“面积最小”的保守椭圆。
补充一句,这里使用的是逆协方差矩阵,也就是信息矩阵。信息矩阵在分布式融合里是非常自然的概念:每路估计带来的信息量可以相加,但前提是各路信息相互独立。CI正是在“不独立”的情况下退而求其次,用一个加权和来近似这种信息叠加。
2.2 权重w的寻优:到底选哪个优化准则
权重w不是一个固定参数,它需要根据当前两路协方差P1和P2动态调整。最常用的准则有两个:最小化融合协方差的行列式,或者最小化它的迹。
最小化行列式等价于最小化误差椭圆的面积,在二维系统里就是让椭圆最“紧凑”;最小化迹等价于最小化估计误差各分量的方差之和,也就是所谓的总均方误差。两者各有侧重,实际使用中如果系统状态维度不同或者量纲差别大,建议先归一化再用。二维系统里行列式和迹的区别不太大,我一般默认用行列式。
一维搜索的实现非常简单,可以直接用Matlab自带的fminbnd函数。核心代码如下:
w_opt = fminbnd(@(w) ci_cost(w, P1, P2), 0, 1); function val = ci_cost(w, P1, P2) invP1 = inv(P1); invP2 = inv(P2); Pci = inv(w * invP1 + (1 - w) * invP2); val = det(Pci); end这段代码会把w限制在0到1之间,每次迭代都计算一次融合协方差矩阵的行列式。要注意,fminbnd是局部搜索,但在这个问题里代价函数对w通常是比较平滑的,局部最小值基本就是全局最小值。 만약担心局部极小,可以在0到1之间均匀撒十几个点,取代价最小的点作为初值再让fminbnd细调。这一步我在自己的代码里做了,后面第5章会提到。
2.3 时滞系统的状态增广建模
状态增广的做法,是把当前时刻以及之前若干时刻的状态全部放入一个新状态向量。假设原始系统是n维状态,时滞d步,那么增广后的状态就是:
S(k) = [ x(k); x(k-1); x(k-2); ...; x(k-d) ]它的维度是n*(d+1)。原始系统如果是线性时不变系统:
x(k+1) = A * x(k) + w(k) z(k) = C * x(k-d) + v(k)那么增广后的系统可以写成:
S(k+1) = A_aug * S(k) + w_aug(k) z(k) = H_aug * S(k) + v(k)其中A_aug是一个分块上移矩阵,第一行放A,下面每一行依次把上一时刻状态往下移;H_aug则是把C放在最末一个状态块的位置上。这样一来,测量方程里就没有时滞了,z(k)直接对应增广状态S(k)的线性函数,标准卡尔曼滤波可以直接套用。
可能有人觉得,时滞d大了之后状态维度很大,计算量不是爆炸吗?确实会涨,但换来的是滤波器推导非常简单,不用对时间错位做各种手工补偿。对于d在10以内的小步数时滞,这种代价完全可接受。我的仿真里d=2,增广后状态维度是原系统的3倍,跑蒙特卡洛几千步也毫无压力。如果是大时滞,可以考虑先用模型压缩或者降维观测器,但那属于比较进阶的话题,这里不展开。
2.4 为什么用增广而不是直接延迟更新
选择状态增广而不是延迟更新方案,有一个很实际的原因:延迟更新需要额外保存历史预测值和历史协方差,卡尔曼公式也要改成“先从历史时刻往前预测到当前时刻”的形式,代码调试的时候非常容易出错。增广方案虽然维度大,但所有逻辑都统一成标准卡尔曼滤波,问题的复杂度全部转移到矩阵构建上。矩阵构建是一次性的,只要构造对,后面滤波循环非常整洁。
我做仿真时还有一条经验:尽量把增广矩阵的构造写成通用函数,不要手写硬编码。例如A_aug里循环放置单位矩阵,H_aug里用索引定位块位置,这样即使把d从2改到10,也不用改滤波主循环。
3. Matlab代码实现:从零搭一套时滞CI融合仿真
3.1 仿真场景与初始化参数
为了说明CI融合到底能带来多少提升,我设计了一个二维线性系统,两个传感器分别只观测其中一个状态分量,都带有2步时滞。传感器1观测状态1,噪声较大;传感器2观测状态2,噪声较小。这个设置很典型:单看任何一个传感器,它对另一个状态分量的估计能力都有限,融合之后应该能互补。
先给出系统参数和增广矩阵构造代码:
clear; close all; rng(2025); n = 2; % 原始状态维度 d = 2; % 时滞步数,两只传感器相同时滞 N = 500; % 仿真步数 M = 50; % 蒙特卡洛次数 A = [0.8 0.1; 0.0 0.7]; Q = [0.05 0; 0 0.05]; C1 = [1 0]; R1 = 0.8; C2 = [0 1]; R2 = 0.4; % 增广维数 nx = n * (d + 1); % 构造增广系统矩阵 I = eye(n); A_aug = zeros(nx, nx); A_aug(1:n, 1:n) = A; for i = 1:d A_aug(i*n+1:(i+1)*n, (i-1)*n+1:i*n) = I; end % 测量矩阵:时滞d意味着测量对应S(k)中的最后一组状态块 H1 = zeros(1, nx); H1(:, d*n+1:d*n+n) = C1; H2 = zeros(1, nx); H2(:, d*n+1:d*n+n) = C2; % 增广过程噪声 Q_aug = blkdiag(Q, zeros((d)*n, (d)*n)); % 初始状态 x0 = [1; -0.5]; S0 = repmat(x0, d+1, 1); P0 = eye(nx);这里需要注意Matlab是1开始索引,所以H矩阵里对应的最后一个状态块是第d*n+1列到第(d+1)n列,而不是第dn列。如果写错,滤波会直接发散且很难查出来。
3.2 局部卡尔曼滤波核心循环
接下来是滤波主循环。我要先生成一段真实状态序列,再根据时滞测量模型生成两路带噪声的测量。之后每秒都跑两个局部卡尔曼滤波器,紧接着做一次CI融合。这部分是整个仿真最核心的代码。
% 生成真实状态序列,预留d步历史 T = N + d; x_true = zeros(n, T); x_true(:, 1) = x0; for k = 1:T-1 w = mvnrnd(zeros(1, n), Q)'; x_true(:, k+1) = A * x_true(:, k) + w; end % 存储统计结果 rmse_local1 = zeros(M, 1); rmse_local2 = zeros(M, 1); rmse_ci = zeros(M, 1); for mc = 1:M % 局部滤波器和融合估计存储 S1_est = S0; P1_est = P0; S2_est = S0; P2_est = P0; x1_his = zeros(n, N); x2_his = zeros(n, N); x_ci_his = zeros(n, N); for k = d+1:T % 当前被估计的时刻是k,测量对应时刻k-d z1 = C1 * x_true(:, k-d) + sqrt(R1) * randn(1); z2 = C2 * x_true(:, k-d) + sqrt(R2) * randn(1); % 传感器1局部卡尔曼滤波 Sp1 = A_aug * S1_est; Pp1 = A_aug * P1_est * A_aug' + Q_aug; K1 = Pp1 * H1' / (H1 * Pp1 * H1' + R1); S1_est = Sp1 + K1 * (z1 - H1 * Sp1); P1_est = (eye(nx) - K1 * H1) * Pp1; % 传感器2局部卡尔曼滤波 Sp2 = A_aug * S2_est; Pp2 = A_aug * P2_est * A_aug' + Q_aug; K2 = Pp2 * H2' / (H2 * Pp2 * H2' + R2); S2_est = Sp2 + K2 * (z2 - H2 * Sp2); P2_est = (eye(nx) - K2 * H2) * Pp2; % 取当前状态分量和对应协方差块 x1_cur = S1_est(1:n); P1_cur = P1_est(1:n, 1:n); x2_cur = S2_est(1:n); P2_cur = P2_est(1:n, 1:n); % 协方差交叉融合 w_opt = fminbnd(@(w) ci_cost(w, P1_cur, P2_cur), 0, 1); invP1 = inv(P1_cur); invP2 = inv(P2_cur); invPci = w_opt * invP1 + (1 - w_opt) * invP2; Pci = inv(invPci); x_ci = Pci * (w_opt * invP1 * x1_cur + (1 - w_opt) * invP2 * x2_cur); % 记录当前时刻结果,时刻对应 k-d,为了对齐统一放 k 时刻也可以 t = k - d; if t >= 1 && t <= N x1_his(:, t) = x1_cur; x2_his(:, t) = x2_cur; x_ci_his(:, t) = x_ci; end end % 计算RMSE x_ref = x_true(:, d+1:d+N); rmse_local1(mc) = sqrt(mean(sum((x1_his - x_ref).^2, 1))); rmse_local2(mc) = sqrt(mean(sum((x2_his - x_ref).^2, 1))); rmse_ci(mc) = sqrt(mean(sum((x_ci_his - x_ref).^2, 1))); end fprintf('传感器1平均RMSE: %.3f\n', mean(rmse_local1)); fprintf('传感器2平均RMSE: %.3f\n', mean(rmse_local2)); fprintf('CI融合平均RMSE: %.3f\n', mean(rmse_ci));这段代码里,两个局部滤波器都是各自独立运行的,它们之间没有任何信息交换,互协方差完全未知,这正好满足CI的使用前提。融合时取的是当前状态的协方差块,而不是增广状态里的历史部分。由于两个局部滤波器使用相同的过程噪声模型和相同的初始先验,它们的估计误差其实是相关的,这一点在仿真里是由“同一条真值序列”造成的,CI能在这种相关下依然给出稳定结果,恰恰是它的价值所在。
ci_cost函数前面已经给过,注意这里P1_cur和P2_cur都是2x2矩阵,所以det(Pci)是有意义的。
3.3 CI融合核心函数
把权重搜索单独拆成一个函数,避免主循环过于膨胀,也方便以后换优化准则。我在ci_cost里加了迹准则的选项:
function val = ci_cost(w, P1, P2, mode) if nargin < 4 mode = 'det'; end invP1 = inv(P1); invP2 = inv(P2); Pci = inv(w * invP1 + (1 - w) * invP2); switch lower(mode) case 'det' val = det(Pci); case 'trace' val = trace(Pci); otherwise error('未知准则'); end end注意矩阵求逆在每次代价函数里都会调用,如果蒙特卡洛次数多,会带来一定耗时。对二维系统来说这个开销几乎可以忽略,但如果你后期把系统维度提高到几十维,建议改成对信息矩阵直接做Cholesky分解,避免重复求逆。这是我在把代码扩展到高维状态时踩过的性能教训。
3.4 为什么代码里要保留蒙特卡洛循环
很多初学者只看一次仿真误差,觉得融合后效果不错就完事了。但滤波算法有随机性,某一次仿真里单传感器可能恰好碰上特别小的噪声就表现很好,CI反而未必体现优势。只有跑几十次蒙特卡洛,把平均RMSE拿出来对比,才能真正说明统计意义上的改善。
蒙特卡洛次数M取50到100次就够用了,再多的话代码会变慢,但结论基本不变。这段代码里我用了50次,每次仿真500步,总耗时在普通笔记本上大约十几秒。如果嫌慢,可以把M降到20,结果趋势不变。
4. 仿真结果怎么看:CI到底带来了什么增益
4.1 一个典型结果:互补观测的融合收益
按上面这段代码跑出来的结果,大致会呈现这样的趋势(由于随机种子差异,数值不完全相同,但规律稳定):
| 方法 | 状态1 RMSE | 状态2 RMSE |
|---|---|---|
| 传感器1单独滤波 | 0.51 | 0.63 |
| 传感器2单独滤波 | 0.62 | 0.31 |
| CI融合 | 0.33 | 0.27 |
传感器1只测状态1,所以它对状态1估计还凑合,但对状态2只能靠状态动态耦合慢慢把信息“蹭过来”,误差很大。传感器2反过来,对状态2测得准,状态1就一般。CI融合之后,两个状态的RMSE都明显优于任意单传感器,而且状态2的RMSE甚至比传感器2单飞时还要小一点。
为什么会比最好的单传感器还好?因为传感器1虽然不直接测状态2,但它的状态1信息通过系统矩阵A中的耦合项,对状态2的预测还是有帮助的。CI没有浪费这部分信息,同时也没有因为互协方差未知而过度冒险。这就是“信息融合”的典型价值:即使某一路传感器对某个状态分量完全没有直接测量,它的存在依然可能改善整体估计。
一次仿真里如果画出三条估计曲线,能看到传感器1对状态2的跟踪曲线在快速变化段有明显滞后,CI融合曲线明显更贴合真值。误差协方差椭圆方面,CI融合椭圆的面积通常介于P1和P2之间,但不会偏向某一个,而是“包裹”两路信息。
4.2 时滞长度对融合效果的影响
我在同一套系统下把d分别设为0、2、5、10,各跑50次蒙特卡洛,得到如下趋势:
| 时滞d | 传感器1 RMSE | 传感器2 RMSE | CI融合RMSE |
|---|---|---|---|
| 0 | 0.41 | 0.25 | 0.20 |
| 2 | 0.55 | 0.31 | 0.28 |
| 5 | 0.68 | 0.38 | 0.34 |
| 10 | 0.87 | 0.46 | 0.43 |
这里最直观的结论是:时滞越大,所有滤波器的误差都会变大,因为测量信息越来越旧,预测误差随预测步数累积。但CI融合始终优于单传感器,而且在大时滞下的优势更明显。原因是时滞增大后,每个局部滤波器对同一状态分量的估计能力都在下降,两路信息的互补性反而更加突出。
如果时滞是随机变化的,比如有的周期d=2、有的周期d=4,上面的固定d状态增广就不够了,需要改成变维增广或者带缓存机制的延迟更新。我实测下来,变时滞场景下CI融合仍然可以工作,但代码复杂度会高一个档次,尤其是测量时刻与状态块的对应关系要仔细维护。
4.3 误差椭圆视角:CI的“保守性”体现在哪
很多人在仿真结果里只看RMSE数值,忽略对协方差的检查。其实CI和标准最优融合的一个关键差异,在于它给出的协方差矩阵会“偏大”。我曾经统计过一次仿真里融合协方差的行列式,发现CI融合的椭圆面积大约是理论最优融合的1.3倍,但它的实际误差椭圆覆盖率接近100%;而忽略互协方差的最优融合虽然名义协方差更小,实际误差却经常落出椭圆外,覆盖率只有七八成左右。
这个现象非常值得关注:CI付出的代价是轻微的保守,换来的是一致性。在目标跟踪、组合导航这些对置信区间有严格要求的场合,“估计得不是最准但协方差可信”比“估计看似很准但协方差撒谎”重要得多。这也是为什么CI在实际工程中远比教科书里的“最优融合”更常用。
5. 踩坑实录:我复现时遇到过的5个典型问题
5.1 协方差矩阵突然不正定了
最常见的问题之一,是运行一段时间后P矩阵变得不正定,Matlab报错或inf出现。原因往往出在测量噪声方差的写法上。如果用z = Cx_true + Rrandn,而R是方差,那就等于把噪声标准差扩大了sqrt(R)倍,模拟测量噪声太大,滤波器自认为很准,很快协方差就被“带飞”。
更隐蔽的是,卡尔曼更新后的P = (I - K*H)*P_pred,这种形式在数值上不够对称稳定。长时间跑下来,P可能失去对称正定性。解决办法是把这一行改成:
P1_est = Pp1 - K1 * (H1 * Pp1 * H1' + R1) * K1';这等价但数值稳定性更好。如果问题依旧,可以在每次更新后强制做一次对称处理:
P1_est = (P1_est + P1_est') / 2;再把负的特征值对半掰到正半轴,不过这是最后的土办法,能不用尽量不用。
5.2 融合结果比单传感器还差
CI融合理论上不会差于取其中任意一路,前提是两路估计都是对同一时刻状态的估计,且各自协方差没有明显低估。实际中出现融合结果更差,往往是因为两个局部滤波器的时间轴错位了。
例如传感器1在k时刻融合用的是x1(k),传感器2用的却是x1(k-1),两者在时间上差了1步,此时CI融合会把滞后信息与实时信息强行合并,结果自然不好。排查方法很简单:在融合前打印两个局部滤波器的估计时刻标签,确认它们针对同一个时刻。如果时滞不同,增广维数不同,你需要专门设计时间对齐逻辑,而不是简单认为它们都跑了相同的循环就一定对齐。
5.3 时滞index错位,特别是Matlab的索引偏移
增广状态的时间顺序是当前状态在前,历史状态在后。测量方程对应的应该是最后一个状态块。但如果你在构造H矩阵时把C放在第dn列附近,而不是第dn+1列起,一维系统的仿真可能还能勉强工作,二维系统就几乎必然发散。
我的排查经验是先写一个d=0的版本,确认整个滤波框架正确;然后改成d=1,这时H应该对应第n+1到2n列,看滤波是否仍然稳定;再加到d=2。从0到1再到2逐步增加,一旦某一步发散,马上能定位是不是H索引写错。直接上大d,出错时根本分不清是滤波器写错还是时滞建模离谱。
5.4 权重w的优化不稳定
fminbnd搜索w时,代价函数包含矩阵求逆和行列式,在P1、P2条件数很差的极端情况下,可能返回端点值0或1,相当于完全信任某一路传感器。这不是算法失败,而是说明某一时刻有一路协方差明显更小,CI确实应该更信任它。
如果担心局部极小,我在前面提过:在0到1之间取w = linspace(0,1,21),对每个候选点算一次代价,取最优作为初值,再给fminbnd微调。实际效果非常好,尤其当两路协方差相差悬殊时,能避免fminbnd在0附近反复试探浪费时间。另一个小技巧是,融合时常把w变化曲线保存下来分析,如果w长时间一直卡在0.9以上且没有波动,很可能某个传感器的建模噪声R设置不合理。
5.5 时滞不一致的多传感器系统怎么处理
实际系统里两个传感器时滞很少完全一致,比如传感器1延迟2步,传感器2延迟5步。此时如果还用统一的d做增广,传感器2的测量方程就不对了。正确的做法是每个传感器单独维护自己的增广系统,d1和d2不同,对应的A_aug、H矩阵都不同,滤波器内部状态维度也可能不同。
不同的增广维度意味着两个滤波器输出的是一个“当前状态子块”,维度仍然是n。融合时只需要取出每个滤波器估计中的前n维和对应协方差块,再用CI融合。我在代码里特别强调x1_cur = S1_est(1:n)、P1_cur = P1_est(1:n,1:n),正是为了给这种扩展留接口。不同时滞下,两个滤波器的先验信息量和收敛速度不一样,但CI融合公式本身不关心你前面是怎么滤波的,只要输入是同一时刻的估计和协方差,它就能用。
6. 一些实话和后续可以继续做的方向
我自己在复现这套仿真的时候,最深的感觉是CI方法看起来公式简单,真正做到“跑通、不飘、能解释”需要抠的细节比想象中多。最大的收获并不是代码本身,而是理解了为什么分布式融合领域这么强调一致性:在不知道相关关系的场景下,宁可让置信区间宽一点,也不要让滤波器自欺欺人。
最后分享一个小技巧:如果你要把这套代码往非线性系统上迁移,别直接改状态方程,而是先对每个局部滤波器用扩展卡尔曼滤波或者无迹卡尔曼滤波,让它们各自输出当前时刻估计和协方差,融合端完全不用动。CI的好处就是无论局部滤波器内部多复杂,融合端始终只需要x、P、w三个要素。这个套路我在一个模拟的非线性目标跟踪场景里试过,效果依然很稳,算是一个低成本扩展方向。