
运行结果
本文针对多目标场景下的观测—航迹匹配问题,设计了一个基于 MATLAB 的多目标航迹关联仿真程序。程序能够在多个目标同时运动、观测点存在噪声、目标可能出现或消失的情况下,实现观测数据与已有航迹之间的自动匹配,并对航迹的起点和终点进行合理管理。
在多目标跟踪中,最常见的问题不是单个目标的滤波精度,而是当前时刻的观测点到底属于哪一条历史航迹。当目标数量较多、运动轨迹交叉、观测存在随机误差时,如果仅依靠最近邻方法,很容易出现航迹交换、误匹配或轨迹断裂等问题。因此,本文程序重点模拟以下几类典型情况:
- 多个目标同时运动,系统在每一时刻接收一组观测点;
- 观测点与已有航迹之间需要建立匹配关系;
- 当目标消失后,已有航迹在后续时刻可能没有对应观测,需要判断其是否应当终止;
- 当新目标出现时,未匹配观测不能直接混入旧航迹,而应当作为新航迹起点进行管理;
- 在航迹起点和终点同时存在时,避免将“目标消失后的空缺”与“新目标出现的观测”混淆。
程序运行后,主要可以得到以下结果:
- 多目标真实运动轨迹;

-
观测点与已有航迹之间的匹配关系;

-
最终形成的多目标航迹估计结果。


