主要内容

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

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

海洋监视情景

模拟安装在塔顶上的海洋监控雷达俯瞰港口的船只。塔的位置和场景中船舶的运动的模拟跟踪场景.

%创建跟踪方案。场景=跟踪场景(“停车时间”,30);%定义单位转换。nmi2m=1852;%海里到米hr2s=3600;%小时到秒kts2mps=nmi2m/hr2s;%节到米每秒

海上监视雷达

在塔楼上增加一个海洋监视雷达。该雷达安装在海拔20米(ASL)的地方。该雷达凝视港口,测量30度方位扇区。海洋监视雷达的常见规格如下所示:

  • 灵敏度:0 dbsm @ 5公里

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

  • 方位分辨率:2度

  • 距离分辨率:5米

使用上述规格模拟海洋雷达融合雷达传感器.

%创建监视雷达。传感器= FusionRadarsensor(1,“无扫描”,...“安装位置”,[0 0-20],...%20米(ASL)“MountingAngles”,[45 0 0],...%[偏航-俯仰-滚转]度“FieldOfView”,[30 10],...%[az el]deg'参考范围',5e3,...%m“方位角解”2....%度“范围解析”5....%m'hasins'符合事实的...%报告信息'targetreportformat','检测',...%无聚类检测'检测','传感器球形');

将塔架添加到场景作为静止平台,其中雷达安装在其顶部。

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

在雷达监视区内的港口增加三艘船。两艘较小的船只以20节和30节的速度转弯,大船以10节的速度恒定航向航行。

