主要内容

雷达机动目标自适应跟踪与管理

这个例子展示了如何使用雷达资源管理有效地跟踪多个机动目标。在雷达跟踪机动目标需要更频繁地重新审视目标比non-maneuvering跟踪目标。一个交互多模型(IMM)滤波器估计当目标机动。这一估计有助于管理雷达重新审视的时间,因此提高了跟踪。这个示例使用雷达的雷达工具箱™模型和传感器融合和跟踪工具箱™的跟踪。

介绍

多功能雷达可以搜索目标,确认新的歌曲,重新跟踪更新状态。执行这些功能,多功能雷达通常是由一个资源管理器创建搜索雷达任务,确认和跟踪。这些任务将根据优先级和时间,这样,在每个时间步,多功能雷达可以指出其梁在所需的方向。的多功能相控阵雷达搜索和跟踪调度(雷达工具箱)示例显示了一个多功能相控阵雷达资源管理器管理。

在这个例子中,我们扩展了多功能相控阵雷达搜索和跟踪调度(雷达工具箱)例子的情况下多个机动目标。有两个相互矛盾的要求雷达用来跟踪机动目标:

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

  2. 目标机动的时间事先是未知的。如果不是操纵,众所周知,目标的雷达可以重新审视目标很少。然而,由于操作的开始和结束时间未知,雷达必须重新审视每个跟踪足够频繁操作开始和结束时能够识别。

雷达必须提供足够的平衡梁以跟踪目标和留下足够的时间来寻找新的目标。一种方法是定义一个重游率在每个跟踪目标无论其操纵地位和离开新目标搜索的剩余时间。这有时被称为雷达管理方案积极的跟踪[1]。随着越来越多的成为跟踪目标,雷达可以执行更少的搜索任务也可以跟踪每个目标的频率更低。显然,如果目标的数量很大,雷达就会不知所措。

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

在本例中,您比较活跃的结果跟踪和自适应跟踪雷达适应基于估计跟踪机动。

定义场景模型和雷达

您定义一个场景和一个雷达20赫兹的更新率,这意味着雷达有每秒20梁用于搜索,确认或追踪。你负载使用的基准轨迹基准轨迹的多目标跟踪的例子。你有六个基准轨迹和定义为每一个轨迹。图中的六个平台遵循non-maneuvering腿点缀着机动的腿。您可以查看图中的轨迹。

%创建场景updateRate = 20;场景= trackingScenario (“UpdateRate”,updateRate);%添加基准轨迹负载(“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”85000年[0],“YLimits”(-45000 70000),“ZLimits”1000年[-10000]);plp = platformPlotter (thp,“DisplayName的”,“平台”);人民行动党= trajectoryPlotter (thp,“DisplayName的”,“轨迹”,“线宽”1);dtp = detectionPlotter (thp,“DisplayName的”,“检测”);本量利= coveragePlotter (thp,“DisplayName的”,“雷达覆盖”);trp = trackPlotter (thp,“DisplayName的”,“跟踪”,“ConnectHistory”,“上”,“ColorizeHistory”,“上”);numPlatforms =元素个数(scenario.Platforms);trajectoryPositions =细胞(1、numPlatforms);i = 1: numPlatforms trajectoryPositions{我}= lookupPose (scenario.Platforms{我}.Trajectory, (0:0.1:185));结束trajectoryPositions plotTrajectory (pap);视图(税,3)

图包含一个坐标轴对象和一个uipanel类型的对象。坐标轴对象包含6行类型的对象,补丁。这些对象代表平台、轨迹检测、雷达覆盖面,跟踪,(历史)。

概率雷达模型定义使用radarDataGenerator系统对象™。设置”ScanMode”这个对象的属性“自定义”让资源管理器来控制雷达的角度看。这使得调度的雷达搜索,确认和跟踪目标。雷达是安装在一个新的平台的场景。

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

定义跟踪器

