主要内容

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

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

海上监视场景

模拟安装在塔顶的海洋监视雷达,可以俯瞰港口中的船只。模拟塔的位置和船舶在场景中的运动是由trackingScenario

创建跟踪场景。scenario = trackingScenario(“StopTime”, 30);定义单位转换。Nmi2m = 1852;%海里换算成米Hr2s = 3600;%小时到秒Kts2mps = nmi2m/hr2s;%节到米每秒

海上监视雷达

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

  • 灵敏度:0 dBsm @ 5公里

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

  • 方位分辨率:2度

  • 距离分辨率:5米

以上述规格建立海洋雷达的模型fusionRadarSensor

创建监视雷达。传感器= fusionRadarSensor(1,“没有扫描”...“MountingLocation”,[0 0 -20],...% 20米(美国手语)“MountingAngles”,[45 0 0],...%[横摆俯仰角]度“FieldOfView”30 [10],...% [az el]度“ReferenceRange”5 e3,...% m“AzimuthResolution”2,...%度“RangeResolution”5,...% m“之内”,真的,...报告INS信息“TargetReportFormat”“检测”...%没有聚类的检测“DetectionCoordinates”“球形传感器”);

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

平台(场景中,“传感器”、传感器);塔=场景。平台{1}
塔=平台与属性:PlatformID: 1 ClassID: 0位置:[0 0 0]方向:[0 0 0]尺寸:[1x1 struct]网格:[1x1 extendedObjectMesh]轨迹:[1x1 kinematicTrajectory] PoseEstimator: [1x1 insSensor]发射器:{}传感器:{[1x1 fusionRadarSensor]}签名:{[1x1 rcsSignature] [1x1 irSignature] [1x1 tsSignature]}

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

定义两艘小船的尺寸。Dim = struct(...“长度”, 80,...% m“宽度”15岁的...% m“高度”5,...% m“OriginOffset”, [0 0 5/2]);% [x y z] 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(速度*kts2mps)^2/半径0];angVelBody = [0 0 speed*kts2mps/radius];轨迹(“位置”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(速度*kts2mps)^2/半径0];angVelBody = [0 0 speed*kts2mps/radius];轨迹(“位置”initPos,“速度”initVel,“定位”initOrient,...“AccelerationSource”“属性”“加速”accBody,...“AngularVelocitySource”“属性”“AngularVelocity”, angVelBody);平台(场景中,“维度”昏暗的,“签名”rcs,“轨迹”, traj);确定这艘大船的尺寸。Dim = struct(...“长度”, 400,...% m“宽度”现年60岁的...% m“高度”15岁的...% m“OriginOffset”, [0 0 15/2]);% [x y z] 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])';轨迹(“位置”initPos,“速度”initVel,“定位”initOrient,...“AccelerationSource”“属性”“AngularVelocitySource”“属性”);将大船添加到场景中。。平台(场景中,“维度”昏暗的,“签名”rcs,“轨迹”, traj);创建一个显示器来显示船只的真实、测量和跟踪位置。。theaterDisplay = helpermarinesmonitillancedisplay(场景,...“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金宝app支持函数来初始化一个恒定回合率的Gamma Gaussian Inverse Wishart (GGIW) PHD滤波器。filterInitFcn在每一个时间步骤中将出生成分添加到博士强度中。这些出生部件被均匀地添加到传感器的视野内。它们的大小和预期的探测数量是使用关于预期在港口的船舶类型的先验信息指定的。

跟踪器使用GGIW-PHD分量的伽玛分布来估计应该从一个物体产生多少探测。跟踪器还使用传感器的限制计算密度中每个组件的可检测性。使用trackingSensorConfiguration为传感器的配置建模trackerPHD

