主要内容

跟踪操纵目标

此示例显示如何使用各种跟踪过滤器跟踪机动目标。该示例显示了使用单个运动模型和多个运动模型的过滤器之间的差异。

定义一个场景

在此示例中,您定义一个单个目标,其最初在恒定速度下行进为200 m / s 33秒,然后进入恒定的10 deg / s。转弯持续33秒,然后目标在3 m / s ^ 2的直线上加速。

[Truestate,Time,Fig1] = HelperGeneratetrethdata;dt = diff(时间(1:2));numsteps = numel(时间);图(图)

将测量值定义为位置并添加正常随机噪声,标准偏差为1到测量。

%设置可重复结果的RNG种子s = RNG;RNG(2018);PositionSelector = [1 0 0 0 0 0; 0 0 1 0 0 0; 0 0 0 0 1 0];%状态位置truepos = positionselector * truestate;measnoise = randn(尺寸(truepos));measpos = truepos + moreNoise;

轨道使用恒定速度滤波器

你定义A.trackingekf.具有恒定速度运动模型。您使用第一个测量来定义初始状态和状态协方差,并将过程噪声设置为非添加剂,以定义X,Y和Z组件中未知的加速度的过程噪声。此定义类似于功能的方式initcvekf.作品。

initialstate = positionSelector'* measpos(:,1);initialcovariance = diag([1,1e4,1,1e4,1,1e4]);未测量%速度cvekf = trackingEKF(@constvel, @cvmeas, initialState,......'stateTransitionJacobianfcn',@constveljac,......'measurementjacobianfcn',@cvmeasjac,......'statecovariance',初始转移性,......“HasAdditiveProcessNoise”, 错误的,......'processnoise',眼睛(3));

对于每次测量,您预测过滤器,从真实位置计算预测状态的距离,并使用测量校正过滤器以获得滤波后的位置的估计。

dist = 0(1、numSteps);estpos = zeros(3,numsteps);为了i = 2:尺寸(measpos,2)预测(cvekf,dt);DIST(i)=距离(CVEKF,TRUEPOS(:,i));从真实位置距离estpos(:,i)= positeSelector *正确(CVEKF,Measpos(:,i));结尾图(图);绘图(estpos(1,:),estpos(2,:),“.g”'显示名称''cv低pn') 标题('真实和估计的立场')轴([5000 8000 -500 2500])

如图所示,过滤器能够非常好地跟踪运动的恒定速度部分,但是当目标执行转弯时,滤波器估计位置与真实位置发散。您可以从以下情节中看到估计的距离。在转弯期间,在33-66秒,归一化距离跳到非常高的值,这意味着过滤器无法跟踪机动目标。

