mcpField
M
matlab-simulate-radar-detections

matlab-simulate-radar-detections

github.com/matlab其他1.2k56 次安装1 天前更新
代码仓库

关于 matlab-simulate-radar-detections

使用 radarScenario 中的 radarDataGenerator 进行统计级雷达检测仿真的 MATLAB 技能,帮助将硬件规格或性能需求转化为场景参数,并明确其与波形级仿真的区别。

主要功能

  1. 01配置 radarScenario 和 radarDataGenerator
  2. 02将硬件规格转为仿真参数
  3. 03建模扫描、目标与检测性能
  4. 04比较扫描策略和覆盖范围
  5. 05生成供跟踪工作流使用的检测

适用场景

  1. 01测试运动目标的检测表现
  2. 02比较机械扫描与电子扫描
  3. 03开展雷达覆盖或部署研究
  4. 04为跟踪器生成检测数据

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/matlab/matlab-agentic-toolkit --skill matlab-simulate-radar-detections

安装后在 Claude Code 中输入/matlab-simulate-radar-detections确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

manifest.yaml
references/
coordinates-and-transforms.md
coupled-parameters.md
detection-model.md
fov-and-scan.md
interaction-flow.md
radar-equation-tools.md
requirements-sheet-template.md
terrain-clutter-atmosphere.md
trajectories.md
visualization.md

详细介绍

雷达数据生成器 — 统计检测仿真

在 radarScenario 中使用 radarDataGenerator 构建检测级雷达仿真。此技能将用户的硬件规格和性能要求与 Radar Toolbox 统计仿真 API 对接。

适用场景

  • 用户想要仿真对运动目标的雷达检测
  • 用户有雷达硬件规格(数据手册)或性能要求,并想要构建仿真
  • 用户提到监视雷达、扫描、重访时间、检测概率或雷达覆盖范围
  • 用户想要比较扫描策略(机械扫描、电子扫描或混合扫描)
  • 用户想要生成检测结果以馈入跟踪器(trackerGNN、trackerJPDA),或进行传感器融合
  • 用户想要进行蒙特卡洛分析、权衡研究,或根据链路预算预测进行验证
  • 用户正在研究雷达部署位置或几何布局,以最大化覆盖范围
  • 用户现有的 radarDataGenerator 代码无法正常工作,例如漏检、配置错误
  • 用户想要根据预期性能验证仿真结果

不适用场景

  • 用户需要 I/Q 级波形仿真(使用 radarTransceiver + 脉冲多普勒处理链)
  • 用户需要设计 CFAR 检测器或波束形成
  • 用户需要设计波形(模糊函数、线性调频优化)
  • 用户已有检测结果,想要对其进行处理
  • 用户需要双基地或多基地雷达配置
  • 用户需要干扰或电子攻击建模(EW 场景)
  • 用户想要在自定义仿真循环中独立调用 radarDataGenerator(不使用 radarScenario)

如果用户需要信号级保真度,请解释其中的权衡并交由其他方案处理。

检测路径

radarDataGenerator 支持两种检测路径。本技能仅使用目标姿态路径:

路径调用签名检测由以下参数控制使用场景
目标姿态(本技能)detect(scenario)DetectionProbability、FalseAlarmRate、ReferenceRange、ReferenceRCS标准雷达仿真——将目标定义为具有轨迹的平台
辐射信号detect(scenario, propagatedEmissions)Sensitivity、DetectionThresholdESM 接收机、显式传播辐射信号的双基地场景

一种路径中的属性对另一种路径完全没有影响。在目标姿态路径中设置 Sensitivity 或 DetectionThreshold 会产生“not relevant”警告。

独立模式: radarDataGenerator 也可在场景之外调用:[dets, numDets, config] = rdg(targetPoses, simTime)。可用于集成到自定义循环中(Simulink、事件驱动)。但会失去 advance()、轨迹自动化、多传感器聚合和覆盖范围可视化功能。完整的独立 API 和姿态结构体要求请参阅 references/detection-model.md。

工作流

按以下 9 个步骤交互执行。不要默默地自行选择参数——在每个决策点都与用户沟通。

步骤 1:推荐方案

推荐在 radarScenario 中使用 radarDataGenerator 进行统计级仿真。说明其中的权衡:可快速迭代场景设计,但对信号处理的控制较少。如果用户需要 I/Q 级保真度,请说明替代方案(radarTransceiver + 脉冲多普勒 + CFAR),并停止结构化的 9 步流程。

用户确认采用统计级方案后,说明所用方法并列出 API:radarScenario、radarDataGenerator、platform、waypointTrajectory/kinematicTrajectory/geoTrajectory。

步骤 2:确认用例