定义雷达的测量极限和分辨率。。azLimits = sensor.FieldOfView(1)/2*[-1 1];%度rangeLimits = [0 15e3];% msensorLimits = [azLimits;rangeLimits];sensor. rangerresolution = [sensor.AzimuthResolution;sensor. rangerresolution];定义传感器在塔上的安装位置和方向。参数(1)= struct(“帧”“球”...“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.Trajectory.Velocity (:)...“定位”rotmat (tower.Trajectory.Orientation“帧”),...“IsParentToChild”,真的,...“HasRange”,真的,“HasElevation”假的,“HasVelocity”、假);的可检测性建模%由传感器跟踪。探测概率定义了概率从扩展对象生成至少1个检测的%。sensorConfig = trackingSensorConfiguration(“SensorIndex”、传感器。SensorIndex,...“SensorLimits”sensorLimits,...“SensorResolution”sensorResolution,...“DetectionProbability”, 0.99,...“SensorTransformParameters”、参数);用于更新trackingSensorConfiguration的传感器配置字段。configFlds = {“SensorIndex”“IsValidTime”};%雷达分辨率单元对应的噪声协方差。resolutionNoise = diag((sensorResolution/2).^2);sensorConfig。FilterInitializationFcn = @(varargin)filterInitFcn(varargin{:},params);sensorConfig。SensorTransformFcn = @ctmeas;sensorConfig。ClutterDensity = sensor.FalseAlarmRate/(sensor.AzimuthResolution*sensor.RangeResolution);使用trackingSensorConfiguration创建PHD跟踪器。追踪器=追踪器“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;从塔的雷达产生探测。[dets,~,config] =检测(塔,时间);更新探测的测量噪声,以匹配雷达的分辨率。dets = updateMeasurementNoise(dets,resolutionNoise);%更新跟踪器。trackSensorConfig = computeTrackingSensorConfig(config,configFlds);tracks =跟踪器(dets,trackSensorConfig,时间);更新显示当前波束位置,检测和轨道位置。theaterDisplay(引爆器,配置,跟踪);%快照。snapFigure (theaterDisplay,任何(时间= = snapTimes));结束writeMovie (theaterDisplay);

下图显示了雷达探测结果(以红点表示)和估计的航迹位置(以标有航迹ID的黄色方框表示),以及估计的跟踪对象范围(以黄色椭圆表示)。雷达塔位于原点(0,0),图中没有显示。雷达的视场由图的顶部和底部交叉的两条红线表示。所有船只都位于雷达的视野范围内,由于船只的尺寸远远大于雷达的距离和方位角分辨率,沿着雷达可见的船只表面进行多次探测。

showSnapshot (theaterDisplay, 1)

由于舰船被建模为扩展对象而不是点目标,舰船的探测可能会被舰船和雷达之间的另一艘舰船遮挡。如下图所示。在这种情况下,图中顶部的较小船只没有被雷达探测到。雷达的视线被图底部的另一艘小船和中间的大船挡住了。跟踪器保持对被遮挡船只的估计,并在接下来的步骤中将检测结果与轨道联系起来,而不会丢下轨道。

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

下图显示了该场景中距离雷达最近的较小船只的PHD估计。你可以验证PHD估计的船的位置在船的中心附近,并且估计的尺寸合理地接近船的实际尺寸,由轨道椭圆与船的重叠指示。

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

下一张图还显示,PHD跟踪器估计了场景中另一艘小船的位置、大小和航向。这艘船之前被其他两艘船挡住了。尽管有遮挡,估计的位置,大小和方向与船非常吻合。

