基于IMM算法的目标跟踪
下载后可任意编辑 基于交互式多模型方法的目标跟踪 高海南 3110038011 一、 目标建模 我们设定一个目标在二维平面内运动,其状态由位置、速度和加速度组成,即。假设采样间隔为,目标检测概率,无虚警存在,在笛卡尔坐标系下目标的离散运动模型和观测模型 (假定在采样时刻)为: 目标在二维平面内运动模型如下: 1. CV:近似匀速运动模型 CV模型将加速度看作是随机扰动(状态噪声),取目标状态 。则状态转移矩阵,干扰转移矩阵和观测矩阵分别为: , 2. CT:匀速转弯模型 只考虑运动角速度已知的CT模型。则状态转移矩阵,干扰转移矩阵和观测矩阵分别为: 量测噪声协方差矩阵由传感器决定。 二、 交互多模算法原理 假定有个模型: 其中,是均值为零、协方差矩阵为的白噪声序列。用一个马尔可夫链来控制这些模型之间的转换,马尔可夫链的转移概率矩阵为: 测量模型为: IMM算法步骤可归纳如下: ①、输入交互 其中,是模型转到模型的转移概率,为规一化常数,。 ②、对应于模型,以,及作为输入进行Kalman滤波。 1)预测 2)预测误差方差阵 3)卡尔曼增益 4)滤波 5)滤波误差方差阵 ③、模型概率更新 其中,为归一化常数,且,而为观测的似然函数,。 ④、输出交互 三、 仿真实验 设定目标运动起始位置坐标(x,y)为(1000,1000),初始速度为(10,10),采样间隔T=1s ,CT模型运动的角速度,即做顺时针匀速转弯运动。x和y独立地进行观测,观测标准差为50米。目标在1~150s运动模型为CV,151~270s运动模型为CT, 271~400s运动模型为CV。目标运动真实轨迹和测量轨迹如图1所示。 图1 目标运动轨迹 在IMM滤波时,使用2个模型集,即CV、CT,假设我们已经知道CT模型的目标运动角速度w,Markov转移矩阵。进行蒙特卡洛仿真,得到IMM滤波结果。将此滤波结果与单独的CV、CT模型的标准卡尔曼滤波结果对比,如图2所示。由图可知,CT模型滤波结果与真实值有较大偏差,在转弯时CV模型卡尔曼滤波结果偏离偏离真实值,而IMM算法能较好的跟踪目标。 图2 各种滤波结果图 为了定量分析滤波结果,我们将X、Y方向的CV、CT卡尔曼滤波、IMM滤波与真实值分别求位置偏差、均方根误差并进行进行对比,如图3、图4所示。同时作出各个时刻CV、CT的模型概率,如图5所示。可以看到在转弯时刻(151~270s)期间,CT模型概率大于CV模型概率,此时IMM滤波主要取决于CT模型,而在其他时刻,CT模型起主要作用,这与我们的经验知识一致。IMM算法就是通过各模型概率的自动调整来完成对机动目标的跟踪,相对于单一模型滤波具有较理想的跟踪精度。 图3 位置滤波偏差 图4 位置滤波均方根误差 图5 各时刻CV、CT模型概率 1、下面讨论不同的马尔科夫一步转移矩阵对跟踪结果的影响。 (1)时,模型概率和滤波结果如下图所示,此时CV、CT模型概率变化趋势不变,但相差不大,显然IMM算法优于单模型Kalman滤波算法,但其精度低于当转移矩阵为P1时的结果。 图6 转移矩阵为P2时概率变化图 图7 转移矩阵为P2时滤波结果图 (2)更极端地,取时,模型概率和滤波结果如下图所示,此时CV、CT模型概率变化趋势总体不变,但相差甚微,而IMM算法总体上仍优于单模型Kalman滤波算法,但其精度同样低于当转移矩阵为P1和P2时的结果。 图8 转移矩阵为P3时概率变化图 图9 转移矩阵为P3时滤波结果图 综上所述,Markov链状态转移矩阵对角线元素越大,即由k-1时刻模型m1转移到k时刻模型m1概率越大,也就是模型的“惯性”越大,交互式多模型滤波结果精度越高,反之,精度越低。 2、CT模型角速度对滤波结果的影响 取Markov转移矩阵,而角速度,其他参数均不变,仿真得到如下结果,与图2对比可知,当角速度越接近于真实值,跟踪精度越高,反之跟踪精度有所下降。 图10 角速度=-pi/360时滤波结果图 通过编写程序和仿真实验结果可以体会到,IMM算法核心在于对做复杂机动运动的目标滤波时,IMM能够通过对各个模型滤波器的输入输出通过混合概率和似然函数计算进行加权综合处理,自动切换模型,实现对目标的较好跟踪。IMM算法跟踪性能好坏取决于其使用的模型集,模型越精确,模型集越丰富,跟踪效果就越好,但带来了计算量增加的问题,有时反而降低性能。 附:IMM滤波程序 produce_data.m 下载后可任意编辑 clear ;clc N = 400;T = 1; x0 = [1000,10,1000,10] ; xA = [];zA = [x0(1),x0(3)]; %model-1,匀速运动 A1 = [1,T,0,0; 0,1,0,0; 0,0,1,T; 0,0,0,1]; G1=[T^2/2, 0; T, 0; 0, T^2/2; 0, T] ; Q1=[0.1^2 0; 0 0.1^2]; %model-2,匀速转弯模型 A2=CreatCTF(-pi/270,T); G2=CreatCTT(T); Q2=[0.0144^2 0; 0 0.0144^2]; % 产生真实数据 x = x0; for k = 1:150%匀速直线 x = A1*x + G1*sqrt(Q1)*[randn,randn] ; xA =[xA x]; end for k = 1:120%匀速圆周转弯 x = A2*x + G2*sqrt(Q2)*[randn,randn] ; xA =[xA x]; end for k = 1:130%匀速直线 x = A1*x + G1*sqrt(Q1)*[randn,randn] ; xA =[xA x]; end plot(xA(1,:),xA(3,:), b- ) save( data , xA , A1 , N , x0 , G1 , Q1 , A2 , G2 , Q2 ); title( 运动轨迹 ) xlabel(