建议一个用例(例如:地面监视系统扫描一个扇区)。确认:

  • 扫描类型: 建议机械扫描,也可选择电子扫描或两者结合
  • 坐标系: NED(默认)、ENU 或地心坐标系。说明其影响。
  • 配置: 确认采用单基地配置
  • 传播环境: 默认使用 FreeSpace(无折射)。如果用户提到远距离、低仰角目标或超视距,可提供大气模型:atmosphere(scenario, model) — 'EffectiveEarth'(半径为 4/3 地球半径)、'RefractivityGradient' 或 'CRPL'。这些模型会在传播路径中加入折射偏差(射线弯曲),影响报告的目标位置——但不会在链路预算中加入大气衰减。天气/降水不会以统计方式建模。
步骤 3:询问参数来源方向

“您采用哪种工作方向?自顶向下(指定需求,推导硬件)?自底向上(指定硬件,推导性能)?还是两者结合?”

如果用户提供数据表:按照 references/coupled-parameters.md 中的数据表导入流程操作——提取参数、映射到各组、识别缺项、完成链路预算并标记冲突。

流程从此处分支:

自顶向下路径(步骤 4 → 5):用户先指定性能需求,再推导硬件。

  • 步骤 4:提出参考性能(距离、RCS、Pd、Pfa)
  • 步骤 5:展示耦合参数表,推导满足需求所需的硬件

自底向上路径(步骤 5 → 4):用户先指定硬件,再推导性能。

  • 步骤 5:展示耦合参数表,收集硬件规格(功率、增益、NF、带宽等)
  • 步骤 4:通过 radareqrng 从硬件推导并展示参考性能

混合/数据表: 收集用户已有的信息,从两个方向补齐缺项,并标记不一致之处。

两种路径都会在步骤 6(目标集设计)汇合。

步骤 4:提出参考性能

将其作为参考目标规格展示:

  • 参考距离、参考 RCS(注意:ReferenceRCS 的单位是 dBsm)
  • 检测概率、虚警率(有效范围:[1e-7, 1e-3])
  • 积分类型和脉冲数(假设为相干积分;询问 N 或 CPI)
  • 单基地、晴空

自顶向下: 提出具体的默认值,供用户确认或修改。 自底向上: 展示根据用户硬件推导出的数值,并说明推导过程(使用了哪个函数、哪些输入)。对于积分,假设为相干积分,询问脉冲数或 CPI 时长。使用 detectability(Pd, Pfa, 1, 'SwerlingN') - 10*log10(N) 计算所需 SNR。Swerling 参数必须是字符串:'Swerling0'、'Swerling1'……'Swerling4'。对于相干系统,绝不要将 N 传给 detectability——这会应用非相干损耗。完整决策表请参见 references/interaction-flow.md § 步骤 4。

步骤 5:展示耦合参数表

展示 references/coupled-parameters.md 中的参数关系表。这有助于建立信心、展示可追溯性,并便于用户提出修正。

自顶向下: 使用该表推导出满足已确认参考性能所需的硬件。 自底向上: 使用该表收集用户的硬件规格,并确定哪些参数组已受约束。

第 6 步:目标集设计

确认几何条件(雷达位置、扫描扇区、空中目标)。提出具有物理代表性的目标,并设置不同的:

  • RCS(UAV 约为 0.01 m²,战斗机约为 1 m²,商用飞机约为 10 m²)
  • 速度(旋翼机为 50 m/s,喷气式飞机为 250 m/s,快速目标为 300+ m/s)
  • 高度(低空突防为 500 m,中空为 5 km,高空为 10 km)

提供 Swerling 模型(I = 慢起伏,III = 主散射体)。通过每个平台 Signatures 属性上的 rcsSignature 配置各目标的 RCS 模型——模式请参见 references/detection-model.md。平台默认 RCS 为 10 dBsm(Swerling0)。

继续之前的合理性检查:

  1. 使用 horizonrange(antennaHeight) 确认目标几何条件未超出雷达地平线。如果任何目标在指定高度上超出视距,请向用户指出。

  2. 计算每个目标的预期 0.9 Pd 参考距离。报告如下表:

目标RCS(dBsm)Swerling距离(km)预期 Pd
UAV-201150.72
战斗机01400.95

使用:SNR_at_R = RadarLoopGain + RCS_dBsm - 40*log10(range),然后根据正确的 Swerling 公式将 SNR 映射为 Pd(参见 references/radar-equation-tools.md)。如果任何目标的预期 Pd < 0.5,请标出该目标——运行模拟前,用户应了解哪些目标的检测结果不可靠。

询问:“您需要地形或地面回波吗?还是自由空间就足够?”

第 7 步:地形 / 遮挡

如适用,请参见 references/terrain-clutter-atmosphere.md 了解地形选项。在自由空间中验证检测结果后,再添加地形和遮挡。landSurface 用于高度图,seaSurface 用于海况,customSurface 用于用户自定义。landSurface 提供用于视距遮挡的 occlusion()。radarDataGenerator 上的 HasOcclusion 表示目标间遮挡。

