主要内容

操纵雷达自适应跟踪机动目标

这个例子展示了如何使用雷达资源管理来有效地跟踪多个机动目标。跟踪机动目标要求雷达比跟踪非机动目标更频繁地重新访问目标。交互式多模型(IMM)当目标机动时,滤波器估计。此估计有助于管理雷达重访时间,从而增强跟踪。此示例使用雷达工具箱™ 用于雷达模型和传感器融合与跟踪工具箱™ 用于跟踪。

介绍

多功能雷达可以搜索目标,确认新的轨道,并重新访问轨道以更新状态。为了执行这些功能,多功能雷达通常由资源管理器管理,该资源管理器创建用于搜索、确认和跟踪的雷达任务。这些任务按照优先级和时间进行调度,以便在每个时间步骤中,多功能雷达都能将波束指向期望的方向。的多功能相控阵雷达的搜索与跟踪调度示例显示了一个由资源管理器管理的多功能相控阵雷达。

在这个例子中,我们扩展了多功能相控阵雷达的搜索与跟踪调度多个机动目标的示例。对于用于跟踪机动目标的雷达,有两个相互冲突的要求:

  1. 目标的数量和它们的初始位置通常是事先不知道的。因此,雷达必须不断搜索感兴趣的区域以找到目标。此外,当雷达进入雷达覆盖区域时,雷达需要探测并建立对每个目标的跟踪。

  2. 目标机动的时间周期是事先未知的。如果已知目标没有机动,雷达可以不频繁地重新访问目标。然而,由于机动的开始和结束时间是未知的,雷达必须频繁地重新访问每个航迹,以能够识别机动的开始和结束时间。

雷达必须在提供足够的波束以跟踪目标为中心和留出足够的时间搜索新目标之间取得平衡。一种方法是简单地定义每个跟踪目标的重访率,而不考虑其机动状态,并将剩余的时间留给新目标搜索。这种雷达管理方案有时被称为积极的跟踪[1].随着越来越多的目标被跟踪,雷达要么可以执行更少的搜索任务,要么可以更少地跟踪每个目标。显然,如果目标数量很大,雷达就会被淹没。

主动跟踪对待所有曲目以同样的方式,这使得它模式基于资源管理算法。管理雷达的一个更复杂的方法是基于每个轨道的属性。例如,使用轨道属性,如状态不确定性协方差的大小,轨道是否机动,以及它向雷达站点保护的资产移动的速度。当使用这些属性时,雷达资源管理称为自适应跟踪[1].

在这个例子中,您比较了主动跟踪和自适应跟踪的结果时,雷达适应基于估计的轨迹机动。

定义场景和雷达模型

您定义了一个场景和一个更新速率为20hz的雷达,这意味着该雷达每秒有20个波束用于搜索、确认或跟踪。加载的基准轨迹多目标跟踪的基准轨迹(传感器融合和跟踪工具箱)的例子。有六个基准轨迹你为每一个定义一个轨迹。图中六个平台由非机动支腿和机动支腿穿插而成。你可以在图中看到轨迹。

%创建方案updateRate = 20;场景= trackingScenario(“更新”,更新);%添加基准轨迹装载(“BenchmarkTrajectories.mat”“垫”);平台(场景中,'弹道', v1Trajectory);平台(场景中,'弹道',v2Trajectory);平台(场景中,'弹道',v3Trajectory);平台(场景中,'弹道',v4Trajectory);平台(场景中,'弹道',v5Trajectory);平台(场景中,'弹道', v6Trajectory);%创建可视化f =图;议员= uipanel (“父”f“标题”“戏剧情节”'字体大小'12...“写成BackgroundColor”“白色”“位置”,(。01 .25 .98 .73]); tax = axes(mp,'ZDir'“反向”);%可视化场景thp = theaterPlot (“父”,税,“AxesUnits”, (“公里”“公里”“公里”],“XLimits”,[0 85000],“YLimits”(-45000 70000),'ZLimits'1000年[-10000]);plp = platformPlotter (thp,“显示名称”“平台”);PAP = trajectoryPlotter(THP,“显示名称”“轨迹”'行宽',1);DTP = detectionPlotter(THP,“显示名称”“检测”);CVP = coveragePlotter(THP,“显示名称”“雷达覆盖”);trp = trackPlotter (thp,“显示名称”“跟踪”“ConnectHistory”“上”“ColorizeHistory”“上”); numPlatforms=numel(scenario.Platforms);轨迹位置=单元(1,numPlatforms);i = 1: numplatestrajectorypositions {i} = lookupPose(scenario. plates{i}.Trajectory,(0:0.1:185));结束trajectoryPositions plotTrajectory (pap);视图(税,3)