%定义两艘小船的尺寸。dim = struct(...“长度”,80,...%m“宽度”,15,...%m“高度”5....%m“原始偏移量”, [0 0 5/2]);%[x y z] m%将小型船舶的雷达散射截面(RCS)建模为30 dBsm。rcs = rcssignature(“模式”,30);%创建一个转动的轨迹。速度= 20;%结初始偏航=130;%度初始位置=[1050 790];半径=200;%minitOrient=四元数([init0],“欧勒德”,'Zyx','框架'); initVel=速度*kts2mps*旋转点(initOrient,[1 0]);accBody=[0(速度*kts2mps)^2/半径0];angVelBody=[0 0速度*kts2mps/半径];traj=运动轨迹(“位置”,initPos,“速度”,initVel,“方向”,东方,...“AccelerationSource”,“财产”,“加速”,accBody,...“AngularVelocitySource”,“财产”,“角度速度”,angVelBody);%将第一艘以20节的速度航行的小船添加到场景中%离雷达塔最近的船。平台(方案,“尺寸”暗淡的“签名”,rcs,“轨迹”,traj);%创建另一艘小船,以30节的速度航行。这是船%哪一个离雷达塔最远。速度=30;%结初始偏航=120;%度initpos = [1410 1180 0];半径= 400;%minitOrient=四元数([init0],“欧勒德”,'Zyx','框架'); initVel=速度*kts2mps*旋转点(initOrient,[1 0]);accBody=[0(速度*kts2mps)^2/半径0];angVelBody=[0 0速度*kts2mps/半径];traj=运动轨迹(“位置”,initPos,“速度”,initVel,“方向”,东方,...“AccelerationSource”,“财产”,“加速”,accBody,...“AngularVelocitySource”,“财产”,“角度速度”,angVelBody);平台(场景,“尺寸”暗淡的“签名”,rcs,“轨迹”,traj);%定义大型船舶的尺寸。dim = struct(...“长度”,400,...%m“宽度”60,...%m“高度”,15,...%m“原始偏移量”, [0 0 15/2]);%[x y z] m%将大型船舶的雷达截面(RCS)建模为75dbsm。rcs = rcssignature(“模式”,75);%创建大船的轨迹,以10节的恒定航向航行。速度=10;%结初始偏航=-135;%度initPos=[1150 1100 0];initOrient=四元数([init0],“欧勒德”,'Zyx','框架'); initVel=速度*kts2mps*旋转点(initOrient,[1 0]);traj=运动轨迹(“位置”,initPos,“速度”,initVel,“方向”,东方,...“AccelerationSource”,“财产”,“AngularVelocitySource”,“财产”);%将大型船舶添加到场景中。平台(方案,“尺寸”暗淡的“签名”,rcs,“轨迹”,traj);%创建显示屏以显示船舶的真实,测量和跟踪位置。TheaterDisplay = HelpermarinesurveillandicleSplay(情景,...“伊西娅”符合事实的“距离单位”,“我是,...“XLim”,450*[-11]+1e3,“YLim”,450*[-11]+1e3,'zlim',[-1000 10],...'电影','marineurveillanceexample.gif');slcttrkpos = zeros(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跟踪器

创建一个追踪器根据港口内三艘船的雷达探测结果形成航迹。PHD跟踪器允许将多个探测结果关联到单个目标,从而能够估计船只的大小。这在传感器探测到的目标大小大于传感器的分辨率,导致沿船舶表面产生多个检测。

跟踪器使用filterInitFcn金宝app支持功能初始化恒定转速Gamma高斯逆出(GGIW)PHD滤波器。filterInitFcn每次步骤都会为PHD强度添加初始组件。这些出生部件在传感器的视野中均匀地添加。它们的尺寸和预期的检测次数使用关于港口中预期的船舶类型的先前信息来指定。

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

%定义雷达的测量极限和分辨率。azLimits=传感器视野(1)/2*[-1];%度rangelimits = [0 15e3];%mSensorLimits = [Azlimits; rangelimits];sensorreesolution = [sensor.azimuthresolution; sensor.rangeresolution];%在塔上定义传感器的安装位置和方向。参数(1)=结构(“框架”,“球形”,...“原始位置”,sensor.mountinglocation(:),...“原始速度”,[0;0;0],...“方向”,rotmat(四元数)(传感器安装角,“欧勒德”,“zyx”,'框架'),'框架'),...“IsParentToChild”符合事实的...“哈斯兰奇”符合事实的“HasElevation”,sensor.haselevation,'hasvelocity',假);%在场景中定义塔的位置、速度和方向。参数(2)=结构(“框架”,“矩形”,...“原始位置”tower.Trajectory.Position (:)...“原始速度”,塔。轨迹。速度(:),...“方向”,rotmat(塔架、轨道、方向、,'框架'),...“IsParentToChild”符合事实的...“哈斯兰奇”符合事实的“HasElevation”错误的'hasvelocity',假);%创建TrackingSensor配置,以模拟传感器的可检测性%由传感器跟踪。检测概率定义概率%从扩展对象生成至少1个检测。传感器配置=跟踪传感器配置(“传感器索引”、传感器。SensorIndex,...“传感器限制”,sensorlimits,...“传感器分辨率”,分辨率,...“DetectionProbability”,0.99,...'sensortransformparameters',params);%用于更新TrackingSensor配置的传感器配置上的字段。configFlds={“传感器索引”,“IsValidTime”};%与雷达分辨率单元对应的噪声协方差。resolutionNoise=diag((传感器分辨率/2)。^2);sensorConfig.FilterInitializationFcn=@(varargin)filterInitFcn(varargin{:},参数);sensorConfig.SensorTransformFcn=@ctmeas;sensorConfig.ClutterDensity=sensor.FalseArmRate/(sensor.AzimuthResolution*sensor.RangeResolution);%使用trackingSensorConfiguration创建PHD跟踪器。tracker=trackerPHD(“传感器配置”,sensorConfig,...“HassensorConfiguration输入”符合事实的...“分割FCN”,@(x)分区检测(x,1.5,6),...“删除阈值”,1e-6,...“出生率”,1e-5);

模拟和跟踪船舶

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

%初始化方案和跟踪器。重启(场景);重置(跟踪器);%将模拟设置为以雷达的更新速率前进。场景。updaterate = sensor.updaterate;%可重复的随机种子集。rng(2019年);%运行模拟。snaptimes = [2 7场景.Stoptime];%秒尽管前进(方案)%获取当前模拟时间。时间=scenario.SimulationTime;%从塔雷达产生检测。[DETS,〜,CONFIG] =检测(塔,时间);config.sensorindex = sensor.sensorindex;更新探测的测量噪声以匹配雷达分辨率。dets=更新测量噪声(dets,分辨率噪声);%更新跟踪器。trackSensorConfig=ComputeTrackSensorConfig(配置,配置FLDS);tracks=tracker(数据传输,trackSensorConfig,时间);%更新显示当前波束位置,检测和跟踪位置。theaterDisplay(引爆器,配置,跟踪);%拍快照。snapFigure(剧院显示器,任意(时间==快照时间));结尾writeMovie(剧院显示器);

