主要内容

与雷达进行海洋监测的延伸对象跟踪

这个例子展示了如何生成一个海洋场景,模拟来自海洋监视雷达的雷达探测,并配置一个多目标概率假设密度(PHD)跟踪器,以使用雷达探测估计模拟船舶的位置和大小。

海洋监测场景

模拟海上监视雷达安装在一个俯瞰港口船舶的塔的顶部。模拟了该场景中塔的位置和船舶的运动跟踪Cenario

%创建跟踪场景。场景=跟踪Cenario(“StopTime”, 30);%定义单位转换。nmi2m = 1852;%海里到米的hr2 = 3600;小时到秒KTS2MPS = NMI2M / HR2S;%节到米每秒

海洋监视雷达

在塔上加一个海上监视雷达。雷达安装在海平面以上20米(ASL)。雷达凝视着港口,测量一个30度的方位扇区。海洋监视雷达的常用规格如下:

  • 灵敏度:0 dBsm @ 5公里

  • 视野:30°方位角,10°仰角

  • 方位角分辨率:2°

  • 距离分辨率:5米

模型的海洋雷达与上述规格使用fusionRadarSensor

%创建监视雷达。传感器= fusionRadarSensor (1,'没有扫描'......“MountingLocation”(0 0 -20),......% 20米(ASL)“MountingAngles”(45 0 0),......%[偏航纵摇“FieldOfView”30 [10],......% [z el] deg“ReferenceRange”,5e3,......% m“AzimuthResolution”2,......%度“RangeResolution”5,......% m“之内”,真的,......%报告​​INS信息“TargetReportFormat”“检测”......%检测不聚类“DetectionCoordinates”“球形传感器”);

将塔添加到场景中,作为一个固定平台,雷达安装在它的顶部。

平台(场景中,“传感器”、传感器);塔=场景。平台{1}
[1x1 kinematicTrajectory] PoseEstimator: [1x1 insSensor] Emitters: {} Sensors: {[1x1 fusionRadarSensor]} Signatures: {[1x1 rcsSignature] [1x1 irSignature] [1x1 tsSignature]}

在港口雷达监视区增加三艘船。两艘较小的船以20节和30节的速度转弯,大船以10节的速度匀速前进。

定义两艘小船的尺寸。昏暗的=结构(......'长度', 80,......% m“宽度”15岁的......% m“高度”5,......% m'OriginOffset',[0 0 5/2]);(b) i ' m%型号为小船的雷达横截面(RCS)为30 dbsm。rcs = rcsSignature (“模式”, 30);创造一个转弯轨迹。速度= 20;%结Inityaw = 130;%度initPos = [1050 790 0];半径= 200;% minitOrient =四元数([initYaw 0 0],“eulerd”“ZYX股票”“帧”);engvel =速度* kts2mps * rotatepoint(机器,[1 0 0])';AccBody = [0(速度* kts2mps)^ 2 /半径0];Angvelbody = [0 0速度* kts2mps /半径];traj = kinematictrajectory(“位置”,initpos,“速度”,entivel,'方向'initOrient,......'AccelerationSource'“属性”“加速”accBody,......“AngularVelocitySource”“属性”“AngularVelocity”, angVelBody);%加上第一艘小船,以20节向场行驶。这是离雷达塔最近的一艘船。平台(场景中,'方面'昏暗的,“签名”rcs,“轨迹”,traj);创造另一艘以30节速度航行的小船。这就是那艘船距雷达塔最远的%。速度= 30;%结Inityaw = 120;%度initPos = [1410 1180 0];半径= 400;% minitOrient =四元数([initYaw 0 0],“eulerd”“ZYX股票”“帧”);engvel =速度* kts2mps * rotatepoint(机器,[1 0 0])';AccBody = [0(速度* kts2mps)^ 2 /半径0];Angvelbody = [0 0速度* kts2mps /半径];traj = kinematictrajectory(“位置”,initpos,“速度”,entivel,'方向'initOrient,......'AccelerationSource'“属性”“加速”accBody,......“AngularVelocitySource”“属性”“AngularVelocity”, angVelBody);平台(场景中,'方面'昏暗的,“签名”rcs,“轨迹”,traj);定义大型船的尺寸。昏暗的=结构(......'长度', 400,......% m“宽度”现年60岁的......% m“高度”15岁的......% m'OriginOffset',[0 0 15/2]);(b) i ' m%将大型船舶的雷达截面(RCS)建模为75dbsm。rcs = rcsSignature (“模式”, 75);%创建大型船舶的轨迹,以10节的常数行进。速度= 10;%结initYaw = -135;%度initPos = [1150 1100 0];initOrient =四元数([initYaw 0 0],“eulerd”“ZYX股票”“帧”);engvel =速度* kts2mps * rotatepoint(机器,[1 0 0])';traj = kinematictrajectory(“位置”,initpos,“速度”,entivel,'方向'initOrient,......'AccelerationSource'“属性”“AngularVelocitySource”“属性”);%将大船添加到方案。平台(场景中,'方面'昏暗的,“签名”rcs,“轨迹”,traj);%创建一个显示来显示船只的真实、测量和跟踪位置。theaterDisplay = helperMarineSurveillanceDisplay(场景中,......“IsSea”,真的,“DistanceUnits”“米”......“XLim”,450 * [ -  1 1] + 1E3,“YLim”,450 * [ -  1 1] + 1E3,“ZLim”-1000年[10],......“电影”“MarineSurveillanceExample.gif”);slctTrkPos = 0(3、7);slctTrkPos (1, - 1) = 1;slctTrkPos(2、3)= 1;slctTrkPos(3、6)= 1;slctTrkVel = circshift(slctTrkPos,[0 1]);theaterDisplay。TrackPositionSelector = slctTrkPos;theaterDisplay。TrackVelocitySelector = slctTrkVel; theaterDisplay(); snapnow(theaterDisplay);

多目标GGIW-PHD跟踪器

创建一个trackerphd.从港口的三艘船的雷达探测中形成跟踪。PHD跟踪器通过允许多个探测与单个目标相关联,使估计船舶的大小成为可能。这在海洋监测等情况下非常重要,传感器检测到的物体的大小大于传感器的分辨率,导致沿着船舶表面产生多个检测。

跟踪器使用filterInitFcn万博1manbetx用于初始化一个恒定转速伽马高斯逆Wishart (GGIW) PHD滤波器的支持函数。filterInitFcn在每个时间步骤中增加出生成分到博士强度。这些出生组件被均匀地添加到传感器的视场内。它们的大小和预计的检测数量是根据港口预计船舶类型的预先信息确定的。

跟踪器使用GGIW-PHD组件的伽马分布来估计应该从一个对象生成多少个检测。跟踪器还利用传感器的极限计算密度中每个部件的可检测性。使用trackingSensorConfiguration为传感器的配置进行建模trackerphd.

定义雷达的测量范围和分辨率。azLimits = sensor.FieldOfView(1)/2*[-1 1];%度= [0 15e3];% msensorLimits = [azLimits; rangeLimits];sensorResolution = [sensor.AzimuthResolution; sensor.RangeResolution];定义传感器在塔上的安装位置和方向。参数(1)=结构(“帧”“球”......“OriginPosition”sensor.MountingLocation (:)......'OriginVelocity',[0; 0; 0],......'方向', rotmat(四元数(传感器。MountingAngles,“eulerd”“zyx股票”“帧”),“帧”),......“IsParentToChild”,真的,......“HasRange”,真的,“HasElevation”、传感器。HasElevation,“HasVelocity”,错误的);%定义塔的位置,速度和方案中的方向。params(2)= struct(“帧”'矩形的'......“OriginPosition”tower.Trajectory.Position (:)......'OriginVelocity',tower.traptory.velocity(:),......'方向',rotmat(tower.trajectory.orientation,“帧”),......“IsParentToChild”,真的,......“HasRange”,真的,“HasElevation”,错误的,“HasVelocity”,错误的);%创建一个跟踪等级将模拟可检测性的跟踪传感器%曲目。检测概率定义了概率从扩展对象生成至少1个检测的百分比。SENSORCONFIG =跟踪转换仪控制功能(“SensorIndex”、传感器。SensorIndex,......'sensorlimits'sensorLimits,......“SensorResolution”sensorResolution,......“DetectionProbability”, 0.99,......“SensorTransformParameters”、参数);用于更新trackingSensorConfiguration的传感器配置的%字段。configFlds = {“SensorIndex”“IsValidTime”};对应于雷达的分辨率单元的噪声协方差。resolutionNoise =诊断接头((sensorResolution / 2) ^ 2);sensorConfig。FilterInitializationFcn = @(变长度输入宗量)filterInitFcn(变长度输入宗量{:},params);sensorConfig。SensorTransformFcn = @ctmeas;sensorConfig。ClutterDensity = sensor.FalseAlarmRate / (sensor.AzimuthResolution * sensor.RangeResolution);使用trackingSensorConfiguration创建一个PHD跟踪器。跟踪器= trackerphd(“SensorConfigurations”sensorConfig,......“HasSensorConfigurationsInput”,真的,......“PartitioningFcn”,@(x)零件detections(x,1.5,6),......“ExtractionThreshold”, 0.75,......“DeletionThreshold”,1e-6,......“出生率”1 e-5);

模拟和跟踪船舶

以下循环导致船舶的位置直到方案结束。对于方案中的每个步骤,跟踪器将使用雷达视野中的船舶中的检测更新。

初始化场景和跟踪器。重启(场景);重置(跟踪);%设置模拟以雷达的更新速度前进。场景。UpdateRate = sensor.UpdateRate;%为可重复的结果设置随机种子。rng (2019“旋风”);%的模拟运行。snapTimes = [2 7 scenario.StopTime];%秒推进(场景)获得当前模拟时间。Time = Scenario.simulationtime;从塔的雷达上产生探测。[侦破,~,配置]=检测(塔、时间);更新探测的测量噪声以匹配雷达分辨率。DETS = UPDATEMEASURENCENOISE(DETS,DEMOTATENOISE);%更新追踪。trackSensorConfig = computeTrackingSensorConfig(配置、configFlds);跟踪=追踪(精细、trackSensorConfig、时间);%用当前波束位置、探测和跟踪位置更新显示。theaterDisplay(引爆器,配置,跟踪);%的快照。snapFigure (theaterDisplay,任何(时间= = snapTimes));结束writeMovie (theaterDisplay);

下图为雷达探测结果,红色圆点表示,估计的航迹位置为标注航迹ID的黄色方块表示,估计的被跟踪对象的范围为黄色椭圆表示。雷达塔位于原点(0,0),图中没有显示。雷达的视场由两条红线表示,这两条红线穿过图的顶部和底部。所有的船都在雷达的视野范围内,由于船的大小远远大于雷达的范围和方位分辨率,沿着雷达可见的船的表面进行多次探测。

showSnapshot (theaterDisplay, 1)

由于船舶被建模为扩展目标而不是点目标,船舶的检测可能会被船和雷达之间的另一艘船的存在所遮挡。如下图所示。在这种情况下,图中顶部的小船没有被雷达探测到。雷达的视线被图底部的另一艘小船和中间的一艘大船挡住了。跟踪器保持对被遮挡船舶的估计,并在跟踪的以下步骤中关联检测,而不会丢弃跟踪。

showSnapshot(theaterDisplay,2)轴([1250 1450 1150 1350]);视图(90 [-90]);

下图显示了位于场景中最接近雷达的较小船的PHD估计。您可以验证船舶位置的PHD估计位于船舶中心附近,估计尺寸合理地接近船舶的实际尺寸,由轨道与船舶的椭圆重叠表示。

showSnapshot(theaterDisplay,3)轴([650 850 700 900]);视图(90 [-90]);

下一个图还显示了PHD跟踪器估计了场景中其他小船的位置、大小和航向。这艘船之前被另外两艘船挡住了。尽管存在遮挡,但估计的位置、大小和方向与船舶非常匹配。

showSnapshot(theaterDisplay,3)轴([900 1100 1250 1450]);视图(90 [-90]);

3艘船舶的轨道状态使用3D位置协方差矩阵报告每艘船的估计大小。采用协方差矩阵的特征分解,计算每个船舶的估计长度,宽度和高度。

numtrks = numel(曲目);trackid = [tracks.trackid]';长度=零(numtrks,1);宽度=零(numtrks,1);height = zeros(numtrks,1);ITRK = 1:numtrks ext = track(iTrk)。扩展;[q,d] = eig(ex);d = 2 * sqrt(DIAG(D));idims = 1:3;UP = [0 0 -1];[〜,iup] = max(abs(up * q));高度(ITRK)= D(IDIMS(IUP));IDIMS(IUP)= [];长度(iTrk)= max(d(idims));宽度(iTrk)= min(d(idims));结束%显示船舶的估计尺寸。dim =表(TrackID、长度、宽度、高度)
dims = 3x4 table TrackID Length Width Height _______ ______ ______ ______ 1 99.077 17.388 16.276 2 473.93 55.699 8.8352 3 100.75 18.741 17.407

请记住,船舶的真实尺寸是:

大型船舶

  • 长度:400

  • 宽度:60米

  • 高度:15米

小型船

  • 长度:80

  • 宽度:15米

  • 身高:5米

该跟踪器能够通过估计每艘船的形状为椭圆来区分大型和小型船舶的大小。在仿真中,每艘船的真实形状是用一个长方体建模的。跟踪器的形状假设和模型船舶的真实形状之间的不匹配导致高估了船舶的长度和宽度。雷达是一个二维传感器,只测量距离和方位角,所以每艘船的高度是不可观测的。这导致跟踪器报告的高度估计不准确。

总结

这个示例展示了如何生成一个海上场景,从一个海上监视雷达模拟雷达探测,并配置一个多目标PHD跟踪器来使用雷达探测跟踪模拟的船舶。在这个示例中,您了解了如何在场景中建模扩展对象,从这些对象生成多个检测。您还学习了如何使用多目标PHD跟踪器来处理由多个检测提供的信息,以估计被跟踪对象的位置和大小。

万博1manbetx支持功能

computeTrackingSensorConfig

返回包含雷达返回的配置信息的结构。这个结构用于更新跟踪器中使用的trackingSensorConfiguration模型。

函数config = computetrackingsensorconfig(configin,flds)config = struct();iFld = 1:numel(flds) thisFld = flds{iFld};配置(thisFld) = configIn。(thisFld);结束结束

updateMeasurementNoise

根据指定的噪声协方差设置检测的测量噪声。

函数DETS = UPDATEMEASURENCENOISE(DETS,噪声)dets = 1:numel(dets) dets{iDet}.MeasurementNoise(:) = noise(:);结束结束

filterInitFcn

修改返回的过滤器initctggiwphd匹配被跟踪的船舶的速度和预期的检测次数。

函数phd = filterinitfcn(measparam,varargin)该函数仅使用预测出生密度来模拟出生%的场景。如果输入参数个数= = 1%在FOV内均匀设置预测诞生。phdDefault = initctggiwphd;% 1。使用方位角和距离创建均匀分布状态。阿兹= 0;方位角上的所有分量。范围= Linspace(1000,10000,5);% 5组成范围[AZ,R] = MeshGrid(AZ,范围);%创建一个PHD过滤器来分配内存。phd = ggiwphd(zeros(7,numel(Az)),repmat(eye(7),[1 1 numel(Az)])),......'scalematrices'repmat(眼(3)[1 1元素个数(Az)]),......'statetransitionfcn'@constturn,“StateTransitionJacobianFcn”@constturnjac,......“MeasurementFcn”,@ ctmeas,“MeasurementJacobianFcn”@ctmeasjac,......“PositionIndex”(1 3 6),“ExtentRotationFcn”, phdDefault。ExtentRotationFcn,......'hasadditiveProcessnoise',错误的,“ProcessNoise”, 2 *眼(4),......'instalaldecay'1 e3,“GammaForgettingFactors”,1.1 * on(1,numel(az)),......'maxnumcomponents', 10000);i = 1:numel(Az) [sensorX,sensorY,sensorZ] = sph2cart(deg2rad(Az(i)),0,R(i));globalPos = measParam(1).Orientation'*[sensorX;sensorY;sensorZ] + measParam(1).OriginPosition(:);博士学位。States([1 3 6],i) = globalPos;博士学位。statecovariance ([1 3 6],[1 3 6],i) = diag([1e5 1e5 1000]);%使用位置协方差覆盖组件之间的间隙结束% 2。你已经描述了每艘船的“运动学”状态%在视野内。接下来,添加关于它们的大小和%预期检测数。%预计海洋中有2种类型的船只,小而且%。您可以为每种大小创建组件。phdSmall =博士;%克隆PHD过滤器用于大型船只。phdLarge =克隆(博士);%设置初始组件数。numComps = phdSmall.NumComponents;对于小型船舶,预计长度和尺寸约为100米宽度% 20米。由于方向未知,我们将创建4每个尺寸的%取向。首先,您必须将组件添加到在相同状态下,%密度。这可以通过简单地附加它来完成%小船的设置值附加(phdsmall,phdsmall);附加(phdsmall,phdsmall);定义形状的%自由度。大量代表%更高的尺寸确定性。景深= 1000;vx vy和的协方差。smallStateCov = diag([300 300 50]);%比例矩阵的小船= (dof - 4)*diag([100/2 20/2 10].^2);% l, w, h%彼此以45度创建4个方向。i = 1:4 thisIndex = (i-1)*numComps + (1:numComps); / /索引R = rotmat(四元数([45*(i-1) 0 0],“eulerd”“ZYX股票”“帧”),“帧”);phdSmall.ScaleMatrices(:,:,thisIndex) = repmat(R*smallShape*R',[1 1 numComps]); / /指定一个数组phdSmall。StateCovariances([2 4 5],[2 4 5],thisIndex) = repmat(R*smallStateCov*R',[1 1 numcoms]); / /指定一个节点phdSmall。StateCovariances([6 7],[6 7],thisIndex) = repmat(diag([100 100]),[1 1 numComps]);结束%小船舶产生大约10-20个检测。expNumDets = 15;不确定性= 5 ^ 2;phdSmall.Rates (,) = expNumDets /不确定性;phdSmall.Shapes (,) = expNumDets ^ 2 /不确定性;phdSmall.DegreesOfFreedom(:) =景深;对于大型船舶遵循类似的流程。追加(phdLarge phdLarge);追加(phdLarge phdLarge);largeStateCov = diag([100 5 10]);= (dof - 4)*diag([500/2 100/2 10].^2);i = 1:4 thisIndex = (i-1)*numComps + (1:numComps); / /索引R = rotmat(四元数([45*(i-1) 0 0],“eulerd”“ZYX股票”“帧”),“帧”);phdLarge.ScaleMatrices(:,:,thisIndex) = repmat(R*largeShape*R',[1 1 numComps]); / /复制索引phdLarge。StateCovariances([2 4 5],[2 4 5],thisIndex) = repmat(R*largeStateCov*R',[1 1 numcoms]); / /将数据存储在指定的节点上phdLarge。StateCovariances([6 7],[6 7],thisIndex) = repmat(diag([100 100]),[1 1 numComps]);结束%生成大约100-200个检测。expNumDets = 150;不确定性= 50 ^ 2;phdLarge.Rates (,) = expNumDets /不确定性;phdLarge.Shapes (,) = expNumDets ^ 2 /不确定性;phdLarge.DegreesOfFreedom(:) =景深;将大的船加入到小的船中以创造总密度。这个密度%将%添加到每个步骤的总密度。博士= phdSmall;追加(博士,phdLarge);结束用检测输入调用时%,即适应性出生密度,不要%添加任何新组件。如果nargin> 1%这将在密度中创建0个组件。博士= initctggiwphd;结束结束