主要内容

使用分布式同步无源传感器跟踪

本例演示了使用空间分布和同步无源传感器测量的对象跟踪。在使用单一机动传感器的被动测距,您了解了被动测量提供目标状态的不完全可观察性,以及如何操纵单个传感器来获得距离信息。另外,也可以使用多个静止传感器来获得可观测性。在本例中,您将学习如何通过融合来自被动同步传感器的多个检测来跟踪多个对象。

简介

在同步多传感器-多目标跟踪问题中,同步收集来自多个无源传感器的检测,并用于估计以下内容:

  • 场景中的目标数量

  • 目标的位置和速度

方法的使用跟踪前静态融合[1]体系结构用于跟踪使用被动测量。的静态融合该体系结构的一部分旨在对最可能的检测集进行三角测量,并输出包含目标估计位置的融合检测。由于测量需要通过静态融合融合在一起,传感器必须同步报告测量结果。

对于只包含视线(LOS)信息的测量,至少需要2个传感器才能找到位置。然而,使用2个传感器,当多个目标位于同一平面时,就会出现虚影问题(在没有目标的点上相交)。对于2个目标和2个传感器,不可能从单帧测量中识别出正确的对,如下图所示:

因此,必须使用3个或更多的传感器来减少重影问题。由于测量噪声和错误测量的存在,很难完全消除重影问题。静态关联返回的幽灵三角测量很可能被动态关联块丢弃,因为目标和传感器的几何形状在场景中发生了变化。

定义场景

在这里使用的场景中,传感器和目标的相对位置取自[1]中的一个示例。该方案由5个等间距的目标组成,由3到5个被动传感器观测。无源检测采用radarEmitter而且fusionRadarSensorDetectionMode设置为ESM.的HasNoise属性设置为产生无噪声检测和虚假警报。在本例中,噪声通过用户控制的变量添加到测量中。这是为了模拟传感器噪声对静态融合的影响。每个传感器都有一个180度的方位角和一个FalseAlarmRate每方位分辨率1e-3单元。这将导致每次扫描产生2到3个假警报。场景定义被包装在helper函数中helperGenerateFusionScenarioData

[detectionBuffer,truthLog,theaterDisplay] = helperGenerateStaticFusionScenarioData;showScenario (theaterDisplay);

showGrabs (theaterDisplay []);

三传感器履带

在本节中,只考虑来自内部三个传感器的测量,并且每个传感器的测量噪声协方差设置为0.01度平方。

来自每个传感器的检测被传递到一个staticDetectionFuser.的MeasurementFusionFcn被动三角测量被指定为triangulateLOS.的MeasurementFusionFcn允许指定一个函数来融合给定的检测组合(每个传感器最多一个检测),并返回融合的位置及其误差协方差。的参数FalseAlarmRate体积而且DetectionProbability指定为反映此场景中模拟的传感器的参数。这些参数用于计算可行关联的可能性。的UseParallel属性时,设置为真正的,允许熔断器评估可行的关联使用并行处理器。

跟踪是通过GNN数据关联实现的trackerGNN

跟踪性能用trackAssignmentMetrics而且trackErrorMetrics

设置

传感器数量%numSensors = 3;使用triangulateLOS函数创建检测熔断器% MeasurementFusionFcn,指定传感器参数。fuser =静态检测fuser (“MeasurementFusionFcn”@triangulateLOS,...“MaxNumSensors”numSensors,...“UseParallel”,真的,...“FalseAlarmRate”1 e - 3,...“体积”, 0.0716,...“DetectionProbability”, 0.99);%使用GNN跟踪器跟踪跟踪器= trackerGNN(“AssignmentThreshold”45岁的...“ConfirmationThreshold”[3 - 5],“DeletionThreshold”[4 - 5]);使用赋值和错误度量来计算精度。trackingMetrics = trackAssignmentMetrics(“DistanceFunctionFormat”“自定义”...“AssignmentDistanceFcn”@trueAssignment,“DivergenceDistanceFcn”, @trueAssignment);errorMetrics = trackErrorMetrics;

运行三个传感器的模拟

