定义
SDFormat 是一种用于描述机器人仿真场景的 XML 文件格式,后缀名为 .sdf,根元素为 sdf,并通过 version 属性标明所遵循的规范版本[2]。它既能描述单个机器人,也能描述机器人所处的完整环境,包括地面、光照、地形、风、大气以及物理引擎参数[1]。
在 SDFormat 的术语体系中,SDFormat 指规范本身,SDF 是它的同义缩写;但官方建议优先使用 SDFormat 这一写法,因为 SDF 这一缩写在其他领域还有别的含义[2]。规范与实现是两件事:规范定义字段与语义,解析实现则由同仓库维护的 libsdformat 提供,该库读取 SDF 文件并返回 C++ 接口[3]。
原理
SDFormat 采用嵌套标签的树形结构。一个模型由 model 标签作为具名容器,内部包含若干 link 与 joint;link 表示具名刚体,joint 表示两个刚体之间的运动学约束,其 type 属性可取 fixed、revolute、prismatic、ball、universal、screw、continuous 等类型,分别对应不同的剩余自由度数量[4]。joint 通过 parent 与 child 标签引用模型内的 link 名称,从而确定父子关系[4]。
位姿由 pose 标签给出,形式为一组三维平移量加一组三维姿态角,默认使用弧度;较新的规范允许通过 degrees 属性改用角度,或用 rotation_format 属性在欧拉角与四元数之间切换[5]。模型进入世界时必须指定一个规范链接(canonical link),模型的隐式坐标系附着于该链接;若未显式指定,则取模型中的第一个 link[6]。
从规范 1.7 起,SDFormat 引入完整的坐标系语义,区分世界坐标系、模型坐标系、链接坐标系与关节坐标系,并用 pose 的 relative_to 属性与 frame 的 attached_to 属性显式声明参照关系[6]。名称的作用域也随之划分:每个模型拥有独立的模型作用域,世界另有世界作用域,因此不同模型内部的同名链接不会相互冲突[6]。
物理引擎相关设置集中写在 physics 标签中,可以指定摩擦模型等参数;从规范 1.6 起,gravity 与 magnetic_field 两个元素由 physics 移到了 world 之下。规范 1.11 还引入了 inertial 的 auto 属性,允许在给定碰撞几何与密度的前提下自动推算质量与转动惯量[5]。
发展历程
SDFormat 最初是为科学机器人应用设计的,作为 Gazebo 机器人仿真器的一部分出现[1]。为了让相关库能被其他项目复用、也让 Gazebo 更加模块化,这些组件后来从 Gazebo 中拆出独立发布,SDFormat 规范与解析库同处一个代码仓库[7]。规范版本号写在 sdf 元素的 version 属性中,例如 1.4、1.5、1.6,与 libsdformat 库的版本号(如 2.3、3.0、4.0)是两套独立的编号体系。
早期 Gazebo 各版本与规范、库版本之间存在对应关系:Gazebo 2.2 使用的库版本在 1.4.7 与 2.0 之间,支持到规范 1.5;Gazebo 7 对应库版本 4.1.0 以上、5.0 以下,支持到规范 1.6;Gazebo 11 使用的库版本为 SDFormat 9,支持到规范 1.7[8]。
规范后续版本逐步扩展表达能力:1.7 版增加了坐标系语义,1.8 版增加了模型组合,1.9 版增加了以角度或四元数表示姿态的新方式,1.10 版增加了合并式 include、世界中的 joint 以及流体附加质量,1.11 版加入转动惯量的自动计算[5]。兼容性方面,仓库中提供了 .convert 转换文件,可以把旧版本文件向前迁移。随着 Gazebo 生态的演进,相关命名空间由 ignition 改为 gz,旧命名空间被标记为废弃[9]。
应用
SDFormat 最主要的使用场景是 Gazebo 仿真器,Gazebo 用它描述仿真的每一个方面[7]。用它可以描述简单轮式底盘,也可以描述人形机器人,除运动学与动力学属性外还能定义传感器、表面属性、纹理、关节摩擦等参数,因此同一份描述可同时服务于仿真、可视化、运动规划与控制[1]。
在 ROS 2 生态中,SDFormat 与 URDF 常配合使用。sdformat-urdf 软件包提供 C++ 库与 urdf_parser_plugin,可以把 SDFormat XML 转换为 URDF 数据结构,从而让 robot_state_publisher 一类的工具直接以 SDF 作为机器人描述[10]。反向转换同样可行:借助 Gazebo Sim 自 Garden 版起提供的 gz sdf 命令,可以把 URDF 模型转成 SDF[11]。
围绕 SDFormat 还出现了第三方工具与转换器。ROD 是一个基于 SDFormat 规范处理机器人描述的 Python 库,支持规范 1.10 及以上版本,提供序列化、反序列化、类型校验与从 Python 以编程方式生成 SDF 文件等能力[11]。此外还有 sdformat-mjcf 库,用于在 SDFormat 与 MuJoCo 的 MJCF 格式之间双向转换模型、世界、关节、传感器与材质[12]。
局限
SDFormat 规范版本与 libsdformat 库版本分属两套编号,二者并不一一对应,这给使用者判断某个仿真器支持哪些字段带来了额外成本[13]。由于规范允许存在多个历史版本,不同版本的转换与升级需要依赖仓库中的转换文件来完成。
与 URDF 相比,SDFormat 对机器人控制与规划类软件的支持一度不够完整。有开发者指出,早期版本缺少用于表示六轴力/力矩传感器的固定关节、缺少可用于控制与规划的纯运动学坐标系,且官方解析库依赖 Boost 库,在 Windows 上部署不便;其中固定关节与 Boost 依赖问题后来已分别解决[14]。
文件层面的互通也有边界。SDFormat 适合描述完整世界并支持多模型,而 URDF 只描述单台机器人,两者虽同为 XML,但底层是两套独立标准,不能直接把 SDF 文件交给只识别 URDF 的可视化工具使用[15]。
参考资料
- SDFormat Specification [引用日期2026-10-14]
- sdformat [引用日期2026-10-14]
- sdformat [引用日期2026-10-14]
- Specifying model kinematics in SDFormat [引用日期2026-10-14]
- Table of content [引用日期2026-10-14]
- Pose Frame Semantics Tutorial [引用日期2026-10-14]
- tutorial-8 [引用日期2026-10-14]
- Install dependencies from source on Ubuntu [引用日期2026-10-14]
- Migration [引用日期2026-10-14]
- Setting Up The SDF [引用日期2026-10-14]
- pypi.org 上的网页 [引用日期2026-10-14]
- Gazebo — News — Open Robotics [引用日期2026-10-14]
- Which SDFormat corresponds to version of Gazebo [引用日期2026-10-14]
- github.com 上的网页 [引用日期2026-10-14]
- 科普:机器人项目中的描述文件SDF 和 URDF 对比 [引用日期2026-10-14]