雷达探测到的对象后,它源检测跟踪,执行一些操作。跟踪维护跟踪目标状态估计的列表在感兴趣的领域。如果无法分配给任何检测跟踪已经维护的追踪,追踪发起一个新的轨道。在大多数情况下,新的追踪是否代表一个真正的目标或假目标尚不清楚。首先,创建一个跟踪试探性的地位。如果得到足够的检测,跟踪确认。同样,如果没有分配到一个跟踪检测,跟踪是滑行(预测没有校正)。如果轨道有一些错过了更新,跟踪器删除跑道上。

在本例中,您使用一个跟踪器相关联的检测跟踪使用全局最近邻(GNN)算法。跟踪机动目标,你定义一个FilterInitializationFcn函数初始化一个IMM滤波器。的initMPARIMM函数使用了两个运动模型:一个常速模型和constant-turn率模型。的trackingIMM过滤器是负责评估每个模型的概率,你可以访问的ModelProbabilities财产。在本例中,您将一个目标时操纵constant-turn率模型的概率高于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 0 1);

雷达资源管理

本节仅简要概述了雷达资源管理。更多细节,请参阅雷达机动目标自适应跟踪与管理(雷达工具箱)的例子。

搜索任务

在本例中,您指定确定性搜索任务。光栅扫描用于覆盖所需的领空。方位扫描限制设置为60[-90]度和高度限制[0]-9.9度。如果不存在其他任务,雷达扫描一个角细胞的空间。一个角细胞的大小是由雷达的AzimuthResolutionElevationResolution属性。负仰角角度意味着从地平线雷达点光束。

AzimuthLimits = 60 [-90];ElevationLimits = -9.9 [0];azscanspan = diff (AzimuthLimits);numazscan =地板(azscanspan / radar.AzimuthResolution) + 1;AzimuthLimits azscanangles = linspace (AzimuthLimits (1), (2), numazscan) + radar.MountingAngles (1);elscanspan = diff (ElevationLimits);numelscan =地板(elscanspan / radar.ElevationResolution) + 1;ElevationLimits elscanangles = linspace (ElevationLimits (1), (2), numelscan) + radar.MountingAngles (2);[elscangrid, azscangrid] = meshgrid (elscanangles azscanangles);scanangles = [azscangrid (:) elscangrid (:))。”; searchq = struct(“JobType”,“搜索”,“BeamDirection”num2cell (scanangles 1),“优先”,1000,“WaveformIndex”1);current_search_idx = 1;

跟踪任务

不同的搜索任务,跟踪任务不能提前计划。相反,资源管理器创建的确认和跟踪任务基于场景的变化。的主要区别在这个例子雷达机动目标自适应跟踪与管理(雷达工具箱)的例子是JobType可以为每个跟踪任务“TrackNonManeuvering”“TrackManeuvering”。区分这两种类型的跟踪任务使您能够安排任务为每个类型的跟踪不同的重游率,是一种自适应跟踪算法。类似的搜索任务,跟踪任务也管理的工作队列中。

