主要内容

扩展对象跟踪雷达海洋监视

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

海洋监测场景

模拟海洋监视雷达安装在一座塔的顶端俯瞰船只在港口。模拟塔的位置和船舶的运动场景管理trackingScenario

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

海洋监视雷达

添加一个海洋监视雷达塔。雷达安装在海拔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],% (az el)度“ReferenceRange”5 e3,% m“AzimuthResolution”2,%度“RangeResolution”5,% m“之内”,真的,%报告INS信息“TargetReportFormat”,“检测”,%检测没有集群“DetectionCoordinates”,“球形传感器”);

塔添加到场景的固定平台雷达安装在上面。

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

添加三艘船在港口在雷达的监测部门。两个较小的船只将在20和30节,大型船旅行在一个常数标题10节。

%定义的维度两个小的船只。昏暗的=结构(“长度”,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 =速度* kts2mps * rotatepoint (initOrient [1 0 0]) ';accBody =[0(速度* kts2mps) ^ 2 /半径0];angVelBody =[0 0速度* kts2mps /半径);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 =速度* kts2mps * rotatepoint (initOrient [1 0 0]) ';accBody =[0(速度* kts2mps) ^ 2 /半径0];angVelBody =[0 0速度* kts2mps /半径);traj = kinematicTrajectory (“位置”initPos,“速度”initVel,“定位”initOrient,“AccelerationSource”,“属性”,“加速”accBody,“AngularVelocitySource”,“属性”,“AngularVelocity”,angVelBody);平台(场景中,“维度”昏暗的,“签名”rcs,“轨迹”,traj);%定义大型船舶的维度。昏暗的=结构(“长度”,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 =速度* 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形成的跟踪雷达检测产生的三艘船在港口。博士跟踪使估计的大小船只,允许多个检测单个对象有关。这是很重要的在海洋监测等情况下,传感器检测到的对象的大小大于传感器的分辨率,从而导致多个检测沿表面生成的船只。

跟踪器使用filterInitFcn金宝app支持函数来初始化一个常数转弯速率γ高斯逆Wishart博士(GGIW)过滤器。filterInitFcn将出生组件添加到PHD-intensity在每一个时间步。这些出生组件添加统一的视野内的传感器。他们的大小和预期数量的检测使用之前指定的信息类型的船只将在港口。

GGIW-PHD组件的跟踪器使用伽马分布来估计多少检测应该来自一个对象。跟踪器也在密度计算每个组件的检测能力使用传感器的限制。使用trackingSensorConfiguration模拟传感器的配置trackerPHD

%定义雷达的测量范围和分辨率。azLimits = sensor.FieldOfView (1) / 2 * [1];%度rangeLimits = 15 e3 [0];% msensorLimits = [azLimits; rangeLimits];sensorResolution = [sensor.AzimuthResolution; sensor.RangeResolution];%定义传感器的安装位置和取向在塔上。参数(1)=结构(“帧”,“球”,“OriginPosition”sensor.MountingLocation (:)“OriginVelocity”(0,0,0),“定位”rotmat(四元数(sensor.MountingAngles“eulerd”,“zyx股票”,“帧”),“帧”),“IsParentToChild”,真的,“HasRange”,真的,“HasElevation”sensor.HasElevation,“HasVelocity”、假);%定义塔的位置、速度和方向的场景。参数(2)=结构(“帧”,“矩形”,“OriginPosition”tower.Trajectory.Position (:)“OriginVelocity”tower.Trajectory.Velocity (:)“定位”rotmat (tower.Trajectory.Orientation“帧”),“IsParentToChild”,真的,“HasRange”,真的,“HasElevation”假的,“HasVelocity”、假);%创建trackingSensorConfiguration模型的检测能力%由传感器跟踪。探测概率定义了概率%的生成至少1检测扩展对象。sensorConfig = trackingSensorConfiguration (“SensorIndex”sensor.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博士跟踪器。追踪= 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 = 7 scenario.StopTime [2];%秒推进(场景)%得到当前仿真时间。时间= scenario.SimulationTime;%从塔的生成检测雷达。[侦破,~,配置]=检测(塔、时间);%更新测量噪声的检测与雷达的决议。依据= updateMeasurementNoise(侦破,resolutionNoise);%更新追踪。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]);

下面的图显示了博士估计较小的船最接近雷达位于场景。您可以验证的博士估计船的位置靠近船的中心和估计的大小是相当接近船的实际大小,显示重叠的跟踪与船的椭圆。

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

下一个图也显示博士跟踪估计的位置,大小和其他小型船舶的场景。这是原先闭塞的船上的其他两艘船。尽管闭塞,估计位置、大小和方向匹配的船。

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

3船的跟踪状态报告的估计大小每个船使用3 d位置协方差矩阵。协方差矩阵的特征分解计算估计的长度,宽度,高度的船只。

numTrks =元素个数(跟踪);TrackID = [tracks.TrackID] ';长度= 0 (numTrks, 1);宽度= 0 (numTrks, 1);身高= 0 (numTrks, 1);iTrk = 1: numTrks ext =跟踪(iTrk) .Extent;[Q, D] = eig (ext);d = 2 *√诊断接头(d));iDims = 1:3;= (0 0 1);[~,iUp] = max (abs (* Q));高度(iTrk) = d (iDims (iUp));iDims (iUp) = [];长度(iTrk) = max (d (iDims));宽度(iTrk) = min (d (iDims));结束%显示表的估计尺寸的船只。dim =表(TrackID、长度、宽度、高度)
dim = 3 x4表TrackID长度宽度高度看上去_________长得一样3 2 1 99.077 17.388 16.276 473.93 55.699 8.8352 100.75 18.741 17.407

回想一下,真正的维度的船只是由:

大型船舶

  • 长度:400

  • 宽度:60米

  • 高度:15米

小型船

  • 长度:80

  • 宽度:15米

  • 身高:5米

跟踪器能够区分大型和小型船只的大小估计每个船作为一个椭圆的形状。模拟,每船的真实形状建模使用长方体。形状的假设之间的不匹配追踪和的真实形状建模船只导致高估了船的长度和宽度。雷达是一个2 d传感器,测量范围和方位,所以每个船的高度是不明显的。这导致不准确的高度估计报告的追踪。

总结

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

金宝app支持功能

computeTrackingSensorConfig

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

函数配置= computeTrackingSensorConfig (configIn, flds)配置=结构();iFld = 1:元素个数教主thisFld = flds的{iFld};配置(thisFld) = configIn。(thisFld);结束结束

updateMeasurementNoise

设置指定的测量噪声检测基于噪声协方差。

函数依据= updateMeasurementNoise(精细、噪音)iDet = 1:元素个数(检波器)精细{iDet} .MeasurementNoise(:) =噪音(:);结束结束

filterInitFcn

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

函数博士= filterInitFcn (measParam变长度输入宗量)%这个函数使用预测出生密度只有模拟出生%的场景。如果输入参数个数= = 1%设置预测出生在视场均匀。phdDefault = initctggiwphd;% 1。使用方位和范围创建均匀分布状态。阿兹= 0;%所有组件在方位。范围= linspace (1000、10000、5);% 5的组件范围(阿兹,R) = meshgrid (Az,范围);%创建一个博士过滤器来分配内存。博士= ggiwphd(0(7元素个数(Az)), repmat(眼(7),[1 1元素个数(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),“TemporalDecay”1 e3,“GammaForgettingFactors”,1.1 *(1,元素个数(Az)),“MaxNumComponents”,10000);i = 1:元素个数(Az) [sensorX、感觉,sensorZ] = sph2cart(函数(阿兹(i)), 0, R (i));globalPos = measParam (1) .Orientation‘* [sensorX;感知;sensorZ] + measParam (1) .OriginPosition (:);博士学位。州(3 6][1,i) = globalPos;博士学位。StateCovariances (3 6 [1], [1 3 6] i) =诊断接头([1 e5 1000 e5]);使用位置协方差%覆盖组件之间的差距结束% 2。你所描述的“运动”国家的船只%的视野内。接下来,添加他们的大小和信息%的预期数量的检测。%%预计有两个类型的船只在海上,小和%。你每个尺寸创建组件。phdSmall =博士;%克隆博士过滤器对于大型船只。phdLarge =克隆(博士);%初始数量的组件集。numComps = phdSmall.NumComponents;%对小型船只,预计规模大约是100米长% 20米宽。取向是未知的,我们将创建4%为每个大小方向。首先,你必须将组件添加到%密度相同的状态。这可以通过简单地添加它小船%设置值追加(phdSmall phdSmall);追加(phdSmall phdSmall);%的自由度定义形状。大量代表%确定维度高。景深= 1000;%在vx协方差,v和ω。smallStateCov =诊断接头([300 300 50]);%矩阵规模小船smallShape =(景深- 4)*诊断接头([100/2计10]20/2。^ 2);% l, w和h%创建4方向45度。我= 1:4 thisIndex =(张)* numComps + (1: numComps);R = rotmat(四元数((45 *(张)0 0),“eulerd”,“ZYX股票”,“帧”),“帧”);phdSmall.ScaleMatrices (:,:, thisIndex) = repmat (R * smallShape *”, [1 1 numComps]);phdSmall。StateCovariances ([2 4 5], [2 4 5], thisIndex) = repmat (R * smallStateCov *”, [1 1 numComps]);phdSmall。StateCovariances (7 [6]、[7] 6, thisIndex) = repmat(诊断接头(100 [100]),1 numComps [1]);结束%小型船只产生约10 - 20检测。expNumDets = 15;不确定性= 5 ^ 2;phdSmall.Rates (,) = expNumDets /不确定性;phdSmall.Shapes (,) = expNumDets ^ 2 /不确定性;phdSmall.DegreesOfFreedom(:) =景深;大型船舶%遵循类似的过程。追加(phdLarge phdLarge);追加(phdLarge phdLarge);largeStateCov =诊断接头((100 5));largeShape =(景深- 4)*诊断接头([500/2 100/2 10]。^ 2);我= 1:4 thisIndex =(张)* numComps + (1: numComps);R = rotmat(四元数((45 *(张)0 0),“eulerd”,“ZYX股票”,“帧”),“帧”);phdLarge.ScaleMatrices (:,:, thisIndex) = repmat (R * largeShape *”, [1 1 numComps]);phdLarge。StateCovariances ([2 4 5], [2 4 5], thisIndex) = repmat (R * largeStateCov *”, [1 1 numComps]);phdLarge。StateCovariances (7 [6]、[7] 6, thisIndex) = repmat(诊断接头(100 [100]),1 numComps [1]);结束%生成大约100 - 200检测。expNumDets = 150;不确定性= 50 ^ 2;phdLarge.Rates (,) = expNumDets /不确定性;phdLarge.Shapes (,) = expNumDets ^ 2 /不确定性;phdLarge.DegreesOfFreedom(:) =景深;%添加大型船舶小型船只创建总密度。这个密度%添加到总密度每一步。博士= phdSmall;追加(博士,phdLarge);结束%称为时检测输入出生即自适应密度,不%添加任何新组件。如果输入参数个数> 1%这将创建0组件的密度。博士= initctggiwphd;结束结束