第 8 步:模拟时长

按用户熟悉的方式询问:秒数、扫描次数、目标照射次数,或基于事件。扫描参数确定后,再在这些单位之间换算。

第 9 步:生成需求说明

生成一份独立文档,包含三个部分——参见 references/requirements-sheet-template.md。

关键功能

功能用途工具箱
radarScenario场景容器(平台、时间、检测)Radar
radarDataGenerator统计检测传感器Radar
platform向场景添加平台Radar
waypointTrajectory在局部坐标中基于航点的运动(具有 ReferenceFrame)Radar
kinematicTrajectory在局部坐标中基于状态的运动(无 ReferenceFrame)Radar
geoTrajectory在大地坐标中基于航点的运动(纬度/经度/高度)——要求 IsEarthCentered = trueRadar
radareqrng根据雷达方程计算最大检测距离Radar
radareqpow所需发射功率Radar
radareqsnr给定距离处的接收信噪比Radar
detectabilityPd/Pfa/N/Swerling 对应的所需信噪比(可检测性因子)Radar
albersheimPd/Pfa/N 对应的所需信噪比(仅适用于 Swerling 0)Phased Array
shnidmanPd/Pfa/N/Swerling 0–4 对应的所需信噪比Phased Array
horizonrange根据天线高度计算雷达视距Radar
height2el根据目标高度/距离计算仰角Radar
freq2wavelen根据频率计算波长Phased Array
rangeres2bw根据距离分辨率计算带宽Phased Array
bw2rangeres根据带宽计算距离分辨率Phased Array
speed2dop根据速度计算多普勒频移。采用单程约定——对于单基地双程:fd = 2*speed2dop(v, lambda)Phased Array
dop2speed根据多普勒频移计算速度。采用单程约定——对于单基地双程:v = dop2speed(fd, lambda)/2,或直接使用 lambda*fd/2Phased Array
beamwidth2gain根据半功率波束宽度计算天线增益。必须传入 [azBW; elBW] 列向量——标量表示对称波束。Phased Array
aperture2gain根据有效孔径计算天线增益Phased Array
gain2aperture根据天线增益计算有效孔径Phased Array
ap2beamwidth根据孔径长度和波长计算波束宽度Phased Array
beamwidth2ap根据波束宽度和波长计算孔径长度Phased Array
effbeamwidth双程有效波束宽度(Tx+Rx)→ 映射到 AzimuthResolution/ElevationResolutionPhased Array
systemp系统噪声温度Phased Array
noisepow根据温度和带宽计算噪声功率Phased Array
theaterplot场景可视化Radar
coverageConfig覆盖图Radar
radarmetricplot绘制指标随距离变化的曲线,并显示目标/阈值线和红黄绿指示灯Radar
orientationPlotter可视化波束指向(theaterPlot 绘图器)Radar
detectionPlotter在 theater 图上可视化检测结果Radar
landSurface静态地形(高度矩阵或 DTED)——仅当 IsEarthCentered=true 时遮挡才会生效Radar
seaSurface动态海面(谱模型、风、风区长度)Radar
customSurface用于杂波的极化散射矩阵表面Radar
surfaceReflectivityLand地面杂波反射率模型(Barton、GIT 等)Radar
surfaceReflectivitySea海面杂波反射率模型Radar
clutterGenerator向场景添加杂波(与雷达传感器一一对应,要求指定表面)Radar
ringClutterRegion定义显式杂波区域(当 UseBeam=false 时必需)Radar
getClutterGenerator获取雷达现有的杂波生成器Radar

约定

可追溯性
  • 每个随机量都可追溯到一个已配置参数
  • radarDataGenerator 提供内置可追溯性——属性名称本身就是文档
  • 如果手动实现任何计算,请注释说明模型、参数,以及它与系统设计的关联方式
坐标系
  • 选择一个坐标系,并始终保持一致
  • waypointTrajectory 有 'ReferenceFrame' 属性:'NED' 或 'ENU'——与 IsEarthCentered = false 搭配使用
  • kinematicTrajectory 没有 ReferenceFrame——继承自场景——与 IsEarthCentered = false 搭配使用
  • geoTrajectory 使用大地坐标航点 [lat, lon, alt],单位为 [deg, deg, m]——必须设置 IsEarthCentered = true
    • 有 'ReferenceFrame'('NED'/'ENU'),用于解释速度/方向
    • 也支持 Course、GroundSpeed、ClimbRate,可替代 Velocities
    • DetectionCoordinates = 'Scenario' 会以 ECEF(米)报告,而非经纬度
    • 单个航点 = 静止平台(忽略 TimeOfArrival)
  • **约束:**轨迹类型与 IsEarthCentered 严格绑定——混用会导致错误
  • NED:地平线上方的仰角为负值。ENU:地平线上方的仰角为正值。
  • 始终进行验证:解析计算预期仰角,并与测量值比较
参数来源标签

