主要内容

模拟扫描雷达

这个例子展示了如何用扫描单站雷达模拟探测和跟踪。这个示例向您展示了如何配置具有机械和电子扫描功能的统计雷达模型,如何设置场景管理工具来处理平台动态和定时,以及如何检查生成的探测和跟踪。

介绍

统计雷达模型

统计雷达模型等radarDataGenerator为雷达系统的早期发展提供有价值的数据。该系统从其性能特征的角度进行建模,并使用最小参数集以及已建立的理论来确定该系统将如何与其环境相互作用。这包括基本系统参数的规范,如工作频率、带宽和脉冲重复频率(PRF),以及角度和距离分辨率、虚警率和检测概率等重要指标。雷达模型有专门的模式单站,双站和被动操作。该模型的主要输出是原始探测数据或一系列航迹更新。当不生成时域信号时,发射器可以为它正在使用的波形指定一个数字ID,以便可以考虑适当的信号增益和抑制。探测可以在雷达帧中输出,如果接收雷达知道发射机的位置和方向,则可以在场景帧中输出。使用各种跟踪和跟踪管理算法之一生成跟踪。数据速率由系统更新速率规范处理,以便以适当的速率生成检测。

场景管理

该模型与radarScenario在动态环境中随时间产生检测或跟踪数据。该场景对象不仅管理仿真时间,还可以在请求检测帧或跟踪更新帧时,根据需要处理场景中对象之间的数据结构传递。雷达物体被安装在一个平台上,该平台处理动态,如场景框架中的位置、速度和方向。这些场景平台还可能包含特征信息,描述了平台在各种类型的传感器上的表现。对于我们的目的,rcsSignature类将被用于赋予目标平台雷达横截面。

扫描

控制扫描的属性可以在雷达对象定义中找到。扫描可以是机械扫描也可以是电子扫描。使用机械扫描,指向方向不能立即改变,而是受到方位角和仰角最大旋转速率的限制。而电子扫描则没有这样的限制,扫描方向在每个循环开始时重置。雷达也被允许同时进行机械和电子扫描。

这张图显示了这两种模式在扫描模式上的差异。在电子模式下,扫描角度总是增加,而在机械模式下,扫描位置总是改变到相邻的位置。雷达首先扫描方位,因为那是主扫描方向,即扫描极限最大的方向。

scan_modes2.gif

场景:空中监视

对于这种情况,考虑一个扫描雷达系统,其天线安装在塔上,可能用于跟踪飞机。您将模拟两个具有不同RCS配置文件的入站平台,并检查检测和跟踪数据。你可以看到信噪比和距离对探测能力的影响。

雷达系统

使用1 GHz的中心频率和1.5 MHz的带宽,可产生约100米的距离分辨率。要对每个扫描位置的单个脉冲建模,请将更新速率设置为所需的PRF。设置范围模糊度的大小以反映PRF选择,并将范围上限设置为范围模糊度大小的两倍,以允许检测第一和第二范围模糊度中的对象。

为可重复性设置种子rng (“默认”);系统参数C = physconst(“光速”);Fc = 1e9;%赫兹带宽= 1.56 e6;%赫兹PRF = 4e3;%赫兹updateRate = prf;rangeRes = c/(2*带宽);% mrangeAmb = c/(2*prf);% mrangeLims = [0 2*rangeAmb];

除了在机械扫描和电子扫描模式之间进行选择外,扫描行为还受扫描极限和视场(FoV)在方位角和仰角上的规范控制。FoV由每个扫描位置的可观测区域的方位角和仰角范围组成,类似于双面半功率波束宽度规范。扫描点的选择使扫描限制所定义的总角度范围被大小等于FoV的非重叠段所覆盖。扫描限制是在雷达的框架中指定的,它可以从它的平台框架通过MountingAngles财产。

方位扫描+/-20度,仰角扫描+/-10度。设置FoV为4度方位角和8度仰角。最后,指定要模拟的完整扫描的总数,这将指示总模拟时间。

扫描参数azLimits = [-20 20];elLimits = [-10 10];Fov = [4;8];%度numFullScans = 24;%要模拟的完整扫描数

