能力标签:WSF_AIR_MOVER / WSF_SCRIPT_PROCESSOR / 地形查询 / 脚本控高 / 控制回路 / 低空突防
这个 demo 在展示什么
低空突防、贴地飞行,是作战飞机规避雷达的重要手段:把飞行高度压到地形遮蔽线以下,让对方雷达的视距被山体切断。AFSIM 里并没有一个开箱即用的"地形跟随 mover"组件,terrain_following展示的是一种通用做法——用脚本在每个更新周期查询前方地形高度,再把目标高度喂给 mover,让平台自动随地形起伏。
它的价值不在"地形"本身,而在揭示 AFSIM 一个核心能力:脚本可以实时读写平台状态、查询环境(地形/大气)并把结果接回控制回路。这套"脚本查环境→控状态"的范式,能套到地形回避、防撞高、大气跟随等大量场景,是 AFSIM 里复用率极高的一招。
核心机制:脚本把地形反馈接进控制回路
思路分三步,全部发生在平台自身的组件里,不需要外部指挥:
- 平台挂一个常规
WSF_AIR_MOVER(或运动学 mover),负责按命令控高控速。 - 再挂一个
WSF_SCRIPT_PROCESSOR,在on_update周期里运行控制逻辑。 - 每步:沿航向前方取一个查询点 → 用地形查询接口取该点高程 → 目标高度 = 地形高 + 安全余量(AGL)→ 把目标高度作为命令下发给 mover。
整套逻辑是一个闭环控制:mover 输出实际高度,脚本下一周期再读回来比对修正。
真实可跑的最小片段(AFSIM 2.9 语法,示意)
下面让一架蓝方飞机在地形上做"离地 100 m"的跟随飞行。语法范式取自 AFSIM 2.9 公开能力文档,按本系列"片段式、无顶层包裹"的结构书写;地形查询的具体接口名以你环境中的实际 API 为准,这里用#注释标出控制意图:
end_time 600 sec # 推演总时长 platform_type TF_AIR WSF_PLATFORM # 定义"地形跟随飞机"类型 side blue mover WSF_AIR_MOVER # ① 飞行机动:按命令控高控速 update_interval 0.5 sec # 机动解算步长 max_speed 150 m/s # 最大地速(影响前方查询提前量) end_mover processor tf_ctrl WSF_SCRIPT_PROCESSOR # ② 脚本控制器:把地形反馈接进控制回路 update_interval 0.5 sec # 脚本周期 <= mover 步长,才跟得上地形 on_update # 读取平台当前位置与航向 # 沿航向前方取一个 geopoint 作为查询点 # 调用地形查询接口,取该点地面高程 h_terr # 目标高度 = h_terr + 100 m(离地余量 AGL) # 把"保持目标高度"命令下发给 mover(受最大升降率约束) end_on_update end_processor end_platform_type platform tf_01 TF_AIR position 34.0n 120.0e altitude 1000 m msl # 初始位置(示意) end_platform说明:上段把"地形查询"写成注释意图而非拼死写死某个 API——因为不同 AFSIM 版本的环境查询接口细节有差异,写出来反而可能误导。控制回路的结构才是本文要讲的点。
关键参数速查
| 参数 | 所在组件 | 类型 / 单位 | 默认值 | 取值说明 | 调参影响 |
|---|---|---|---|---|---|
update_interval(脚本) | processor | 时间 (sec) | 引擎默认 | 控制逻辑执行周期 | 必须 ≤ mover 步长,否则地形突变时来不及修正;过小徒增 CPU |
max_speed | mover(air) | 速度 (m/s) | 需给 | 最大地速 | 决定"前方查询点"提前量;越快需越靠前查询 |
| 最大升降率 | mover(air) | 速度 (m/s) | 有默认 | 垂直机动能力 | 遇陡山能否及时爬升;余量小 + 坡度大易撞山 |
| 安全余量 (AGL) | 脚本命令 | 距离 (m) | 自设 | 离地保留高度 | 太小易撞山,太大暴露雷达、失去贴地意义 |
| 地形数据源 | 环境 | 路径 | 无 | DTED/高程文件目录 | 缺失则查询失败,地形跟随整体失效 |
工程实践与常见坑
- 地形数据是硬前提。没有高程数据源(或路径写错),查询接口返回空/异常,平台不会报错,只是"不控高"——结果可能直接穿山。验证办法:脚本里把查询返回值打出来,确认非异常值再接控制。
- 脚本周期和 mover 步长要匹配。脚本跑得比 mover 慢,地形突变时 mover 已经冲出去了才收到新目标高,照样撞山。建议脚本
update_interval≤ mover 步长。 - 余量 vs 升降率要一起校。设了 50 m 离地余量,但升降率只有 5 m/s、前方 1 km 外突然抬升 200 m,按速度算根本爬不上去。调参时把"坡度×速度"和"最大升降率"放在一起算。
- 只在低空场景上这套。纯高空对抗、无真实地貌的想定,地形跟随徒增复杂度与算力,直接定高飞更干净。
备注:如果你的想定不涉及真实地貌(比如纯高空对抗),就别上地形跟随,徒增复杂度。它只在"低空/贴地"场景有价值。
小结与下一篇
本篇展示了 AFSIM 极重要的一类范式:脚本作为控制回路,实时把环境(地形)读进来、把状态(高度)写出去。它的本质是"查询→比对→下发命令"的闭环,比地形本身更通用——同一招换掉数据源,就能做地形回避、防撞高、大气剖面跟随。
下一篇进入卷一收尾,把舞台搬到太空——cislunar的绕月轨道,看"非大气、靠轨道力学"的机动怎么做。
下一篇预告:(07)空间轨道机动 cislunar:WSF_INTEGRATING_SPACE_MOVER 绕月轨道
轨道,看"非大气、靠轨道力学"的机动怎么做。
下一篇预告:(07)空间轨道机动 cislunar:WSF_INTEGRATING_SPACE_MOVER 绕月轨道