本章要回答的三个问题:SDF 相对于 URDF 和随意写 XML,多给了什么(答案:机器可校验的场景语义)?地形、建筑、大批障碍物这些"静态世界"怎么建才既真实又不拖垮物理引擎?一个模型文件放在哪、Gazebo 按什么顺序找到它——为什么团队协作里的启动失败八成是路径问题?
第 3 章讲清了"力怎么算",但力作用在什么上——地面是平的还是起伏的、墙的碰撞体是盒还是网格、模型文件夹里除了 mesh 还有什么——这些由第 4 章的"场景账"决定。这本账的特点是错误安静:物理参数错了机器人会抖给你看,场景账错了往往只是"悄悄不像"——车在颠簸地形上跑得太顺、雷达打在墙上没有回波强度差异。安静的错误比吵闹的更危险。
SDF 是这本账的记账语言。它是 XML,但不是随意的 XML:有 schema、有版本、能被命令行工具校验和转换。理解它的设计意图(描述一切、程序可解析),你就理解了为什么生态里"从 URDF 生成 SDF"、"从 CAD 生成模型"的工具链都长成那样。
| 节 | 回答哪个问题 | 关键产出 |
|---|---|---|
| 4.1 SDF 格式深度解析 | SDF 的语义结构长什么样 | 世界/模型层级图 + 校验转换命令 |
| 4.2 静态环境构建 | 地形与场景怎么建 | 地形参数实例 + 视觉/碰撞分离原则 |
| 4.3 资源管理与生态 | 模型怎么被找到 | 路径解析顺序表 + 团队协作配置 |
4.1 定语言,4.2 用语言建世界,4.3 解决"素材从哪来、去哪找"。三节合起来输出一件事:一个可版本化、可复现的仿真场景包。
读过第 3 章的惯性/碰撞概念(SDF 里的 link 定义直接复用它们)。最好手边有终端,4.1 的校验命令值得跑一遍。
场景搭好、物理就绪,机器人还缺眼睛——第 5 章讲传感器数据如何在渲染引擎与噪声模型的合谋下被"制造"出来。
本章三节的产出最终要合成一个可交付单元——场景包,它的验收标准值得提前讲清。一个合格的场景包包含四层内容:通过 gz sdf -p 校验的世界与模型文件(4.1);每个模型的三件套齐全、static 声明到位、碰撞体全部为基本几何体(4.2);一份 uri_inventory.txt 依赖清单,所有 model:// 引用都能在本地库命中,无 Fuel 隐性依赖(4.3);一段冒烟脚本,冷 clone 后 source env.sh 能无头跑满一千步不报错。四层各自的典型故障模式恰好错开:语法层错在启动即崩,建模层错在"悄悄不像",依赖层错在换机即挂,验收层缺了则前三种错误都到演示现场才爆炸。评审一个场景包时按这四层从下往上问,"建好了"三个字就从感觉变成了可打钩的清单——这也是本章对第 1 章"可审计实验装置"承诺的兑现方式之一。场景包一旦验收,就应以只读资产对待:后续改动走版本号递增与新场景包发布,而不是在旧文件上原地覆盖——环境悄悄变了而测试结果无人知晓,是批量统计实验里最难追查的一类污染。