showSnapshot(theaterDisplay,3) axis([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*√(diag(d));iDims = 1:3;Up = [0 0 -1];[~,iUp] = max(abs(up*Q));Height(iTrk) = d(iDims(iUp));iDims(iUp) = [];长度(iTrk) = max(d(iDims));宽度(iTrk) = min(d(iDims));结束显示船舶估计尺寸的表格。dims =表(TrackID,长度,宽度,高度)
dim = 3x4表TrackID长宽高_______ ______ ______ ______ 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米

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

总结

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

金宝app支持功能

computeTrackingSensorConfig

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

函数config = computeTrackingSensorConfig(configIn,flds) config = struct();iFld = 1:数字(flds) thisFld = flds{iFld};config.(thisFld) = configIn.(thisFld);结束结束

updateMeasurementNoise

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

函数dets = updatemmeasurementnoise (dets,noise)iDet = 1:numel(dets) dets{iDet}.MeasurementNoise(:) = noise(:);结束结束

filterInitFcn

返回的筛选器initctggiwphd与被跟踪船只的速度和预期探测数量相匹配。

函数phd = filterInitFcn(measParam,varargin)此函数仅使用预测出生密度来模拟年的出生%场景。如果Nargin == 1在FOV内统一设置预测出生。phdDefault = initctggiwphd;% 1。使用方位角和范围创建均匀分布的状态。Az = 0;%方位角上的所有分量。range = linspace(1000,10000,5);% 5组件的范围[Az,R] = meshgrid(Az, ranges);%创建PHD过滤器来分配内存。phd = ggiwphd(zero (7,numel(Az)),repmat(eye(7),[11 1 numel(Az)]),...“ScaleMatrices”,repmat(eye(3),[11 1 numel(Az)]),...“StateTransitionFcn”@constturn,“StateTransitionJacobianFcn”@constturnjac,...“MeasurementFcn”@ctmeas,“MeasurementJacobianFcn”@ctmeasjac,...“PositionIndex”,[1 3 6],“ExtentRotationFcn”, 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;博士学位。StateCovariances([1 3 6],[1 3 6],i) = diag([1e5 1e5 1000]);使用位置协方差覆盖组件之间的间隙结束% 2。你已经描述了每艘船的“运动学”状态%在视野内。接下来,添加关于它们的大小和%的预期检测数。预计在海上有2种类型的船,小型和%。为每个大小创建组件。phdSmall = phd;为大型船只克隆PHD过滤器。phdLarge =克隆(phd);设置初始组件数量。numComps = phdSmall.NumComponents;对于小型船舶,预期尺寸为100米左右的长度和宽度为20米。由于方向未知,我们将创建4%的方向为每个大小。方法中添加组件相同状态下的密度。这可以通过简单地追加它来完成为小船设置值追加(phdSmall phdSmall);追加(phdSmall phdSmall);%定义形状的自由度。大的数字代表维度上更高的确定性。Dof = 1000;vx, vy和的协方差。smallStateCov = diag([300 300 50]);小船的比例矩阵smallShape = (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 numComps]);phdSmall。StateCovariances([6 7],[6 7],thisIndex) = repmat(diag([100 100]),[1 1 numComps]);结束%小型船只产生大约10-20个探测。expNumDets = 15;不确定度= 5^2;phdSmall.Rates(:) = expNumDets/uncertainty;phdSmall.Shapes(:) = expNumDets^2/uncertainty;phdsmall . degreesfreefreedom (:) = dof;大型船舶遵循类似的流程。。追加(phdLarge phdLarge);追加(phdLarge phdLarge);largeStateCov = diag([100 5 10]);largeShape =(自由度- 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',[11 1 numComps]);phdLarge。StateCovariances([2 4 5],[2 4 5],thisIndex) = repmat(R*largeStateCov*R',[1 1 numComps]);phdLarge。StateCovariances([6 7],[6 7],thisIndex) = repmat(diag([100 100]),[1 1 numComps]);结束生成大约100-200个检测。expNumDets = 150;不确定性= 50^2;phdLarge.Rates(:) = expNumDets/uncertainty;phdLarge.Shapes(:) = expNumDets^2/uncertainty;phdlarge . degreesfreefreedom (:) = dof;将大型船只添加到小型船只,以创建总密度。这个密度%被添加到总密度每一步。phd = phdSmall;追加(博士,phdLarge);结束%当调用检测输入,即自适应出生密度,不添加任何新组件。如果Nargin > 1这将在密度中创建0个分量。PhD = initctggiwphd;结束结束