需求表中的每个参数都要标注来源:

  • 用户提供——用户告知
  • 领域假设——合理的默认值,并说明依据
  • 推导得出——根据其他参数计算得出(注明使用的函数)
系统参数与仿真参数

确认用户需求和用例(步骤 2–6)后,区分以下参数:

  • 系统参数(用户的设计):FieldOfView、CenterFrequency、Bandwidth、MaxAzimuthScanRate、ReferenceRange、天线高度等。切勿为解决仿真问题而更改这些参数。
  • 仿真参数(我们的配置):UpdateRate、RangeLimits、场景 UpdateRate、DetectionCoordinates、仿真时长。这些参数可以自由调整。

如果出现仿真伪影(例如,波束步进导致漏检),应通过调整仿真参数来解决。如果解决方案需要更改系统参数,则应向用户说明,并结合物理直觉解释——这是设计方面的洞见,而不是仿真修复。

自洽性

推导出所有参数后,验证整个流程是否闭合:

  • 使用 radareqrng 根据硬件参数计算 Rmax
  • 将 ReferenceRange 设置为 Rmax
  • 运行仿真,确认在参考距离处约为 Pd
  • 如果不匹配,则进行诊断并标记

常见错误

错误错误原因正确做法
未调用 release() 就修改不可调属性radarDataGenerator 是 System 对象——不可调属性(FieldOfView、ScanMode、AzimuthResolution、扫描限制)在首次调用 detect() 后会被锁定修改不可调属性前调用 release(radar),然后在重新运行前调用 restart(scenario)
以线性 m² 为单位设置 ReferenceRCS此属性要求使用 dBsm转换:10*log10(rcs_linear)
使用 range2bw / bw2range已弃用使用 rangeres2bw / bw2rangeres
使用 MechanicalScanLimits此属性不存在使用 MechanicalAzimuthLimits、MechanicalElevationLimits
为电子扫描设置 MaxAzimuthScanRate会被忽略(并发出警告)在电子模式下,波束每次更新按 FieldOfView(1) 移动
混淆 detect(scenario) 与 detect(platform, time)两者的签名不同——场景级调用会合并所有传感器的检测结果dets = detect(scenario) 或 [dets, configs] = detect(scenario)——两者都有效。逐个平台调用:[dets, ~, configs] = detect(platform, time)
忘记 NED 坐标系中的仰角符号地平线以上的目标仰角为负检查符号:在 NED 坐标系中,el = -asind(alt/range)
在非 Custom 扫描模式下使用 HasScanLoss仅在 ScanMode='Custom' 时适用Mechanical/Electronic 模式下省略此属性
混用轨迹参考坐标系会导致静默的位置误差将所有 waypointTrajectory 对象设为相同的 'ReferenceFrame'
waypointTrajectory 的时长短于 StopTime场景会在轨迹的最大终点处停止,而不是在 StopTime 处停止。平台轨迹结束后位置会变为 NaN——之后将不再被检测到,且不会给出提示。将所有 waypointTrajectory 的终点延长至 >= StopTime(添加保持航点)。或者对匀速平台使用 kinematicTrajectory。
混淆 radar/waypointTrajectory 与 drivingScenario 轨迹API 不同——drivingScenario 使用参与者航点,而不是此类在 radarScenario 中,始终使用 waypointTrajectory、kinematicTrajectory 或 geoTrajectory
对配备前视传感器的移动平台使用 kinematicTrajectory机体坐标系方向是固定的(默认:恒等变换 = 场景坐标轴)。它不会随速度旋转——前视传感器无法跟随飞行路径。对配备传感器的移动平台使用 waypointTrajectory 或 geoTrajectory。它们的机体坐标系会随航向旋转。
硬编码噪声(例如 0.2*randn)无法追溯,破坏自洽性使用 radarDataGenerator 内置噪声模型,或注释说明其来源
未设置传感器的 UpdateRate默认值为 1 Hz——扫描速率 = FoV(1)*1 = 极慢始终为 radarDataGenerator 显式设置 'UpdateRate'
场景的 UpdateRate < 传感器的 UpdateRate发生混叠:仅采样部分 FoV 驻留位置。位于未采样位置之间的目标会静默地完全不产生检测结果。为确保检测完整,将场景的 UpdateRate 设为传感器的 UpdateRate。
将传感器的矩形坐标测量值直接与场景坐标系中的真值比较传感器的矩形坐标属于波束旋转坐标系——每次检测的坐标系取决于检测时波束指向的位置。原始测量值与真值可能相差数十 km。使用每个检测结果的 MeasurementParameters(1):scenarioPos = Orientation * Measurement + OriginPosition。Orientation 矩阵编码了安装方向和当前扫描角。
认为球坐标测量值的顺序为 [range, az, el]'Sensor spherical' 的实际顺序是 [az, el, range]检查 DetectionCoordinates 设置;默认值为 'Body'(笛卡尔坐标)
未设置 RangeLimits默认值为 [0, 100 km]——超过 100 km 的目标不会产生检测结果,且不会给出提示设置 'RangeLimits', [0, R],其中 R = max(maxTargetRange, ReferenceRange * 1.2)
将 'Sector' 与 MechanicalElevationLimits 一起使用'Sector' 会将 HasElevation 设为 false——仰角限制会被忽略(并发出警告)如需仰角扫描,请显式使用 'ScanMode','Mechanical' 并设置 HasElevation=true
为排查检测问题而设置或调查 HasElevationHasElevation 不会影响是否检测到目标。它只控制是否测量仰角,以及波束是否在仰角方向扫描。默认值为 false(仅方位角)。切勿设置 HasElevation=false(它本来就是默认值)。调试检测缺失问题时,切勿调查 HasElevation——它不会导致检测缺失。检测缺失的原因包括:RangeLimits、目标位于扫描扇区之外、ReferenceRange / ReferenceRCS 不足,或 UpdateRate 过低。
在 IsEarthCentered=false 时调用 atmosphere(scene, model)会出错:“The IsEarthCentered property must be true to modify the atmosphere model”所有大气/折射模型都要求 IsEarthCentered=true。平地场景始终使用自由空间模型。
认为在 IsEarthCentered=false 时地形会遮挡目标detect() 中的地形遮挡仅适用于 IsEarthCentered=true如果地形遮挡很重要,请使用带有 geoTrajectory 的地心场景
混淆 HasOcclusion 与地形遮挡HasOcclusion 用于目标间遮挡(扩展目标);地形视线遮挡通过 SurfaceManager 实现地形遮挡:使用 IsEarthCentered=true + landSurface。目标间遮挡:使用 HasOcclusion=true
使用 clutterGenerator 但未添加任何表面会静默地产生 0 个杂波检测结果创建杂波生成器前,添加 landSurface(scene) 或 seaSurface(scene)
将 ScattererDistribution='RangeDopplerCells' 与 radarDataGenerator 一起使用调用 detect() 时会出错仅适用于 radarTransceiver;对 radarDataGenerator 使用 'Uniform'(默认值)
在没有 ringClutterRegion 的情况下设置 UseBeam=false会产生 0 个杂波检测结果添加显式区域:ringClutterRegion(cg, minR, maxR, azSpan, azCenter)
在目标姿态路径中设置 Sensitivity 或 DetectionThreshold“不相关”——这些属性仅适用于发射路径在目标姿态路径(detect(scenario))中,检测仅由 Pd / Pfa / ReferenceRange / ReferenceRCS 决定
提高 FalseAlarmRate 来模拟表面杂波FalseAlarmRate 会产生均匀分布的虚警(白噪声);它不会模拟具有真实零度后向散射系数、几何特性或多普勒特性的空间相关表面杂波使用带表面(landSurface / seaSurface)和反射率模型的 clutterGenerator。参见 terrain-clutter-atmosphere.md。
认为 radarDataGenerator 能模拟信号处理损失(MTI、STAP、CFAR)统计模型不会模拟杂波抑制滤波器损失、STAP 自适应权重损失,或距离-多普勒空间中杂波脊附近的可检测性下降这些效应需要进行 I/Q 级仿真(Phased Array System Toolbox 波形 + 接收机链路)。若要在统计级别近似这些效应,请通过链路预算(radareqsnr)中的 Loss 参数添加预期的处理损失,或降低杂波影响区域内的 DetectionProbability。
对单基地速度分辨率使用 dop2speed(1/CPI, lambda)结果是正确值的 2 倍(3.0 m/s 而非 1.5 m/s)dop2speed 使用单程约定。单基地速度分辨率 = lambda/(2*CPI)。请使用手动公式或 dop2speed(fd,lambda)/2。
使用 radareqrng(SNR, lambda, ...)——参数顺序错误会静默地产生错误结果(不会报错)正确写法:radareqrng(lambda, SNR, Pt, tau, ...)——lambda 在前
向 radareqrng 传入线性值的 Gain距离结果荒谬(10^49 km)Gain 的单位是 dBi,不是线性值。传入 30,而不是 1000。
向 radareqrng 传入 dBsm 单位的 RCS结果相差 3 倍,或负值时出错RCS 的单位是线性 m²。转换:db2pow(rcs_dBsm)
将平均功率作为 Pt 传给 radareqrng会低估距离Pt 是峰值功率(瓦)。计算:Ppeak = Pavg / (tau * PRF)
使用 FieldOfView 推导天线增益FoV ≠ 波束宽度时,增益会算错增益由 beamwidth2gain([AzimuthResolution; ElevationResolution]) 得出。需要提供两个波束宽度——标量输入会假设波束对称(扇形波束的误差最高可达 10 dB)。FoV 是每个扫描位置的角覆盖范围,不一定等于接收波束宽度。
认为 FieldOfView 必须等于 AzimuthResolution对 AESA 或宽发射波束配置而言,扫描步长不正确FoV 和分辨率彼此独立。FoV = 发射波束宽度(典型情况)。对于共用孔径,FoV = AzRes。对于宽发射波束 + 窄接收波束,FoV > AzRes。
对默认目标(Swerling0)使用 Swerling I 的 Pd 公式在参考距离处会低估 Pd 约 40%(0.52 而非 0.89)检查 target.Signatures{1}.FluctuationModel。默认值为 Swerling0——请使用 marcumq。对于 Swerling1 目标:Pfa^(1/(1+SNR_lin))。

