AFSIM 07篇 传感器与跟踪:如何让平台“看见“敌人
🧭 系列导航(共 15 篇):
入门篇:01 AFSIM 是什么? · 02 从零搭建环境 · 03 跑通第一个仿真 · 04 核心概念扫盲
基础篇:05 SDL 入门 · 06 Platform 详解 · 07 传感器与跟踪 · 08 武器与交战 · 09 机动与航线
进阶篇:10 通信与处理器 · 11 External Control · 12 TCP 客户端实战 · 13 Wizard 可视化
高级篇:14 C++ 插件开发 · 15 调试与最佳实践
上一篇:06 Platform 详解 | 下一篇:08 武器与交战
07 传感器与跟踪:如何让平台"看见"敌人
在 第 06 篇《Platform 详解》 里,我们学会了如何定义一个平台(Platform)——比如一架无人机、一艘军舰。但一个"会飞的铁盒子"本身并不能打胜仗,它得先看见敌人在哪。
这就引出了本篇的主角:传感器(Sensor) 与 跟踪(Track)。一句话类比:传感器像是平台的"眼睛和耳朵",而跟踪就是平台大脑里关于"某个目标正在哪、往哪走"的持续记忆。
在 第 04 篇《核心概念扫盲》 中我们说过,平台由若干组件(Component) 组合而成,传感器正是其中最关键的一类组件。本文先讲 SDL 层面传感器如何配置,再讲"看见"之后数据如何沉淀为跟踪,最后提前引出我们在真实项目里用到的 C++ 跟踪接口,为 第 14 篇《C++ 插件开发》 埋下伏笔。
一、sensor 块:平台的"感官"怎么配
AFSIM 里传感器通过 sensor 块定义,然后像武器、处理器一样挂载到平台之上。常见的三类传感器,各有"看家本领":
- 雷达(Radar):主动发射电磁波再接收回波。探测距离远、精度高,但"开雷达"会暴露自己——就像在黑夜里打手电筒找人,别人也能看见光。
- ESM(电子支援措施,Electronic Support Measures):被动接收敌方雷达、通信的电磁辐射来定位。自己不发射,隐蔽性好,但一般只能得到方位,测距精度弱。
- IRST(红外搜索与跟踪,Infrared Search and Track):靠目标的红外热辐射(发动机尾焰、机体蒙皮温度)发现目标,同样被动、抗干扰,适合"安静"地盯梢。
那实战里怎么选?一个经验法则是:先用被动传感器(ESM/IRST)悄悄摸情况,确认威胁后再用雷达精确测距。纯雷达开局虽看得清,却容易"亮明身份"招来反击;而复杂电磁环境下,多传感器互补(雷达给距离、ESM 给方位、IRST 抗干扰)往往比单一传感器更稳。这也正是 AFSIM 鼓励在一个平台上挂多种传感器的原因。
下面是一个挂载到 UAV 上的雷达传感器 SDL 示例(对照 第 06 篇 的平台写法):
text
platform UAV_01 RECON_STRIKE_UAV
category RED
icon "uav.png"
comm ...
sensor radar_sensor WSF_RADAR
antenna WSF_ANTENNA
beamwidth 2.0 deg
transmitter_power 10000.0 // 瓦
frequency 9.0e9 // 9 GHz
minimum_detectable_signal -110.0 // dBm
end_sensor
end_platform
注意 WSF_RADAR 是 AFSIM 内置的雷达类型,SDL 里通过调整天线波束宽度、发射功率、频率、最小可探测信号等参数,就能粗略控制"看多远、看多清"。ESM 与 IRST 写法类似,只是物理模型不同。
🔍 安装实证|真实传感器的写法:还是 lte_fighter.txt,它挂的三个传感器把"主动/被动/光电"凑齐了:
text
sensor rdr1 aesa # 有源相控阵雷达(主动)
on
internal_link raw_data_mgr
ignore missile
end_sensor
sensor eyes WSF_GEOMETRIC_SENSOR # 几何/光学传感器(被动)
azimuth_field_of_view -180.0 degrees 180.0 degrees
maximum_range 10 nmi
reports_location reports_velocity reports_range_rate # 上报哪些量
end_sensor
sensor rwr esm # 电子支援措施(无源)
ignore_same_side
end_sensor
两个细节很"真实":① 雷达用 aesa(场景自定义的雷达类型,底层仍是 WSF_RADAR),而光电用内置的 WSF_GEOMETRIC_SENSOR——说明 AFSIM 既有内置传感器基类,也允许场景自定义具体型号;② internal_link 把传感器原始数据接到平台内部的 raw_data_mgr,这正是 第 10 篇 说的"组件之间用 link 交换数据"的落点;③ reports_* 显式声明传感器上报哪些量(位置/速度/测距率),和本篇"检测→跟踪"沉淀的信息字段一一对应。
二、从"看到一瞬间"到"持续跟踪"
传感器不是一照到敌人就完事,AFSIM 把"看见"拆成清晰的三个阶段,理解它很重要:
- 检测(Detect):传感器在某一时刻、某一波束内发现一个回波/信号,判定"这里有东西"。这是瞬时事件。
- 跟踪(Track):系统把连续多个检测点关联起来,估计目标的位置、速度、航向,形成一个随时间更新的目标档案。
- 形成 track_list(跟踪列表):一个平台上所有跟踪被汇总进该平台的跟踪列表,作为后续决策(开火、机动)的信息来源。
红蓝双方的跟踪存在差异:蓝方(我方)传感器探测到的敌方目标会形成蓝方的跟踪;反过来红方探测到蓝方也一样。AFSIM 中还存在 master track list(主跟踪列表) 的概念——它是对一个平台所有来源跟踪去重、融合后的"权威版本",避免同一目标被重复计为多个跟踪。
还要理解一个现实细节:跟踪是会"丢失"的。当目标脱离探测范围、或被干扰、或暂时被地形遮挡,新的检测点不再到来,系统不会立刻删除这条 Track,而是让它进入"滑行(coast)"状态——用最近的速度航向外推一小段时间。若在外推窗口内重新捕获,Track 就接续更新;若一直没回来,才被丢弃。这个机制让仿真里的态势不会因为一两次漏看就剧烈跳变,也更接近真实指挥员的判断习惯。
三、提前认识 WsfTrackList:C++ 插件怎么读跟踪
在真实项目里(例如我们维护的仿真控制系统,红方 UAV_01 对蓝方 Enemy_Ship 的侦察),光在 SDL 里"看见"还不够——后端 C++ 插件需要程序化地读取这些跟踪数据,才能做自动决策或上报态势。
AFSIM 暴露了 WsfTrackList 这套 C++ 接口,常用方法有:
- GetTrackCount():返回当前跟踪数量;
- GetTrackEntry(int):按索引取出某条跟踪条目;
- GetMasterTrackList():获取融合后的主跟踪列表;
- WsfLocalTrack:单条本地跟踪对象,包含目标位置、速度、置信度等。
它们都归属 wsf::external 命名空间下的插件体系。例如:
cpp
// 示例:在 C++ 插件中读取 UAV_01 的跟踪
WsfTrackList* trackList = aPlatform.GetTrackList();
int n = trackList->GetTrackCount();
for (int i = 0; i < n; ++i) {
const WsfLocalTrack* t = trackList->GetTrackEntry(i);
// 拿到 t 的位置、速度后,可判断是否锁定了 Enemy_Ship
}
这段代码只是"引子",完整插件开发(事件驱动、如何把跟踪发给 Java 后端)我们留到 第 14 篇 展开。现在你只需记住:SDL 负责"产生"跟踪,C++ 接口负责"读取"跟踪。
四、探测与跟踪时序图
下面用时序图描述一次典型的"发现→跟踪"过程,帮助建立直观印象:
可以看到,检测是"点",跟踪是"线",track_list 是把这些线收拢起来的"本子"。
小结
- 传感器是平台的"感官组件",雷达主动、ESM/IRST 被动,各有隐蔽性与精度的权衡。
- "看见"分三步:检测(瞬间)→ 跟踪(持续估计)→ 汇总进 track_list。
- 红蓝双方各自维护跟踪,master track list 是多源融合的权威版本。
- WsfTrackList(GetTrackCount() / GetTrackEntry() / GetMasterTrackList() / WsfLocalTrack)是 C++ 插件读取跟踪的接口,为 第 14 篇 铺垫。
- 传感器作为组件挂载平台,配置写法与 第 06 篇 平台定义一脉相承。
下期预告
看见敌人之后,下一步自然是"打出去"。下一篇 《08 武器与交战:建模完整打击链》 我们将把传感器发现的跟踪,转化为发射、飞行、命中的完整打击流程。欢迎点赞、收藏、关注本系列!
更多推荐


所有评论(0)