利用该方法定义了概率雷达模型radarDataGenerator系统对象™。设置”ScanMode”此对象的属性“自定义”允许资源管理器控制雷达角度。这使得雷达能够进行搜索、确认和跟踪目标的调度。在场景中,雷达安装在一个新的平台上。

雷达= radarDataGenerator (1,...'ScanMode'“自定义”...“更新”updateRate,...“MountingLocation”, [0 0 -15],...“FieldOfView”(3; 10),...'AzimuthResolution', 1.5,...“HasElevation”,真的,...“DetectionCoordinates”“球形传感器”);平台(场景中,“位置”(0 0 0),“传感器”、雷达);

定义跟踪器

雷达检测到的物体后,将其馈送到检测跟踪器,其执行多个操作。跟踪器认为是在感兴趣的地区目标状态的估计曲目列表。如果检测不能分配给已经被跟踪维护的任何跟踪,跟踪器启动一个新的轨道。在大多数情况下,无论是新的轨迹表示真正的目标还是假目标尚不清楚。起初,轨道用试探性的状态产生。如果获得足够的检测,赛道变得证实。类似地,如果没有检测被分配给一个轨道,所述轨道被设置为惯性(没有校正预测的)。如果轨道有一些错过更新,跟踪器删除曲目。

在本例中,您使用了一个跟踪器,该跟踪器使用全局最近邻(GNN)算法将检测与轨迹关联起来。为了跟踪机动目标,你定义FilterInitializationFcn函数,用于初始化IMM过滤器。的initMPARIMM函数使用两个运动模型:恒定速度模型和恒定回转速率模型。的trackingIMM(传感器融合和跟踪工具箱)Filter负责估计每个模型的概率,您可以从它的ModelProbabilities所有物在本例中,当恒定转弯率模型的概率高于0.6时,将目标分类为机动。

跟踪= trackerGNN(“FilterInitializationFcn”@initMPARIMM,...“ConfirmationThreshold”3 [2],“DeletionThreshold”, 5 [5],...'HasDetectableTrackIDsInput'符合事实的“AssignmentThreshold”, 150,...“MaxNumTracks”,10,“MaxNumSensors”1);posSelector = [1 0 0 0 0 0;0 0 1 0 0 0;0 0 0 0 1 0];

雷达资源管理

本节仅简要介绍了雷达的资源管理。有关详细信息,请参阅操纵雷达自适应跟踪机动目标的例子。

搜索任务

在本例中,您确定地分配搜索任务。光栅扫描用于覆盖所需的空域。方位扫描限制被设置为[-90 60]度,仰角限制被设置为[-9.9 0]度。如果没有其他任务存在,雷达每次只扫描一个角单元。角单元的大小由雷达的大小决定FieldOfView所有物负仰角意味着雷达将波束从地平线指向上方。

