资产
当你已经能够启动本地模拟器后,下一层需要理解的就是资产包。LAV2 将几何、场景描述以及后端相关的机器人定义统一放在 lav2.assets 下面,这样同一个仓库就可以同时服务 MuJoCo、Isaac Lab 以及相关任务封装。
为什么需要资产包
lav2.assets 是仿真资源稳定的查找入口。本地 runner 不会硬编码绝对路径,而是通过 load_callback 从包资源中解析文件。
这种模式能够让本地运行、editable install 以及下游任务包围绕同一个资产根目录保持一致。
以 MJCF 作为建模标准
对 LAV2 来说,MuJoCo MJCF 是仿真资产的实施标准,这个选择是有意为之:
- 对当前使用场景而言,MJCF 实际上可以视作 URDF 的增集。
- URDF 原生并不能很好地描述本项目所需的旋翼电机及其执行语义,除非依赖特定模拟器的扩展或插件。
- 本地模拟器与控制闭环本身就围绕 MuJoCo 构建,因此最精确、最容易验证的表达应当首先落在 MJCF 上。
在实际工作流中,建模路径是:
- 先在 MJCF 中建立权威的机体模型。
- 通过 lav2.controller.run 在本地 MuJoCo 仿真中验证行为。
- 在需要时,再将该 MJCF 资产转换到其它后端格式。
这样可以保留一个主要的机械描述来源,而不是长期维护多个能力上限不同、且都需要手工编辑的格式。
MuJoCo 资产加载流程
对本地健全性检查来说,关键路径如下:
- lav2.controller.run 调用
load_callback。 load_callback从 lav2.assets 中解析 MuJoCo 场景。- MuJoCo 加载该场景,场景内部再引用 LAV2 的 MJCF 机体模型及其几何资源。
- 控制闭环将执行器命令写入场景中定义的 actuators。
这也是为什么当 viewer 无法启动,或者机器人显示不完整时,本地仿真指南会先让你检查资产是否正确。
转换得到的其它格式
其它格式是从 MJCF 模型派生出来的下游产物,而不是与其平行的权威来源。Isaac Lab 使用的 USD 资产最初是从 MuJoCo 侧描述转换而来,之后又进行了手工编辑,因为 Isaac Lab 对 USD 还有额外要求,直接转换并不能完全满足。
因此更准确的理解方式是:
- MJCF 是参考实现。
- 其它格式的资产继承自 MJCF 设计。
- 转换之后仍然可能需要后端相关的手工调整。
这在排查跨后端不一致时尤其重要。如果 MuJoCo 与 Isaac Lab 表现不一致,应该先检查问题是否来自转换边界,或者来自后端特定的后处理修改,而不是默认两份表示是独立演化出来的。
资源边界
MJCF 与 USD 资产树都位于包的资源根目录之下,但它们有意不被当作 Python 子模块。它们是供仿真后端使用的资源目录,而不是导入接口。
因此文档中值得交叉引用的 API 表面,主要是包级资产入口 lav2.assets 以及实际消费这些资源的运行时代码,尤其是 lav2.controller.run。
实际编辑规则
- 当平台几何结构或执行语义发生变化时,应把 MuJoCo MJCF 描述视作源资产进行修改。
- 尽量让 loader 与任务封装继续依赖 lav2.assets,这样路径解析在 editable install 与打包分发场景下都能保持稳定。
- 当需要引入新的后端时,优先从 MJCF 模型转换或派生,而不是直接维护一套完全独立、手工编写的资产定义。
- 如果某个后端在转换后仍需要手工修改,应明确记录这一约束,避免把派生资产误认为是独立维护的事实来源。
API 交叉引用
- 包入口:lav2.assets
- 本地场景加载:load_callback
- 本地运行入口:lav2.controller.run