扫描点总数如下所示。扫描限制表示参考天线视距矢量的最小和最大扫描角度,因此在一个方向上扫描的总面积比该方向上扫描限制的范围大到FoV的一半。图案总是在az/el上的矩形网格。

numScanPointsAz = floor(diff(azLimits)/fov(1)) + 1;numScanPointsEl = floor(diff(elLimits)/fov(2)) + 1;numScanPoints = numScanPointsAz*numScanPointsEl;

使用了独立于FoV的角度分辨率规范,这允许对角度估计算法建模,如单脉冲。这种角度分辨率决定了区分目标的能力,并用于从Cramer-Rao下界(CRLB)推导出具有该分辨率的单脉冲角度估计的实际角度精度。同样,距离分辨率决定了区分两个目标所需的最小距离,但实际的距离测量精度来自于用于距离估计的CRLB。精确的测量值(距离、距离速率、角度等)可以通过关闭测量噪声来使用HasNoise财产。通常,当信噪比无约束地增加时,测量误差不会趋于零。这可以通过偏差属性(RangeBiasFraction等)捕获,每种可测量类型都有一个偏差属性。出于我们的目的,我们将保留它们的默认值。

在每个方向上使用角分辨率等于FoV的1/4,这允许在同一范围内FoV中最多16个点目标之间进行区分。

angRes = fov/4;

参考目标和雷达环路增益

这个雷达模型没有直接指定发射功率、噪声功率和所使用的探测算法的细节,而是使用了的概念雷达回路增益将目标RCS和距离转化为信噪比,信噪比直接转化为探测概率。雷达环路增益是任何雷达系统的一个重要特性,用一种方法计算参考目标,其中包括参考范围和RCS,以及给定检测和虚警概率的接收机工作特征(ROC)。

对20公里和0 dBsm处的参考目标使用90%的探测概率。每次更新时,每个分辨率单元使用默认的1e-6个假警报。

refTgtRange = 20e3;refTgtRCS = 0;detProb = 0.9;faRate = 1e-6;

雷达构造

使用上述参数构建雷达。使用俯仰扫描下限来设置雷达从其平台的俯仰安装角度。这将使瞄准矢量向上,以便扫描区域的下边缘与地面平行(也就是说,没有一个扫描点将雷达指向地面)。

pitch = elLimits(1);安装天线向上旋转

启用仰角测量,假警报生成,并与相应的范围歧义已经……财产。要建立一个只测量距离和角度的雷达模型,请设置HasRangeRate为假。为了在场景坐标中进行探测,雷达需要知道发射机的方向。由于本例使用单站雷达,这可以通过启用惯性导航系统(INS)功能来实现之内财产。

%创建雷达对象sensorIndex = 1;%需要唯一的标识符雷达=雷达数据生成器(传感器索引,“UpdateRate”updateRate,...“DetectionMode”“单站”“ScanMode”“电子”“TargetReportFormat”“检测”“DetectionCoordinates”“场景”...“HasElevation”,真的,“之内”,真的,“HasRangeRate”假的,“HasRangeAmbiguities”,真的,“HasFalseAlarms”,真的,...“CenterFrequency”足球俱乐部,“带宽”、带宽、...“RangeResolution”管理员,“AzimuthResolution”动物遗传资源(1)“ElevationResolution”动物遗传资源(2)...“ReferenceRange”refTgtRange,“ReferenceRCS”refTgtRCS,“DetectionProbability”detProb,“FalseAlarmRate”faRate,...“RangeLimits”rangeLims,“MaxUnambiguousRange”rangeAmb,“ElectronicAzimuthLimits”azLimits,“ElectronicElevationLimits”elLimits,...“FieldOfView”fov,“MountingAngles”,[0 pitch 0]);

使用helper类来可视化扫描模式,并在模拟循环中对其进行动画处理。

scanplt = helperScanPatternDisplay(雷达);scanplt.makeOverviewPlot;

图中包含一个轴对象。标题为Scan Pattern的axis对象包含21个类型为line的对象。这些对象表示扫描点,视场,扫描限制。