测量噪声%measNoise = 0.01;时间= 0;模拟时间%dT = 1;% 1hz场景更新速率。%循环通过检测和跟踪目标iter = 1: nummel (detectionBuffer)%真相信息sensorplatpose = truthLog{iter}(1:numSensors);targetplatpose = truthLog{iter}(6:结束);groundTruth = [sensorplatpose; targetplatpose];使用记录的检测生成噪声检测thisBuffer = detectionBuffer{iter};availableDetections = vertcat(thisBuffer{1:numSensors});noiseDetections = addNoise(availableDetections,measNoise);使用熔断器检测熔断器噪声fusedDetections = fuser(噪声检测);在熔融检测上运行跟踪器confTracks =跟踪器(fusedDetections,时间);更新跟踪和分配指标trackingMetrics (confTracks targetPlatPoses);[trackIDs,truthIDs] = currentAssignment(trackingMetrics);errorMetrics (confTracks trackIDs、targetPlatPoses truthIDs);更新影院显示detsToPlot = [noiseDetections(:);fusedDetections(:)];theaterDisplay (confTracks detsToPlot groundTruth);模拟时间增量%时间=时间+ dT;结束轴(theaterDisplay.TheaterPlot.Parent);

ylim (1.5 [0]);

使用三个噪声协方差为0.01度平方的传感器进行跟踪的结果可以使用分配指标进行总结。请注意,所有的轨道都被分配到正确的真理,没有虚假的轨道被跟踪器确认。这些结果表明了良好的静态关联精度。

assignmentTable = trackMetricsTable(trackingMetrics);assignmentTable (: {“TrackID”“AssignedTruthID”“TotalLength”“FalseTrackStatus”})
ans = 5×4 table TrackID assigndtruthid TotalLength false trackstatus _______ _______________ ___________ ________________ 3 10 59 false 6 7 59 false 7 6 59 false 10 9 58 false 11 8 58 false

目标位置和速度的估计误差可以用误差度量来概括。所有目标的位置和速度误差分别在7米和2米/秒以内,归一化误差接近于1。误差度量表明了良好的动态关联和跟踪性能。

disp (cumulativeTrackMetrics (errorMetrics));
TrackID posRMS velRMS posANEES velANEES _______ ______ ______ ________ ________ 3 6.8821 1.595 2.51 0.80396 6 3.9895 1.1149 1.6409 0.5416 7 5.8195 1.3356 1.9041 0.66745 10 4.2425 1.2514 1.6719 0.62374 11 3.6443 1.1453 1.375 0.55326

测量精度的影响

融合被动探测以消除虚影高度依赖于被动测量的精度。随着测量噪声的增加,鬼关联和真实关联之间的区别变得不那么突出,导致静态关联的准确性显著下降。对于距离较近的目标,也可能发生融合探测与履带的错误关联。在下一节中,将介绍一个辅助函数helperRunStaticFusionSimulation用于重新运行测量噪声协方差为2度平方的场景。

使用高测量噪声再次运行该场景

numSensors = 3;measNoise = 2;平方根(2)度的%标准偏差[trackingMetrics,errorMetrics] = helperRunStaticFusionSimulation(detectionBuffer,truthLog,numSensors,measNoise,theaterDisplay,false);轴(theaterDisplay.TheaterPlot.Parent);

ylim (1.5 [0]);

注意,在这个模拟中,一些轨道被确认,然后被丢弃。差的静态关联精度导致鬼目标三角测量更频繁,这导致跟踪器删除这些轨迹由于多次失误。

assignmentTable = trackMetricsTable(trackingMetrics);assignmentTable (: {“TrackID”“AssignedTruthID”“TotalLength”“FalseTrackStatus”})
ans = 9×4 table TrackID AssignedTruthID TotalLength false trackstatus _______ _______________ ___________ ________________ 1 10 59 false 3 NaN 4 true 4 NaN 5 false 6 7 59 false 7 6 59 false 10 9 57 false 11 8 56 false 13 NaN 5 false 18 NaN 5 true

每个真理的估计误差都更高。请注意,轨道在上面的剧院显示中跳跃。

disp (cumulativeTruthMetrics (errorMetrics));
TruthID posRMS velRMS posANEES velANEES _______ ______ ______ ________ ________ 6 261.26 7.498 82.824 1.4568 7 54.822 3.226 3.9109 0.92307 8 50.606 4.6234 2.8907 1.1096 9 83.002 5.0335 7.1213 1.6252 10 206.17 7.0411 47.227 1.8917

通过增加传感器数量,可以提高关联精度。然而,随着每个传感器的增加,计算需求呈指数级增长。静态融合算法将大部分时间用于计算每个三角测量的可行性。这部分算法是并行化时的UseParallel的属性staticDetectionFuser设置为真正的,它提供了与处理器数量成比例的线性加速。为了进一步加速执行,您还可以生成C/ c++代码,这些代码也可以在多个处理器上并行执行。您可以学习使用MATLAB®Coder™代码生成的基础知识开始使用MATLAB编码器(MATLAB编码器)

通过并行化和代码生成加速MATLAB代码

为了加速MATLAB代码的仿真,必须将算法重构为MATLAB函数,可编译为MEX文件或共享库。为此,将静态融合算法重构为一个函数。为了在多个调用之间保持熔断器的状态,它被定义为持续的变量。

