3 most important points
- 仿真环境能够解决真机资源不足的问题、保证环境可控、验证算法,但通常与现实有差距
- 针对不同的应用场景,有不同的仿真器与基准,推荐 IsaacSim 和 MuJoCo
- 除了环境仿真,机器人的动力学模拟也有相应 API,推荐 Drake 和 Pinocchio
5 thoughts
Notes
简介
- 优点
- 解决真机资源不足的问题
- 保证环境的一致和稳定
- 控制灵活,可验证算法
- 缺点
- 仿真环境与真实环境差别过大
常见仿真平台
仿真器 应用范围 先进性 普及度 IsaacGym 大规模并行 RL 仿真(几千环境并行),适合训练智能体 前沿,GPU 加速物理,速度极快 在 RL/AI 学界热度高,但受限于 NVIDIA GPU IsaacSim 高保真机器人仿真,支持传感器、数字孪生、工业应用 最前沿之一,渲染 + 物理 + 传感器综合强 工业和学术都在用,但安装和硬件门槛高 MuJoCo 学术研究,经典 RL benchmark(Hopper, HalfCheetah 等) 高精度动力学建模,物理准确,渲染一般 学术界极为常见,很多 RL baseline 都依赖它 Sapien 机器人操作、物体交互(manipulation、抓取、装配) 高性能物理,尤其在操作任务上很强 在操作研究里逐渐流行,但比 MuJoCo / PyBullet 小众 CoppeliaSim (V-REP) 综合机器人仿真,适合教学与多传感器集成 功能全但技术稍旧,渲染和物理不算顶尖 教育和实验室常用,入门友好 PyBullet 轻量级仿真,常用于 RL 教学 / 快速实验 中等,物理和渲染比 IsaacSim / MuJoCo 弱 非常普及,社区活跃,使用门槛低 Genesis 新一代具身 AI 仿真器,多物理类型 + GPU 加速 前沿(软体、布料、刚体等都能模拟) 新平台,潜力大,目前小众 SOFA 医学仿真(软体组织、手术)、软体机器人 在软体仿真方面最先进之一 在医疗和软体机器人领域常见,但通用 AI 社区少见 GenieSim 具身 AI 任务仿真(偏 RL/AI 研究) 前沿,定制化面向 AI 研究 新兴平台,普及度低
quadrantChart title 仿真器:技术先进性 vs 普及度 x-axis "技术先进性(低)" --> "技术先进性(高)" y-axis "普及度(低)" --> "普及度(高)" quadrant-1 "先进 & 常见" quadrant-2 "次先进 & 常见" quadrant-3 "次先进 & 小众" quadrant-4 "先进 & 小众" IsaacSim: [0.9, 0.7] IsaacGym: [0.8, 0.6] MuJoCo : [0.8, 0.9] Sapien : [0.7, 0.6] CoppeliaSim: [0.5, 0.7] PyBullet: [0.5, 0.9] Genesis: [0.9, 0.4] SOFA: [0.7, 0.3] GenieSim: [0.8, 0.2]
- 为什么有多种仿真器?
- 物理能力不同 → 使用环境不同
- 有的偏 刚体动力学(MuJoCo、PyBullet) → 适合跑控制/运动任务。
- 有的支持 软体 / 布料 / 生物组织(SOFA、Genesis) → 适合医疗或复杂材料模拟。
- 有的强调 GPU 并行(IsaacGym、Genesis) → 适合大规模 RL。
- 传感器与感知接口不同 → 使用环境不同
- IsaacSim / CoppeliaSim 集成了 相机、激光雷达、IMU 等传感器仿真。
- MuJoCo / PyBullet 则更轻量,传感器支持较少。
- 这直接决定了是否能研究 视觉导航 / 感知任务。
- 环境和任务封装 → 仿真器和专属 benchmark 生态绑定
- MuJoCo → 封装了一系列标准 RL 任务(HalfCheetah, Ant, Hopper…)。
- Sapien → 提供 ManiSkill 任务集(抓取、堆叠、装配等)。
- IsaacSim → 提供 IsaacLab/IsaacGymEnvs(导航、操作、群体任务)。
- SOFA → 内置了 手术场景、器官组织模型。
- 物理能力不同 → 使用环境不同
- 建模与动力学计算库 针对机器人本身的物理性质进行模拟
- Drake:最推荐,就业价值最高(尤其是自动驾驶和机器人学界)。
- Pinocchio:科研导向,就业也有价值,但主要集中在机器人/研究机构。
- 能处理机器人模型(URDF/SRDF)→ 自动生成运动学树和动力学方程。
- 提供常用的算法:正/逆运动学、正/逆动力学、雅可比计算、质心轨迹、接触动力学等等。
- iDynTree:小众,局部价值。
- RBDL:教学/轻量库,工业价值低。
仿真参数
<!-- base link -->
<link name="base_link">
<visual>
<origin xyz="0 0 0.0" rpy="0 0 0"/>
<geometry>
<cylinder length="0.12" radius="0.10"/>
</geometry>
<material name="blue">
<color rgba="0.1 0.1 1.0 0.5" />
</material>
</visual>
<collision>
<origin xyz="0 0 0.0" rpy="0 0 0"/>
<geometry>
<cylinder length="0.12" radius="0.10"/>
</geometry>
<material name="blue">
<color rgba="0.1 0.1 1.0 0.5" />
</material>
</collision>
<inertial>
<mass value="0.2"/>
<inertia ixx="0.0122666" ixy="0" ixz="0" iyy="0.0122666" iyz="0" izz="0.02"/>
</inertial>
</link>
<!-- 支撑轮摩擦力设置为 0 -->
<gazebo reference="caster_link">
<mu1 value="0.0"/> <!-- 摩擦力 1 -->
<mu2 value="0.0"/> <!-- 摩擦力 2 -->
<kp value="1000000.0" /> <!-- 刚性系数 1 -->
<kd value="10.0" /> <!-- 刚性系数 2 -->
</gazebo>- 通过 Python 脚本动态生成
exec(line.strip())直接用 API 创建物体- 优点:
- 灵活,可通过变量/循环/函数动态生成多种物体(指不同尺寸、质量、摩擦系数等,这些不能使用 API 设置)
- 便于实验、教学和快速原型
- 缺点:
- 模型和代码高度耦合 → 不容易在别的仿真器里复用
- 对团队协作和大规模模型管理不太友好
- 优点:
# 这里使用 PyBullet
# 碰撞体
collision_shape_id = client.createCollisionShape(
shapeType=client.GEOM_BOX,
halfExtents=[cube_size/2]*3
)
# 外观
visual_shape_id = client.createVisualShape(
shapeType=client.GEOM_BOX,
halfExtents=[cube_size/2]*3,
rgbaColor=[0.5,0.5,0.5,1]
)
# 质量与惯性
mass = 1.0
# 惯性如果不提供,PyBullet 会自动计算
# 位置与姿态
position = [0.7, 0.0, cube_size/2]
orientation = client.getQuaternionFromEuler([0,0,0])
# 创建刚体物体
cube_id = client.createMultiBody(
baseMass=mass,
baseCollisionShapeIndex=collision_shape_id,
baseVisualShapeIndex=visual_shape_id,
basePosition=position,
baseOrientation=orientation
)