这个示例展示了如何以编程的方式构造和可视化一个简单的雷达场景radarScenario
,theaterPlot
,radarDataGenerator
对象。
首先,创建一个空的雷达场景。所有场景属性都有默认值。该场景默认不包含任何平台。
场景= radarScenario
scenario = radarScenario带有属性:IsEarthCentered: 0 UpdateRate: 10 SimulationTime: 0 StopTime: Inf SimulationStatus: NotStarted
场景由称为平台的对象组成,您可以在其上安装传感器和发射器。要添加平台,请使用平台
对象的功能。这里你创建了一个简单的塔。
塔=平台(场景)
tower = Platform with properties: PlatformID: 1 ClassID: 0 Position: [0,0] Orientation: [0,0] Dimensions: [1x1 struct] Trajectory: [1x1 kinematicTrajectory] PoseEstimator: [1x1 insSensor] emitter: {} Sensors: {} Signatures: {[1x1 rcsSignature]}
当你第一次构建一个平台时,它有一个PlatformID
,它是用于标识平台的唯一标识符。该场景按照平台创建的顺序分配平台标识符。你可以指定ClassID
表示平台的分类。例如,这里你用3来表示塔。
塔。ClassID = 3;
传感器可以检测平台。对于雷达传感器,一个相关的特征是雷达横截面(RCS)。缺省情况下,使用统一的RCS签名:
塔。签名{1}
ans = rcsSignature with properties: Pattern: [2x2 double]方位角:[- 180180]仰角:[2x1 double]频率:[0 1.0000e+20]
加载预定义的圆柱体RCS数据,并使用该数据来定义塔平台的RCS。
负载(“RCSCylinderExampleData.mat”,“气缸”);塔。{1} = rcsSignature(签名“模式”,缸。RCSdBsm,...“方位”,缸。方位,“高度”,缸。海拔高度,...“频率”, cylinder.Frequency);
默认情况下,平台没有维度,并且被建模为点目标。您可以有选择地指定长度、宽度和高度,以表示对象的范围,以及主体框架原点到其几何中心的偏移量。控件可以指定平台维度维
财产。
你可以这样指定塔的尺寸:
塔。尺寸=结构(...“长度”10...“宽度”10...“高度”现年60岁的...“OriginOffset”, [0 0 30]);
这座塔的长、宽、高分别为10米、10米和60米。原点偏移[0 0 30]表示其体架原点(转动中心)在平台局部体轴正z方向上为30米。
您可以通过它获得平台的当前位置和方向位置
和取向
属性。你可以使用场景的platformpose方法来获取更多平台信息:
scenario.platformPoses
ans = struct with fields: PlatformID: 1 ClassID: 3 Position: [0 0 0] Velocity: [0 0 0] Acceleration: [0 0 0] Orientation: [1x1四元数]AngularVelocity: [0 0 0]
你可以使用它来指定平台的位置和方向轨迹
财产。可以使用a来指定平台的轨迹kinematicTrajectory
,waypoinTrajectory
,或geoTrajectory
对象。
默认情况下,平台由静态对象组成kineticTrajectory
它的身体轴完全居中并与场景轴对齐:
塔。轨迹
ans = kinematicTrajectory with properties: SampleRate: 100 Position: [0 00] Orientation: [1x1 quaternion] Velocity: [0 00] AccelerationSource: 'Input' AngularVelocitySource: 'Input'
要获得4度的俯仰角,你可以使用取向
轨道物体的性质。使用从欧拉角获得的四元数指定方向。
tYaw = 0;tPitch = 4;巨魔= 0;([tYaw tPitch tRoll],“eulerd”,“zyx股票”,“帧”);
雷达工具箱中的大多数示例使用“东北-向下”约定。这意味着x轴指向北,y轴指向东,z轴指向下。同样,局部体框架的x-, y-和z-方向分别是向前,右,向下的方向。
的theaterPlot
object提供了一个在三维场景中动态绘制对象的接口。您可以使用标准的MATLAB轴绘制方法添加或删除注释到戏剧情节的轴,您可以通过它父
财产。
使用一个platformPlotter
绘制平台。
正如预期的那样,塔的中心在原点在NED坐标与4度的俯仰。
tPlot = theaterPlot (“XLim”50 [-50],“YLim”50 [-50],“ZLim”, -100年[0]);pPlotter = platformPlotter (tPlot,“DisplayName的”,“塔”);构成= platformPoses(场景);towerPose =构成(1);towerDims = tower.Dimensions;plotPlatform (pPlotter towerPose。位置,towerDims, towerPose.Orientation); set(tPlot.Parent,“YDir”,“反向”,“ZDir”,“反向”);视图(tPlot。父母,-37.5, 30)
如果需要在平台上添加雷达传感器,可以添加radarDataGenerator
对象在平台上的传感器
财产。
记住,在NED坐标系中,“Z”方向是向下的。因此,如果你想在塔顶安装一个雷达,你应该把它的“z”位置设为-60米。
的radarDataGenerator
具有在场景坐标中报告检测的选项。在场景坐标中报告检测可以更容易地将生成的检测与场景中对象的位置进行比较。
towerRadar = radarDataGenerator (“SensorIndex”, 1...“UpdateRate”10...“MountingLocation”, [0 0 -60],...“ScanMode”,“没有扫描”,...“之内”,真的,...“TargetReportFormat”,“检测”,...“DetectionCoordinates”,“场景”);塔。传感器= towerRadar;
要查看场景中的传感器覆盖率,可以使用覆盖率绘图仪并绘制场景的覆盖率配置。你可以通过调整内部轴的限制来扩大情节的范围:
tPlot。XLimits = [-5000 5000];tPlot。YLimits = [-5000 5000];tPlot。ZLimits = [-1000 0];covPlotter = coveragePlotter (tPlot,“DisplayName的”,传感器覆盖的);plotCoverage (covPlotter coverageConfig(场景));
您可以在场景中添加其他平台,并调整影响其他传感器观察平台的参数。你可以用rcsSignature
以模拟安装在塔上的雷达能看到什么。
下面的代码创建了一架直升机,并将其雷达横截面全向设置为40 dBsm。
直升机=平台(场景);直升机。维= struct(...“长度”30岁的...“宽度”、1。...“高度”7...“OriginOffset”[0 8 -3.2]);直升机。签名= rcsSignature (...“模式”, (40 40;40 40),...“高度”, -90;90年),...“方位”[-180180]);
可以将多个传感器安装到任何平台,方法是将传感器放置在单元数组中,然后再分配给传感器
财产。
直升机。传感器= {...radarDataGenerator (“SensorIndex”2,...“UpdateRate”, 20岁,...“MountingLocation”, [22 0],...“MountingAngles”, [-5 0 0],...“ScanMode”,“没有扫描”,...“之内”,真的,...“TargetReportFormat”,“检测”,...“DetectionCoordinates”,“场景”),...radarDataGenerator (“SensorIndex”3,...“UpdateRate”30岁的...“MountingLocation”, [22 0],...“MountingAngles”, [50 0],...“ScanMode”,“没有扫描”,...“之内”,真的,...“TargetReportFormat”,“检测”,...“DetectionCoordinates”,“场景”)};
你可以安排直升机穿过雷达波束的路径。这张图展示了如何让直升机在250米的高度以恒定速度沿100米的直线飞行7秒:
直升机。轨迹= waypointTrajectory([2000 50 -250; 2000 -50 -250],[0 7]);
平台在时间上的移动是通过使用while循环并调用场景的来执行的推进
方法。
你可以在循环中绘制所有平台的位置、方向和尺寸:
概要文件= platformProfiles(场景);尺寸= vertcat (profiles.Dimensions);而advance(scenario) pose = platformpose (scenario);位置= vertcat (poses.Position);方向= vertcat (poses.Orientation);plotPlatform(pPlotter,位置,尺寸,方向);plotCoverage (covPlotter coverageConfig(场景));%以使动画更缓慢地取消注释下面的行%暂停(0.01)结束
在上面的例子中,你添加了三个更新率不同的雷达:塔的更新率为10hz,直升机的更新率分别为20hz和30hz。
可以将场景置于调用的模式中推进
根据需要更新仿真的时间,以更新它包含的每个传感器。你可以通过设置UpdateRate
的概率为零。
场景。UpdateRate = 0;
要显示模拟时间,请向图中添加一个UI控件。
无花果= (tPlot祖先。父母,“图”);timeReadout = uicontrol(图,“风格”,“文本”,“HorizontalAlignment”,“左”,“位置”,[0 0 200 20]);timeReadout。字符串=”SimulationTime:“+ scenario.SimulationTime;
现在可以达到合适的传感器时间。您可以使用检测
使每个传感器在回路中可用的检测。检测可以通过构造一个detectionPlotter
对象。
dPlotter = detectionPlotter (tPlot,“DisplayName的”,“检测”);
您可以通过重新启动并修改它来再次运行相同的模拟,以报告检测结果。
a的检测位置radarDataGenerator
能从检测中提取出来吗测量
字段:
重启(场景);而(场景)timeReadout前进。字符串=”SimulationTime:“+ scenario.SimulationTime;检测=检测(场景);提取测量位置的列向量allDetections =(检测{:});如果~isempty(allDetections) measurement = cat(2,allDetections. measurement)';其他的测量= 0 (0,3);结束plotDetection (dPlotter、测量);提出了= platformPoses(场景);位置= vertcat (poses.Position);方向= vertcat (poses.Orientation);plotPlatform(pPlotter,位置,尺寸,方向);plotCoverage (covPlotter coverageConfig(场景));结束
注意,仿真的更新时间不均匀地增加到每个传感器所需的时间。
在这个示例中,您学习了如何构造和可视化一个简单的场景,并获取由雷达数据生成器生成的检测结果。