仿真资产
仿真资产(Simulation Assets)是机器人仿真里的“可复用世界零件”。机器人本体、末端执行器、桌子、杯子、抽屉、地形、灯光、相机、LiDAR、材质贴图、碰撞体、标注信息,统统都属于资产层。很多团队把仿真理解成“选一个仿真器然后把机器人导进去”,真正做起来才会发现,训练效果、仿真稳定性、渲染真实度、Sim2Real 表现,往往先败在资产质量上,而不是算法本身。
这篇笔记专门回答资产层的问题:仿真里到底有哪些资产,它们如何被建模、制作、导入、管理、验证,并最终变成一个可训练、可调试、可迁移的仿真世界。 关于平台选型见 仿真平台,关于世界组织和物理规则见 仿真世界构建与物理规则,关于格式语法基础见 开发工具链。
1. 仿真资产总论
1.1 什么是资产层
在机器人仿真中,可以把工程栈粗略拆成四层:
graph TD
A[平台层<br/>Isaac Sim / MuJoCo / Gazebo / SAPIEN] --> B[资产层<br/>Robot / Object / Scene / Sensor / Material]
B --> C[世界层<br/>World / Task / Reset / Randomization]
C --> D[算法层<br/>RL / IL / VLA / Planner / Evaluation]
style A fill:#e3f2fd
style B fill:#fff3e0
style C fill:#e8f5e9
style D fill:#fce4ec
- 平台层决定你能用什么物理引擎、渲染器、API 和性能上限。
- 资产层决定机器人、物体、场景、传感器是否“像回事”、是否稳定、是否方便复用。
- 世界层决定这些资产如何被摆放、重置、组合成任务。
- 算法层才是在这些基础之上训练或评测策略。
资产层的职责不是“把一个 mesh 放进去”这么简单,而是把视觉、物理、交互、标定、命名、版本管理统一起来。
1.2 资产层与其他章节的边界
| 主题 | 本文关注点 | 相关章节 |
|---|---|---|
| 仿真器选型 | 不展开选型,只说明不同平台承载资产的差异 | 仿真平台, 仿真工具对比 |
| 世界层次与物理规则 | 只讲资产如何提供参数,不讲 solver 与时间步理论 | 仿真世界构建与物理规则 |
| URDF/MJCF/SDF/USD 语法 | 不做基础语法教程,重点讲这些格式在资产工程中的表达能力 | 开发工具链 |
| 控制、动力学、接触理论 | 只在资产参数需要时做最小引用 | 控制理论, 动力学 |
| Sim2Real | 只讨论资产如何支持随机化和现实对齐 | Sim2Real |
1.3 为什么资产质量是第一性问题
很多训练失败,表面像是“奖励写坏了”“策略学不动”“sim-to-real gap 太大”,实际根因却在资产层:
- 机器人 link 的惯量写错,导致控制器天生不稳。
- collision mesh 太复杂,求解器接触时间飙升。
- 传感器朝向配置反了,视觉策略永远学不到目标。
- 材质和灯光过于理想,部署时视觉直接失效。
- 物体 pivot 位置错误,抽屉门把手一抓就飞。
- 命名和元数据混乱,数据生成后无法追溯版本。
可以把资产质量看成一种隐式先验:
在很多工程场景中,Assets 是最先需要被治理的项。
1.4 仿真资产的生命周期
flowchart LR
A[需求定义] --> B[几何建模]
B --> C[视觉资产整理]
C --> D[物理属性补全]
D --> E[传感器/关节绑定]
E --> F[导入仿真器]
F --> G[调试与验证]
G --> H[版本化与发布]
H --> I[世界构建与任务复用]
style A fill:#e8eaf6
style B fill:#e3f2fd
style C fill:#fff3e0
style D fill:#e8f5e9
style E fill:#fce4ec
style F fill:#f3e5f5
style G fill:#ede7f6
style H fill:#fff8e1
style I fill:#f1f8e9
1.5 资产工程的核心目标
一个“好资产”不是看起来漂亮而已,它要同时满足:
- 几何正确:尺寸、坐标轴、局部原点、法线、拓扑没有明显错误。
- 视觉可信:材质和贴图能表达外观差异,支持后续视觉随机化。
- 物理稳定:质量、惯量、碰撞代理、关节限制合理,能稳定求解。
- 交互明确:抓取点、接触面、铰接轴、可动部件定义清楚。
- 可复用:命名、目录、元数据、版本管理规范。
- 可迁移:能在多个仿真器或数据管线中转换和复用。
2. 资产分类体系
2.1 资产类型总览
graph TD
A[仿真资产] --> B[机器人资产]
A --> C[可交互物体资产]
A --> D[静态场景资产]
A --> E[传感器资产]
A --> F[渲染资产]
A --> G[地形与环境资产]
A --> H[元数据资产]
B --> B1[底座/连杆/关节]
B --> B2[末端执行器]
B --> B3[驱动与传动]
B --> B4[本体传感器]
C --> C1[刚体]
C --> C2[铰接体]
C --> C3[柔性体]
C --> C4[工具/容器]
D --> D1[房间]
D --> D2[桌面]
D --> D3[工位]
D --> D4[背景与障碍]
E --> E1[Camera]
E --> E2[LiDAR]
E --> E3[IMU]
E --> E4[Force/Contact]
F --> F1[材质]
F --> F2[纹理]
F --> F3[灯光]
F --> F4[天空盒]
G --> G1[地板]
G --> G2[坡道]
G --> G3[楼梯]
G --> G4[碎石/软地]
H --> H1[标注]
H --> H2[语义标签]
H --> H3[版本号]
H --> H4[数据接口]
2.2 从训练任务角度看资产
| 任务类型 | 核心资产 | 常见额外资产 | 资产难点 |
|---|---|---|---|
| 桌面抓取 | 机械臂、夹爪、桌子、杯子、盒子 | 俯视相机、腕部相机、背景板 | 物体尺寸与抓取点 |
| 铰接操作 | 柜门、抽屉、水龙头、旋钮 | 接触传感器、限位约束 | 轴心和阻尼配置 |
| 插拔装配 | 插头、孔槽、定位治具 | 高精度碰撞代理、力觉 | 公差和接触稳定性 |
| 移动导航 | 地图、障碍物、门、走廊 | LiDAR、IMU、语义标签 | 大场景分块和重置 |
| 四足地形 | 地面、坡道、楼梯、软地 | 高度图、接触点 | 地形材质与摩擦 |
| 人形搬运 | 全身机器人、箱体、工位 | 多相机、接触/力矩传感器 | 自碰撞与大质量物体 |
2.3 从工程职责角度看资产
不同团队往往把资产责任分给不同角色:
| 角色 | 负责资产内容 | 典型输出 |
|---|---|---|
| 机械/结构工程师 | CAD 模型、关节结构、装配逻辑 | STEP, SolidWorks, OnShape |
| 3D 美术/数字孪生工程师 | 视觉 mesh、材质、灯光、场景美术 | FBX, USD, PBR 贴图 |
| 仿真工程师 | 碰撞体、惯量、关节驱动、传感器 | URDF, MJCF, USD Physics, SDF |
| 算法工程师 | 随机化参数、采样接口、标注协议 | config, dataset schema |
| 基础设施工程师 | 资产目录、版本、缓存、CI 校验 | registry, manifest, validation script |
2.4 资产不是文件,而是“文件 + 语义 + 规则”
同一个杯子,在工程上至少有四层表达:
cup_visual.obj:视觉网格cup_collision.obj:碰撞代理cup.usd/cup.xml:物理与层级定义metadata.json:类别、抓取面、可倒液体、材质标签、语义 ID
因此资产本质上是:
3. 几何与网格基础
3.1 Primitive、Mesh 与实例化
| 表达方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Primitive(box/sphere/capsule) | 便宜、稳定、易算惯量 | 外形粗糙 | 碰撞体、原型验证 |
| Triangular Mesh | 外观自由度高 | 计算量大、拓扑问题多 | 视觉资产 |
| Convex Hull | 碰撞稳定、计算较快 | 形状逼近有限 | 碰撞代理 |
| Decomposed Convex Mesh | 平衡精度与稳定性 | 需要分解流程 | 可交互物体碰撞 |
| Instancing | 节省显存和加载时间 | 定制能力受限 | 仓储箱体、桌椅批量场景 |
3.2 坐标轴、单位与缩放
资产工程里最常见的错误不是高深数学,而是单位和坐标轴不统一。
| 维度 | 常见约定 | 典型坑 |
|---|---|---|
| 长度单位 | 米(m) | CAD 导出成毫米,导入后物体缩小 1000 倍 |
| up 轴 | +Z 或 +Y |
Maya/Blender/Unity/ROS 约定不同 |
| 角度单位 | 弧度 | 关节限制配置时混入度数 |
| 尺寸缩放 | 统一在导出前 bake | 导入时临时 scale,导致惯量和碰撞代理不一致 |
资产导出前最好建立固定规范:
- 几何原始单位统一为米。
- 根节点缩放为
1,1,1。 - 局部坐标系尽量与实际装配坐标一致。
- 关节轴方向在 CAD、描述文件、仿真器中保持同向。
3.3 局部原点与 pivot
局部原点(pivot)不是可有可无的美术细节,它直接影响:
- 抓取点定义
- 铰接轴旋转中心
- 物体摆放和重置
- 语义操作点
例如抽屉资产:
- 视觉 mesh 的 pivot 若在几何中心,渲染可能没问题。
- 但世界层希望抽屉沿滑轨移动,局部原点更适合放在滑轨参考位置。
- 若 pivot 混乱,
OpenDrawer任务的位姿采样和轨迹规划都会变得别扭。
3.4 网格拓扑与法线
不良网格的典型症状:
- 法线反转,表面发黑或闪烁
- 非流形边,凸分解失败
- 重叠面,接触计算发散
- 三角面过密,FPS 下降
- 细长三角形过多,碰撞代理生成异常
3.5 LOD(Level of Detail)
大场景里,LOD 是资产工程必须考虑的项。
| LOD 层级 | 面数级别 | 用途 |
|---|---|---|
| LOD0 | 最高 | 近景渲染、截图、演示 |
| LOD1 | 中等 | 普通训练/交互 |
| LOD2 | 低 | 远景或背景物体 |
| Collision Proxy | 极低 | 碰撞与接触 |
建议做法:
- 视觉 mesh 和碰撞 mesh 分离。
- 远景背景家具使用低模或实例化。
- 训练环境优先保证接触稳定,再追求画面质量。
3.6 UV 与贴图基础
一个有用资产至少要明确:
- 是否有合理 UV 展开
- 贴图是否支持平铺
- 法线贴图与粗糙度贴图是否匹配
- 纹理分辨率是否过高
graph LR
A[High-poly/CAD] --> B[Retopo]
B --> C[UV Unwrap]
C --> D[Bake Maps]
D --> E[PBR Textures]
E --> F[LOD + Collision Proxy]
F --> G[Simulation Import]
3.7 几何资产的最小检查表
| 检查项 | 合格标准 |
|---|---|
| 单位 | 米 |
| 轴向 | 文档化且统一 |
| 缩放 | 根节点缩放为 1 |
| 法线 | 朝向正确 |
| 拓扑 | 无明显非流形错误 |
| LOD | 至少有训练级与展示级区分 |
| collision proxy | 已准备 |
4. 视觉资产制作
4.1 视觉资产的目标不是“越真实越好”
视觉资产通常在三个目标之间取平衡:
- 写实性:尽量接近真实照片或真实场景。
- 可控性:便于随机化颜色、纹理、反射、光照。
- 性能:训练环境能跑得动。
对仿真训练而言,“可控且稳定的逼真”通常比“极限画质”更重要。
4.2 PBR 材质体系
PBR(Physically Based Rendering)通常包含:
| 贴图/参数 | 作用 | 常见问题 |
|---|---|---|
| Base Color / Albedo | 表面颜色 | 把阴影烘进颜色图,导致随机化困难 |
| Normal Map | 细节法线 | 法线空间不匹配 |
| Roughness | 粗糙度 | 金属/塑料区分不明显 |
| Metallic | 金属度 | 误把所有灰色表面都当金属 |
| AO | 环境遮蔽 | 与实时阴影重复叠加 |
| Emissive | 自发光 | 不必要地引入亮斑 |
4.3 颜色空间
视觉资产管线里经常混淆两种空间:
- sRGB:给人看的颜色空间
- Linear:给渲染计算用的线性空间
典型规则:
- base color 通常用 sRGB
- roughness / metallic / normal 通常用 linear
如果这一步错了,会导致:
- 材质对比异常
- 金属表面过亮
- 训练图像和真实相机分布差异扩大
4.4 材质风格库
在机器人仿真里,建议构建可复用的材质风格库,而不是每次手工调。
| 材质类别 | 关键参数 | 典型对象 |
|---|---|---|
| 哑光塑料 | 低金属度、中高粗糙度 | 杯子、盒子、工具壳 |
| 抛光金属 | 高金属度、低粗糙度 | 不锈钢容器、夹具 |
| 喷涂金属 | 中等粗糙度 | 工业柜体、机械外壳 |
| 木质桌面 | 非金属、法线纹理弱 | 餐桌、工作台 |
| 织物 | 高粗糙度、法线细节 | 沙发、布袋 |
| 透明材料 | 折射/反射依赖渲染器 | 玻璃杯、透明挡板 |
4.5 视觉随机化友好的材质设计
如果计划做 Sim2Real,视觉资产最好天然支持:
- 颜色替换
- 纹理切换
- 粗糙度扰动
- 灯光方向变化
- 相机曝光变化
不推荐:
- 把颜色、阴影、污渍全部烘死在一个贴图中
- 复杂 shader 依赖专用渲染器
- 使用超高分辨率贴图覆盖整个训练场景
4.6 灯光也是视觉资产
灯光在世界层参与渲染规则,但从制作和复用角度,它本质上也是资产。
| 灯光类型 | 适用用途 | 常见坑 |
|---|---|---|
| Directional | 室外太阳光、主方向光 | 阴影过硬,方向过于固定 |
| Point | 小范围补光 | 数量多时性能差 |
| Spot | 顶灯、工业射灯 | cone angle 设错容易过曝 |
| Dome / HDRI | 全局环境光 | 环境贴图过于理想化 |
| Rect Light | 室内软光源 | 平台支持差异较大 |
4.7 视觉资产检查清单
| 项目 | 目标 |
|---|---|
| 材质命名 | 统一可检索 |
| 贴图目录 | 相对路径清晰 |
| 颜色空间 | 已区分 sRGB / linear |
| 反射与粗糙度 | 合理匹配对象类别 |
| 灯光模板 | 支持复用与随机化 |
| 纹理尺寸 | 与训练分辨率匹配 |
| domain randomization | 可插拔,不依赖手工改图 |
5. 物理资产制作
5.1 visual mesh 与 collision mesh 必须分离
这是资产工程里最重要的规则之一。
| 项目 | visual mesh | collision mesh |
|---|---|---|
| 目标 | 好看 | 稳定、便宜 |
| 面数 | 高 | 低 |
| 细节 | 保留外观细节 | 保留接触关键轮廓 |
| 渲染 | 需要 | 不需要 |
| 碰撞计算 | 不建议直接参与 | 必须参与 |
直接拿高精度视觉 mesh 做碰撞,常见后果:
- 碰撞检测很慢
- 接触面抖动
- solver 难收敛
- 小缝隙被错误识别为可插入区域
5.2 Convex decomposition
对非凸物体,常见做法是把碰撞代理拆成多个凸体:
graph LR
A[原始视觉网格] --> B[几何清理]
B --> C[凸分解]
C --> D[多个 convex hull]
D --> E[物理验证]
典型适用对象:
- 杯子把手
- 抽屉柜体
- 钳子
- 门把手
- 插线板等有孔洞的物体
5.3 质量、质心与惯量
物理资产制作不能只写一个 mass=1.0 就结束。对刚体而言,至少有三个关键量:
- 质量 \(m\)
- 质心位置 \(\mathbf{c}\)
- 惯量张量 \(\mathbf{I}\)
对离散质量点近似,有:
如果惯量过小,物体会像纸片一样乱飞;如果惯量过大,控制器又会显得迟钝。对机器人 link 尤其如此。
5.4 常见惯量错误
| 错误 | 现象 |
|---|---|
| 惯量矩阵不是正定 | 仿真器直接报错或行为异常 |
| 质心位置和实际几何错位 | 抓取或跌落姿态不合理 |
| 所有关节 link 都用同一组惯量 | 全身运动表现失真 |
| 导出时忘记 scale | 质量和体积不匹配 |
5.5 摩擦、恢复系数与接触参数
资产层通常至少要提供以下物理属性:
| 参数 | 含义 | 影响 |
|---|---|---|
| Static Friction | 静摩擦 | 是否容易起步滑动 |
| Dynamic Friction | 动摩擦 | 滑动过程阻力 |
| Restitution | 恢复系数 | 是否弹跳 |
| Contact Offset | 接触缓冲距离 | 提前触发接触 |
| Rest Offset | 稳态接触距离 | 接触稳定性 |
这些参数不应孤立看,而要与平台求解器、时间步和几何尺度一起调。更系统的规则见 仿真世界构建与物理规则。
5.6 碰撞层与过滤
碰撞层(collision layers / masks)在大型系统里非常重要。
用途包括:
- 忽略机器人内部自碰撞中不必要的 pair
- 避免视觉装饰物参与物理
- 让抓手指尖只与目标物或环境特定层交互
- 分离触发体与实体碰撞体
5.7 接触 proxy 与 affordance proxy
除了真实碰撞体,很多工程系统还会额外维护两类代理:
- Contact Proxy:为求解器服务的接触简化模型
- Affordance Proxy:为抓取、插入、按钮按压等高层交互服务的语义代理
例如杯子可以有:
- 外壁碰撞体
- 内腔碰撞体
- 抓取区域 proxy
- 液体容积 proxy
5.8 物理资产的验收方式
最常见的物理资产 smoke test:
- 自由落体是否稳定
- 斜面滚动是否合理
- 夹爪抓取后是否抖动/穿透
- 多次 reset 后姿态是否一致
- 批量并行环境中是否出现单个 outlier 爆炸
6. 机器人资产
6.1 机器人资产的组成
graph TD
A[机器人资产] --> B[结构资产]
A --> C[驱动资产]
A --> D[传感器资产]
A --> E[控制接口资产]
A --> F[调试元数据]
B --> B1[link]
B --> B2[joint]
B --> B3[collision]
B --> B4[inertial]
C --> C1[motor]
C --> C2[transmission]
C --> C3[stiffness/damping]
C --> C4[limits]
D --> D1[joint encoder]
D --> D2[IMU]
D --> D3[Camera]
D --> D4[Force/Contact]
6.2 从“描述格式”到“可用资产”
开发工具链 已经介绍了 <link>, <joint>, <inertial>, <sensor> 等基础元素。本篇更关心另一层问题:
- 这些元素如何组织才利于训练和调试?
- 什么叫“机器人描述文件写得能跑”,什么叫“资产做得能长期复用”?
两者差别很大。很多机器人描述文件能在 RViz 里显示,但在仿真器中一施加重力就散架。这说明格式合法不等于资产工程合格。

