1. 先把 1v1.txt 当成“实验总说明书”
你打开这个文件时,不要先关心语法,而要像读实验方案一样读它。它先说明当前文件所在路径,然后用场景变量选择 1v1,再把公共配置和具体场景 include 进来。也就是说,它本身不是所有细节的集合,而是把一次实验要用的配置拼起来。
物理类比是:一篇实验记录不会把仪器制造图纸全写进去,而是写“本实验使用某套仪器、某个样品、某个初始条件、某个观测方案”。AFSIM 的顶层场景文件也是这个角色。
2. 读文件时先抓这六类字段
路径与场景选择
file_path 和 define_path_variable SCNRIO 1v1 决定后续 include 和输出文件指向哪次实验。
公共配置
include_once _common.txt 表示很多通用模型、常量或类型不在当前文件里,而是在公共配置里复用。
具体场景
include_once scenarios/${SCNRIO}.txt 才是真正摆放平台和路线的地方。对于当前选择,它会落到 scenarios/1v1.txt。
可重复性
random_seed 固定随机性,类似数值实验里固定随机种子,方便复现实验结果。
时间边界
end_time 规定仿真跑到什么时候停。它相当于实验采样窗口或模拟终止时间。
观测输出
log_file、event_pipe、event_output 规定实验结束后留下哪些证据,例如日志、轨迹、事件。
3. 再进入 scenarios/1v1.txt,看“实验对象怎么摆放”
这个文件开始把抽象实验变成具体实体。它 include 了 platforms/lte_fighter.txt,说明蓝红双方平台都基于同一类战斗机模板;随后定义蓝方路线和红方路线,再定义两个平台:蓝方 Talon_1_1 和红方 red_1。
这里最重要的不是名字,而是结构:每个平台都有阵营、指挥关系、航向、初始位置、高度、任务变量、路线和 assessment processor。换成物理语言,就是每个实验对象不仅有初始相空间状态,还有组织关系、任务参数和后续行为评估器。
4. 你应该在脑子里形成一条实验定义链
第一层是 1v1.txt:它决定这次实验选哪套 scenario、记录什么、跑多久。第二层是 scenarios/1v1.txt:它决定平台在哪里、向哪飞、属于哪一方、接受什么任务。第三层才是 platforms/lte_fighter.txt:它定义“战斗机这种平台”到底挂了哪些传感器、武器、processor 和规则。
所以最好的阅读动作是:看到一个 include 就顺着打开;看到一个平台类型就去平台模板;看到一个 processor 名称就去 processors 目录;看到一个规则阶段就去 rules 目录。你是在沿着实验定义向模型细节逐层下钻。
5. 本章先不要深入 C++,只建立“配置如何召唤源码能力”的直觉
event_output、command_chain、processor assessment、platform BLUE_FIGHTER 这些关键词最终都对应 C++ 或插件里的实现。但第一遍不需要马上钻进去。第一遍只要知道:脚本文件声明“我要用什么能力”,底层框架负责把这些能力实例化并放到仿真循环里运行。
这就像实验说明书说“使用某型号探测器和某套数据采集系统”,你第一遍先理解实验组织方式,之后再去看探测器电路或采集系统源码。
6. 读完本章,你应该能回答三个问题
- 这次实验选的是哪个 scenario?答案在
SCNRIO 和 include_once scenarios/${SCNRIO}.txt。
- 实验对象是谁、初始在哪里、怎么运动?答案在
scenarios/1v1.txt 的 route 和 platform 定义。
- 实验结束后看什么证据?答案在
log_file、event_pipe 和 event_output。
如果这三个问题能答出来,你就已经读懂了 AFSIM 的第一层骨架:它不是先写程序,而是先用场景脚本声明一次可重复的仿真实验。