扫描模式快速参考

模式关键行为
'Mechanical'actualRate = min(FieldOfView(1) * sensorUpdateRate, MaxAzimuthScanRate)。请参见下方的扫描速率模型。
'Electronic'每次更新时,波束按 FieldOfView(1) 的步长移动。MaxAzimuthScanRate 不相关。
'Mechanical and electronic'机械扫描负责粗略指向,电子扫描进行精细调整。
'No scanning'固定凝视波束。

便捷构造函数:radarDataGenerator(id, 'Raster')、'Rotator'、'Sector'、'Custom'。

机械扫描速率模型(重要)

机械模式下的实际扫描速率为:

actualScanRate = min(FieldOfView(1) * sensorUpdateRate, MaxAzimuthScanRate)  [deg/s]
stepPerScenarioUpdate = actualScanRate / scenarioUpdateRate  [deg]

传感器的默认 UpdateRate 为 1 Hz。 若未显式设置,2 度波束的扫描速率仅为 2 度/秒,与 MaxAzimuthScanRate 无关。务必显式设置传感器的 UpdateRate:

radar = radarDataGenerator(1, 'Sector', ...
    'UpdateRate', 20, ...  % MUST set — default 1 Hz causes very slow scan
    'FieldOfView', [2; 20], ...
    'MaxAzimuthScanRate', 36, ...
    ...);
