主要内容

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

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

海洋监测场景

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

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

海洋监测雷达

海洋监视雷达添加到塔。该雷达装海平面(ASL)20米上方。雷达凝视进港,测量30度方位扇区。对于海洋监视雷达通用规范上市:

  • 灵敏度:0 dBsm @ 5公里

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

  • 方位分辨率:2 deg

  • 范围分辨率:5米

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

%创建监控雷达。传感器= fusionRadarSensor (1,“没有扫描”...'mountinglocation'(0 0 -20),...% 20米(ASL)“MountingAngles”,[45 0 0],...%[偏航俯仰辊]度“FieldOfView”,[30 10],...%[AZ EL] DEG“ReferenceRange”5 e3,...%M.'azimuthresolution'2,...%deg.'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;%deg.initpos = [1050 790 0];半径= 200;%M.initOrient =四元数([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''财产''角速度', angVelBody);在场景中加入第一艘以20节速度航行的小船。这是雷达塔最近的船。平台(场景中,“维度”,暗淡,“签名”,RCS,'弹道', traj);%创建另一个小船,以30节行驶。这是船%距离雷达塔最远。速度= 30;%结initYaw = 120;%deg.initPos = [1410 1180 0];半径= 400;%M.initOrient =四元数([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''财产''角速度', 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;%deg.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''M'...'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用于初始化一个恒定转速伽马高斯逆Wishart (GGIW) PHD滤波器的支持函数。filterInitFcn在每个时间步骤中增加出生成分到博士强度。这些出生组件被均匀地添加到传感器的视场内。它们的大小和预计的检测数量是根据港口预计船舶类型的预先信息确定的。

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

%定义雷达的测量限制和分辨率。azlimits = sensor.fieldofview(1)/ 2 * [ -  1 1];%deg.= [0 15e3];%M.sensorLimits = [azLimits; rangeLimits];sensorResolution = [sensor.AzimuthResolution; sensor.RangeResolution];定义传感器在塔上的安装位置和方向。PARAMS(1)=结构('框架''球形'...'originposition'sensor.MountingLocation (:)...“OriginVelocity”(0, 0, 0),...“定位”,rotmat(四元音(Sensor.Mountingangles,'eulerd''ZYX'“帧”),“帧”),...'Isparenttochild', 真的,...'hasrange',真的,“HasElevation”、传感器。HasElevation,“HasVelocity”、假);在场景中定义塔的位置、速度和方向。参数(2)=结构('框架'“矩形”...'originposition'tower.Trajectory.Position (:)...“OriginVelocity”tower.Trajectory.Velocity (:)...“定位”rotmat (tower.Trajectory.Orientation“帧”),...'Isparenttochild', 真的,...'hasrange',真的,“HasElevation”假的,“HasVelocity”、假);%创建跟踪传感器配置模型的检测由传感器跟踪%。检测概率定义了概率%来自扩展对象产生至少1检测。sensorConfig = trackingSensorConfiguration ('sensorindex'、传感器。SensorIndex,...“SensorLimits”sensorLimits,...'sensorreesolution',sensorreesolution,...“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跟踪器。追踪= trackerPHD ('SensorConfigurations',sensorConfig,...'hassensorconfigurationsinput',真的,...'partitioningfcn'@ (x) partitionDetections (x, 1.5, 6),...'ExtractionThreshold',0.75,...'deletionthreshold'1 e-6...“出生率”,1E-5);

模拟和跟踪船舶

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

初始化场景和跟踪器。重启(情况);复位(跟踪器);%设定模拟以雷达的更新速度前进。场景。UpdateRate = sensor.UpdateRate;%设置可重复结果的随机种子。RNG(2019年,“扭腰”);%运行模拟。snapTimes = [2 7 scenario.StopTime];%秒推进(场景)%获取当前仿真时间。时间= scenario.SimulationTime;从塔的雷达上产生探测。[DETS,〜,CONFIG] =检测(塔,时间);%更新检测的测量噪声以匹配雷达的分辨率。依据= updateMeasurementNoise(侦破,resolutionNoise);%更新跟踪器。trackSensorConfig = computeTrackingSensorConfig(配置,configFlds);曲目=跟踪器(dets的,trackSensorConfig,时间);%用当前波束位置、探测和跟踪位置更新显示。theaterDisplay(引爆器,配置,跟踪);%拍摄快照。snapfigure(theaterdisplay,任何(time == 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));结束%显示船舶的估计尺寸的表。DIMS =表(的TrackID,长度,宽度,高度)
Dims = 3x4表Traditic长度宽度_______ ______ ______ ______ ______199.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 = computeackingsensorconfig (configIn,flds) config = struct();ifld = 1:numel(flds)thisfld = flds {ifld};配置。(thisfld)= configin。(thisfld);结束结束

updateMeasurementNoise

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

函数依据= updateMeasurementNoise(精细、噪音)iDET = 1:numel(dets)dets {idet} .measurementnoise(:) =噪音(:);结束结束

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”,@ constrenturn,'StateTransitionJacobianFcn',@ constturnjac,...“MeasurementFcn”@ctmeas,'MeasurementJacobianFcn',@ ctmeasjac,...“PositionIndex”(1 3 6),“ExtentRotationFcn”, phdDefault。ExtentRotationFcn,...“HasAdditiveProcessNoise”假的,“ProcessNoise”,2 *眼睛(4),...“TemporalDecay”,1e3,'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和OMEGA中的%协方差。smallStateCov = DIAG([300 300 50]);小船%规模矩阵smallshape =(DOF  -  4)*诊断([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.statecoviarces([2 4 5],[2 4 5],themindex)= repmat(r * smallstatecov * r',[1 1 numcomps]);phdsmall.statecoviarces([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]);largeShape =(DOF  -  4)* DIAG([2分之500100/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(:) = DOF;%大型船舶添加到小型船舶制造总密度。这个密度每一步加到总密度。phd = phdsmall;附录(博士,Phdlarge);结束%当调用检测输入,即适应性出生密度,不要%添加任何新的组件。如果输入参数个数> 1%这会在密度0分量。的phd = initctggiwphd;结束结束