方位角上的扫描点精确扩展到指定的方位角扫描限制,而仰角扫描点则根据需要略微内拉,以避免扫描点重叠或冗余。

计算系统的距离-角度分辨率单元的总数,以及用于检测的帧总数。然后通过将假警报率乘以整个模拟过程中询问的分辨率单元的总数来计算预期的假警报数量。

numResolutionCells = diff(rangeLims)*prod(fov)/(rangeRes*prod(angRes));numFrames = numFullScans*numScanPoints;用于检测的帧总数的%expNumFAs = faRate*numFrames* numresoltioncells%预期FAs数量
expNumFAs = 9.5040

场景和目标

使用radarScenario对象来管理顶级模拟流。该对象提供了添加新平台的功能,并从场景中的所有传感器对象快速生成检测。它还管理模拟中的时间流。使用上一步中计算的总帧数来查找所需的帧数StopTime.如果需要根据场景中对象的更新速率自适应地更新仿真时间,可将场景更新速率设置为零。

%创建场景stopTime = numFullScans*numScanPoints/prf;场景=雷达场景(“StopTime”stopTime,“UpdateRate”, 0);

使用平台方法生成新的平台对象,将它们添加到场景中,并返回用于访问平台属性的句柄。每个平台都有一个唯一的ID,由场景在构建时分配。对于静态平台,只有位置属性。若要模拟标准的等速运动轨迹,请使用kinematicTrajectory对象,并指定位置和速度。

在不同的范围内建立两个目标平台,以不同的速度和角度进入。

%创建平台rdrPlat =平台(场景,“位置”,[0 0 12]);%放置在原点上方12米处tgtPlat(1) =平台(场景,“轨迹”kinematicTrajectory (“位置”,[38e3 6e3 10e3],“速度”,[-380 -50 0]));tgtPlat(2) =平台(场景,“轨迹”kinematicTrajectory (“位置”,[25e3 -3e3 1e3],“速度”,[-280 10 -10]));

为了方便检测方法和仿真时间的自动推进,场景需要感知早期构建的雷达目标。方法将雷达安装到平台上传感器平台的属性。若要在一个平台上安装多个传感器,则传感器属性可以是传感器对象的单元格数组。

将雷达安装到平台rdrPlat。传感器= radar;

rcsSignature类可用于指定平台RCS为面向角度的函数。对于简单的常量rcs签名,请设置模式属性设置为标量值。假设一个平台是20 dBsm,另一个是4 dBsm,以演示可检测性方面的差异。

设置目标平台RCS配置文件tgtRCS = [20,4];% dBsmtgtPlat(1)。签名= rcsSignature(“模式”, tgtRCS (1));tgtPlat(2)。签名= rcsSignature(“模式”tgtRCS (2));

检测能力

计算可以预期的目标的理论信噪比。因为使用了简单的运动学轨迹,所以真值位置和距离就是这样计算的。

time = (0:numFrames-1).'/updateRate;tgtPosTruth(:,:,1) = tgtPlat(1)。位置+ time*tgtPlat(1).Trajectory.Velocity; tgtPosTruth(:,:,2) = tgtPlat(2).Position + time*tgtPlat(2).Trajectory.Velocity; tgtRangeTruth(:,1) = sqrt(sum((tgtPosTruth(:,:,1)-rdrPlat.Position).^2,2)); tgtRangeTruth(:,2) = sqrt(sum((tgtPosTruth(:,:,2)-rdrPlat.Position).^2,2));

然后利用已知目标RCS和雷达模型计算的雷达环路增益,得到每个目标的真实信噪比。

tgtSnr = tgtRCS - 40*log10(tgtRangeTruth) + radar.RadarLoopGain;

对于纯幅度检测方案,如CFAR,在指定的检测概率和虚警率下,检测所需的最小信噪比为

minSnr = 20*log10(erfcinv(2*radar.FalseAlarmRate) - erfcinv(2*radar.DetectionProbability));% dB

计算检测的最小范围。

Rd = 10。^((tgtRCS - minSnr + radar.RadarLoopGain)/40);%米

将目标的平均范围和信噪比与最小范围和信噪比阈值进行比较。目标的总移动距离足够小,基于距离的信噪比没有明显变化。

