在使用 ROS、Gazebo、MuJoCo、Isaac Lab进行机器人仿真时,经常会遇到一个问题:

机器人模型能够正常导入,但是仿真速度比较慢。

尤其是从 SolidWorks、Creo 等CAD软件导出的机器人URDF模型,很多情况下会直接使用STL作为Collision模型。

例如:

<collision>
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <geometry>
        <mesh filename="Link_1.STL"/>
    </geometry>
</collision>

视觉模型使用高精度STL没有问题,但是如果Collision也直接使用高面数STL,在物理仿真过程中可能增加碰撞检测的计算量。

一、URDF中的Visual和Collision有什么区别?

一个典型的机器人Link通常包含:

<link name="Link_1">

    <visual>
        ...
    </visual>

    <collision>
        ...
    </collision>

    <inertial>
        ...
    </inertial>

</link>

简单理解:

Visual:

负责“看起来是什么样”。

Collision:

负责“物理上碰到哪里”。

Inertial:

负责质量、质心和惯量。

因此:

Visual不一定需要简化,但是Collision通常没有必要使用非常高精度的CAD网格。

二、为什么STL Collision可能影响仿真?

例如一个机械臂Link:

Visual
└── 高精度STL
    └── 数万三角面

如果Collision也使用同一个STL:

Collision
└── 高精度STL
    └── 数万三角面

物理引擎需要不断进行碰撞检测。

尤其在强化学习中:

机器人
   ↓
MuJoCo
   ↓
数十万~数百万Simulation Steps
   ↓
大量碰撞检测

Collision模型越复杂,计算负担通常越大。

因此机器人仿真中经常会对Collision模型进行简化。

三、最简单的优化方法:Box Collision

例如原来的Collision:

<collision>
    <geometry>
        <mesh filename="Link_1.STL"/>
    </geometry>
</collision>

可以替换成:

<collision>
    <origin xyz="0.02 0.01 0.05" rpy="0 0 0"/>
    <geometry>
        <box size="0.1 0.05 0.2"/>
    </geometry>
</collision>

原来的:

STL Mesh
↓
大量三角面

变成:

Box
↓
简单几何体

这样可以显著降低Collision几何复杂度。

四、但是手动修改URDF比较麻烦

假设一个机器人有:

base_link
Link_1
Link_2
Link_3
...
Link_20

如果每个Link都需要手动:

  1. 找到对应STL
  2. 查看STL尺寸
  3. 计算中心位置
  4. 设置Collision origin
  5. 设置Box尺寸
  6. 修改URDF

处理几十个Link会比较麻烦。

因此我自己做了一个小工具:

URDF Collision Box自动生成工具

基本工作流程:

                URDF
                  │
                  ↓
             解析Link
                  │
                  ↓
           自动寻找STL
                  │
                  ↓
          Trimesh读取STL
                  │
                  ↓
          计算几何包围盒
                  │
          ┌───────┴───────┐
          ↓               ↓
       中心坐标          尺寸
          │               │
          └───────┬───────┘
                  ↓
          自动生成Box
                  │
                  ↓
          输出新的URDF

五、软件目前可以做什么?

目前主要实现:

1. 自动读取URDF

选择:

robot.urdf

程序自动解析Link。

2. 自动识别STL

例如:

<mesh filename="Link_3.STL"/>

自动找到:

meshes/Link_3.STL

3. 自动计算STL包围盒

通过Python trimesh读取STL。

计算:

Bounding Box

得到:

中心坐标
X/Y/Z尺寸

4. 自动生成Collision Box

例如:

<collision>
    <origin xyz="0.025 -0.037 0.01" rpy="0 0 0"/>
    <geometry>
        <box size="0.08 0.04 0.12"/>
    </geometry>
</collision>

5. 自动替换原Collision

原来:

<collision>
    <geometry>
        <mesh filename="Link_3.STL"/>
    </geometry>
</collision>

自动替换成:

<collision>
    <origin xyz="..."/>
    <geometry>
        <box size="..."/>
    </geometry>
</collision>

同时不会修改:

Visual
Inertial
Joint

等其他模型信息。

六、适合哪些机器人仿真平台?

目前主要针对:

ROS
 │
 ├── Gazebo
 │
 ├── MuJoCo
 │
 └── Isaac Lab / Isaac Sim

特别是进行机器人强化学习训练时,可以先对Collision进行简化。

例如:

CAD模型
   ↓
URDF
   ↓
Collision优化
   ↓
MuJoCo
   ↓
强化学习

或者:

CAD模型
   ↓
URDF
   ↓
Collision优化
   ↓
Isaac Lab
   ↓
机器人强化学习

七、Box Collision并不是所有模型都适合

需要注意:

Box只是最简单的一种碰撞模型。

例如:

机械臂大臂

使用Box通常比较合适。

但是对于:

复杂夹爪
复杂轮毂
不规则机械结构

单个Box可能会造成比较大的几何误差。

因此更高级的方法是:

STL
 ↓
Convex Hull
 ↓
多个凸包

或者:

STL
 ↓
VHACD
 ↓
多个Convex Hull
 ↓
Collision

后续计划继续增加:

  • Convex Hull自动生成
  • VHACD自动凸分解
  • 多Box自动生成
  • URDF批量处理
  • URDF → MuJoCo XML
  • URDF → Isaac模型

八、Windows直接运行

目前提供Windows版本。

不需要安装:

Python
ROS
MuJoCo
Gazebo

也不需要配置Python环境。

基本使用流程:

① 选择URDF

② 选择Mesh/STL目录

③ 点击生成

④ 获得优化后的URDF

例如:

Jibot3.urdf
       ↓
URDF Collision优化
       ↓
Jibot3_box_collision.urdf

九、适合哪些人?

主要适合:

  • ROS开发者
  • MuJoCo用户
  • Isaac Lab用户
  • 机器人强化学习研究人员
  • 机械臂仿真开发人员
  • 移动机器人开发人员
  • 四足机器人开发人员
  • 高校机器人实验室
  • 机器人数字孪生开发人员

十、工具获取

目前提供Windows版本。

如果你在做:

ROS / URDF / MuJoCo / Isaac Lab机器人仿真

,并且需要批量简化Collision模型,可以尝试这个工具。

工具获取:

👉 【工具地址

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