图:机器人资产一旦真正进入仿真器并受到重力、地面接触和关节驱动影响,很多“在描述文件里看不出来”的问题会立刻暴露出来。图中的状态就属于“资产可载入,但还不是可用资产”。
6.3 机器人资产的最小组织单元
| 资产单元 | 至少包含什么 |
|---|---|
| Base | 根坐标系、质量、碰撞体 |
| Link | visual、collision、inertial |
| Joint | parent/child、axis、limit、dynamics |
| End-effector | 工具坐标系、接触面、抓取几何 |
| Sensor mount | 外参、安装偏移、命名 |
| Actuator config | 控制模式、增益、饱和 |
6.4 关节轴、限制与方向约定
关节资产的典型错误:
axis写反,正方向与控制器相反limit与真实机械结构不一致- mimic joint 没同步,夹爪左右指不对称
- 零位定义与实机不一致,Sim2Real 校准困难
6.5 机器人资产的控制接口
一个机器人资产不仅要描述“长什么样”,还要说明“怎么控制它”:
| 控制接口 | 描述 | 适用场景 |
|---|---|---|
| Position | 目标关节位置 | 工业臂、低速任务 |
| Velocity | 目标速度 | 滑台、轮组 |
| Torque/Force | 直接施加力矩/力 | 研究、全身控制 |
| Effort + PD | 底层 PD + 力矩限制 | RL 和运动控制混合 |
| Operational Space | 末端位姿接口 | 操作任务、遥操作 |
6.6 机器人资产的命名规范
强烈建议在资产层统一命名:
base_linkshoulder_linkwrist_roll_jointleft_finger_padcamera_front_optical_frametool0
命名混乱带来的直接问题包括:
- 数据记录难以解析
- 控制器配置容易错绑
- 跨平台转换脚本脆弱
- 训练日志难比对
6.7 机器人资产实例解剖:桌面机械臂
下面给一个机械臂资产的工程视角解剖:
| 层 | 示例内容 | 说明 |
|---|---|---|
| 结构层 | 6 个 revolute joints + 夹爪 | 机器人骨架 |
| 视觉层 | 外壳 mesh、螺丝、logo | 用于渲染 |
| 物理层 | 简化碰撞胶囊/盒体、惯量 | 用于仿真稳定性 |
| 工具层 | TCP、抓取 pad、接触面 | 用于操作 |
| 传感层 | 腕部相机、关节编码器、力矩估计 | 用于观测 |
| 控制层 | joint-space PD / operational-space action | 用于训练和部署 |
6.8 机器人资产调试 Checklist
| 检查项 | 方法 |
|---|---|
| 零位是否正确 | 所有关节归零后可视检查 |
| link 惯量是否合理 | 自由落体、摆动 test |
| 自碰撞是否正确 | 全关节扫描 |
| 末端坐标是否正确 | TCP 对齐测试 |
| 传感器外参 | 在 标定与系统集成 流程中验证 |
7. 可交互物体资产
7.1 刚体、铰接体、柔性体
| 类型 | 例子 | 难点 |
|---|---|---|
| 刚体 | 杯子、积木、工具箱 | 质量分布、抓取姿态 |
| 铰接体 | 门、抽屉、水龙头、剪刀 | 轴心、阻尼、限位 |
| 柔性体 | 布料、绳索、软袋 | 求解成本高、跨平台差异大 |
| 混合体 | 插座+弹簧盖板、夹子 | 多种约束叠加 |
7.2 物体资产要回答的 7 个问题
每个可交互物体最好明确:
- 物体类别是什么?
- 是否可抓取?
- 是否可开合/旋转/插拔?
- 关键操作区域在哪里?
- 哪些部分参与碰撞?
- 哪些参数允许随机化?
- 是否有语义状态机?
7.3 常见可操作对象模板
| 对象模板 | 关键资产字段 |
|---|---|
| 门 | 铰链轴、开合角、把手位置、阻尼 |
| 抽屉 | 线性滑轨、最大行程、把手 affordance |
| 旋钮 | 旋转轴、档位、摩擦 |
| 插头 | 公差、插入方向、接触面 proxy |
| 杯子/容器 | 内外壁、容量 proxy、抓取区域 |
| 工具 | 握持区、作用端、危险区 |
7.4 PartNet-Mobility、ManiSkill 与 robosuite 的启示
这几个生态在资产设计上给出过很好的范式:
| 生态 | 典型贡献 | 对资产工程的启示 |
|---|---|---|
| PartNet-Mobility | 大量铰接物体结构 | 关节化资产的标准来源 |
| ManiSkill | 可交互对象与 GPU 并行环境 | 物体资产必须适配批量训练 |
| robosuite | 标准操作任务模板 | 资产要服务任务抽象,而不是孤立存在 |
7.5 可交互物体的语义状态机
一个物体的视觉 mesh 并不能表达“任务状态”。很多操作对象需要额外状态机:
stateDiagram-v2
[*] --> Closed
Closed --> Opening: grasp handle + pull
Opening --> Open: displacement > threshold
Open --> Closing: push
Closing --> Closed: displacement < epsilon
7.6 可交互物体实例解剖:抽屉资产
抽屉资产至少包含:
- 柜体静态 mesh
- 抽屉盒体 mesh
- 线性关节
- 行程限制
- 把手 affordance 区域
- collision proxy
- 打开阈值语义
| 组件 | 作用 |
|---|---|
| Cabinet body | 静态承载结构 |
| Drawer body | 可移动部件 |
| Slider joint | 定义运动方式 |
| Handle proxy | 抓取点采样 |
| Contact proxy | 接触计算稳定 |
| Semantic tag | is_open, open_ratio |
7.7 小物体与长尾物体
长尾物体资产的工程难度经常被低估:
- 小螺丝、小电池:碰撞尺度小,接触不稳定
- 柔软包装袋:几何易变形
- 透明杯子:视觉渲染与深度观测都困难
- 金属反光件:视觉 domain gap 大
7.8 可交互物体资产 Checklist
| 检查项 | 合格标准 |
|---|---|
| 运动轴 | 与真实物理一致 |
| 限位 | 不穿模、不超行程 |
| affordance | 任务可访问 |
| 状态标签 | 可供 reward / evaluation 使用 |
| 碰撞代理 | 不过密也不过粗 |
| 随机化字段 | 尺寸、材质、摩擦可配置 |
8. 传感器资产
8.1 传感器是一级资产
很多初学者把传感器当成“场景里的一个插件”,但在工程上它们应该作为一级资产管理。原因是:
- 它们有安装位姿和命名
- 它们有频率、噪声和延迟模型
- 它们决定训练观测空间
- 它们决定数据集结构
8.2 传感器资产的关键字段
| 字段 | 含义 |
|---|---|
frame_id |
坐标系命名 |
mount_pose |
相对安装位姿 |
rate_hz |
采样频率 |
latency_ms |
输出延迟 |
noise_model |
噪声模型 |
resolution |
图像/点云分辨率 |
fov |
视场角 |
sync_group |
时间同步分组 |
8.3 视觉传感器
| 传感器 | 关键参数 | 典型用途 |
|---|---|---|
| RGB Camera | 分辨率、FOV、曝光、白平衡 | 视觉策略、检测、VLA |
| Depth Camera | 量程、深度噪声、空洞 | 操作、建图 |
| Stereo Camera | baseline、校正参数 | 深度估计 |
| Event Camera | 阈值、极性事件流 | 高速动态场景 |
8.4 几何传感器
| 传感器 | 关键参数 | 典型用途 |
|---|---|---|
| LiDAR | beam 数、旋转频率、量程 | 导航、建图、避障 |
| Radar | 回波模型、速度分辨率 | 户外移动系统 |
| Ultrasonic | cone angle、量程 | 近距离感知 |
8.5 本体与接触传感器
| 传感器 | 关键参数 | 作用 |
|---|---|---|
| Joint Encoder | 分辨率、噪声、偏置 | 关节状态 |
| IMU | bias drift、白噪声、采样率 | 姿态估计 |
| Force/Torque | 饱和上限、滤波 | 装配、接触控制 |
| Contact Sensor | 触发阈值、接触面定义 | 触地、抓取 |
| Tactile | taxel 分布、灵敏度 | 灵巧手操作 |
8.6 传感器安装位姿
graph LR
A[robot_base] --> B[link]
B --> C[sensor_mount]
C --> D[camera_frame]
C --> E[lidar_frame]
C --> F[imu_frame]
实际工程里最容易错的是:
- 传感器安装 frame 与视觉模型 frame 混用
- optical frame 轴约定错误
- 腕部相机随 link 运动,但数据解析脚本仍按固定相机处理
8.7 传感器噪声与标定接口
本篇只讨论资产层如何暴露接口:
- 相机内参
- 相机外参
- 深度 scale
- IMU bias 初值
- LiDAR beam spec
- 力觉零点
真正的系统标定流程见 标定与系统集成。
8.8 传感器资产配置示例
camera_asset = {
"name": "wrist_cam",
"frame_id": "wrist_cam_optical_frame",
"resolution": [640, 480],
"fov_deg": 72.0,
"rate_hz": 30,
"latency_ms": 20,
"noise": {
"read_noise": 0.01,
"white_balance_jitter": 0.05,
},
}
<sensor name="front_depth" type="depth">
<update_rate>30</update_rate>
<camera>
<horizontal_fov>1.05</horizontal_fov>
<image><width>640</width><height>480</height></image>
</camera>
</sensor>
8.9 传感器资产 Checklist
| 检查项 | 目标 |
|---|---|
| frame 命名 | 明确、唯一 |
| 外参 | 文档化 |
| 频率 | 与控制/记录链路匹配 |
| 延迟 | 明确可随机化 |
| 噪声模型 | 有合理默认值 |
| 数据接口 | 可直接写入 dataset schema |
9. 场景与环境资产
9.1 场景资产与物体资产的区别
场景资产强调的是组合关系和空间语义,而不仅是单一物体。
例如“厨房台面”不是一个简单桌子,它往往包含:
- 台面
- 橱柜
- 抽屉
- 挂架
- 背景墙
- 顶灯
- 摄像机安装位
9.2 常见场景模板
| 场景模板 | 核心资产 |
|---|---|
| 桌面操作台 | 桌子、背景板、收纳盒、目标物、固定相机 |
| 家庭厨房 | 台面、橱柜、抽屉、杯碗、家电、顶灯 |
| 仓储货架 | 货架、箱体、通道、托盘、条码面 |
| 工业工位 | 治具、夹具、工件、输送带、护栏 |
| 室内导航空间 | 房间、门、走廊、障碍、语义标签 |
| 室外地形 | 路面、坡道、石块、草地、光照环境 |
9.3 灯光布局模板
| 模板 | 用途 |
|---|---|
| 顶灯均匀照明 | 常规训练 |
| 单侧强光 | 制造阴影和高光 |
| 背光 | 测视觉鲁棒性 |
| HDR 环境光 | 提升整体真实感 |
9.4 背景与干扰物资产
背景物虽然不参与任务,但常常决定视觉泛化:
- 空桌面 vs 杂乱桌面
- 统一纯色背景 vs 家庭杂物背景
- 工位干净 vs 工具随机摆放
这些通常应做成可采样模板,而不是手工摆一次就结束。
9.5 场景资产的层级组织
graph TD
A[Scene Template] --> B[Static Layout]
A --> C[Movable Objects]
A --> D[Lighting Pack]
A --> E[Sensor Rig]
A --> F[Reset Logic Metadata]
9.6 大场景与分块管理
对仓储、室内导航、工厂等大场景,建议做分块:
room_a.usdcorridor_1.usdworkcell_pick_place.usdwarehouse_shelf_block_3.usd
这样便于:
- 流式加载
- 版本管理
- 局部替换
- benchmark 组合
9.7 场景资产 Checklist
| 检查项 | 合格标准 |
|---|---|
| 地面高度 | 统一零参考 |
| 灯光模板 | 可切换 |
| 障碍层 | 可单独启停 |
| 相机位 | 命名与外参清晰 |
| scene graph | 层次稳定 |
| reset anchor | 物体初始点可采样 |
10. 主流资产描述格式
10.1 不同格式的资产表达能力
| 格式 | 强项 | 短板 | 更适合表达什么 |
|---|---|---|---|
| URDF | 机器人骨架、ROS 生态兼容 | 场景表达弱、闭链弱 | 机器人本体 |
| MJCF | 接触、执行器、传感器、约束丰富 | 场景协作生态弱 | 机器人和操作物理 |
| SDF | 场景、多模型、光源、传感器完整 | 社区主要集中在 Gazebo 生态 | 世界与场景 |
| USD | 场景图强、协作强、材质与物理兼容性强 | 复杂度高、生态偏 Omniverse | 大型世界和资产库 |
| OBJ/STL/FBX/glTF | 网格交换方便 | 不直接表达完整物理世界 | mesh 本体 |
10.2 URDF 从资产角度怎么看
URDF 更像“机器人骨架描述”,适合:
- 关节链
- link 视觉与碰撞定义
- 传动和插件挂接
但不适合做完整世界资产管理,因为它对:
- 大型场景
- 多对象布局
- 灯光
- 全局物理配置
支持有限。
10.3 MJCF 的资产工程价值
MJCF 的价值在于它把物理资产表达得更细:
geom可直接表达原始碰撞几何actuator描述驱动类型sensor原生挂接equality处理闭链solref/solimp/condim处理接触求解细节
对以 MuJoCo 为核心的平台,MJCF 通常是“可训练资产”的自然表达方式。
10.4 SDF 的场景表达优势
SDF 很适合描述:
- 多模型世界
- 光源
- 传感器
- 物理引擎设置
- 插件扩展
因此 Gazebo 生态常把 SDF 当成“机器人 + 场景”一体化表达。
10.5 USD 的资产库思维
USD 最大的优势不是单个文件能描述什么,而是:
- scene graph 清晰
- 引用与实例化强
- layering / composition 适合大型资产库
- 材质、渲染、物理 API 可组合
它天然适合做:
- 场景模板库
- 机器人资产仓库
- 多用户协作编辑
- 数字孪生资产发布
10.6 Mesh 格式如何选
| 格式 | 特点 |
|---|---|
| STL | 简单、常见,但无材质 |
| OBJ | 普通 mesh 交换,支持材质引用 |
| FBX | DCC 工具常用,但软件实现差异大 |
| glTF | 适合轻量可视化与 Web |
| USD Mesh | 适合 Omniverse / OpenUSD 资产生态 |
10.7 一个资产通常需要多格式共存
一个成熟项目中,同一资产可能同时存在:
robot.urdfrobot.usdrobot_collision.stlrobot_visual.fbxmetadata.yaml
这不是混乱,而是因为不同环节有不同消费方。
11. 资产生产工作流
11.1 从 CAD 到仿真器的端到端流程
flowchart TD
A[机械/CAD 原型] --> B[导出 STEP/FBX/OBJ]
B --> C[网格清理与重拓扑]
C --> D[制作视觉材质]
D --> E[制作 collision proxy]
E --> F[补质量/质心/惯量]
F --> G[绑定关节/驱动/传感器]
G --> H[导出 URDF/MJCF/SDF/USD]
H --> I[导入仿真器]
I --> J[物理与视觉验证]
J --> K[版本登记与发布]

