关于 matlab-simulate-radar-detections
使用 radarScenario 中的 radarDataGenerator 进行统计级雷达检测仿真的 MATLAB 技能,帮助将硬件规格或性能需求转化为场景参数,并明确其与波形级仿真的区别。
主要功能
- 01配置 radarScenario 和 radarDataGenerator
- 02将硬件规格转为仿真参数
- 03建模扫描、目标与检测性能
- 04比较扫描策略和覆盖范围
- 05生成供跟踪工作流使用的检测
适用场景
- 01测试运动目标的检测表现
- 02比较机械扫描与电子扫描
- 03开展雷达覆盖或部署研究
- 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.yamlreferences/coordinates-and-transforms.mdcoupled-parameters.mddetection-model.mdfov-and-scan.mdinteraction-flow.mdradar-equation-tools.mdrequirements-sheet-template.mdterrain-clutter-atmosphere.mdtrajectories.mdvisualization.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、DetectionThreshold | ESM 接收机、显式传播辐射信号的双基地场景 |
一种路径中的属性对另一种路径完全没有影响。在目标姿态路径中设置 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)。
继续之前的合理性检查:
-
使用
horizonrange(antennaHeight)确认目标几何条件未超出雷达地平线。如果任何目标在指定高度上超出视距,请向用户指出。 -
计算每个目标的预期 0.9 Pd 参考距离。报告如下表:
| 目标 | RCS(dBsm) | Swerling | 距离(km) | 预期 Pd |
|---|---|---|---|---|
| UAV | -20 | 1 | 15 | 0.72 |
| 战斗机 | 0 | 1 | 40 | 0.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 = true | Radar |
radareqrng | 根据雷达方程计算最大检测距离 | Radar |
radareqpow | 所需发射功率 | Radar |
radareqsnr | 给定距离处的接收信噪比 | Radar |
detectability | Pd/Pfa/N/Swerling 对应的所需信噪比(可检测性因子) | Radar |
albersheim | Pd/Pfa/N 对应的所需信噪比(仅适用于 Swerling 0) | Phased Array |
shnidman | Pd/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/2 | Phased Array |
beamwidth2gain | 根据半功率波束宽度计算天线增益。必须传入 [azBW; elBW] 列向量——标量表示对称波束。 | Phased Array |
aperture2gain | 根据有效孔径计算天线增益 | Phased Array |
gain2aperture | 根据天线增益计算有效孔径 | Phased Array |
ap2beamwidth | 根据孔径长度和波长计算波束宽度 | Phased Array |
beamwidth2ap | 根据波束宽度和波长计算孔径长度 | Phased Array |
effbeamwidth | 双程有效波束宽度(Tx+Rx)→ 映射到 AzimuthResolution/ElevationResolution | Phased 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 |
为排查检测问题而设置或调查 HasElevation | HasElevation 不会影响是否检测到目标。它只控制是否测量仰角,以及波束是否在仰角方向扫描。默认值为 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 < 传感器 UpdateRate | FoV 驻留混叠——只有采样到的位置才会产生检测结果。将场景 UpdateRate 设置为与传感器 UpdateRate 相同。 |
| 完全没有检测结果 | 目标位于波束 FoV 之外 | 使用 coverageConfig(radar) 获取当前波束方向;并与目标方位角比较 |
| 只有部分扫描产生检测结果 | 目标靠近波束步进边界 | 机械扫描的正常现象——方位角与波束步进位置对齐的高速目标可能会在某些扫描中漏检。增大传感器/场景 UpdateRate 以减小步进大小(切勿通过更改 FieldOfView 等系统参数来修复仿真伪影)。 |
| 检测结果过多 | 自检测(雷达平台) | 过滤:忽略 TargetIndex == radar platform ID(通常为 1)的检测结果 |
| Pd 远低于配置值 | 目标超出 ReferenceRange | SNR 会随 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');
完整的模式感知验证示例请参阅 坐标与变换 — 验证。
调试:隔离波束指向
排查“无检测”或意外检测间隔时,请隔离问题,判断是波束指向还是其他原因:
- 释放传感器,然后切换为全向模式:
origFoV = radar.FieldOfView;
origScan = radar.ScanMode;
release(radar);
radar.FieldOfView = [360; 180];
radar.ScanMode = 'No scanning';
- 重启并重新运行场景(
restart(scenario)+ 前进循环) - 解读结果:
- 出现检测 → 问题在于波束指向(扫描限制、MountingAngles、FoV、扫描步进越过目标)
- 仍无检测 → 问题出在其他方面(RangeLimits、UpdateRate 混叠、ReferenceRange、地平线、目标 RCS)
- 释放并恢复原始配置,然后再继续:
release(radar);
radar.FieldOfView = origFoV;
radar.ScanMode = origScan;
注意: radarDataGenerator 是一个 System 对象。调用 detect() 后,若要更改不可调谐属性(FieldOfView、ScanMode、AzimuthResolution、扫描限制等),必须先调用 release(radar)。修改不可调谐属性前,务必先调用 release()。
请先执行此操作,再逐一检查具体参数——一次测试即可将问题范围缩小一半。
调试顺序
- 全向隔离(见上文)——通过一次测试排除波束指向问题
- 检查系统性原因——RangeLimits 门限、扫描扇区边界、UpdateRate 混叠。这些会导致确定性故障(Pd 为 0%),且通过单次运行即可识别。
- 蒙特卡洛试验(最后进行)——仅在排除系统性原因后执行。使用重复运行来刻画随机性行为: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 中)
完整的转换方法和验证模式,请参阅坐标与变换。
输出要求
- 需求表——独立文档(参见 references 中的模板)
- MATLAB 脚本——可运行,并包含设计依据注释和耦合参数表
- 验证——将仿真检测结果与解析预测进行比较
代码生成规则
- 绝不要依赖
radarDataGenerator的默认值。 在构造函数中显式设置每个相关属性,即使使用的是默认值也是如此。这样代码能自我说明——读者无需查阅文档即可了解每项参数的选择。隐藏的默认值就是隐藏的假设。**例外——属性门控:**不要设置与当前配置无关的属性。设置受门控的属性会产生警告(“在此配置中不相关”)。请参阅下方的属性门控表。 - 为每个参数值标注其来源:用户提供、派生(注明基于哪些输入),或领域假设(附理由)。
属性门控规则
由 Has* 标志门控的属性——当标志为 false 时,不要设置这些属性:
门控标志(为 false 时) | 不要设置 |
|---|---|
HasElevation | ElevationResolution、ElevationBiasFraction、MaxElevationScanRate、MechanicalElevationLimits、ElectronicElevationLimits |
HasRangeRate | RangeRateResolution、RangeRateBiasFraction、RangeRateLimits、HasRangeRateAmbiguities |
HasRangeAmbiguities | MaxUnambiguousRange |
HasRangeRateAmbiguities | MaxUnambiguousRadialSpeed |
由 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.