% actualRate = min(2*20, 36) = 36 deg/s ✓

若要让窄波束达到所需扫描速率:

  • sensorUpdateRate >= desiredRate / FieldOfView(1)
  • 示例:2 度波束要达到 36 度/秒,UpdateRate 需大于或等于 18 Hz
场景与传感器 UpdateRate

传感器按自身的 UpdateRate 发射;场景的 UpdateRate 控制 advance()/detect() 的执行频率。如果场景速率低于传感器速率,则只会对一部分驻留位置进行采样——位于采样位置之间的目标会悄无声息地完全检测不到。

规则: 除非你有意采用稀疏检测节奏,否则始终将场景 UpdateRate 设为传感器 UpdateRate。

检测模型

SNR = RadarLoopGain + RCS_dBsm - 40*log10(Range)
  • RadarLoopGain:只读,根据 ReferenceRange、ReferenceRCS、DetectionProbability 和 FalseAlarmRate 推导得出。内部参考 SNR 使用 Swerling0(非起伏)模型——目标起伏模型会在检测时单独应用。
  • 无硬件参数(Pt、Gain、NF)——所有参数均汇总在参考性能中
  • CenterFrequency/Bandwidth 只影响分辨率,不影响检测距离
  • 测量精度:σ² = (Δ/√(2·SNR))² + (BiasFraction·Δ)² — Cramér-Rao 界加上偏差下限。默认值:AzimuthBiasFraction=0.1、RangeBiasFraction=0.05、ElevationBiasFraction=0.1。在高 SNR 下,偏差下限占主导(方位角 0.3°,距离 3.75 m)。
  • Pd 与距离的关系取决于目标的 FluctuationModel——默认平台采用 Swerling0(非起伏)模型。Swerling0 使用 marcumq,Swerling1 使用 Pfa^(1/(1+SNR))。使用错误的公式会导致 Pd 误差约 40%。完整步骤请参见 references/radar-equation-tools.md。

Agent 的工作是使用雷达方程工具作为转换层,衔接用户的硬件规格与这一统计接口。

故障排除