图:资产工作流的最后一步不是“文件导进去了”就结束,而是要在仿真器里检查 scene hierarchy、属性面板、资源绑定和基础可视化状态。Stage / Property / Content 这类面板是资产验收的重要入口。
11.2 推荐目录结构
assets/
├── robots/
│ └── franka_like_arm/
│ ├── meshes/
│ ├── textures/
│ ├── urdf/
│ ├── usd/
│ └── metadata.yaml
├── objects/
│ └── mug_01/
├── scenes/
│ └── kitchen_counter_v2/
├── sensors/
│ └── rgbd_front_cam/
└── materials/
└── brushed_metal/
11.3 版本管理与可追溯
建议每个资产都带:
asset_idversionsourceunitlicensesim_test_statuslast_validated_platforms
11.4 资产 manifest 示例
asset_id: mug_01
version: 2.1.0
category: rigid_object
source: internal_scan
unit: meter
formats:
visual_mesh: meshes/mug_visual.obj
collision_mesh: meshes/mug_collision.obj
usd: usd/mug_01.usd
physics:
mass_kg: 0.32
static_friction: 0.55
dynamic_friction: 0.42
semantics:
affordances: [grasp_side, place_upright]
container: true
11.5 自动化校验脚本应该做什么
资产 CI 可以检查:
- 文件是否存在
- 命名是否符合规范
- mesh 是否过大/过小
- 关节限制是否有效
- 惯量矩阵是否正定
- 贴图路径是否失效
- 导入仿真器 smoke test 是否通过
12. 平台落地示例
12.1 Isaac Sim / Omniverse
Isaac Sim 资产重点:
- USD / OpenUSD 组织
- RTX 材质
- PhysX 物理属性
- 传感器和 Replicator/随机化接口
from pxr import Usd, UsdGeom, UsdPhysics
stage = Usd.Stage.CreateNew("table_scene.usda")
table = UsdGeom.Xform.Define(stage, "/World/Table")
UsdPhysics.RigidBodyAPI.Apply(table.GetPrim())
UsdPhysics.CollisionAPI.Apply(table.GetPrim())
stage.Save()
12.2 MuJoCo / MJCF
MuJoCo 资产重点:
- 直接用
geom构建碰撞和近似视觉 mesh引用外部资源- actuator/sensor/contact 参数表达强
<body name="cup" pos="0.5 0 0.75">
<freejoint/>
<geom type="mesh" mesh="cup_visual" rgba="0.9 0.2 0.2 1"/>
<geom type="capsule" fromto="0 0 0 0 0 0.1" size="0.03" contype="1" conaffinity="1"/>
</body>
12.3 Gazebo / SDF
Gazebo 资产重点:
- 世界和场景资产表达完整
- 传感器插件丰富
- ROS 生态接入方便
<model name="workbench">
<static>true</static>
<link name="bench_link">
<visual name="visual">
<geometry><box><size>1.2 0.8 0.75</size></box></geometry>
</visual>
<collision name="collision">
<geometry><box><size>1.2 0.8 0.75</size></box></geometry>
</collision>
</link>
</model>
12.4 SAPIEN / ManiSkill
SAPIEN/ManiSkill 资产重点:
- 操作任务对象资产丰富
- PartNet-Mobility 等可交互对象适配好
- RGB-D + 点云资产接口自然
12.5 选择建议
| 平台 | 更适合的资产工作 |
|---|---|
| Isaac Sim | 大型场景、写实渲染、企业资产库 |
| MuJoCo | 研究型机器人和操作资产 |
| Gazebo | ROS 联调、场景化系统资产 |
| SAPIEN/ManiSkill | 可交互操作对象和 benchmark 资产 |
13. 资产质量检查清单
13.1 常见错误模式
| 错误 | 现象 | 修复方向 |
|---|---|---|
| 单位错误 | 物体巨大或极小 | 统一 meter |
| 惯量异常 | 物体飞走/发抖 | 重算质心和惯量 |
| 关节轴反 | 操作方向完全相反 | 检查 axis / frame |
| collision 过密 | FPS 暴跌 | 简化碰撞代理 |
| 传感器朝向错 | 图像全偏/深度错位 | 修正 optical frame |
| 材质不一致 | 视觉策略过拟合 | 统一 PBR 流程 |
| 命名混乱 | 数据解析困难 | 建立命名规范 |
13.2 资产验收分级
| 等级 | 标准 |
|---|---|
| 可显示 | 能导入并渲染 |
| 可仿真 | 重力和接触稳定 |
| 可训练 | 支持 reset、批量环境、随机化 |
| 可迁移 | 与实机参数有对齐路径 |
| 可复用 | 目录、版本、元数据规范化 |
13.3 工程踩坑
坑 1:把 CAD mesh 直接当 collision
问题:
- 导入最方便
- 一开始看起来“最真实”
结果:
- 接触抖动
- 训练速度极慢
- 某些姿态下 solver 爆炸
更好的做法是保留视觉 mesh,同时制作粗粒度 collision mesh。
坑 2:只关注 mesh,不管语义
问题:
- 场景看起来很完整
- 物体都摆进去了
结果:
- 不知道哪个面适合抓取
- 不知道门是否打开
- 评测脚本无法直接读状态
因此 affordance、状态标签、语义字段必须成为资产的一部分。
坑 3:传感器配置临时写在任务脚本里
结果:
- 迁移世界时容易丢配置
- 多项目之间无法复用
- 校准和随机化逻辑分散
更好的做法是把传感器抽成单独资产包。
14. 与其他章节的关系
- 想知道不同仿真器各自适合什么,先看 仿真平台。
- 想知道 PhysX、MuJoCo、Gazebo、SAPIEN 在接触和渲染上的差异,看 仿真工具对比。
- 想看 URDF/MJCF/SDF 的基础语法和开发工具,看 开发工具链。
- 想理解资产如何进入可训练世界,以及时间步、接触求解、随机化如何生效,看 仿真世界构建与物理规则。
- 想从 Sim2Real 角度理解为什么纹理、灯光、传感器噪声要做成可控资产,看 Sim2Real。
- 想把机器人资产与控制接口联系起来,看 控制理论。
15. 参考文献与延伸阅读
- Pixar, OpenUSD Documentation.
- NVIDIA, Isaac Sim Documentation.
- DeepMind, MuJoCo Documentation.
- Open Robotics, SDFormat Specification.
- UCSD / ManiSkill 团队,ManiSkill2 / ManiSkill3 Documentation.
- PartNet-Mobility dataset papers and docs.
- Stanford robosuite documentation.
- 仿真平台
- 仿真世界构建与物理规则
- 开发工具链