主要内容

用于海洋监视的扩展雷达目标跟踪

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

海洋监测场景

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

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

海洋监视雷达

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

  • 灵敏度:0 dBsm @ 5公里

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

  • 方位分辨率:2 deg

  • 距离分辨率:5米

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

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

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

平台(场景中,“传感器”,传感器);塔=场景.platforms {1}
Tower =具有属性的平台:PlatformID:1分类:0位置:[0 0 0]方向:尺寸:尺寸:[1x1 struct]网格:[1x1扩展objectmesh]轨迹:[1x1 kinematictrajectory] ​​poseestimator:[1x1 Inssensor]发射器:{}传感器:{[1x1 fusionradarsensor]}签名:{[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股票”“帧”);initVel = speed*kts2mps*rotatepoint(initOrient,[1 0 0])';accBody = [0 (speed*kts2mps)^2/radius 0];angVelBody = [0 0 speed*kts2mps/radius];traj = kinematicTrajectory ('位置'initPos,“速度”initVel,“定位”initOrient,...“AccelerationSource”“属性”“加速”accBody,...“AngularVelocitySource”“属性”“AngularVelocity”, angVelBody);在场景中加入第一艘以20节速度航行的小船。这是离雷达塔最近的一艘船。平台(场景中,“维度”昏暗的,“签名”rcs,“轨迹”, traj);创造另一艘以30节速度航行的小船。这就是那艘船%距离雷达塔最远。速度= 30;%结initYaw = 120;%度initPos = [1410 1180 0];半径= 400;% minitOrient =四元数([initYaw 0 0],“eulerd”“ZYX股票”“帧”);initVel = speed*kts2mps*rotatepoint(initOrient,[1 0 0])';accBody = [0 (speed*kts2mps)^2/radius 0];angVelBody = [0 0 speed*kts2mps/radius];traj = kinematicTrajectory ('位置'initPos,“速度”initVel,“定位”initOrient,...“AccelerationSource”“属性”“加速”accBody,...“AngularVelocitySource”“属性”“AngularVelocity”, angVelBody);平台(场景中,“维度”昏暗的,“签名”rcs,“轨迹”, traj);定义大型船的尺寸。昏暗的=结构(...“长度”, 400,...% m“宽度”现年60岁的...% m'高度'15岁的...% m“OriginOffset”, [0 0 15/2]);(b) i ' m%型号为大型船舶的雷达横截面(RCS)为75 dbsm。rcs = rcsSignature (“模式”, 75);%创建大型船舶的轨迹,以10节的恒定航向航行。速度= 10;%结initYaw = -135;%度initPos = [1150 1100 0];initOrient =四元数([initYaw 0 0],“eulerd”“ZYX股票”“帧”);initVel = speed*kts2mps*rotatepoint(initOrient,[1 0 0])';traj = kinematicTrajectory ('位置'initPos,“速度”initVel,“定位”initOrient,...“AccelerationSource”“属性”“AngularVelocitySource”“属性”);%将大型船添加到场景中。平台(场景中,“维度”昏暗的,“签名”rcs,“轨迹”, traj);%创建一个显示来显示船只的真实、测量和跟踪位置。theaterDisplay = helperMarineSurveillanceDisplay(场景中,...“IsSea”,真的,“DistanceUnits”“米”...“XLim”, 450 * [1] + 1 e3,“YLim”, 450 * [1] + 1 e3,“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组件的伽马分布来估计应该从一个对象生成多少个检测。跟踪器还利用传感器的极限计算密度中每个部件的可检测性。使用跟踪仪器频道配置来模拟传感器的配置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”、假);在场景中定义塔的位置、速度和方向。参数(2)=结构(“帧”“矩形”...“OriginPosition”,tower.traptory.position(:),...“OriginVelocity”tower.Trajectory.Velocity (:)...“定位”rotmat (tower.Trajectory.Orientation“帧”),...“IsParentToChild”,真的,...“HasRange”,真的,'haselevation'假的,“HasVelocity”、假);%创建跟踪传感器配置模型的检测由传感器跟踪%。检测概率定义了概率从扩展对象生成至少1个检测的百分比。sensorConfig = trackingSensorConfiguration (“SensorIndex”,sensor.sensorindex,...“SensorLimits”sensorLimits,...“SensorResolution”sensorResolution,...'侦查可力', 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) partitionDetections (x, 1.5, 6),...“ExtractionThreshold”, 0.75,...“DeletionThreshold”1 e-6...'出生率'1 e-5);

模拟和跟踪船舶

下面的循环将推进船只的位置,直到场景结束。对于场景中的每一步,跟踪器都更新雷达视野中舰船的探测结果。

初始化场景和跟踪器。重启(场景);重置(跟踪);%设置模拟以雷达的更新速度前进。场景。UpdateRate = sensor.UpdateRate;%为可重复的结果设置随机种子。rng (2019“旋风”);%的模拟运行。snapTimes = [2 7 scenario.StopTime];%秒推进(场景)获得当前模拟时间。时间= scenario.SimulationTime;从塔的雷达上产生探测。[侦破,~,配置]=检测(塔、时间);更新探测的测量噪声以匹配雷达分辨率。依据= updateMeasurementNoise(侦破,resolutionNoise);%更新追踪。trackSensorConfig = computeTrackingSensorConfig(配置、configFlds);跟踪=追踪(精细、trackSensorConfig、时间);%用当前波束位置、探测和跟踪位置更新显示。TheaterDisplay(DETS,CONFIG,TRACK);%的快照。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 =元素个数(跟踪);TrackID = [tracks.TrackID] ';长度= 0 (numTrks, 1);宽度= 0 (numTrks, 1);身高= 0 (numTrks, 1);iTrk = 1:numTrks ext = tracks(iTrk).Extent;[Q, D] = eig (ext);d = 2 *√诊断接头(d));iDims = 1:3;Up = [0 0 -1];[~, iUp] = max (abs (* 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 = computeackingsensorconfig (configIn,flds) config = struct();iFld = 1:numel(flds) thisFld = flds{iFld};配置(thisFld) = configIn。(thisFld);结束结束

updateMeasurementNoise

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

函数依据= updateMeasurementNoise(精细、噪音)dets = 1:numel(dets) dets{iDet}.MeasurementNoise(:) = noise(:);结束结束

filterinitfcn.

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

函数博士= filterInitFcn (measParam变长度输入宗量)%此功能仅使用预测的出生密度来模拟出生%的场景。如果输入参数个数= = 1%在FOV内均匀设置预产期。phdDefault = initctggiwphd;% 1。使用方位角和距离创建均匀分布状态。阿兹= 0;方位角上的所有分量。范围= linspace(1000、10000、5);% 5组成范围(阿兹,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),'senderrotationfcn', phdDefault。ExtentRotationFcn,...“HasAdditiveProcessNoise”假的,“ProcessNoise”, 2 *眼(4),...“TemporalDecay”1 e3,“GammaForgettingFactors”, 1.1 *(1,元素个数(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。你已经描述了每艘船的“运动学”状态%在视野内。接下来,添加关于它们的大小和%预期检测数。预计在海上有两种类型的船,小型和%。您可以为每种大小创建组件。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创建4个方向,彼此45度。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);结束%当调用检测输入,即适应性出生密度,不要%添加任何新组件。如果输入参数个数> 1%这将在密度中创建0个组件。博士= initctggiwphd;结束结束