🧭 系列导航(共 15 篇):
入门篇:01 AFSIM 是什么? · 02 从零搭建环境 · 03 跑通第一个仿真 · 04 核心概念扫盲
基础篇:05 SDL 入门· 06 Platform 详解 · 07 传感器与跟踪 · 08 武器与交战 · 09 机动与航线
进阶篇:10 通信与处理器 · 11 External Control · 12 TCP 客户端实战 · 13 Wizard 可视化
高级篇:14 C++ 插件开发 · 15 调试与最佳实践
上一篇:04 核心概念扫盲 | 下一篇:06 Platform 详解
05 场景定义语言 SDL 入门:用文本描述战场
在 第 04 篇 里,我们建立了"类型 + 实例""平台包含组件"的心智模型。但那些平台和传感器,到底写在哪儿、怎么写成机器能读的东西?答案就是本篇的主角:SDL(Scenario Definition Language,场景定义语言)。
可以毫不夸张地说,SDL 是整个 AFSIM 系列后续所有篇章的地基。武器、传感器、机动、通信,全都建立在你能熟练书写 SDL 之上。
一、SDL 是什么:文本 + 关键字 + 块
SDL 是一门基于文本的关键字 + 块(block)语言。它不像 C++ 那样需要编译,也不像 Python 那样强调逻辑控制;它的定位非常朴素:用人类可读的文本,把"战场长什么样"描述出来。
它的基本单元是"块"。每个块用一对关键字包裹,内部是一组属性设置。最常见的块有:
platform/platform_type:平台及其类型模板(详见 第 06 篇)processor/processor_type:处理器sensor/sensor_type:传感器comm/comm_type:通信设备weapon/weapon_type:武器
一个 SDL 文件,本质上就是若干"块"的有机组合。下面这张 Mermaid 图展示了 SDL 文件的整体块结构:
二、文件结构与常用语法
一个典型的 SDL 文件,从上到下大致是这样一个顺序:
- 全局场景设置(场景名称、起止时间、坐标系等)。
- 各类
*_type模板定义(先定义"类型",后面实例才能引用)。 - 具体的实例块(用前面定义的类型,造出战场上的真实实体)。
SDL 有几条非常简单的语法规则,记住就够用:
- 注释:以
#开头的行是注释,引擎会忽略。多写注释是好习惯。 - include 其他文件:用
include "xxx.txt"可以把另一个 SDL 文件原样嵌入当前文件。这让你把"通用模板"和"具体想定"分文件管理,非常清爽。 - 变量:可以用简单的变量先存一个数值,后面重复引用,便于统一修改。
# 这是一条注释:定义一个常量高度 variable ALT = 5000 # 单位:米 include "common_types.txt" # 引入通用类型模板 scenario_name "My First Scenario" start_time 0 end_time 3600 platform WATCHER platform_type RECON_UAV altitude ALT end_platform三、一个最小可运行场景
下面给出一个最小、但可以真正跑起来的 SDL 片段,包含 1 个红方侦察无人机和 1 个蓝方静止目标。把它存成demo.txt,用 Wizard 或命令行加载即可运行。
# demo.txt —— 最小可运行示例 scenario_name "Demo Scenario" start_time 0 end_time 600 # 蓝方:一个静止的地面目标 platform ENEMY_GROUND platform_type GENERIC_GROUND side blue latitude 32.0 longitude 118.0 altitude 0 end_platform # 红方:一架高空侦察无人机 platform UAV_01 platform_type RECON_UAV side red latitude 33.0 longitude 118.5 altitude 8000 speed 200 end_platform这个片段里你看到了side(阵营)、latitude/longitude/altitude(经纬度与高度)、speed(速度)等属性——它们正是 第 06 篇 要展开讲解的"平台关键属性"。
🔍安装实证|真实场景里长什么样:在
demos/air_to_air/scenarios/1v1.txt中,一个真实作战平台是这样写的(节选):
platform Talon_1_1 BLUE_FIGHTER side blue commander SELF command_chain IFLITE SELF command_chain ELEMENT SELF heading 90 deg position 00:05:00.00n 01:10:00.00w altitude 30000.00 ft script_variables MISSION_TYPE = "SWEEP"; ROUTE.Append("blue_route"); end_script_variables edit processor assessment enemy_side red enemy_type RED_FIGHTER mission_task SWEEP end_processor end_platform注意几个比上面"最小示例"更接近实战的点:commander/command_chain声明了指挥关系(同一架机能同时属于IFLITE与ELEMENT两条指挥链);position直接用地理坐标串(度分秒)而非直角坐标;script_variables里能写脚本逻辑(如把航线ROUTE追加进平台);edit processor则就地修改某个处理器的参数。这正是 第 10 篇 要展开的"指挥链 + 处理器"的雏形。
四、为什么 SDL 如此重要
对比 第 04 篇 讲过的"类型 + 实例"模型,你会发现 SDL 几乎一一对应:
xxx_type块 = 类型定义(模板)xxx块 = 实例(具体实体)
换句话说,你写的每一行 SDL,都是在落实那套 WSF 框架模型。后面我们要学的传感器、武器、机动、通信,无不是先定义*_type,再在platform里"挂载"对应的组件。把 SDL 练熟,后面所有篇章都会变成"在这个框架里加新块"而已。
五、小结
- SDL 是 AFSIM 的场景定义语言,用"关键字 + 块"的文本描述战场,是后续所有篇章的基础。
- 基本块包括 platform / processor / sensor / comm / weapon 及其对应的
*_type模板。 - 语法极简:
#注释、include引入外部文件、变量统一常量。 - 文件结构通常是:全局设置 → 类型模板 → 具体实例。
- 一个 1~2 个 platform 的最小片段即可跑通,验证了 第 04 篇 的"类型 + 实例"模型。
下期预告
SDL 的骨架搭好了,下一篇 第 06 篇《Platform 详解》 我们深入最常用的platform_type与platform块,并用作者真实项目里的UAV_01与Enemy_Ship手把手写出完整平台定义。