

一句话介绍: 这套程序用 CV(匀速直线)和 CT(匀速转弯)两个运动模型共同跟踪一个会发生机动的二维目标,并利用 IMM(交互多模型)根据测量数据动态调整两个模型的概率,最终得到比固定单一运动模型更适合“直行—转弯—再直行”目标的状态估计结果。
目标跟踪最麻烦的地方,不是目标一直匀速直线运动,而是它可能突然改变运动方式。
例如一个目标可能:
先直线匀速 → 中间进入转弯 → 后面重新直线运动
如果整个过程始终只使用 CV 模型,那么转弯阶段容易出现模型失配;如果始终只使用 CT 模型,直线阶段又可能并不合适。
这个程序采用的思路是:
真实运动 + 测量噪声 → CV Kalman 跟踪 + CT Kalman 跟踪 → IMM 根据残差动态计算模型概率 → 融合两个模型结果 → 输出目标位置估计
它的核心不是“提前知道目标什么时候转弯”,而是根据每一时刻的测量结果,判断当前哪个运动模型更符合目标状态。
1. 这个程序真正实现了什么?
工程的主线非常清楚,理解下面几个文件即可。
文件 | 作用 |
|---|---|
| 主程序,完成 Monte Carlo 仿真、CV/CT 单模型滤波、IMM 融合和误差统计 |
| 生成“直线—转弯—直线”的真实二维运动轨迹 |
| 标准 Kalman 滤波预测和更新 |
| 建立 CT 模型状态转移矩阵和噪声输入矩阵 |
| 已生成的 400 个时刻真实轨迹及模型参数 |
程序实际完成四类比较:
只使用 CV 模型进行 Kalman 跟踪;
只使用 CT 模型进行 Kalman 跟踪;
使用 CV + CT 两模型构成 IMM 跟踪;
通过 50 次 Monte Carlo 仿真比较位置误差、RMSE 和模型概率。
2. 程序跟踪的目标状态是什么?
程序使用四维状态:
X = [x, vₓ, y, vᵧ]ᵀ
其中:
x:X 方向位置;vₓ:X 方向速度;
y:Y 方向位置;vᵧ:Y 方向速度。
初始状态为:
X₀ = [1000, 10, 1000, 10]ᵀ
也就是目标初始位于约 (1000, 1000),两个方向的初始速度均为 10。
程序的测量矩阵 H 只直接观测 x 和 y,因此传感器获得的是位置测量,速度需要由动态模型和 Kalman 滤波共同估计。
3. 自带真实轨迹是怎样运动的?
produce_data.m 共生成 400 个时刻的数据,采样周期 T = 1。
运动过程非常适合用来测试 IMM:
时间段 | 运动模型 | 持续时间 |
1~150 | CV 匀速直线 | 150 个时刻 |
151~270 | CT 匀速转弯 | 120 个时刻 |
271~400 | CV 匀速直线 | 130 个时刻 |
所以整个测试目标会经历一次明显的模型切换:
CV → CT → CV
这正是交互多模型滤波器需要处理的典型问题。
4. 测量数据为什么比真实轨迹“乱”很多?
主程序不会直接把真实位置送给滤波器,而是在 x、y 测量中加入高斯噪声。
测量噪声协方差为:
R = diag(2500, 2500)
因此两个方向的测量标准差均为:
σ = √2500 = 50
也就是说,即使真实目标轨迹很平滑,每次位置测量仍可能在真实值周围发生几十米级波动。
程序真正要做的是:
从带噪位置测量中恢复更加平滑、更加接近真实目标状态的位置和速度估计。
5. CV 模型负责什么?
CV 是 Constant Velocity,也就是匀速运动模型。
它假设一个采样周期内速度基本不变,因此:
xₖ = xₖ₋₁ + T·vₓ,ₖ₋₁
yₖ = yₖ₋₁ + T·vᵧ,ₖ₋₁
速度则近似保持:
vₓ,ₖ ≈ vₓ,ₖ₋₁,vᵧ,ₖ ≈ vᵧ,ₖ₋₁
这类模型非常适合目标基本沿直线稳定运动的阶段。
在本程序中,真实轨迹前 150 个时刻和最后 130 个时刻就是由 CV 模型产生的。
6. CT 模型为什么能描述转弯?
CT 是 Constant Turn,也就是程序注释中的“匀速转弯模型”。
与 CV 不同,CT 状态转移矩阵中包含:
sin(ωT);cos(ωT)
(1 - cos(ωT)) / ω
其中 ω 是转弯角速度。
这些三角函数使 X、Y 两个方向的速度不再完全独立,而是会随着转弯发生耦合,因此能够描述二维平面上的连续转弯运动。
真实数据生成时使用的转弯角速度为:
ω = -π / 360 rad/s
负号代表转向方向。
需要注意,主跟踪程序中的 CT 滤波模型重新设置为:
ω = -π / 270 rad/s
所以滤波器使用的 CT 模型与生成真实轨迹时并不完全一致。这意味着当前 Demo 不只是“完全已知模型条件下跟踪”,还存在一定的转弯模型失配。
7. Kalman 滤波在两个模型中做什么?
无论 CV 还是 CT,程序最终都使用 Kalman 滤波完成状态估计。
它的核心过程可以压缩成两步。
x̂ₖ⁻ = F x̂ₖ₋₁
Pₖ⁻ = F Pₖ₋₁ Fᵀ + GQGᵀ
其中:
x̂ₖ⁻:根据运动模型预测的当前状态;
Pₖ⁻:预测状态的不确定性;
F:CV 或 CT 的状态转移矩阵;
Q:过程噪声协方差。
Kₖ = Pₖ⁻Hᵀ(HPₖ⁻Hᵀ + R)⁻¹
x̂ₖ = x̂ₖ⁻ + Kₖ(zₖ - Hx̂ₖ⁻)
其中 zₖ 是当前带噪位置测量。
简单来说:
运动模型告诉程序“目标大概会走到哪里”,测量值告诉程序“传感器现在看到了哪里”,Kalman 增益 Kₖ 决定两者应该各相信多少。
8. 为什么只用一个 Kalman 模型还不够?
Kalman 滤波本身并不会自动知道目标的运动模式已经改变。
如果始终使用 CV:直线阶段通常比较合适;
目标进入转弯后,CV 的预测方向会逐渐偏离真实轨迹。
如果始终使用 CT:转弯阶段更适合;
长时间直线运动时,固定转弯假设又可能引入不必要的偏差。
所以问题不在于 Kalman 滤波“不好”,而在于:
单个 Kalman 滤波器必须依赖某一种运动模型,而机动目标的模型可能随时间改变。
IMM 就是为了解决这个问题。
9. IMM 到底做了什么?
IMM 全称 Interacting Multiple Model,即交互多模型。
当前程序同时维护两个 Kalman 滤波器:
CV 模型 + CT 模型
每一个时刻,IMM 会完成:
模型概率预测 → 两个模型状态混合 → 分别进行 Kalman 滤波 → 根据测量残差计算模型似然 → 更新模型概率 → 加权融合状态
所以它不是简单地把 CV 和 CT 各算一遍再平均,而是:
当前哪个模型更符合测量数据,哪个模型在最终结果中就占更大权重。
10. 模型概率是怎样变化的?
程序的模型转移概率矩阵为:
当前模型 | 下一时刻 CV | 下一时刻 CT |
CV | 0.99 | 0.01 |
CT | 0.01 | 0.99 |
这意味着程序假设:
当前运动模型大概率会在下一时刻继续保持,但仍然允许以 1% 的概率切换到另一种模型。
两个模型初始概率均为 0.5。
当新的测量到来后,程序根据两个模型的预测残差和残差协方差计算似然 Λ,再更新模型概率。
两模型情况下可以理解为:
μⱼ(k) = Λⱼ(k)cⱼ / [Λ₁(k)c₁ + Λ₂(k)c₂]
其中:
μⱼ(k):第 j 个模型更新后的概率;
Λⱼ(k):当前测量在第 j 个模型下出现的可能性;
cⱼ:根据上一时刻模型概率和转移概率得到的先验模型概率。
如果某段时间 CT 模型明显比 CV 更能解释测量数据,那么 CT 的概率就会提高;重新进入直线运动以后,CV 概率又有机会重新占优。
11. 最终 IMM 结果怎样得到?
两个模型完成各自 Kalman 更新后,程序不会硬选其中一个,而是按照当前模型概率进行融合:
x̂_IMM = μ₁x̂_CV + μ₂x̂_CT
其中:
μ₁:CV 模型概率;
μ₂:CT 模型概率;
x̂_CV:CV 模型当前状态估计;
x̂_CT:CT 模型当前状态估计。
而且:
μ₁ + μ₂ = 1
因此 IMM 的本质可以理解成:
模型概率高的结果多占一些,模型概率低的结果少占一些。
这使滤波器能够在不同运动阶段之间平滑切换,而不是突然把一个模型完全关闭。
12. 为什么 IMM 特别适合这个任务?
真实机动目标并不会永远遵守一个固定模型。
这份测试数据本身就经历 CV → CT → CV。如果只选一个模型,那么至少有一段时间一定会发生失配。
IMM 同时保留多个候选模型,因此更适合这种运动状态会切换的目标。
程序虽然使用真实轨迹做仿真评价,但 IMM 滤波器并没有直接读取“现在进入 CT 阶段”这样的标签。
模型概率主要由测量残差驱动。
所以它体现的是:
根据观测数据判断当前哪个模型更可信。
这比人工提前写死模型切换时间更接近实际目标跟踪问题。
如果直接在某一时刻从 CV 突然切换到 CT,一旦切换判断错误,状态估计可能出现明显跳变。
IMM 使用概率加权,使 CV 和 CT 在一段时间内可以同时存在,只是权重不同,因此模型过渡更加平滑。
CV、CT 提供不同的运动先验,Kalman 滤波负责结合测量,IMM 再利用测量似然决定模型概率。
整个结构形成:
运动模型 → 状态预测 → 测量修正 → 模型判断 → 状态融合
所以它不是只依靠轨迹几何,也不是只依靠瞬时测量,而是把多种信息结合起来。
13. 为什么不直接把测量轨迹平滑一下?
简单滑动平均确实可以降低测量噪声,但它只知道:
“附近几个位置取平均。”
它并不知道目标当前具有怎样的速度,也不知道目标可能正在转弯。
Kalman + IMM 则显式维护:
位置;速度;状态不确定性;
CV/CT 运动模型;模型切换概率。
因此它解决的不只是“曲线变平滑”,而是一个完整的动态状态估计问题。
14. 为什么不始终使用 CT 模型?
CT 看起来比 CV 更复杂,但“更复杂”并不等于始终更合适。
如果目标长期直线运动,而滤波器始终假设存在固定转弯角速度,模型反而可能产生系统性偏差。
所以多模型方法的价值恰恰在于:
不是寻找一个万能模型,而是在不同阶段让不同模型发挥作用。
15. 50 次 Monte Carlo 仿真有什么意义?
主程序设置:
MC = 50
也就是使用相同真实轨迹,但每次重新生成一组随机测量噪声,然后重复运行 CV、CT 和 IMM。
这样可以减少“某一次噪声刚好特别幸运或特别差”带来的偶然影响。
程序统计:
X、Y 方向平均位置误差;
X、Y 方向 RMSE;
两个模型的平均概率。
RMSE 的基本含义是:
RMSE = √[Σ(error²) / MC]
误差越小,说明多次随机测量条件下的跟踪结果总体越接近真实轨迹。
16. 运行后能够得到什么?
程序会把真实轨迹、带噪测量以及 CV、CT、IMM 三种跟踪结果放在一起比较,同时统计 X、Y 方向的位置误差和 RMSE。
更重要的是,它还会记录 CV、CT 两个模型概率随时间的变化。因此除了知道“跟得准不准”,还可以观察:
当目标运动方式发生变化时,IMM 是否会逐渐提高更合适模型的权重。
这比只输出一条滤波曲线更能体现 IMM 的工作机制。
17. 它适合用在哪里?
目标可能先稳定飞行,再进行转弯机动。单一 CV 模型容易在转弯阶段失配,而 IMM 可以同时维护直线和转弯模型。
车辆会经历直行、转向、重新直行等过程。CV + CT 是这类二维运动的经典基础组合。
当位置传感器含有明显噪声,同时运动方式又会改变时,可以利用类似的多模型状态估计思路提高轨迹连续性。
这个工程同时给出了数据生成、单模型 Kalman、模型概率更新和最终状态融合,比较适合理解“单模型滤波为什么会失配,以及 IMM 怎样改善”。
18. 这个程序本身有哪些优势?
对比完整: 同时实现 CV、CT 和 IMM,能够直观看到单模型和多模型之间的差别。
运动场景明确: 自带 CV → CT → CV 的 400 时刻机动轨迹,特别适合验证模型切换。
具有统计评价: 使用 50 次 Monte Carlo,而不是只展示一次随机测量结果。
模型概率可观察: 不只输出状态估计,还能看到两个运动模型的可信度变化。
代码结构清楚: Kalman 滤波、CT 矩阵和主 IMM 流程分开实现,便于学习和修改。
19. 怎么运行?
工程已经带有 data.mat,所以最直接的运行方式是:
将整个 CV_CT_IMM 文件夹放到 MATLAB 当前目录;
直接运行 IMM_TEST.m;
程序自动加载 data.mat;
自动生成带噪测量;
运行 CV、CT 和 IMM 跟踪;
完成 50 次 Monte Carlo 统计并输出结果。
如果希望重新生成真实运动轨迹,可以先运行 produce_data.m,它会重新生成并保存 data.mat,然后再运行 IMM_TEST.m。
由于 produce_data.m 中本身包含随机过程噪声,因此重新生成 data.mat 后,真实轨迹也会发生变化。
20. 哪些参数最值得修改?
参数 | 当前值 | 作用 |
| 50 | Monte Carlo 次数 |
| 0.99 | 模型保持当前状态的概率 |
| 0.01 | CV/CT 相互切换概率 |
初始模型概率 | 0.5 / 0.5 | 两模型初始可信度 |
| 2500 | 位置测量噪声方差 |
CV 过程噪声 | 0.1² | CV 模型状态扰动 |
CT 过程噪声 | 0.0144² | CT 模型状态扰动 |
CT 角速度 |
| 跟踪程序使用的转弯模型 |
可以通过这些参数研究:
测量变差后 IMM 是否仍能稳定跟踪;
模型切换概率如何影响响应速度;
CT 模型角速度不准确时跟踪结果如何变化;
不同过程噪声对模型概率和状态估计有什么影响。
21.需要注意
真实机动目标还可能出现:
加速;减速;更复杂的转弯率变化;停止;三维运动。
当前 IMM 只有两个模型,因此它适合研究“直线 + 固定转弯”类型的基础多模型跟踪,不代表已经覆盖所有机动形式。
22. 一句话看懂这个项目
这是一个 MATLAB 交互多模型目标跟踪程序:它用 CV 模型描述直线匀速运动,用 CT 模型描述二维转弯运动,再通过 Kalman 滤波分别估计目标状态,并根据测量残差实时更新两个模型的概率,最终按模型概率融合状态结果,从而适应“直线—转弯—直线”这类运动模式会发生变化的机动目标。