跳转至

仿真资产

仿真资产(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 位置错误,抽屉门把手一抓就飞。
  • 命名和元数据混乱,数据生成后无法追溯版本。

可以把资产质量看成一种隐式先验:

\[ \text{Training Outcome} \approx f(\text{Policy}, \text{World}, \text{Assets}, \text{Physics}, \text{Data}) \]

在很多工程场景中,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 资产工程的核心目标

一个“好资产”不是看起来漂亮而已,它要同时满足:

  1. 几何正确:尺寸、坐标轴、局部原点、法线、拓扑没有明显错误。
  2. 视觉可信:材质和贴图能表达外观差异,支持后续视觉随机化。
  3. 物理稳定:质量、惯量、碰撞代理、关节限制合理,能稳定求解。
  4. 交互明确:抓取点、接触面、铰接轴、可动部件定义清楚。
  5. 可复用:命名、目录、元数据、版本管理规范。
  6. 可迁移:能在多个仿真器或数据管线中转换和复用。

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 资产不是文件,而是“文件 + 语义 + 规则”

同一个杯子,在工程上至少有四层表达:

  1. cup_visual.obj:视觉网格
  2. cup_collision.obj:碰撞代理
  3. cup.usd / cup.xml:物理与层级定义
  4. metadata.json:类别、抓取面、可倒液体、材质标签、语义 ID

因此资产本质上是:

\[ \text{Asset} = \text{Geometry} + \text{Appearance} + \text{Physics} + \text{Semantics} + \text{Versioning} \]

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 视觉资产的目标不是“越真实越好”

视觉资产通常在三个目标之间取平衡:

  1. 写实性:尽量接近真实照片或真实场景。
  2. 可控性:便于随机化颜色、纹理、反射、光照。
  3. 性能:训练环境能跑得动。

对仿真训练而言,“可控且稳定的逼真”通常比“极限画质”更重要。

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}\)

对离散质量点近似,有:

\[ \mathbf{c} = \frac{1}{M}\sum_i m_i \mathbf{r}_i \]
\[ \mathbf{I} = \sum_i m_i \left[(\mathbf{r}_i^\top \mathbf{r}_i)\mathbf{I}_3 - \mathbf{r}_i \mathbf{r}_i^\top\right] \]

如果惯量过小,物体会像纸片一样乱飞;如果惯量过大,控制器又会显得迟钝。对机器人 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

除了真实碰撞体,很多工程系统还会额外维护两类代理:

  1. Contact Proxy:为求解器服务的接触简化模型
  2. Affordance Proxy:为抓取、插入、按钮按压等高层交互服务的语义代理

例如杯子可以有:

  • 外壁碰撞体
  • 内腔碰撞体
  • 抓取区域 proxy
  • 液体容积 proxy

5.8 物理资产的验收方式

最常见的物理资产 smoke test:

  1. 自由落体是否稳定
  2. 斜面滚动是否合理
  3. 夹爪抓取后是否抖动/穿透
  4. 多次 reset 后姿态是否一致
  5. 批量并行环境中是否出现单个 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_link
  • shoulder_link
  • wrist_roll_joint
  • left_finger_pad
  • camera_front_optical_frame
  • tool0

命名混乱带来的直接问题包括:

  • 数据记录难以解析
  • 控制器配置容易错绑
  • 跨平台转换脚本脆弱
  • 训练日志难比对

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 个问题

每个可交互物体最好明确:

  1. 物体类别是什么?
  2. 是否可抓取?
  3. 是否可开合/旋转/插拔?
  4. 关键操作区域在哪里?
  5. 哪些部分参与碰撞?
  6. 哪些参数允许随机化?
  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.usd
  • corridor_1.usd
  • workcell_pick_place.usd
  • warehouse_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.urdf
  • robot.usd
  • robot_collision.stl
  • robot_visual.fbx
  • metadata.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_id
  • version
  • source
  • unit
  • license
  • sim_test_status
  • last_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.
  • 仿真平台
  • 仿真世界构建与物理规则
  • 开发工具链

评论 #