snrMargin = mean(tgtSnr,1) - minSnr
snrMargin =1×28.6781 - 0.5978
rangeMargin = (Rd - mean(tgtRangeTruth,1))/1e3%公里
rangeMargin =1×225.7310 - 0.8812

第一个目标比用给定的CFAR参数探测所需的亮度高出约8 dB,而第二个目标被认为几乎无法探测到。

模拟检测

主模拟循环从调用开始推进在场景对象上。此方法将场景向前推进到场景中的对象需要更新的下一次时间,并在到达指定的停止时间时返回false,退出循环。注意,第一次调用推进不步进模拟时间,使第一帧数据收集可能发生在0秒。作为使用的替代品推进现场。SimulationStatus可以检查,以确定模拟是否已运行到完成。

在循环内部,可以为任何传感器对象单独调用检测和跟踪生成方法一步方法),但是存在一些方便的方法,可以通过一个函数调用为所有传感器和场景中的所有目标生成检测和跟踪。因为我们只有一个传感器,检测(现场)获得场景中所有目标的检测列表是一个很好的解决方案。通过像这样在顶层启动检测的生成,场景本身处理所需的定时、INS和其他配置数据传递给传感器。这里还使用可视化助手类来动画扫描模式。

allDets = [];初始化生成的所有检测的列表lookAngs = 0 (2,numFrames);simTime = 0 (1,numFrames);帧= 0;%电流帧推进(场景)%前进,直到到达StopTime增加帧索引并记录模拟时间帧=帧+ 1;simTime(frame) = scene.SimulationTime;生成新的检测Dets =探测(场景);记录检查时的观察角度lookAngs(:,frame) = radar.LookAngle;%更新覆盖率图scanplt.updatePlot (radar.LookAngle);编译任何新的检测allDets = [allDets;dets];结束

图中包含2个轴对象。标题为Scan Pattern的坐标轴对象1包含22个类型为line, patch的对象。这些对象表示扫描点,视场,扫描限制。标题为Beam Pointing的坐标轴对象2包含39个类型为surface、quiver、line的对象。

扫描行为

绘制前两次完整扫描的记录视角,以检查模式。雷达首先在方位角上扫描,并在每次方位角扫描结束时上升仰角,在每次新扫描开始时立即重置观察角度。

图;情节(simTime (1:2 * numScanPoints) * 1 e3, lookAngs (:, 1:2 * numScanPoints));包含(“时间(ms)”);ylabel (“看角(度)”);传奇(“方位”“高度”);标题(的角度看);

图中包含一个轴对象。标题为Look Angles的axes对象包含2个类型为line的对象。这些物体代表方位角、仰角。

检测

类的内容objectDetection由我们的雷达输出。

allDets {1}
ans = objectDetection with properties: Time: 7.5000e-04 Measurement: [3x1 double] MeasurementNoise: [3x3 double] SensorIndex: 1 ObjectClassID: 0 ObjectClassParameters: [] MeasurementParameters: [1x1 struct] ObjectAttributes: {[1x1 struct]}

时间是雷达产生探测的模拟时间。SensorIndex显示此检测是由哪个传感器生成的(当有多个传感器并且您正在使用场景级检测方法时,这很重要)。测量是与检测相关的可测量值。格式取决于检测模式和输出坐标的选择。MeasurementNoise给出测量的方差或协方差,并用于跟踪器模型。当以场景坐标输出检测时,测量场只是目标的估计位置向量,测量噪声给出该位置估计的协方差。

ObjectAttributes字段包含一些有用的元数据。检查第一次检测的元数据内容。

allDets{1}。ObjectAttributes {1}
ans =带字段的结构:TargetIndex: 3信噪比:13.1821

TargetIndex显示生成检测的平台的索引,这是由场景按照构建平台的顺序分配的唯一标识符。本次检测的信噪比与我们对相应目标平台的期望大致相同。当检测到的是假警报时,TargetIndex将为-1,这是一个无效的平台ID。

将每个检测的目标指标、信噪比和时间收集为向量。

