第二章:XML模型基础结构 - 根节点与默认命名空间错误
好,咱们正式开始动手写模型了。很多新手拿到MuJoCo,第一件事就是照着网上的片段拼一个XML文件,然后一跑——报错。我见过最多的报错,十有八九都出在根节点和命名空间上。说白了,就是MuJoCo不认识你写的这个文件到底是个啥。
2.1 根节点:模型的身份证
每个MuJoCo模型XML文件,最外层必须是一个 <mujoco> 标签。这就是根节点。它告诉解析器:“嘿,我是一份MuJoCo模型文件,按MuJoCo的规矩来读我。”
我遇到过有人把根节点写成 <model> 或者 <robot> 的,结果MuJoCo直接甩一个“Unknown root element”的错误。嗯,这其实不怪MuJoCo,它只认自己的身份证。
<mujoco>
<worldbody>
<light pos="0 0 1"/>
<geom type="plane" size="1 1 0.1"/>
</worldbody>
</mujoco>
你想想看,如果连身份证都不对,后面的内容写得再漂亮也没用。MuJoCo解析器看到根节点不是 <mujoco>,直接就罢工了。
2.2 默认命名空间:看不见的坑
根节点写对了,接下来就是命名空间。MuJoCo的XML文件有一个默认命名空间,就是 http://mujoco.org/schema/mujoco。这个命名空间不是必须写的,但如果你写了,就必须写对。
我曾经接手过一个项目,模型文件里写了命名空间,但写成了 http://mujoco.org/schema/mujoco_v2。结果模型加载时所有元素都报“unrecognized element”。查了半天才发现,就是多了一个 _v2 后缀。
<mujoco xmlns="http://mujoco.org/schema/mujoco_v2">
<worldbody>
<geom type="box" size="0.1 0.1 0.1"/>
</worldbody>
</mujoco>
这个文件会报错,因为命名空间不对。MuJoCo只认 http://mujoco.org/schema/mujoco。
2.3 命名空间写不写?我的建议
我个人习惯是不写命名空间。MuJoCo的解析器在没有命名空间的情况下,会自动使用默认的解析规则。写了反而容易出错,尤其是当你从网上复制代码时,很容易带进来一个错误的命名空间。
但如果你非要写,记住两点:
- 必须写对:
http://mujoco.org/schema/mujoco,一个字符都不能差 - 不能写版本号: 没有
v2、2.0之类的后缀
2.4 根节点属性:版本与编译器
根节点 <mujoco> 可以带两个常用属性:model 和 compiler。这两个属性虽然不强制,但我建议你加上。
| 属性 | 作用 | 示例 |
|---|---|---|
model |
给模型起个名字,方便调试时识别 | model="my_robot" |
compiler |
控制编译器的行为,比如角度单位 | compiler="angle:radian" |
我习惯在根节点上加上 model 属性,这样在日志里一眼就能看出是哪个模型在报错。至于 compiler,我一般会在后面单独写一个 <compiler> 子节点,而不是写在根节点属性里。这样更清晰。
2.5 常见错误清单
我把这些年遇到的根节点和命名空间相关的错误整理了一下,你对照着检查,基本能解决90%的问题。
- 根节点写错: 用了
<model>、<robot>、<scene>等非<mujoco>标签 - 命名空间写错: 多写了
_v2、2.0,或者拼写错误 - 根节点闭合错误: 写了
<mujoco>但忘了写</mujoco> - 大小写错误: MuJoCo的标签是区分大小写的,
<Mujoco>不行,必须是<mujoco> - 多余的空格或换行: 根节点前不能有任何字符,包括空格和换行
<?xml version="1.0" encoding="utf-8"?>,这是允许的。但第二行必须是 <mujoco>,中间不能有任何空行或注释。
2.6 知识结构图
下面这张图帮你理清根节点和命名空间的关系。我建议你把它存下来,每次写模型前看一眼,能省不少调试时间。
2.7 实战检查清单
每次写新模型,或者从网上下载别人的模型,我都会按这个清单过一遍。你也试试看,能省不少时间。
- 第一步: 确认第一行(如果有)是
<?xml version="1.0"?>,第二行是<mujoco> - 第二步: 检查
<mujoco>有没有闭合,有没有写错大小写 - 第三步: 如果有
xmlns属性,确认值是http://mujoco.org/schema/mujoco - 第四步: 确认根节点前没有空格、换行、注释等字符
- 第五步: 用MuJoCo自带的
compile命令快速验证:mujoco_compile your_model.xml
mujoco_compile 跑一遍。这个命令只检查语法,不跑仿真,几毫秒就出结果。比直接跑仿真等半天再报错要高效得多。
嗯,根节点和命名空间这块其实不难,但就是容易在细节上翻车。你只要记住:根节点必须是 <mujoco>,命名空间要么不写,要么写对。这两条记住了,这一章的内容你就掌握了。