主要内容

使用GM-PHD跟踪器跟踪点目标密集杂乱

这个例子向您展示了如何在密集杂波跟踪点目标使用高斯混合概率假设密度(GM-PHD)跟踪器使用一个恒定的速度模型。

设置场景

在这个例子中使用的场景创建的使用trackingScenario。5点的场景由匀速运动目标。视场内的目标移动一个静态二维雷达传感器。您使用monostaticRadarSensor模拟二维传感器和安装它在一个静态的平台。您使用FalseAlarmRate属性的传感器来控制混乱的密度。的值FalseAlarmRate产权代表的概率生成假警报在一个分辨单元的传感器。基于的误警率 10 - - - - - - 3 和传感器的分辨率定义在这个例子中,大约有48个假警报生成的每一步。

%的目标位置rng (2022);%创建一个trackingScenario对象现场= trackingScenario (“UpdateRate”10“StopTime”10);numTgts = 5;%初始化每个目标的位置和速度x = 100 *(2 *兰德(numTgts, - 1) - 1);y = 100 *(2 *兰德(numTgts, - 1) - 1);z = 0 (numTgts, 1);vx = 5 * randn (numTgts, 1);v = 5 * randn (numTgts, 1);vz = 0 (numTgts, 1);%平台添加到场景中与给定的位置和速度。i = 1: numTgts thisTgt =平台(现场);thisTgt.Trajectory。Position = [x(i) y(i) z(i)]; thisTgt.Trajectory.Velocity = [vx(i) vy(i) vz(i)];结束%添加一个检测平台。detectingPlatform =平台(现场);detectingPlatform.Trajectory。位置= (-200 0 0);使用monostaticRadarSensor %模拟二维雷达。雷达= monostaticRadarSensor (1,“UpdateRate”scene.UpdateRate,“DetectionProbability”,0.9,% Pd“FalseAlarmRate”1 e - 3,% Pfa“FieldOfView”,120年[1],“ScanMode”,“没有扫描”,“DetectionCoordinates”,“场景”,%在场景框架报告“之内”,真的,%在场景框架使INS报告“ReferenceRange”,300,%短程“ReferenceRCS”10%的默认RCS平台“MaxUnambiguousRange”,400,%短程“RangeResolution”,1“AzimuthResolution”,1“HasFalseAlarms”,真正的);%报告假警报%安装雷达在检测平台上。detectingPlatform。传感器=雷达;

建立追踪和指标

跟踪器

你使用GM-PHD point对象跟踪器跟踪目标。配置一个博士跟踪器的第一步是建立传感器的配置。定义配置使用trackingSensorConfiguration对象。

SensorIndex的配置设置为1匹配的模拟传感器。的传感器是一个点对象传感器输出最多每扫描一检测对象,设置MaxNumDetsPerObject属性的配置为1。

SensorTransformFcn,SensorTransformParameters,SensorLimits一起允许您定义的区域跟踪传感器可以检测到。的SensorTransformFcn定义跟踪状态的变换( x 跟踪 )到一个中间空间使用的传感器( x 传感器 )定义跟踪检测能力。整体计算探测概率计算如下所示:

x 传感器 = SensorTransformFcn ( x 跟踪 , SensorTransformParameters )

P d =

