这个例子演示了使用空间分布和同步无源传感器的测量来跟踪目标。在使用单一机动传感器的无源测距,您了解到被动测量提供目标状态的不完全可观察性以及如何操纵单个传感器以获得范围信息。或者,也可以使用多个固定式传感器来获得可观察性。在此示例中,您将学习如何通过熔断来自被动同步传感器的多个检测来跟踪多个对象。
在多传感器-多目标同步跟踪问题中,同步采集多个无源传感器的检测信息,用于估计以下问题:
场景中的目标数量
目标的位置和速度
这个例子演示了跟踪前静态融合[1]结构跟踪使用被动测量。的静态融合该体系结构的一部分目的是三角化最有可能的检测集,并输出包含估计目标位置的融合检测。由于测量需要通过静态融合融合在一起,传感器必须同步报告测量结果。
如果测量只包含视线信息,则至少需要2个传感器才能找到位置。然而,使用2个传感器时,当多个目标位于同一平面时,就会出现重影(在无目标点相交)的问题。有2个目标和2个传感器,从单个测量框中识别正确的一对是不可能的,如下图所示:
因此,必须使用3个或更多传感器来减少重影的问题。由于存在测量噪声和错误测量,很难完全消除重影的问题。由于目标和传感器在场景期间,动态关联块返回的静态关联返回的Ghost三角形可能被动态关联块丢弃。
这里使用的场景中的传感器和目标的相对放置是从[1]中的一个例子中的。该场景由三到五个无源传感器观察到的五个同等间隔的目标组成。被动检测使用radarEmitter
和fusionRadarSensor
与DetectionMode
设置为ESM
.的HasNoise
传感器的属性设置为假
产生无噪声的检测和假警报。在本例中,噪声通过用户控制的变量添加到测量中。这是为了模拟传感器噪声对静态融合的影响。每个传感器都有一个180度方位的视场和一个falsealMarrate.
每个方位分辨单元1e-3。这将导致每次扫描2到3次错误警报。场景定义被包装在helper函数中helperGenerateFusionScenarioData
.
[detectionBuffer, truthLog theaterDisplay] = helperGenerateStaticFusionScenarioData;showScenario (theaterDisplay);
showGrabs (theaterDisplay []);
在该部分中,仅考虑来自内部三个传感器的测量值,并且每个传感器的测量噪声协方差设定为0.01度平方。
每个传感器的检测将传递到astaticdetectionFuser.
.的MeasurementFusionFcn
对于无源三角测量,指定为triangulateLOS
.的MeasurementFusionFcn
允许指定一个函数来融合给定的检测组合(每个传感器最多一个检测),并返回融合的位置及其误差协方差。的参数falsealMarrate.
那体积
和侦查可力性
,以反映在此场景中模拟的传感器参数。这些参数用于计算可行关联的可能性。的UseParallel
属性,当设置为真正的
,允许fuser使用并行处理器评估可行的关联。
通过使用GNN数据关联执行跟踪trackerGNN
.
利用trackassignmentmetrics.
和trackErrorMetrics
.
设置
%传感器数量numsensors = 3;%创建一个检测fuser使用triangulateLOS函数% measumentfusionfcn,并指定传感器参数。熔化炉= staticDetectionFuser (“MeasurementFusionFcn”,@ triangulatelos,......'maxnumsensors'numSensors,......“UseParallel”,真的,......'falsealmarrate',1e-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;场景的更新率% 1 Hz。循环通过检测和跟踪目标为iter = 1:numel(DetectionBuffer)%真实信息sensorPlatPoses = truthLog {iter} (1: numSensors);targetPlatPoses = truthLog {iter}(6:结束);groundTruth = [sensorPlatPoses; targetPlatPoses];%使用记录的检测产生噪声检测thisBuffer = detectionBuffer {iter};availableDetections = vertcat (thisBuffer {1: numSensors});noiseDetections = addNoise (availableDetections measNoise);使用定影器%熔断器噪声检测fusedDetections =熔化炉(noiseDetections);在保险丝探测器上运行追踪器Conftracks =跟踪器(融合键,时间);%更新跟踪和分配指标trackingMetrics (confTracks targetPlatPoses);[trackIDs, truthIDs] = currentAssignment (trackingMetrics);errorMetrics (confTracks trackIDs、targetPlatPoses truthIDs);%更新影院显示detsToPlot = [noiseDetections (:); fusedDetections (:));theaterDisplay (confTracks detsToPlot groundTruth);%模拟时间增量时间=时间+ dt;结束轴(TheaterDisplay.theereplot.Parent);
ylim (1.5 [0]);
使用噪声协方差为0.01平方度的三个传感器的跟踪结果可以用分配指标进行总结。注意,所有的轨迹都被分配到正确的真理,没有虚假的轨迹被跟踪器确认。这些结果表明了良好的静态关联准确性。
assignmentTable = trackMetricsTable (trackingMetrics);assignmentTable (: {“TrackID”那“AssignedTruthID”那“TotalLength”那“FalseTrackStatus”})
ans = 5×4 table TrackID assigned dtruthid totalength false trackstatus _______ _______________ ___________ ________________ 3 10 59假6 7 59假7 6 59假10 9 58假11 8 58假
可以使用错误指标来汇总估计位置和目标速度的误差。位置和速度的误差分别在7米范围内,分别为2米/秒,所有目标都有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
测量精度的影响
无源探测融合消除重影对无源测量的精度有很大的影响。随着测量噪声的增加,鬼影联想和真联想之间的区别变得不那么突出,导致静态联想的准确性显著下降。对于距离较近的目标,也可能发生融合检测与跟踪的错误关联。在下一节中,我们将介绍一个helper函数HelperrunstaticFusionsimulation.
用于以2度平方的测量噪声协方差重新运行该场景。
使用高测量噪声再次运行方案
numsensors = 3;measnoise = 2;%根号(2)度标准差[TrackingMetrics,Errormetrics] = HelperrunstaticFusionsimulation(检测缓解,真实性,NumSens,MoreNoise,TheaterDisplay,False);轴(TheaterDisplay.theereplot.Parent);
ylim (1.5 [0]);
请注意,确认了几条曲目,然后在此模拟中删除。静态关联的准确性差导致鬼魂目标三角形,更频繁地导致跟踪器导致由于多个未命中而删除这些轨道。
assignmentTable = trackMetricsTable (trackingMetrics);assignmentTable (: {“TrackID”那“AssignedTruthID”那“TotalLength”那“FalseTrackStatus”})
ans = 9×4表TrackID AssignedTruthID TotalLength FalseTrackStatus _______ _______________ ___________ ________________ 1 10 59假3南4对4南5错6 7 59假7 6 59假10 9 57假11 8 56假13南5假18南5真的
每个真理的估计误差更高。请注意,轨道在上面的剧院显示跳跃。
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函数,可以编译为MEX文件或共享库。为此,将静态融合算法重组为函数。要保留多个呼叫之间定影的状态,它被定义为一个执着的
多变的。
类型(“mexFuser”);
function [superDets,info] = mexFuser(detections) %#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™需要指定所有输入参数的属性。这样做的简单方法是通过使用该命令行定义输入属性- args.
选择。有关更多信息,请参见在命令行通过示例定义输入属性(MATLAB编码器).要允许可变数量的检测,您可以使用coder.typeof
函数为输入分配数据类型和大小。
从存储的缓冲区中获取一个样本检测sampleDetection = detectionBuffer {1} {1} {1};%使用编码器。允许可变大小输入的函数类型%检测。maxNumDets = 500;inputDets =编码器。typeof ({sampleDetection} [maxNumDets 1] 1 [0]);h =对话框({'为函数生成代码。这可能需要几分钟……”;......完成后此消息框将关闭。},'codegen消息');%使用codegen命令通过指定输入参数来生成代码%通过示例使用|-args|选项。Codegen.mexFuser- args.{inputDets};关闭(h);
代码生成成功。
您可以通过比较它们融合一帧检测帧来验证代码生成实现的加速
testDetections = addNoise (vertcat (detectionBuffer {1} {1:5}), 1);抽搐,mexFuser (testDetections); t_ML = toc;抽搐,mexFuser_mex (testDetections); 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(检测缓解,真实性,Numsens,MoreNoise,TheaterDisplay,True);轴(TheaterDisplay.theereplot.Parent);
ylim (1.5 [0]);
利用5个传感器进行跟踪的分配结果表明,在整个仿真过程中,所有的真理都被分配了一个轨迹。与低精度的三个传感器模拟的4个轨道下降相比,仿真中也没有轨道下降。
assignmentTable = trackMetricsTable (trackingMetrics);assignmentTable (: {“TrackID”那“AssignedTruthID”那“TotalLength”那“FalseTrackStatus”})
ans = 5×4 table TrackID AssignedTruthID totalength谬误trackstatus _______ _______________ ___________ ________________ 2 10 59假3 9 59假4 8 59假5 7 59假6 6 59假
与三个传感器仿真相比,每个真实目标的位置估计误差要低得多。请注意,与具有高精度测量的三个传感器相比,位置和速度的估计结果降低。
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.
静态关联和融合多个传感器的检测。该示例演示了这种架构如何依赖于网络中的传感器数量和传感器测量的准确性等参数。该实例还展示了如何利用并行计算和自动生成C代码的MATLAB代码来提高性能。
trueAssignment
使用曲目的ObjectAttributes将其分配给正确的事实。
函数id = [track. objectattributes . targetindex];> = >; / / > = >;如果numel(tIDs) > 1 && all(tIDs == = true . platformid)距离= 0;其他的距离=正;结束结束
addNoise
添加噪音到检测
函数measNoise侦破= addNoise(依据)为i = 1:numel(dets)dets {i} .measurement(1)= dets {i} .measurement(1)+ sqrt(moreNoise)* Randn;DETS {i} .MeasurementNoise(1)= MoSmoise;结束结束
[1] Bar-Shalom, Yaakov, Peter K. Willett, Xin Tian。《追踪与数据融合:算法手册》(2011)。