detTgtIdx = cellfun(@(t) t. objectattributes {1}. bb0。TargetIndex allDets);detTgtSnr = cellfun(@(t) t. objectattributes {1}. bb0。信噪比、allDets);detTime = cellfun(@(t) t. time, allDets);firstTgtDet = find(detTgtIdx == tgtPlat(1).PlatformID);secondTgtDet = find(detTgtIdx == tgtPlat(2).PlatformID);

找出FA检测的总数。

numFAs = nummel (find(detTgtIdx== 1))
numFAs = 7

这接近于先前计算的fa的预期数量。

收集跨检测的测量数据,并绘制两个目标平台的真值位置。

tgtPosObs = cell2mat(cellfun(@(t) t. measurement,allDets,“UniformOutput”, 0) ');次要情节(1、2、1);helperPlotPositionError (tgtPosTruth(:,: 1),时间,tgtPosObs (:, firstTgtDet) detTime (firstTgtDet)的场景。SimulationTime);标题(“目标1位置错误”);次要情节(1、2、2);helperPlotPositionError (tgtPosTruth(:,: 2),时间,tgtPosObs (:, secondTgtDet) detTime (secondTgtDet)的场景。SimulationTime);标题(“目标2位置错误”);集(gcf,“位置”得到(gcf“位置”)+[0 0 600 0]);

图中包含2个轴对象。标题为“目标1位置错误”的Axes对象1包含一个类型为line的对象。标题为“目标2位置错误”的Axes对象2包含一个类型为line的对象。

大多数探测都来自第一个目标。然而,第一个目标并没有在每一帧上都被检测到,而第二个目标尽管具有较低的信噪比,但仍然产生了许多检测。虽然第一个目标很容易被检测到,但由于目标在第二个范围模糊且没有进行消歧,测量误差很大。第二个目标被检测到时,显示出与100米距离分辨率一致的位置误差,角度分辨率相对较差。

看看检测与信噪比的总方差。总方差是每个笛卡尔方向(X、Y和Z)的边际方差之和。该方差包括距离-角度空间中估计的影响以及将这些统计数据转换为场景坐标的影响。

detTotVar = cellfun(@(t) trace(t. measurementnoise),allDets);图;次要情节(1、2、1);helperPlotPositionTotVar(detTgtSnr(firstTgtDet), dettttvar (firstTgtDet));标题(的第一个目标);次要情节(1、2、2);helperPlotPositionTotVar(detTgtSnr(secondTgtDet), dettttvar (secondTgtDet));标题(“第二个目标”);集(gcf,“位置”得到(gcf“位置”)+[0 0 600 0]);

图中包含2个轴对象。标题为First Target的Axes对象1包含一个类型为line的对象。标题为Second Target的Axes对象2包含一个类型为line的对象。

虽然由于距离模糊,第一个目标的绝对位置误差较大,但较低的测量方差反映了第一个目标较大的信噪比和明显的距离较短。

模拟跟踪

radarDataGenerator也能够执行开环跟踪。它可以输出轨道更新,而不是输出检测。

再次运行模拟,但这一次让配置雷达模型直接输出轨迹。首先,设置雷达模型的一些属性,在场景框架中生成航迹。

释放(雷达);%解锁重新模拟雷达。TargetReportFormat =“跟踪”;雷达。TrackCoordinates =“场景”

跟踪可以通过许多不同的算法来执行。有简单的alpha-beta滤波器和线性、扩展和无气味的卡尔曼滤波器,以及恒速度、恒加速度和恒转速运动模型。属性使用哪种算法FilterInitializationFcn财产。例如,这是一个函数句柄或字符向量中的函数名@initcvekf“initcvekf”.如果使用函数句柄,它必须接受初始检测作为输入,并返回一个初始化的跟踪器对象。任何具有相同签名的自定义函数都可以被使用。对于这个例子,使用恒速度扩展卡尔曼滤波器。

雷达。FilterInitializationFcn = @initcvekf;

模拟回路的整体结构是相同的,但在这种情况下,雷达的一步函数必须手动调用。所需的输入是通过调用获得的目标姿势结构targetPoses在雷达平台上,INS结构,通过调用获取构成在雷达平台上,和当前仿真时间。

重启(现场);%重启场景allTracks = [];初始化所有跟踪数据的列表推进(场景)生成新的航迹数据tgtpositions = targetpositions (rdrPlat);ins = pose(rdrPlat);轨道=雷达(tgtpositions,ins,scene.SimulationTime);编译任何新的航迹数据allTracks = [allTracks;tracks];结束

检查跟踪对象。

allTracks (1)%看第一个轨道更新
ans = objectTrack with properties: TrackID: 1 BranchID: 0 SourceIndex: 1 UpdateTime: 0.0093 Age: 34 State: [6x1 double] StateCovariance: [6x6 double] statparameters: [1x1 struct] ObjectClassID: 0 objectclass: 1 TrackLogic: 'History' TrackLogicState: [1 1 00 0] IsConfirmed: 1 IsCoasted: 0 IsSelfReported: 1 ObjectAttributes: [1x1 struct]

TrackID是轨道文件的唯一标识符,和SourceIndex是跟踪器对象的ID,当你在场景中有多个跟踪器时,它是有用的。当使用多假设跟踪器时,BranchID给出了所用假设的指数。的状态字段包含此更新的状态信息。由于使用了匀速模型和场景框架轨道坐标,状态由位置向量和速度向量组成。UpdateTime给出生成此曲目更新的时间。另一个重要的性质,IsCoasted,告诉您这个轨道更新是否使用了一个新的目标检测来更新过滤器,或者它是否只是从最后一个目标检测及时向前传播(轨道是“海岸”)。

ObjectAttributes结构给出了正在检测其签名的平台的ID,以及更新期间该签名的信噪比。

allTracks(1)。ObjectAttributes
ans =带字段的结构:TargetIndex: 3信噪比:19.1837

收集目标索引和更新时间。还要检查我们用了多少次探测来更新我们的轨迹。

trackTgtIdx = arrayfun(@(t) t. targetindex,[allTracks.ObjectAttributes]);updateTime = [allTracks.UpdateTime];firstTgtTrack = find(trackTgtIdx == tgtPlat(1).PlatformID);secondTgtTrack = find(trackTgtIdx == tgtPlat(2).PlatformID);numUpdates = nummel (find(~[allTracks.IsCoasted]))含有新检测数据的航迹更新总数的%
numUpdates = 33

这大致是第一部分中产生的非fa检测的数量。

查看XY平面上报告的位置及其协方差,以及真值位置数据。由于第一个目标位于第二个范围歧义,并且没有进行消歧,因此为第一个目标找到“真”歧义位置。

los = tgtPosTruth(:,:,1) - rdrplate . position;R =根号(sum(los.^2,2));los = los./R;Ramb = mod(R,rangeAmb);tgtPosTruthAmb = rdrPlat。位置+方位*Ramb;

使用助手函数绘制位置轨迹的可视化图。

图;次要情节(1、2、1);helperPlotPositionTrack(tgtPosTruthAmb,allTracks(firstTgtTrack));标题(“第一目标赛道”);次要情节(1、2、2);helperPlotPositionTrack(tgtPosTruth(:,:,2),allTracks(secondTgtTrack));标题(“第二目标轨道”);集(gcf,“位置”得到(gcf“位置”)+[0 0 600 0]);

图中包含2个轴对象。标题为First Target Track的Axes对象1包含11个类型为line的对象。这些对象代表真理位置,位置估计,协方差。标题为Second Target Track的Axes对象2包含25个类型为line的对象。这些对象代表真理位置,位置估计,协方差。

在这两种情况下,位置估计都从收敛于真值(或范围模糊真值)轨迹开始。对于第一个目标,我们有更多的轨道更新,最终状态似乎更接近稳态收敛。观察协方差轮廓,注意到随着跟踪过滤器的升温,预期的初始尺寸减小。

为了更仔细地观察跟踪性能,绘制两个目标的位置估计误差的大小,并指出哪些样本随着目标检测而更新。

图;次要情节(1、2、1);helperPlotPositionTrackError(tgtPosTruthAmb,time,allTracks(firstTgtTrack),updateTime(firstTgtTrack));标题(“第一目标模糊位置错误”);次要情节(1、2、2);helperPlotPositionTrackError(tgtPosTruth(:,:,2),time,allTracks(secondTgtTrack),updateTime(secondTgtTrack));标题(“第二目标位置错误”);集(gcf,“位置”得到(gcf“位置”)+[0 0 600 0]);

图中包含2个轴对象。标题为First Target Ambiguous Position Error的Axes对象1包含2个类型为line的对象。这些对象代表海岸、更新。标题为Second Target Position Error的Axes对象2包含2个类型为line的对象。这些对象代表海岸、更新。

对于信噪比较大的第一个目标,在进行新的检测以更新轨迹文件(红色圆圈表示)的样本上,位置误差减小。由于第二个目标的信噪比要低得多,一些单独探测的误差大到足以增加航迹的位置误差。尽管如此,第二个目标航迹位置误差有一个初始下降趋势,估计的状态可能会收敛。

第一个目标轨道有问题。由于处于第二距离模糊且有垂直于视线的运动分量,因此视速度在变化,恒速卡尔曼滤波无法收敛。

结论

在本例中,您配置了一个统计雷达系统,用于模拟和分析目标可探测性和可跟踪性。您了解了如何使用扫描限制和视场属性来定义扫描模式,如何使用场景管理工具运行雷达模型,以及如何检查生成的探测和跟踪。

辅助函数

函数helperPlotPositionError(tgtPosTruth,time,tgtPosObs,detTime,T) tgtPosTruthX = interp1(time,tgtPosTruth(:,1),detTime).';tgtPosTruthY = interp1(time,tgtPosTruth(:,2),detTime).';tgtPosTruthZ = interp1(time,tgtPosTruth(:,3),detTime).';err = sqrt((tgtPosTruthX - tgtPosObs(1,:)))。^2+(tgtPosTruthY - tgtPosObs(2,:))。^2+(tgtPosTruthZ - tgtPosObs(3,:)).^2);情节(detTime * 1 e3,犯错/ 1 e3,“- o”);网格;xlim ([0 T * 1 e3]);ylabel (RMS误差(km));包含(“时间(ms)”);结束函数helpplotpositiontotvar (detTgtSnr,detTotVar) plot(detTgtSnr,detTotVar,“- o”);网格;包含(“信噪比(dB)”);ylabel (总Var (m^2));结束函数helperPlotPositionTrack(tgtPosTruth,tracks) plot(tgtPosTruth(:,1)/1e3,tgtPosTruth(:,2)/1e3);持有;updateIdx = find(~[tracks.IsCoasted]);= 0:0.01:2*;ind = 1:2: number (updateIdx)百分比绘图更新T = tracks(updateIdx(ind));情节(T.State (1) / 1 e3, T.State (3) / 1 e3,*黑的);sigma = T.StateCovariance([1 3],[1 3]);[evec,eval] = eigs(sigma);Mag =√(diag(eval)).';U = evec(:,1)*mag(1);V = evec(:,2)*mag(2);X = cos(theta)*u(1) + sin(theta)*v(1);Y = cos()*u(2) + sin()*v(2);plot(x/1e3 + T.State(1)/1e3,y/1e3 + T.State(3)/1e3,“红色”);结束持有;网格;包含(“X(公里));ylabel (“Y”(公里));传奇(“真理的位置”位置估计的协方差的“位置”“西北”);结束函数helperPlotPositionTrackError(tgtPosTruth,time,tracks,updateTime) state = [tracks. state];Sx = state(1,:);Sy = state(3,:);Sz =状态(5,:);x = interp1(time,tgtPosTruth(:,1),updateTime);y = interp1(time,tgtPosTruth(:,2),updateTime);z = interp1(time,tgtPosTruth(:,3),updateTime);Err =√((x-sx).^2+(y-sy).^2+(z-sz).^2);isUpdate = ~[tracks.IsCoasted];情节(updateTime * 1 e3,犯错); hold;情节(updateTime (isUpdate) * 1 e3,犯错(isUpdate),”或“);持有;网格;包含(“更新时间(毫秒)”);ylabel (“错误(m)”)传说(“摸”“更新”“位置”“西北”);结束
Baidu
map