症状可能原因诊断/修复
完全没有检测结果RangeLimits 太短检查 radar.RangeLimits(2) 是否 >= 最大目标距离
完全没有检测结果传感器 UpdateRate = 1 Hz(默认值)波束扫描速度太慢——显式设置 UpdateRate
完全没有检测结果(已设置 UpdateRate)场景 UpdateRate < 传感器 UpdateRateFoV 驻留混叠——只有采样到的位置才会产生检测结果。将场景 UpdateRate 设置为与传感器 UpdateRate 相同。
完全没有检测结果目标位于波束 FoV 之外使用 coverageConfig(radar) 获取当前波束方向;并与目标方位角比较
只有部分扫描产生检测结果目标靠近波束步进边界机械扫描的正常现象——方位角与波束步进位置对齐的高速目标可能会在某些扫描中漏检。增大传感器/场景 UpdateRate 以减小步进大小(切勿通过更改 FieldOfView 等系统参数来修复仿真伪影)。
检测结果过多自检测(雷达平台)过滤:忽略 TargetIndex == radar platform ID(通常为 1)的检测结果
Pd 远低于配置值目标超出 ReferenceRangeSNR 会随 40·log10(R) 下降——这是预期情况;Pd 仅在参考距离处指定
Pd 高于预期目标 RCS > ReferenceRCS更高的 RCS 会提高 SNR——检查目标平台上的 rcsSignature
经验 Pd > 1.0用检测数除以扫描次数,而不是照射次数机械扫描是双向的:扇区扫描的照射次数 = 2 × 扫描次数。通过 IsScanDone 统计波束经过次数,或根据扫描时序计算:nIlluminations = StopTime / (sector / scanRate)。
测得的位置与真实位置相差很远将原始 .Measurement 与场景坐标系下的真实值作图比较必须先转换到场景坐标系。 使用 MeasurementParameters.Orientation 和 .OriginPosition 进行转换。“0 azimuth” = 传感器波束轴,而非北方。转换方法请参阅 API 答案指南。
受距离限制还是受视距限制目标超出雷达地平线使用 horizonrange(antennaHeight) 检查。在代码中注明因视距而预期漏检的位置。编写代码前也应通过合理性检查发现此问题(步骤 6——确认目标几何位置在雷达地平线范围内)。
自洽性检查失败硬件推导出的 Rmax ≠ 已配置的 ReferenceRange重新检查 radareqrng 输入是否与推导时使用的硬件规格一致
程序化验证

检测精度检查——验证测量误差是否在预期范围内。必须考虑 DetectionCoordinates 模式——除非使用 'Scenario' 模式,否则不能将原始 .Measurement 值与场景坐标系下的真实值进行比较:

% Convert detection to scenario frame FIRST (required for all non-Scenario modes)
mp = dets{k}.MeasurementParameters(1);  % first element = position transform
meas = dets{k}.Measurement;
switch mp.Frame
    case 'Spherical'
        az = meas(1); el = meas(2); R = meas(3);
        posSensor = [R*cosd(el)*cosd(az); R*cosd(el)*sind(az); R*sind(el)];
        measScenario = mp.Orientation * posSensor + mp.OriginPosition(:);
    case 'Rectangular'
        measScenario = mp.Orientation * meas(1:3)' + mp.OriginPosition(:);
end
posError = norm(measScenario - truthPos);
expectedSigma = sqrt(trace(dets{k}.MeasurementNoise(1:3,1:3)));
assert(posError < 5*expectedSigma, 'Position error exceeds 5-sigma');

SNR 检查——验证报告的 SNR 是否与链路预算预测相符(误差在约 1 dB 以内):

expectedSNR = radar.RadarLoopGain + rcs_dBsm - 40*log10(slantRange);
reportedSNR = dets{k}.ObjectAttributes{1}.SNR;
assert(abs(reportedSNR - expectedSNR) < 1.0, 'SNR mismatch > 1 dB');

完整的模式感知验证示例请参阅 坐标与变换 — 验证。

调试:隔离波束指向

排查“无检测”或意外检测间隔时,请隔离问题,判断是波束指向还是其他原因:

  1. 释放传感器,然后切换为全向模式:
origFoV = radar.FieldOfView;
origScan = radar.ScanMode;
release(radar);
radar.FieldOfView = [360; 180];
radar.ScanMode = 'No scanning';
  1. 重启并重新运行场景(restart(scenario) + 前进循环)
  2. 解读结果:
    • 出现检测 → 问题在于波束指向(扫描限制、MountingAngles、FoV、扫描步进越过目标)
    • 仍无检测 → 问题出在其他方面(RangeLimits、UpdateRate 混叠、ReferenceRange、地平线、目标 RCS)
  3. 释放并恢复原始配置,然后再继续:
release(radar);
radar.FieldOfView = origFoV;
radar.ScanMode = origScan;

注意: radarDataGenerator 是一个 System 对象。调用 detect() 后,若要更改不可调谐属性(FieldOfView、ScanMode、AzimuthResolution、扫描限制等),必须先调用 release(radar)。修改不可调谐属性前,务必先调用 release()。

请先执行此操作,再逐一检查具体参数——一次测试即可将问题范围缩小一半。

调试顺序
  1. 全向隔离(见上文)——通过一次测试排除波束指向问题
  2. 检查系统性原因——RangeLimits 门限、扫描扇区边界、UpdateRate 混叠。这些会导致确定性故障(Pd 为 0%),且通过单次运行即可识别。
  3. 蒙特卡洛试验(最后进行)——仅在排除系统性原因后执行。使用重复运行来刻画随机性行为:Swerling 起伏、检测边界附近的间歇性检测、经验 Pd 与解析 Pd 的差异。切勿用蒙特卡洛来诊断检测次数为 0 的目标——这始终是系统性原因导致的。