下图显示了雷达探测,显示为红点,估计轨迹位置显示为带轨迹ID的黄色方框,估计跟踪对象范围显示为黄色椭圆。雷达塔位于原点(0,0),图中未显示。雷达的视场由穿过图顶部和底部的两条红线表示。所有船舶都位于雷达的视场内,并且由于船舶尺寸远大于雷达的距离和方位分辨率,因此沿船舶表面进行多次探测雷达看得见。

showSnapshot(剧院显示器,1)

由于船舶被建模为扩展对象而非点目标,因此船舶和雷达之间的另一艘船舶可能会阻挡对船舶的探测。如下图所示。在这种情况下,图顶部的较小船舶不会被雷达探测到。雷达的视线会被这两个目标阻挡图中底部的其他小型船舶和中间的大型船舶。跟踪器保持对被遮挡船舶的估计,并将以下步骤中的检测与航迹关联,而不会掉下航迹。

showSnapshot(剧院显示器,2)轴([1250 1450 1150 1350]);视图([-90 90]);

下图显示了场景中距离雷达最近的小型船舶的PHD估计值。您可以验证船舶位置的PHD估计值位于船舶中心附近,并且估计尺寸与船舶的实际尺寸相当接近,这由轨迹椭圆与船舶的重叠表示。

showsnapshot(theaterdisplay,3)轴([650 850 700 900]);查看([ -  90 90]);

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

showSnapshot(剧院显示器,3)轴([900 1100 1250 1450]);视图([-90]);

3艘船的航迹状态使用3D位置协方差矩阵报告每艘船的估计尺寸。对协方差矩阵进行特征分解,计算每艘船的估计长度、宽度和高度。

numTrks=numel(轨迹);TrackID=[tracks.TrackID]';长度=0(numTrks,1);宽度=0(numTrks,1);高度=0(numTrks,1);为了iTrk=1:numTrks ext=tracks(iTrk).ext;[Q,D]=eig(ext);D=2*sqrt(diag(D));iDims=1:3;up=[0-1];[~,iUp]=max(abs(up*Q));高度(iTrk)=D(iDims(iUp));iDims(iUp)=[];长度(iTrk)=max(D(iDims));宽度(iTrk)=min(D(iDims));结尾%显示船舶的估计尺寸表。dims=表格(轨迹ID、长度、宽度、高度)
Dims = 3x4表Traditic长度宽度高度_______ ______ ______ ______1 102.7 18.213 16.543 2 472.05 55.85 8.953 3 97.196 18.57 17.626

回想一下,船舶的真实尺寸由以下公式给出:

大船

  • 长度:400米

  • 宽度:60米

  • 高度:15米

小船

  • 长度:80米

  • 宽度:15米

  • 高度:5米

跟踪器能够通过将每艘船的形状估计为椭圆来区分大小船只。在模拟中,使用长方体对每艘船的真实形状进行建模。跟踪器所作的形状假设与模型船舶的真实形状之间的这种不匹配会导致高估船舶的长度和宽度。雷达是一个2D传感器,只测量距离和方位,因此无法观察到每艘船的高度。这导致跟踪器报告的高度估计不准确。

总结

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

金宝app辅助功能

计算机配置

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

功能config=computeTrackingSensorConfig(configIn,flds)config=struct();为了iFld=1:numel(flds)thisFld=flds{iFld};config.(thisFld)=configIn.(thisFld);结尾结尾

更新测量噪声

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

功能dets=更新测量噪音(dets,噪音)为了iDet=1:numel(dets)dets{iDet}.MeasurementNoise(:)=noise(:);结尾结尾

filterInitFcn

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

