🧭 系列导航(共 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 把"看见"拆成清晰的三个阶段,理解它很重要:

  1. 检测(Detect):传感器在某一时刻、某一波束内发现一个回波/信号,判定"这里有东西"。这是瞬时事件。
  2. 跟踪(Track):系统把连续多个检测点关联起来,估计目标的位置、速度、航向,形成一个随时间更新的目标档案。
  3. 形成 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++ 接口负责"读取"跟踪。

四、探测与跟踪时序图

下面用时序图描述一次典型的"发现→跟踪"过程,帮助建立直观印象:

TrackList平台 UAV_01传感器 Radar目标 Enemy_ShipTrackList平台 UAV_01传感器 Radar目标 Enemy_Ship多源融合→Master Track List反射/辐射信号单次检测 (Detect)上报检测点关联历史检测形成/更新 Track决策使用(瞄准/机动)

可以看到,检测是"点",跟踪是"线",track_list 是把这些线收拢起来的"本子"。

小结

  • 传感器是平台的"感官组件",雷达主动、ESM/IRST 被动,各有隐蔽性与精度的权衡。
  • "看见"分三步:检测(瞬间)→ 跟踪(持续估计)→ 汇总进 track_list。
  • 红蓝双方各自维护跟踪,master track list 是多源融合的权威版本。
  • WsfTrackList(GetTrackCount() / GetTrackEntry() / GetMasterTrackList() / WsfLocalTrack)是 C++ 插件读取跟踪的接口,为 第 14 篇 铺垫。
  • 传感器作为组件挂载平台,配置写法与 第 06 篇 平台定义一脉相承。

下期预告

看见敌人之后,下一步自然是"打出去"。下一篇 《08 武器与交战:建模完整打击链》 我们将把传感器发现的跟踪,转化为发射、飞行、命中的完整打击流程。欢迎点赞、收藏、关注本系列!

更多推荐