AzimuthLimits = [-90 60];ElevationLimits = [-9.9 0];azscanspan = diff (AzimuthLimits);numazscan =地板(azscanspan / radar.FieldOfView (1) + 1;AzimuthLimits azscanangles = linspace (AzimuthLimits (1), (2), numazscan) + radar.MountingAngles (1);elscanspan = diff (ElevationLimits);numelscan =地板(elscanspan / radar.FieldOfView (2) + 1;ElevationLimits elscanangles = linspace (ElevationLimits (1), (2), numelscan) + radar.MountingAngles (2);[elscangrid, azscangrid] = meshgrid (elscanangles azscanangles);Scanangles = [azscangrid(:) elscangrid(:)].'; searchq = struct('工作类型'“搜索”“BeamDirection”,num2单元(扫描角度,1),...“优先”,1000,“WaveformIndex”1);current_search_idx = 1;

跟踪任务

与搜索任务不同,跟踪任务不能提前计划。相反,资源管理器会根据变化的场景创建确认和跟踪任务。这个例子和操纵雷达自适应跟踪机动目标例子是工作类型对于每个跟踪任务可以是“TrackNonManeuvering”“TrackManeuvering”.这两种跟踪任务之间的区别使您能够以不同的重访率为每种类型的跟踪安排任务,使其成为一种自适应跟踪算法。与搜索任务类似,跟踪任务也在作业队列中进行管理。

trackq = repmat(结构('工作类型'[],“BeamDirection”[],“优先”, 3000,“WaveformIndex”[],...“时间”[],“范围”[],“TrackID”,[]),1​​0,1);num_trackq_items = 0;

组搜索,并在结构跟踪队列一起在仿真循环更容易参考。

jobq.SearchQueue=searchq;jobq.SearchIndex=当前搜索\u idx;jobq.TrackQueue=trackq;jobq.NumTrackJobs=num\u trackq\u项;jobq.PositionSelector=posSelector;%保持jobq的复位状态resetJobQ=jobq;

任务调度

在本例中,为简单起见,多功能雷达在一小段时间内只执行一种类型的任务,通常称为驻留,但可以在每个驻留开始时切换任务。对于每个驻留,雷达查看所有即将执行的任务,并选择一个确认任务或跟踪任务(如果运行时间到了)。否则,雷达会选择搜索任务。要控制运行任务的时间,可以设置managerPreferences结构定义如下。给出了最高的重访率,等于雷达更新率确认任务,以确保确认波束遵循每个存在的新试探性轨道。类似地,您可以控制非机动和机动目标的重访率。在这种情况下,对于非机动目标和机动目标,分别选择0.8 Hz和4hz的值。由于有6个目标,资源管理器将使用 6 0 8 5 如果所有目标都不机动,每秒更新跟踪目标。假设雷达更新速率为20 Hz,雷达管理器大约每4次更新执行一次目标更新。因此,雷达将花费75%的时间在搜索模式下,25%的时间在跟踪模式下。当新的跟踪被初始化,并且跟踪器认为目标正在机动时,资源管理器分配更多的跟踪波束,而牺牲搜索波束。

Analyze Results部分显示了其他选项的结果。

managerPreferences =结构(...'类型', {“搜索”“确认”“TrackNonManeuvering”“TrackManeuvering”},...“RevisitRate”, {0, updateRate, 0.8, 4},...“优先”,{1000,3000,1500,2500});

运行场景

在模拟过程中,雷达波束由表示搜索和跟踪有关的光束,分别蓝色或紫色颜色描绘。您还可以看到任务的搜索和特定轨道之间的分配使用在最后一秒面板中的资源分配在图的底部模拟的最后一秒。在图中的剧院情节部分,你可以看到每首曲目的历史和比较它的轨迹。

创建一个雷达资源分配显示rp = uipanel (“父”f“标题”“资源分配在最后一秒”'字体大小'12...“写成BackgroundColor”“白色”“位置”,(。01 0.01 0.98 0.23]); rax = axes(rp);%运行场景allocationType = helperAdaptiveTrackingSim(scenario, thp, rax, tracker, resetJobQ, managerPreferences);

分析结果

分析雷达任务负载和它的搜索,确认和跟踪工作之间划分。该图显示,大部分的时间约75%的搜索工作,25%的就业机会的跟踪,也就是当目标没有机动预期雷达分配。当目标被操纵,资源管理器适应分配更多的跟踪工作。当更多的轨道,同时操纵,有更多的跟踪工作,为第700时间步附近看到。因为跟踪器被配置以确认轨道经过两次检测协会在三次尝试确认工作占用很少的时间雷达。因此,暂定轨道的确认或拒绝为迅速。

numSteps=numel(分配类型);allocationSummary=0(3,numSteps);我= 1:numStepsjobType=1:3 allocationSummary(jobType,i)=和(allocationType(1,max(1,i-2*updateRate+1):i)=jobType)/min(i-1,2*updateRate);结束结束图;阴谋(1:numSteps allocationSummary (: 1: numSteps))标题(“雷达分配与时间步长”);包含(“时间步长”); 伊拉贝尔(“在各模式中最后两秒步骤的级分”);传奇(“搜索”'确认'“跟踪”);网格在…上

将此结果与0.8 Hz航迹重访率下主动跟踪的结果进行比较。下图显示了主动跟踪案例的跟踪结果和雷达分配图。跟踪结果表明,有部分航迹丢失或损坏,但雷达资源分配图与自适应跟踪情况下的75%搜索和25%跟踪任务划分相似。您可以通过执行下面的代码示例来获得这些结果。

clearData (plp);clearData (dtp);clearData (trp);重置(跟踪);重启(场景);%对非机动和机动目标修改管理器首选项为1hz重访率managerPreferences =结构(...'类型', {“搜索”“确认”“TrackNonManeuvering”“TrackManeuvering”},...“RevisitRate”, {0, updateRate, 0.8, 0.8},...“优先”,{1000,3000,1500,2500});%运行场景allocationType = helperAdaptiveTrackingSim(scenario, thp, rax, tracker, resetJobQ, managerPreferences);

显然,主动跟踪需要更高的跟踪重访率。从下图可以看出,将跟踪重访率提高到2hz可以改善机动目标的跟踪。然而,雷达的成本是,即使在轨迹不机动的情况下,也要将超过50%的时间用于跟踪任务。如果目标数量更多,雷达就会不堪重负。

以前的研究结果表明,这是不够的2 Hz的频率重新审视机动目标。然而,可以自适应跟踪用于降低非机动目标的回访率超过0.8赫兹?下列图表为0.6赫兹和4Hz非机动和分别机动目标,本发明的结果。使用此设置,雷达资源分配允许80%-85在搜索模式%的时间,留给容量雷达搜索和跟踪更加的目标。

总结

这个例子说明了如何使用跟踪和雷达资源管理相结合,以适应回访率机动轨道。自适应跟踪允许您选择回访率适合于每个目标类型和机动状态。其结果是,雷达变得更加有效,并且可以跟踪机动目标的一个更大的数字。

参考文献

[1] charish, Alexander, Folker Hoffmann, Christoph Degen, Isabel Schlangen。“雷达资源管理从适应性到认知的发展”。IEEE航空航天和电子系统杂志35岁,没有。6(2020年6月1日):8-19。https://doi.org/10.1109/MAES.2019.2957847

金宝app辅助功能

getCurrentRadarTask

返回用于指向雷达波束的雷达任务。

类型(“getCurrentRadarTask.m”
function [currentjob,jobq] = getCurrentRadarTask(jobq,current_time) searchq = jobq. searchqueue;trackq = jobq.TrackQueue;searchidx = jobq.SearchIndex;num_trackq_items = jobq.NumTrackJobs;%更新搜索队列索引searchqidx = mod(searchidx-1,numel(searchq))+1;readyidx = Find ([trackq(1:num_trackq_items).Time]<=current_time);[~, maxpidx] = max ([trackq (readyidx) .Priority]);taskqidx = readyidx (maxpidx);如果找到的跟踪工作有更高的优先级,将其作为当前工作,并增加下一个搜索工作的优先级,因为它被推迟了。否则,下一个搜索任务就是当前的工作。 if ~isempty(taskqidx) % && trackq(taskqidx).Priority >= searchq(searchqidx).Priority currentjob = trackq(taskqidx); for m = taskqidx+1:num_trackq_items trackq(m-1) = trackq(m); end num_trackq_items = num_trackq_items-1; searchq(searchqidx).Priority = searchq(searchqidx).Priority+100; else currentjob = searchq(searchqidx); searchidx = searchqidx+1; end jobq.SearchQueue = searchq; jobq.SearchIndex = searchidx; jobq.TrackQueue = trackq; jobq.NumTrackJobs = num_trackq_items;

helperAdaptiveRadarSim

运行模拟

类型('helperAdaptiveTrackingSim.m'
函数分配类型=helperAdaptiveTrackingSim(scenario,thp,rax,tracker,resetJobQ,ManagerReferences)%Initialize variables雷达=scenario.Platforms{end}.Sensors{1};updateRate=radar.updateRate;resourceAllocation=nan(1,updateRate);h=直方图(rax,resourceAllocation,'BinMethod','integers');xlabel(h.Parent,'TrackID')标签(h.Parent,'Num beams');numSteps=updateRate*185;allocationType=nan(1,numSteps);currentStep=1;重新启动(场景);重置(跟踪器);%返回jobq-jobq=resetJobQ的重置状态;%绘图仪和轴plp=thp.绘图仪(1);dtp=thp.绘图仪(3);cvp=thp.绘图仪(4);trp=thp.绘图仪(5);%对于可重复的结果,设置随机种子并在完成时恢复它s=rng(2020);oc=onCleanup(@()rng(s));%Main loop tracks={};而advance(scenario)time=scenario.SimulationTime;%Update ground truth display poses=platformPoses(scenario);plotPlatform(plp,重塑([poses.Position],3,[]));%根据调度程序当前作业指向雷达[currentJob,jobq]=getCurrentRadarTask(jobq,time);currentStep=currentStep+1;如果currentStep>updateRate resourceAllocation(1:end-1)=resourceAllocation(2:updateRate);如果strcmpi(currentJob.JobType,'Search')detectableTracks=0(0,1,'uint32');resourceAllocation(最小值)([currentStep,updateRate])=0;allocationType(currentStep)=1;cvp.Color=[0 0 1];else detectableTracks=currentJob.TrackID;resourceAllocation(min([currentStep,updateRate])=currentJob.TrackID;cvp.Color=[1 0 1];如果strcmpi(currentJob.JobType,'Confirm')allocationType(currentStep)=2;else allocationType(currentStep)=3;end-end-ra=resourceAllocation(~isnan(resourceAllocation));h.Data=ra;h.Parent.YLim=[0 updateRate];h.Parent.XTick=0:max(ra);radar.LookAngle=currentJob.BeamDirection;plotCoverage(cvp,coverageConfig(scenario));%收集检测并绘制它们检测=检测(scenario);如果isempty(检测)meas=0(0,3);否则检测=[deg2rad(meassph(1)),deg2rad(meassph(1)),deg2rad(meassph(2)),meassph(3));meas=(Deg1}.测量参数.方向*[x;y;z]+检测{1}.测量参数.起始位置];末端检测(dtp,meas);%轨道和绘图轨道(如果锁定)(跟踪器)|检测[confirmedTracks,tentivetracks,~,analysisInformation]=跟踪器(检测,时间,可检测轨迹);pos=getTrackPositions(confirmedTracks,jobq.PositionSelector);plotTrack(trp,pos,字符串([confirmedTracks.TrackID]));tracks.confirmedTracks=confirmedTracks;tracks.tentivetracks=tentivetracks;tracks.analysisInformation=analysisInformation;tracks.PositionSelector=jobq.PositionSelector;end%管理下一个作业的资源jobq=manageResource(检测、作业、跟踪器、跟踪、当前作业、时间、管理者参考);end

initMPARIMM

初始化跟踪器使用的IMM筛选器。

类型('initMPARIMM.m'
函数imm = initMPARIMM(检测)cvekf = initcvekf(检测);cvekf.StateCovariance (2, 2) = 1 e6;cvekf.StateCovariance (4, 4) = 1 e6;cvekf.StateCovariance (6,6) = 1 e6;ctekf = initctekf(检测);ctekf.StateCovariance (2, 2) = 1 e6;ctekf.StateCovariance (4, 4) = 1 e6;ctekf.StateCovariance (7) = 1 e6;ctekf.ProcessNoise (3) = 1 e6;%大噪声未知角加速度imm = trackingIMM('TrackingFilters', {cvekf;ctekf}, ' transitionprobability ', [0.99, 0.99]);

管理资源

管理作业队列,然后创建一个基于跟踪结果新任务。

类型(“manageResource.m”
函数jobq = manageResource(detectionjobq,tracker,tracks,current_job,current_time,managerPreferences) trackq = jobq. trackqueue;num_trackq_items = jobq.NumTrackJobs;如果~为空(检测)检测=检测{1};Else检测= [];end %执行当前任务开关current_job。工作类型case 'Search' % For search job, if there is a detection, establish tentative % track and schedule a confirmation job if ~isempty(detection) % A search task can still find a track we already have. Define % a confirmation task only if it's a tentative track. There % could be more than one if there are false alarms. Create % confirm jobs for tentative tracks created at this update. numTentative = numel(tracks.tentativeTracks); for i = 1:numTentative if tracks.tentativeTracks(i).Age == 1 && tracks.tentativeTracks(i).IsCoasted == 0 trackid = tracks.tentativeTracks(i).TrackID; job = revisitTrackJob(tracker, trackid, current_time, managerPreferences, 'Confirm', tracks.PositionSelector); num_trackq_items = num_trackq_items+1; trackq(num_trackq_items) = job; end end end case 'Confirm' % For a confirm job, if the track ID is within the tentative % tracks, it means that we need to run another confirmation job % regardless of having a detection. If the track ID is within the % confirmed tracks, it means that we must have gotten a detection, % and the track passed the confirmation logic test. In this case we % need to schedule a track revisit job. trackid = current_job.TrackID; tentativeTrackIDs = [tracks.tentativeTracks.TrackID]; confirmedTrackIDs = [tracks.confirmedTracks.TrackID]; if any(trackid == tentativeTrackIDs) job = revisitTrackJob(tracker, trackid, current_time, managerPreferences, 'Confirm', tracks.PositionSelector); num_trackq_items = num_trackq_items+1; trackq(num_trackq_items) = job; elseif any(trackid == confirmedTrackIDs) job = revisitTrackJob(tracker, trackid, current_time, managerPreferences, 'TrackNonManeuvering', tracks.PositionSelector); num_trackq_items = num_trackq_items+1; trackq(num_trackq_items) = job; end otherwise % Covers both types of track jobs % For track job, if the track hasn't been dropped, update the track % and schedule a track job corresponding to the revisit time % regardless of having a detection. In the case when there is no % detection, we could also predict and schedule a track job sooner % so the target is not lost. This would require defining another % job type to control the revisit rate for this case. trackid = current_job.TrackID; confirmedTrackIDs = [tracks.confirmedTracks.TrackID]; if any(trackid == confirmedTrackIDs) jobType = 'TrackNonManeuvering'; mdlProbs = getTrackFilterProperties(tracker, trackid, 'ModelProbabilities'); if mdlProbs{1}(2) > 0.6 jobType = 'TrackManeuvering'; end job = revisitTrackJob(tracker, trackid, current_time, managerPreferences, jobType, tracks.PositionSelector); num_trackq_items = num_trackq_items+1; trackq(num_trackq_items) = job; end end jobq.TrackQueue = trackq; jobq.NumTrackJobs = num_trackq_items; end function job = revisitTrackJob(tracker, trackID, currentTime, managerPreferences, jobType, positionSelector) types = [managerPreferences.Type]; inTypes = strcmpi(jobType,types); revisitTime = 1/managerPreferences(inTypes).RevisitRate + currentTime; predictedTrack = predictTracksToTime(tracker,trackID,revisitTime); xpred = getTrackPositions(predictedTrack,positionSelector); [phipred,thetapred,rpred] = cart2sph(xpred(1),xpred(2),xpred(3)); job = struct('JobType',jobType,'Priority',managerPreferences(inTypes).Priority,... 'BeamDirection',rad2deg([phipred thetapred]),'WaveformIndex',1,'Time',revisitTime,... 'Range',rpred,'TrackID',trackID); end