类型(“mexFuser”);
function [superDets,info] = mexFuser(detects) %#codegen persistent fuser if isempty(fuser) fuser = staticDetectionFuser('MeasurementFusionFcn',@triangulateLOS,…“MaxNumSensors”5…“UseParallel”,真的,…“FalseAlarmRate”,1 e - 3,…“卷”,0.0716,…“DetectionProbability”,0.99);end [superDets,info] = fuser(检测);

MATLAB®Coder™需要指定所有输入参数的属性。方法在命令行上通过示例定义输入属性,这是一种简单的方法arg游戏选择。有关更多信息,请参见在命令行通过示例定义输入属性(MATLAB编码器).要允许可变数量的检测,您将使用coder.typeof函数为输入分配数据类型和大小。

从存储的缓冲区中获取一个样本检测sampleDetection = detectionBuffer{1}{1}{1};使用编码器。允许变量大小输入的Typeof函数%检测。maxNumDets = 500;inputDets =编码器。typeof ({sampleDetection} [maxNumDets 1] 1 [0]);H = msgbox({'为函数生成代码。这可能要花几分钟……”...完成后此消息框将关闭},“Codegen消息”);使用codegen命令通过指定输入参数来生成代码通过使用|-args|选项的例子。codegenmexFuserarg游戏{inputDets};关闭(h);
代码生成成功。

您可以通过比较代码生成融合一帧检测所花费的时间来验证代码生成所实现的加速

测试检测= addNoise(vertcat(detectionBuffer{1}{1:5}),1);t_ML = toc;t_Mex = toc;disp (['MATLAB代码执行时间= 'num2str (t_ML)]);disp (['MEX代码执行时间= 'num2str (t_Mex)]);
MATLAB代码执行时间= 37.9316 MEX代码执行时间= 0.4011

五传感器履带

在本节中,来自所有五个传感器的检测都用于跟踪,并使用2度平方的测量噪声。

measNoise = 2;%与3个传感器相同的噪声numSensors = 5;[trackingMetrics,errorMetrics] = helperRunStaticFusionSimulation(detectionBuffer,truthLog,numSensors,measNoise,theaterDisplay,true);轴(theaterDisplay.TheaterPlot.Parent);

ylim (1.5 [0]);

使用5个传感器跟踪的分配结果表明,在整个模拟过程中,所有的真理都被分配了一个轨道。在低精度的三传感器模拟中,有4个轨道掉落,而在模拟中没有轨道掉落。

assignmentTable = trackMetricsTable(trackingMetrics);assignmentTable (: {“TrackID”“AssignedTruthID”“TotalLength”“FalseTrackStatus”})
ans = 5×4 table TrackID AssignedTruthID TotalLength false trackstatus _______ _______________ ___________ ________________ 2 10 59 false 3 9 59 false 4 8 59 false 5 7 59 false 6 6 59 false

与三个传感器模拟相比,每个真实目标的位置估计误差要低得多。请注意,与三个具有高精度测量的传感器相比,位置和速度的估计结果确实降低了。

disp (cumulativeTruthMetrics (errorMetrics))
TruthID posRMS velRMS posANEES velANEES _______ ______ ______ ________ ________ 6 34.74 3.0009 3.0358 0.75358 7 16.415 2.7014 1.3547 0.53336 8 16.555 2.5768 1.5645 0.49951 9 16.361 2.5381 1.474 0.55633 10 26.137 4.0457 2.3739 1.0349

总结

这个例子展示了如何使用分布式无源传感器网络跟踪物体。你学会了如何使用staticDetectionFuser静态关联和融合来自多个传感器的检测。该示例演示了该体系结构如何依赖于网络中传感器数量和传感器测量精度等参数。该示例还展示了如何通过利用并行计算和从MATLAB代码自动生成C代码来加速性能。

金宝app支持功能

trueAssignment使用track的ObjectAttributes将其分配给正确的真值。

函数tIDs = [track. objectattributes . targetindex];tIDs = tIDs(tIDs > 0);如果number (tIDs) > 1 && all(tIDs == truth.PlatformID) distance = 0;其他的距离= inf;结束结束

addNoise在检测中添加噪音

函数dets = addNoise(dets,measNoise)i = 1: number (dets) dets{i}.Measurement(1) = dets{i}.Measurement(1) + sqrt(measNoise)*randn;dets{i}. measuentnoise (1) = measNoise;结束结束

参考文献

[1] Bar-Shalom, Yaakov, Peter K. Willett, Xin Tian。跟踪和数据融合:算法手册(2011)。