图2 =数字;抓住绘图((1:numsteps)* dt,dist,'G''显示名称''cv低pn') 标题('归一化距离从估计位置到真实位置')包含('时间'') ylabel ('归一化距离') 传奇

增加过程噪声

一个可能的解决方案是增加过程噪声。过程噪声表示运动模型中的未确定术语。对于恒定速度模型,这些是未知的加速度术语。通过提高过程噪声,您可以在运动模型中允许更大的不确定性,这导致过滤器依赖于模型上的测量。以下行创建一个恒定的速度滤波器,具有高处理噪声值,对应于大约5g匝数。

cvekf2 = trackingekf(@constvel,@cvmeas,initialstate,......'stateTransitionJacobianfcn',@constveljac,......'measurementjacobianfcn',@cvmeasjac,......'statecovariance',初始转移性,......“HasAdditiveProcessNoise”, 错误的,......'processnoise',诊断([50,50,1]));水平加速度的百分比不确定性dist = 0(1、numSteps);estpos = zeros(3,numsteps);为了i = 2:尺寸(meSPOS,2)预测(CVEKF2,DT);DIST(i)=距离(CVEKF2,TRUEPOS(:,i));从真实位置距离estpos(:,i)= PositionSelector *正确(CVEKF2,Measpos(:,i));结尾图(图1)绘图(estpos(1,:),estpos(2,:),'。C''显示名称''cv high pn')轴([5000 8000 -500 2500])

增加过程噪声显着提高了滤波器在转弯期间跟踪目标的能力。但是,存在成本:过滤器较低能够在运动的恒定速度期间平滑测量噪声。即使转弯期间的归一化距离显着降低,在运动的恒定速度周期期间,归一化距离在前33秒内增加。

图(图)图((1:numsteps)* dt,dist,'C''显示名称''cv high pn')轴([0 100 0 50])

使用相互作用的运动模型过滤器

另一种解决方案是使用可以同时考虑所有运动模型的过滤器,称为交互多模型(IMM)滤波器。IMM滤清器可以根据需要维护多种运动模型,但通常与2-5个运动模型一起使用。对于该示例,三种模型足够:恒定速度模型,恒定转向模型和恒定加速模型。

imm = trackingimm('TransitionProbabilities', 0.99);%默认IMM有所有三种型号%初始化第一个模型的状态和州协方差初始化(IMM,InitialState,InitialCovariance);

您使用IMM滤波器以与使用EKF的方式相同。

dist = 0(1、numSteps);estpos = zeros(3,numsteps);ModelProbs = Zeros(3,NumSteps);ModelProbs(:,1)= Imm.ModelProbabilities;为了i = 2:尺寸(measpos,2)预测(imm,dt);DIST(i)=距离(IMM,TRUEPOS(:,i));从真实位置距离estpos(:,i)= PositionSelector *正确(Imm,Measpos(:,i));ModelProbs(:,i)= imm.modelprobabilities;结尾图(图1)绘图(estpos(1,:),estpos(2,:),'.m''显示名称''IMM'

Trackingimm.过滤器能够在运动的所有三个部分中跟踪机动目标。

检查过滤器预测状态与真实位置之间的距离,您可以看到IMM滤清器能够减少运动的所有部分的距离。实际上,IMM滤波器在跟踪运动比前面使用的两种恒定速度模型更好。

图(图)保持绘图((1:numsteps)* dt,dist,“米”'显示名称''IMM')轴([0 100 0 50])

为了更好地理解IMM滤波器是如何工作的,请将模型概率作为时间的函数绘制出来。从图中可以看出,用三个具有相同概率的模型初始化滤波器。随着滤波器的更新,它很快收敛到一个非常高的概率,该模型是一个恒定速度模型。经过33秒的运动后,等速模型不再成立,在转弯的持续时间内,等速模型出现的概率变得非常高。在运动的最后一节中,在恒加速度机动过程中,IMM滤波器赋予运动为恒加速度的概率较高,但滤波器对正确的运动模型不太确定,运动为恒速度的概率约为0.3。

图绘图((1:numsteps)* dt,modelprobs)标题('模型概率与时间')包含('时间'') ylabel (“模型概率”) 传奇('imm-cv'“IMM-CA”'imm-ct'返回RNG到之前的状态RNG(s)

总结

此示例显示了如何跟踪具有恒定转弯和恒定加速运动的目标操纵。该示例显示了如何增加过程噪声以通过恒定速度模型捕获未知的操纵。您还看到如何通过使用IMM滤清器来改善机动目标的跟踪。

万博1manbetx支持功能

Helpergeneratetrethdata.

此函数生成地面真理轨迹。

功能[XGT,TT,无花果] = HelperGenerAtetruthdata%产生地面真理Vx = 200;% 多发性硬化症欧米茄= 10;%deg / sACC = 3;%m / s / sdt = 0.1;tt =(0:DT:地板(1000 * DT));图= [];XGT = NAN(9,NUMER(TT));XGT(:,1)= 0;%恒定速度SEG1 =地板(NUMER(TT)/ 3);XGT(2,1)= VX;slct =眼睛(9);SLCT(3:3:结束,:) = [];为了m = 2:seg1 x0 = slct * xgt(:,m-1);x1 = constvel(x0,dt);x1 = slct'* x1;XGT(:,m)= x1;结尾%不断转弯SEG2 =地板(2 * NUMER(TT)/ 3);slct =眼睛(9);SLCT(3:3:结束,:) = [];为了m = seg1 + 1:seg2 x0 = slct * xgt(:,m-1);x0 = [x0(1:4); omega];x1 = constrturn(x0,dt);x1 = x1(1:4);x1 = [x1(1:2); 0; x1(3:4); 0;零(3,1)];XGT(:,m)= x1;结尾%恒定加速度首先=真;为了m = seg2 + 1:numel(tt)x0 = xgt(:,m-1);如果First Vel = X0(2:3:结束);UA = vel / qu(vel);va = ACC * UA;X0(3:3:结束)= VA;first = false;结尾x1 = constacc(x0,dt);XGT(:,m)= x1;结尾%Drop加速度尺寸slct =眼睛(9);SLCT(3:3:结束,:) = [];xgt = slct * xgt;图= [图];绘图(XGT(1,1:SEG1),XGT(3,1:SEG1),'.-');抓住;绘图(XGT(1,SEG1 + 1:SEG2),XGT(3,SEG1 + 1:SEG2),'.-');绘图(XGT(1,SEG2 + 1:结束),XGT(3,SEG2 + 1:结束),'.-');网格;Xlabel('x位置(m)');ylabel('y位置(m)');标题('真正的位置')轴平等的;传奇('恒速''不断转弯''不断加速'结尾