trackq = repmat(结构体(“JobType”[],“BeamDirection”[],“优先”,3000,“WaveformIndex”[],“时间”[],“范围”[],“TrackID”[])10 (1);num_trackq_items = 0;

搜索和跟踪队列分组的结构更容易参考模拟循环。

jobq。SearchQueue = searchq;jobq。SearchIndex = current_search_idx;jobq。TrackQueue = trackq;jobq。NumTrackJobs = num_trackq_items;jobq。PositionSelector = posSelector;% jobq复位状态resetJobQ = jobq;

任务调度

在这个示例中,为了简单起见,只执行一种多功能雷达的工作在一个小时间,通常被称为一个居住,但可以切换任务在每个居住的开始。对于每个住,雷达看着由于执行的所有任务,选择一个确认或追踪任务如果它运行的时刻已经到来。否则,雷达搜索任务。控制运行任务的时候,你设置managerPreferences结构定义如下。重游率最高,等于雷达更新率,是给了确认梁遵循每一个新任务,保证确认初步跟踪存在。类似地,您可以控制non-maneuvering的重游率和机动目标。在这种情况下,您选择的值为0.8赫兹和4赫兹non-maneuvering和机动目标,分别。因为有6个目标,资源管理器将使用 6 0 8 5 对跟踪目标每秒更新如果他们不是操纵。鉴于雷达更新率是20赫兹,雷达经理将执行大约每四更新一个目标更新。因此,雷达会花75%的时间在搜索模式,25%的时间在跟踪模式。当新的跟踪初始化和跟踪认为目标机动时,资源管理器分配更多的跟踪搜索横梁梁为代价的。

分析结果部分显示了其他选择的结果。

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

运行场景

在仿真过程中,雷达波束描绘了蓝色或紫色的颜色代表搜索和track-related梁,分别。您还可以看到搜索之间的任务分配和具体跟踪仿真使用资源分配的最后一秒过去第二个面板底部的图。在戏剧情节的部分图中,您可以看到每个追踪和比较它的历史轨迹。

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

图包含2轴uipanel类型的对象和其他对象。轴1包含12线类型的对象,对象,文本。这些对象代表平台、轨迹检测、雷达覆盖面,跟踪,(历史)。坐标轴对象2包含一个直方图类型的对象。

分析结果

分析了雷达搜索任务负载和其分歧,确认和跟踪工作。图表显示,大多数时候雷达搜索工作分配约75%和25%跟踪工作,时如预期目标并不是操纵。当目标机动时,资源管理器适应分配更多的跟踪工作。当更多的轨道机动的同时,有更多的跟踪工作,看到附近的第700次步骤。确认工作占据很少的雷达因为跟踪配置确认跟踪检测协会在三两次后。因此,初步跟踪是迅速的确认或拒绝。

numSteps =元素个数(allocationType);numSteps allocationSummary = 0(3日);我= 1:numStepsjobType = 1:3 allocationSummary (jobType,我)=总和(allocationType(1,马克斯(1,我2 * updateRate + 1): i) = = jobType) /分钟(张,2 * updateRate);结束结束图;阴谋(1:numSteps allocationSummary (: 1: numSteps))标题(“雷达分配和时间步”);包含(“时间步”);ylabel (分数的步骤在最后两秒每个模式”);传奇(“搜索”,“确认”,“跟踪”);网格

比较这个结果与活性跟踪的结果在0.8赫兹跟踪重游率。以下数据显示积极的跟踪结果和雷达配置图跟踪情况。跟踪结果表明,一些跟踪丢失和破坏,但雷达资源分配图显示一个类似的75%搜索和跟踪任务部门25%的情况下自适应跟踪。你可以获得这些结果通过执行下面的代码示例。

clearData (plp);clearData (dtp);clearData (trp);重置(跟踪);重启(场景);%修改经理偏好0.8赫兹重访率non-maneuvering和机动目标managerPreferences =结构(“类型”,{“搜索”,“确认”,“TrackNonManeuvering”,“TrackManeuvering”},“RevisitRate”{0,updateRate, 0.8, 0.8},“优先”、{1000、3000、1500、2500});%运行场景allocationType = helperAdaptiveTrackingSim(场景、thp伸展,追踪、resetJobQ managerPreferences);

ActiveTracking0808.png

显然,需要更高的跟踪重访率积极跟踪。下面两个图显示,增加跟踪重访率2赫兹提高了机动目标的跟踪。然而,雷达的成本投入超过50%的时间来跟踪任务即使轨道机动。如果目标是更大的数量,雷达会变得不知所措。

radarAllocation22.png

前面的结果表明,它是足够重温机动目标的速度2赫兹。然而,自适应跟踪可以用来降低non-maneuvering目标超出0.8赫兹的重游率?下面的图表呈现结果为0.6赫兹和4赫兹non-maneuvering和机动目标,分别。经过这样设置后,雷达资源分配允许80% -85%的时间在搜索模式下,使雷达搜索和跟踪的能力更多的目标。

ActiveTracking064.png

总结

这个例子展示了如何使用跟踪和雷达资源管理适应机动跟踪的重游率。自适应跟踪允许您为每个目标类型选择适当的重游率和操纵状态。因此,雷达变得更有效率,可以跟踪更多的机动目标。

引用

[1]Charlish,亚历山大,民间霍夫曼Christoph德根,伊莎贝尔贝。“发展从适应到认知雷达资源管理。”IEEE航空航天和电子系统杂志35岁,没有。6(2020年6月1日):8-19。https://doi.org/10.1109/MAES.2019.2957847

万博1manbetx支持功能

getCurrentRadarTask

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

类型(“getCurrentRadarTask.m”)
函数[currentjob jobq] = getCurrentRadarTask (jobq,当前时间)searchq = jobq.SearchQueue;trackq = jobq.TrackQueue;searchidx = jobq.SearchIndex;num_trackq_items = jobq.NumTrackJobs;%更新搜索队列索引searchqidx =国防部(searchidx-1,元素个数(searchq)) + 1;%找到跟踪工作,并具有最高优先级readyidx =找到([trackq (1: num_trackq_items) .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”)
函数allocationType = helperAdaptiveTrackingSim(场景中,经过,伸展,追踪、resetJobQ managerPreferences) %初始化变量雷达= scenario.Platforms{结束}.Sensors {1};updateRate = radar.UpdateRate;resourceAllocation =南(1、updateRate);h =直方图(resourceAllocation伸出,“BinMethod”,“整数”);包含(h.Parent TrackID) ylabel (h。父母,“Num梁”);numSteps = updateRate * 185;allocationType =南(1、numSteps);currentStep = 1;重启(场景);重置(跟踪); % Return to a reset state of jobq jobq = resetJobQ; % Plotters and axes plp = thp.Plotters(1); dtp = thp.Plotters(3); cvp = thp.Plotters(4); trp = thp.Plotters(5); ax = gca; colors = ax.ColorOrder; % For repeatable results, set the random seed and revert it when done s = rng(2020); oc = onCleanup(@() rng(s)); % Main loop tracks = {}; while advance(scenario) time = scenario.SimulationTime; % Update ground truth display poses = platformPoses(scenario); plotPlatform(plp, reshape([poses.Position],3,[])'); % Point the radar based on the scheduler current job [currentJob,jobq] = getCurrentRadarTask(jobq,time); currentStep = currentStep + 1; if currentStep > updateRate resourceAllocation(1:end-1) = resourceAllocation(2:updateRate); end if strcmpi(currentJob.JobType,'Search') detectableTracks = zeros(0,1,'uint32'); resourceAllocation(min([currentStep,updateRate])) = 0; allocationType(currentStep) = 1; cvp.Color = colors(1, :); else detectableTracks = currentJob.TrackID; resourceAllocation(min([currentStep,updateRate])) = currentJob.TrackID; if strcmpi(currentJob.JobType,'Confirm') allocationType(currentStep) = 2; cvp.Color = colors(2, :); else allocationType(currentStep) = 3; cvp.Color = colors(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)); % Collect detections and plot them detections = detect(scenario); if isempty(detections) meas = zeros(0,3); else dets = [detections{:}]; meassph = reshape([dets.Measurement],3,[])'; [x,y,z] = sph2cart(deg2rad(meassph(1)),deg2rad(meassph(2)),meassph(3)); meas = (detections{1}.MeasurementParameters.Orientation*[x;y;z]+detections{1}.MeasurementParameters.OriginPosition)'; end plotDetection(dtp, meas); % Track and plot tracks if isLocked(tracker) || ~isempty(detections) [confirmedTracks,tentativeTracks,~,analysisInformation] = tracker(detections, time, detectableTracks); pos = getTrackPositions(confirmedTracks,jobq.PositionSelector); plotTrack(trp,pos,string([confirmedTracks.TrackID])); tracks.confirmedTracks = confirmedTracks; tracks.tentativeTracks = tentativeTracks; tracks.analysisInformation = analysisInformation; tracks.PositionSelector = jobq.PositionSelector; end % Manage resources for next jobs jobq = manageResource(detections,jobq,tracker,tracks,currentJob,time,managerPreferences); 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},“TransitionProbabilities”, [0.99, 0.99]);

manageResources

管理作业队列并创建新任务根据跟踪结果。

类型(“manageResource.m”)
函数jobq = manageResource (current_job jobq检测,跟踪,跟踪,当前时间,managerPreferences) trackq = jobq.TrackQueue;num_trackq_items = jobq.NumTrackJobs;如果~ isempty(检测)检测=检测{1};其他检测= [];current_job %执行结束目前的工作开关。JobTypecase '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