运行结果表明,该程序能够较好地区分已有航迹延续、新航迹生成、旧航迹终止三类情况。当某个目标消失后,程序不会强行将后续无关观测点分配给该航迹;当新的观测点长期无法匹配到已有航迹时,程序会将其作为新的候选航迹,并在满足确认条件后转化为正式航迹。
程序详解
本文程序的核心任务可以概括为:在第 k k k 个时刻,根据当前观测集合 Z k Z_k Zk 和上一时刻已有航迹集合 T k − 1 T_{k-1} Tk−1,建立合理的观测—航迹匹配关系,并更新航迹状态。
设当前时刻的观测集合为
Z k = z k 1 , z k 2 , ⋯ , z k M Z_k={z_k^1,z_k^2,\cdots,z_k^M} Zk=zk1,zk2,⋯,zkM
已有航迹集合为
T k − 1 = T k − 1 1 , T k − 1 2 , ⋯ , T k − 1 N T_{k-1}={T_{k-1}^1,T_{k-1}^2,\cdots,T_{k-1}^N} Tk−1=Tk−11,Tk−12,⋯,Tk−1N
其中, M M M 表示当前观测数量, N N N 表示已有航迹数量。每一条航迹中保存了目标的历史位置、当前预测位置、连续未匹配次数、航迹状态等信息。
对于第 i i i 条航迹和第 j j j 个观测点,可以构造匹配代价:
c i j = ∣ z k j − x ^ k ∣ k − 1 i ∣ c_{ij}=\left | z_k^j-\hat{x}_{k|k-1}^i \right | cij= zkj−x^k∣k−1i
其中, x ^ k ∣ k − 1 i \hat{x}_{k|k-1}^i x^k∣k−1i 表示第 i i i 条航迹在当前时刻的预测位置, z k j z_k^j zkj 表示第 j j j 个观测点。代价越小,说明该观测点越可能属于该航迹。
为了避免距离过远的观测点被错误匹配,程序中通常设置一个门限 d max d_{\max} dmax,即只有满足
c i j < d max c_{ij}<d_{\max} cij<dmax
的观测—航迹组合才被认为是有效候选匹配。如果距离超过门限,则将其视为不可匹配项。
在实际程序中,可以将所有航迹与所有观测之间的距离组成代价矩阵:
C = [ c 11 c 12 ⋯ c 1 M c 21 c 22 ⋯ c 2 M ⋮ ⋮ ⋱ ⋮ c N 1 c N 2 ⋯ c N M ] C= \begin{bmatrix} c_{11} & c_{12} & \cdots & c_{1M} \ c_{21} & c_{22} & \cdots & c_{2M} \ \vdots & \vdots & \ddots & \vdots \ c_{N1} & c_{N2} & \cdots & c_{NM} \end{bmatrix} C=[c11c12⋯c1M c21c22⋯c2M ⋮⋮⋱⋮ cN1cN2⋯cNM]
然后通过最小代价匹配方法完成观测与航迹之间的分配。对于简单仿真,可以使用最近邻匹配;对于目标数量较多或交叉情况较复杂的场景,则可以进一步采用匈牙利算法、全局最近邻方法或联合概率数据关联方法。
本文程序的重点不仅在于匹配本身,还在于对未匹配航迹和未匹配观测的处理。
对于已有航迹,如果在当前时刻没有匹配到任何观测,则不能立即删除,而是将其标记为一次漏检。对应的连续未匹配次数更新为
m i ( k ) = m i ( k − 1 ) + 1 m_i(k)=m_i(k-1)+1 mi(k)=mi(k−1)+1
当连续未匹配次数超过设定阈值 M max M_{\max} Mmax 时,说明该目标很可能已经离开观测区域或已经消失,此时将该航迹终止。这样可以避免由于单帧漏检导致航迹被过早删除。
对于当前时刻没有被分配到任何已有航迹的观测点,也不能简单丢弃。因为这些观测点可能来自新出现的目标。程序会将这些未匹配观测作为候选航迹的起点,并进行临时保存。如果该候选航迹在后续若干帧中持续获得匹配观测,则将其升级为正式航迹。
因此,航迹状态通常可以划分为三类:
| 航迹状态 | 含义 |
|---|---|
| 候选航迹 | 由未匹配观测生成,尚未确认 |
| 确认航迹 | 连续多帧匹配成功,认为是真实目标 |
| 终止航迹 | 连续多帧未匹配,认为目标已经消失 |
这种设计可以有效解决多目标跟踪中的两个关键问题:
一是目标消失后,避免将其他目标的观测错误接入旧航迹;
二是新目标出现时,避免将其误认为旧航迹的延续。
在程序实现中,每一条航迹一般包含以下信息:
track.id % 航迹编号
track.state % 当前预测状态
track.history % 历史轨迹点
track.age % 航迹存在时间
track.missCount % 连续未匹配次数
track.hitCount % 连续匹配次数
track.status % 航迹状态:候选、确认、终止
其中,missCount 用于判断航迹是否需要终止,hitCount 用于判断候选航迹是否可以升级为正式航迹。通过这两个计数变量,可以将航迹起点和航迹终点分开处理,从而降低多目标场景下的航迹混淆风险。
对于已匹配成功的航迹,其状态更新可以采用简单的位置更新方式,也可以进一步引入卡尔曼滤波。若采用匀速运动模型,目标状态可以写为
x k = [ p x p y v x v y ] T x_k= \begin{bmatrix} p_x & p_y & v_x & v_y \end{bmatrix}^{T} xk=[pxpyvxvy]T
状态预测模型为
x k = F x k − 1 + w k x_k=F x_{k-1}+w_k xk=Fxk−1+wk
其中,
F = [ 1 0 Δ t 0 0 1 0 Δ t 0 0 1 0 0 0 0 1 ] F= \begin{bmatrix} 1 & 0 & \Delta t & 0 \ 0 & 1 & 0 & \Delta t \ 0 & 0 & 1 & 0 \ 0 & 0 & 0 & 1 \end{bmatrix} F=[10Δt0 010Δt 0010 0001]
观测模型为
z k = H x k + v k z_k=H x_k+v_k zk=Hxk+vk
其中,
H = [ 1 0 0 0 0 1 0 0 ] H= \begin{bmatrix} 1 & 0 & 0 & 0 \ 0 & 1 & 0 & 0 \end{bmatrix} H=[1000 0100]
如需帮助,或有导航、定位滤波相关的代码定制需求,请点击下方卡片联系作者
166

被折叠的 条评论
为什么被折叠?