正向修复:步骤层级

验证失败时,修复可能出错的最晚步骤。切勿为了迁就场景选择(步骤 6–7)而更改系统参数(步骤 1–5)。如果雷达的 FoV 未覆盖目标,说明目标不在覆盖范围内——不要扩大 FoV 来“修复”问题。只有确实存在设计错误时,才重新审视前面的步骤。

分析仿真输出

以下是会导致无提示错误的关键 NED 陷阱:

  • 几何仰角(向上为正): atand(-dx(3) ./ horizRange)——对 D 轴取负,使空中目标得到正角度。传感器球面坐标仰角在 NED 中符号相反(传感器 +z = Down):空中目标的 el 为负。
  • 方位角: atan2d(East, North)——交换参数会得到以东为起点的方位角(误差 90°)
  • 经验 Pd: platformID = targetIndex + 1(雷达是平台 1)——索引偏移一位很常见
  • 解析 Pd: 默认值是 Swerling0(marcumq),不是 Swerling I——使用错误公式会产生 40% 的误差
  • SNR: RadarLoopGain + RCS_dBsm - 40*log10(R)——不要添加积分增益(已包含在 RLG 中)

完整的转换方法和验证模式,请参阅坐标与变换。

输出要求

  1. 需求表——独立文档(参见 references 中的模板)
  2. MATLAB 脚本——可运行,并包含设计依据注释和耦合参数表
  3. 验证——将仿真检测结果与解析预测进行比较
代码生成规则
  • 绝不要依赖 radarDataGenerator 的默认值。 在构造函数中显式设置每个相关属性,即使使用的是默认值也是如此。这样代码能自我说明——读者无需查阅文档即可了解每项参数的选择。隐藏的默认值就是隐藏的假设。**例外——属性门控:**不要设置与当前配置无关的属性。设置受门控的属性会产生警告(“在此配置中不相关”)。请参阅下方的属性门控表。
  • 为每个参数值标注其来源:用户提供、派生(注明基于哪些输入),或领域假设(附理由)。
属性门控规则

由 Has* 标志门控的属性——当标志为 false 时,不要设置这些属性:

门控标志(为 false 时)不要设置
HasElevationElevationResolution、ElevationBiasFraction、MaxElevationScanRate、MechanicalElevationLimits、ElectronicElevationLimits
HasRangeRateRangeRateResolution、RangeRateBiasFraction、RangeRateLimits、HasRangeRateAmbiguities
HasRangeAmbiguitiesMaxUnambiguousRange
HasRangeRateAmbiguitiesMaxUnambiguousRadialSpeed

由 ScanMode 门控的属性:

ScanMode不要设置
'No scanning'MaxAzimuthScanRate、MaxElevationScanRate、MechanicalAzimuthLimits、MechanicalElevationLimits、ElectronicAzimuthLimits、ElectronicElevationLimits
'Mechanical'ElectronicAzimuthLimits、ElectronicElevationLimits
'Electronic'MechanicalAzimuthLimits、MechanicalElevationLimits、MaxAzimuthScanRate、MaxElevationScanRate
'Mechanical and electronic'(所有扫描属性均有效)

切勿设置 HasScanLoss——它在所有扫描模式下都会发出警告(在任何当前配置中都无效)。

当 EmissionsInputPort=true 时:不要设置 ScanMode、FieldOfView 或任何扫描限制/速率属性(扫描由发射驱动)。

由 TargetReportFormat 门控的属性:

格式不要设置
'Clustered detections' 或 'Detections'FilterInitializationFcn、ConfirmationThreshold、DeletionThreshold、TrackCoordinates
'Tracks'DetectionCoordinates

由 DetectionMode 门控的属性:

模式不要设置
'ESM'ReferenceRange、ReferenceRCS、DetectionProbability

参考资料

仅加载任务所需的内容——不要在每个提示中读取所有参考资料。

参考资料何时阅读
检测模型配置雷达属性、调试属性名称、了解检测路径
视场与扫描设置 FieldOfView、配置扫描模式、推导 UpdateRate/扫描速率
坐标与变换解读检测结果、转换坐标系、NED 仰角/方位角、绘图
轨迹目标运动、静止平台、场景时长、机体坐标系方向
地形、杂波与大气添加表面、杂波生成器、大气模型、遮挡
雷达方程工具自底向上推导、硬件到 ReferenceRange 的衔接、Pd 与距离的关系
可视化theaterPlot、覆盖范围图、radarmetricplot
耦合参数第 5 步:参数关系表、数据表导入
交互流程完整的 9 步工作流及建议措辞
需求表模板第 9 步:三部分输出工件结构

版权所有 2026 The MathWorks, Inc.

评论

支持 Markdown