功能phd=过滤器输入FCN(measParam,Varagin)该函数仅使用预测出生密度来模拟出生%情景。如果nargin == 1%在FOV内均匀设置预测出生。phdDefault=initctggiwphd;% 1. 使用方位角和距离创建均匀分布的状态。AZ = 0;百分比方位角的所有组件。范围=linspace(100010000,5);范围%5组件[Az,R]=网格网格(Az,范围);%创建一个PHD过滤器来分配内存。PHD = GGIWPHD(零(7,NUMER(AZ)),REPMAT(EYE(7),[1 1 NUMER(AZ)]),...“比例矩阵”,repmat(眼睛(3),[1 1 numel(az)]),...“StateTransitionFcn”,@constturn,“状态转换JacobianFCN”,@constturnjac,...'measurementfcn',@ctmeas,“测量JacobianFCN”,@ctmeasjac,...'positionIndex',[1 3 6],“ExtentRotationFcn”,phddefault.extentrotationfcn,...“HasAdditiveProcessNoise”错误的'processnoise',2*眼(4),...“暂时性排泄”,1e3,“GammaForgettingFactors”,1.1*个(1,努美尔(亚利桑那州)),...“MaxNumComponents”,10000);为了i = 1:NUMER(AZ)[SENSORX,SENSORY,SENSORZ] = SPH2CART(DEG2RAD(AZ(i)),0,R(i));GlobalPos = measparam(1).Oorientation'* [SensorX;感官; Sensorz] + Measparam(1).originposition(:);phd.states([1 3 6],i)= GlobalPos;PHD.STATECOVIRARCE([1 3 6],[1 3 6],i)= DIAG([1E5 1E5 1000]);使用位置协方差的组件之间的%覆盖间隙结尾% 2. 您已经描述了每艘船的“运动学”状态百分比在视野内。接下来,添加有关其大小的信息%预期检测次数。%%预计海上有两种类型的船舶,小型和小型%大的。可以为每个尺寸创建构件。phdsmall = phd;%克隆大型船舶的PHD过滤器。phdLarge=克隆(phd);%设置组件的初始数量。numcomps = phdsmall.numcomponents;对于小型船舶,预计长度和尺寸约为100米%20米宽。由于方向未知,我们将创建4个%每个尺寸的方向。首先,必须将组件添加到%相同状态下的密度。这可以通过简单地附加它来实现小船的%设置值附加(phdSmall,phdSmall);附加(phdSmall,phdSmall);%定义形状的自由度。大数字表示%更高的维度确定性。DOF = 1000;%vx、vy和ω的协方差。smallStateCov=diag([300 50]);%小船尺度矩阵smallShape=(自由度-4)*诊断([100/220/210]。^2);%l、w和h%创建4个彼此成45度角的方向。为了i=1:4该指数=(i-1)*numComps+(1:numComps);R=rotmat(四元数([45*(i-1)0],“欧勒德”,'Zyx','框架'),'框架')phdSmall.ScaleMatrices(:,:,thisIndex)=repmat(R*smallShape*R',[1 numComps]);phdSmall.StateCovariances([2 4 5],[2 4 5],thisIndex)=repmat(R*smallStateCov*R',[1 numComps]);phdSmall.StateCovariances([6 7],[6 7],thisIndex)=repmat(diag([100]),[1 numComps]);结尾%小型船舶产生大约10-20次探测。Expnumdets = 15;不确定性= 5 ^ 2;phdsmall.rates(:) = ExpnumDets /不确定性;phdsmall.shapes(:) = Expnumdets ^ 2 /不确定性;phdsmall.degreesoffreedom(:) = DOF;%遵循类似的大船的过程。追加(phdLarge,phdLarge);追加(phdLarge,phdLarge);大盖世太保=诊断([100 5 10]);大形状=(dof-4)*诊断([500/2 100/2 10])。^2);为了i=1:4该指数=(i-1)*numComps+(1:numComps);R=rotmat(四元数([45*(i-1)0],“欧勒德”,'Zyx','框架'),'框架');phdlarge.scalematrices(:,:,thisIndex)= repmat(r * largeshape * r',[1 1 numcomps]);phdlarge.statecoviarces([2 4 5],[2 4 5],themindex)= Repmat(R * RestaTecov * R',[1 1 NumComps]);phdlarge.statecoviarces([6 7],[6 7],themIndex)= 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;附加(博士、博士);结尾%当使用检测输入(即自适应出生密度)调用时,不要%添加任何新组件。如果纳金>1%这将在密度中创建0个组件。phd=初始CTGGIWPD;结尾结尾