{ 配置 DetectionProbability SensorLimits ( : , 1 ) x 传感器 SensorLimits ( : , 2 ) 配置 MinDetectionProbability 否则

计算探测概率的不确定状态与给定状态协方差,跟踪器使用sigma-point计算生成的样品状态类似于一个无味卡尔曼滤波器。

注意到的签名SensorTransformFcn类似于一个典型的度量模型。因此,您可以使用函数cvmeas,cameas作为SensorTransformFcn。在这个例子中,假设所有跟踪检测。因此,SensorTransformFcn被定义为@ x (x, params)和SensorLimits被定义为(负无穷到正无穷)所有国家。

%变换函数和限制sensorTransformFcn = @ x (x, params);sensorTransformParameters =结构;sensorLimits =(负无穷到正无穷)。*的(6,1);%检测概率为传感器配置Pd = radar.DetectionProbability;配置= trackingSensorConfiguration (“SensorIndex”,1“IsValidTime”,真的,%更新每一步“MaxNumDetsPerObject”,1“SensorTransformFcn”sensorTransformFcn,“SensorTransformParameters”sensorTransformParameters,“SensorLimits”sensorLimits,“DetectionProbability”,Pd);

ClutterDensity属性的配置是指误警率单位体积的测量空间。在这个例子中,笛卡尔坐标的测量空间被定义为场景中的检测报告框架。作为传感器的体积的决议在笛卡尔坐标系的方位和距离分辨率变化,一个近似值可以计算平均射程的传感器。

%传感器参数计算体积的决议Rm = radar.MaxUnambiguousRange / 2;%的意思是范围dTheta = radar.ElevationResolution;%的偏见分数降低分辨率大小“有效”dPhi = radar.AzimuthBiasFraction * radar.AzimuthResolution;= radar.RangeBiasFraction * radar.RangeResolution博士;细胞体积百分比VCell = 2 * ((Rm +博士)^ 3 - Rm ^ 3) / 3 *(信德(dTheta / 2)) *函数(dPhi);%误警率Pfa = radar.FalseAlarmRate;%定义杂波密度配置。ClutterDensity = Pfa / VCell;

您还定义了一个FilterInitializationFcn指定类型的过滤器和过滤器组件的分布,由这个传感器初始化。在本例中,您设置了FilterInitializationFcninitcvgmphd,创建一个常速GM-PHD过滤器并添加1组件/跟踪器的检测概率很低。的initcvgmphd不添加任何组件调用时没有检测。这意味着在这个配置中,出生组件仅仅是添加到过滤器检测以外的AssignmentThreshold多目标的纳税人。看到一个ssignmentThreshold的属性trackerPHD为更多的细节。

配置。FilterInitializationFcn = @initcvgmphd;

接下来创建跟踪器使用这个配置使用trackerPHD系统对象™。在配置一个跟踪器,你指定出生率属性定义的目标出现在单位时间内的视野。的FilterInitializationFcn使用配置添加一个组件/未赋值的检测。在每个时间步,你可以期望组件的数量约等于假警报的数量和新的目标。跟踪器分配出生率所有这些组件均匀。

%使用雷达细胞的数量来计算单位时间内的假警报。ncell = radar.MaxUnambiguousRange / radar.RangeResolution * radar.FieldOfView (1) / radar.AzimuthResolution;numFalse = Pfa * ncell;%选择为每个新组件的初始重量0.05。随着许多新%的目标,不知道新的数量的组件只是用作数字%的假警报。0.1更新率。出生率= 0.05 * (numFalse) / 0.1;%定义创建一个跟踪传感器配置。追踪= trackerPHD (“出生率”出生率,“SensorConfigurations”、配置);

指标

评估跟踪器的性能,还建立了一个为绩效评估指标。在本例中,您使用广义优化子模式分配(GOSPA)指标。GOSPA度量旨在评估跟踪器的性能通过分配一个成本值。更好的跟踪性能,GOSPA成本越低。值0表示完美的跟踪。

%创建gospa度量对象。gospa = trackGOSPAMetric;%初始化变量来存储度量每一步。gospaMetric = 0 (0, 1);loc = 0 (0, 1);太= 0 (0,1);英国《金融时报》= 0 (0,1);

运行仿真

接下来,您推进情况,收集检测的场景中,并运行博士跟踪模拟检测。

创建一个显示百分比显示= helperClutterTrackingDisplay(现场);数= 1;%计数器用于存储度量数据rng (2018);%的运行推进(场景)%当前时间时间= scene.SimulationTime;%电流检测检测=检测(现场);%的踪迹跟踪=追踪(检测、时间);%更新显示显示器(场景,检测、跟踪);%计算GOSPA。getTruth函数定义如下。真理= getTruth(现场);[~,gospaMetric(计数),~,loc(计数)太(计数),英国《金融时报》(计数)]= gospa(痕迹,真理);数=计数+ 1;结束

你可以想象,所有目标跟踪的博士跟踪在这个场景中。这也可以使用GOSPA定量评估指标和相关的组件。在下面的图中,注意GOSPA几步后指标下降。GOSPA指标较高的初始值,因为每个跟踪建立的延迟。

图(“单位”,“归一化”,“位置”[0.1 - 0.1 0.8 - 0.8])次要情节(2 2 2 [1]);情节(gospaMetric“线宽”2);标题(“总GOSPA”);ylabel (“GOSPA指标”);包含(“时间步”);网格;次要情节(2、2、3);情节(太“线宽”2);标题(“错过了目标GOSPA”);ylabel (“错过了目标指标”);包含(“时间步”);网格;次要情节(2、2、4);图(见英国《金融时报》“线宽”2);标题(“虚假跟踪GOSPA”);ylabel (“虚假目标指标”);包含(“时间步”);网格;

分析性能

典型方法资格跟踪器的性能是通过运行一些模拟场景的不同实现。蒙特卡罗模拟有助于抵消的效果随机事件如假警报的位置,错过的事件目标,并在测量噪声。

在本节中,您运行不同实现的场景和不同的假警报率的追踪和计算的平均GOSPA系统为每一个实现。运行场景的过程和计算系统的平均GOSPA包裹在helper函数helperRunMonteCarloAnalysis加快蒙特卡洛模拟,可以生成代码monostaticRadarSensor模型以及trackerPHD使用MATLAB®编码器™工具。的过程生成代码包装在helper函数helperGenerateCode。为一个算法生成代码,代码组装成一个独立的函数。这个函数命名clutterSimTracker_kernel在这个例子中。的clutterSimTracker_kernel函数是写入支持四个假警报率。万博1manbetx与不同的假警报率重新生成代码,您可以使用下面的命令。

pfa = 10 ^ (4、3、4);%选择你的假警报设置helperGenerateCode(场景,pfa);%生成代码

为更多的假警报设置重新生成代码,您可以修改函数包括更多持久的变量。更多细节关于如何生成代码对系统对象™,参考如何生成C代码跟踪的例子。

helperRunMonteCarloAnalysis函数使用一个parfor执行每个蒙特卡罗运行。如果你有并行计算工具箱™许可证,蒙特卡洛运行可以分布在多个工人进一步加速模拟。

%打开国旗蒙特卡罗模拟运行pfa = 10。^ linspace (4、3、4);runMonteCarlo = false;如果runMonteCarlo numRunsPerPfa = 50;% #好< UNRCH >gospaMCs = 0 (4 numRunsPerPfa 4);i = 1:4 gospaMCs(我::)= helperRunMonteCarloAnalysis(场景,pfa, pfa(我),numRunsPerPfa);结束保存clutterTrackingMCRuns.matgospaMCs;其他的%重新加载的结果持续运行负载(“clutterTrackingMCRuns.mat”,“gospaMCs”);结束%绘制结果图(“单位”,“归一化”,“位置”[0.1 - 0.1 0.8 - 0.8])次要情节(2 2 2 [1]);情节(gospaMCs (:: 1)”,“线宽”2);标题(“GOSPA”);传奇(strcat (“Pfa = '字符串(pfa)),“定位”,“水平”,“位置”,“NorthOutside”);ylabel (“平均GOSPA指标”);包含(“蒙特卡罗运行”);网格;次要情节(2、2、3);情节(gospaMCs (:: 3)”,“线宽”2);标题(“错过了目标GOSPA”);ylabel (的平均错过目标指标的);包含(“蒙特卡罗运行”);网格;次要情节(2、2、4);情节(gospaMCs (:: 4)”,“线宽”2);标题(“虚假跟踪GOSPA”);ylabel (的平均错误跟踪指标的);包含(“蒙特卡罗运行”);网格;

上面的情节显示跟踪器的性能在这个场景中通过运行50蒙特卡洛实现每个误警率。随着误警率的增加,生成一个错误的轨道的概率增加。这个概率更高附近的传感器,在细胞的密度分辨率要高得多。随着密集假警报,频繁的出现在这一地区,它们可以作为低速false-track更进一步。可以观察到这种行为的跟踪器的平均“错误跟踪组件”GOSPA度量每个场景运行。注意,随着误警率的增加,峰值的数量情节也会增加。这也导致增加总GOSPA度量。“错过了目标组件”是所有除了一个零。这种类型的事件是由多个错过目标的传感器。

总结

在这个示例中,您了解了如何配置和初始化一个GM-PHD跟踪器跟踪点目标对于一个给定的误警率。您还了解了如何使用GOSPA评估跟踪器的性能指标及其相关组件。此外,您了解了如何运行的几个实现场景下不同的假警报设置跟踪器的性能特征。

效用函数

helperRunMonteCarloAnalysis

函数gospaMC = helperRunMonteCarloAnalysis(场景,pfa、Pfai numRuns)清晰clutterSimTracker_kernel;%计算,追踪运行基于Pfa提供settingToRun =找到(pfa = = Pfai 1“第一”);%初始化每个蒙特卡罗ospa运行gospaMC = 0 (numRuns 4);%使用parfor并行模拟parfori = 1: numRuns rng(我“旋风”);%重启每次运行前的场景重启(现场);在这个场景中%指标和时间gospaMetric = 0 (0, 4);%计数器数= 0;%推进现场和运行推进(场景)数=计数+ 1;%使用targetPoses函数使用雷达传感器结束自己= scene.Platforms {};tgtPoses = targetPoses(自己的,“rotmat”);insPose =姿势(自己的);提出了= platformPoses(场景,“rotmat”);真理=姿势(1:end-1);时间= scene.SimulationTime;%重置追踪最后一步在下一次调用跟踪%重置为0。systemToReset = settingToRun * (abs(时间- scene.StopTime) < 1 e - 3);%存储ospa度量。跟踪和检测可以输出%场景生成代码无需蒙特卡洛。[~,~,gospaMetric(计数,:))= clutterSimTracker_kernel (pfa、tgtPoses insPose,真理,时间,settingToRun, systemToReset);结束%计算平均GOSPA的运行%从时间步20允许跟踪机构。gospaMC(我)=意味着(gospaMetric(20:最终,));结束结束

helperGenerateCode

函数helperGenerateCode(场景,pfa)% #好< DEFNU >%使用platformPoses生成样本构成提出了= platformPoses(场景,“rotmat”);%为内核函数生成样本的输入%% pfa必须编译时常量,他们不能改变随着时间的推移pfa = coder.Constant (pfa);%的目标提出了作为一个变量大小arrray马克斯20元素tgtPoses = coder.typeof(姿势(1),20 [1],[1 0]);%标量ins构成insPose =姿势(scene.Platforms {1},“真正的”);%的真理信息与最大的20个目标真理= coder.typeof(姿势(1),20 [1],[1 0]);%的时间时间= 0;%的错误报警设置运行和重置。重置是必要的%在每次运行跟踪初始化systemToRun = 1;systemToReset = 1;输入= {pfa, tgtPoses insPose,真理,时间,systemToRun, systemToReset};% #好< NASGU >%同名为MATLAB文件允许影子时的MATLAB函数%墨西哥人文件是可用的和自动执行代码在墨西哥人。codegenclutterSimTracker_kernelarg游戏输入- oclutterSimTracker_kernel;结束

getTruth

函数真理= getTruth(场景)platPoses = platformPoses(场景);%真实信息真理= platPoses (1: end-1);%对象的认同感结束

clutterSimTracker_kernel

这个函数是定义在一个外部文件命名clutterSimTracker_kernel,这个脚本一样的工作目录。

函数(检测、跟踪,ospaMetric) = clutterSimTracker_kernel (pfa、tgtPoses insPose,真理,时间,systemToRun, systemToReset)断言(元素个数(pfa) = = 4,“只有4假警报设置支持。万博1manbetx重写更持久的变量添加更多的设置”);持续的tracker1 tracker2 tracker3 tracker4radar1 radar2 radar3 radar4reset1 reset2 reset3 reset4gospa如果isempty (gospa) | | isempty (reset1) | | isempty (reset2) | | isempty (reset3) | | isempty (reset4) gospa = trackGOSPAMetric (“CutoffDistance”,50);结束如果isempty (tracker1) | | isempty (radar1) | | isempty (reset1) tracker1 = setupTracker (pfa (1));radar1 = setupRadar (pfa (1));reset1 = 0 (1, 1);结束如果isempty (tracker2) | | isempty (radar2) | | isempty (reset2) tracker2 = setupTracker (pfa (2));radar2 = setupRadar (pfa (2));reset2 = 0 (1, 1);结束如果isempty (tracker3) | | isempty (radar3) | | isempty (reset3) tracker3 = setupTracker (pfa (3));radar3 = setupRadar (pfa (3));reset3 = 0 (1, 1);结束如果isempty (tracker4) | | isempty (radar4) | | isempty (reset4) tracker4 = setupTracker (pfa (4));radar4 = setupRadar (pfa (4));reset4 = 0 (1, 1);结束开关systemToRun情况下1检测= radar1 (tgtPoses、insPose、时间);跟踪= tracker1(检测、时间);情况下2检测= radar2 (tgtPoses、insPose、时间);跟踪= tracker2(检测、时间);情况下3检测= radar3 (tgtPoses、insPose、时间);跟踪= tracker3(检测、时间);情况下4检测= radar4 (tgtPoses、insPose、时间);跟踪= tracker4(检测、时间);否则错误(“Idx越界”);结束[gp, ~ ~, loc,太,英国《金融时报》)= gospa(痕迹,真理);ospaMetric = (gp loc mT英尺);开关systemToReset情况下1 reset1 = 0 (0,1);情况下2 reset2 = 0 (0,1);情况下3 reset3 = 0 (0, 1);情况下4 reset4 = 0 (0,1);结束结束函数追踪= setupTracker (Pfa) Pd = 0.9;VCell = 0.0609;%内联细胞体积的价值;Kc = Pfa / VCell;%杂波密度%的出生率出生率= 0.05 * (5 + Pfa * 48000) / 0.1;%变换函数和限制sensorTransformFcn = @ x (x, params);sensorTransformParameters =结构;sensorLimits = bsxfun (@times,负无穷到正无穷,(6,1));%到trackingSensorConfiguration装配信息配置= trackingSensorConfiguration (“SensorIndex”,1“IsValidTime”,真的,%更新每一步“DetectionProbability”帕金森病,%检测概率的检测状态“ClutterDensity”Kc,%杂波密度“SensorTransformFcn”sensorTransformFcn,“SensorTransformParameters”sensorTransformParameters,“SensorLimits”sensorLimits,“MaxNumDetsPerObject”,1“FilterInitializationFcn”,@initcvgmphd);追踪= trackerPHD (“SensorConfigurations”配置,“出生率”,出生率);结束函数雷达= setupRadar (Pfa) Pd = 0.9;雷达= monostaticRadarSensor (1,“UpdateRate”10“DetectionProbability”帕金森病,“FalseAlarmRate”Pfa,“FieldOfView”,120年[1],“ScanMode”,“没有扫描”,“DetectionCoordinates”,“场景”,%在场景框架报告“之内”,真的,%在场景框架使INS报告“ReferenceRange”,300,%短程“ReferenceRCS”10“MaxUnambiguousRange”,400,%短程“RangeResolution”,1“AzimuthResolution”,1“HasFalseAlarms”,真正的);结束