Genesis:3行代码搭出你的机器人仿真场景
【免费下载链接】genesis-worldSimulation platform for general-purpose robotics & embodied AI learning.项目地址: https://gitcode.com/GitHub_Trending/genesi/genesis-world
Genesis(前身叫 Genesis)是一个面向通用机器人与具身智能的仿真平台,刚体、布料、流体共用一个场景。本文带你在 5 分钟内理解它、跑通第一个场景,并拿到一套避坑参数。
它补了什么课?
多数物理引擎只做刚体,做布料和流体往往要换工具,换工具的状态迁移很麻烦。Genesis 把刚体、FEM(有限元)、MPM(物质点法)、SPH/PBD(粒子流体)等多个求解器装进同一个场景,共享同一份状态。
- 一个场景混放刚体、软体和粒子,各自走不同求解器
- 自带 Nyx 物理级渲染(光线追踪,即像素级光影)和 GPU 编译器 Quadrants,CPU、CUDA、Metal 都能跑
- 纯 Python 接口,场景、实体、控制都是几十行的脚本
30秒跑通第一个场景
先确认环境:pip install genesis-world,然后把仓库拉下来(示例依赖仓库内的模型文件):git clone https://gitcode.com/GitHub_Trending/genesi/genesis-world。下面这段代码只做一件事:把一台 Franka 机械臂放到地面上跑起来。
import genesis as gs gs.init(backend=gs.cpu) # 选后端,有显卡可换 gs.gpu scene = gs.Scene() plane = scene.add_entity(gs.morphs.Plane()) # 地面 franka = scene.add_entity( gs.morphs.MJCF(file="xml/franka_emika_panda/panda.xml"), # 机械臂 ) scene.build() # 编译物理世界 for i in range(1000): scene.step() # 每步推进一帧跑起来你会看到机械臂悬停在地面上方、夹爪微微张合,画面静止不动——这是它的零位姿态,属于正常现象。
核心能力速查
| 能力 | 一句话说清 | 你什么时候会用到它 |
|---|---|---|
| 刚体动力学 | 碰撞、摩擦、关节控制一个求解器全包 | 机械臂、四足、无人机等刚性机器人 |
| 多物理求解器 | 刚体、软体、粒子、流体混在同一个场景 | 布料搭在机器臂上这类刚柔耦合任务 |
| 模型导入 | URDF、MJCF、OBJ、GLB、USD 直接读文件 | 从现有模型库拖个机器人进场景 |
| 内置传感器 | 深度相机、IMU、触觉、接触力即挂即取 | 视觉策略、强化学习观测 |
| GPU 并行仿真 | 上千个环境同时推进 | 训练时批量采样 |
拖个 XML 就能导入机器人
scene.add_entity(gs.morphs.MJCF(file="xml/franka_emika_panda/panda.xml"))这一句背后,Genesis 解析 MJCF(MuJoCo 的模型描述格式)文件,建好运动链、关节参数和碰撞体。URDF 同理,换成gs.morphs.URDF(file=...)即可,仓库里 ANYmal、UR5e、KUKA 等示例可直接照抄路径。
拆一个真实场景:Franka 机械臂抓取
需求一句话:让机械臂从零位走到木球上方,闭爪抓起再抬起。
选三个组件:地面Plane、MJCF 导入的 Franka、一个目标物体(示例用Box,换成仓库内的木球网格gs.assets/meshes/wooden_sphere_OBJ/wooden_sphere.obj就是抓球)。
关键流程(完整脚本见 examples/rigid/franka_cube.py,控制循环重复处已省略):
# 手指刚度加大,夹持力才够(对应示例第46-47行) franka.set_dofs_kp([100.0, 100.0], fingers_dof) franka.set_dofs_kv([10.0, 10.0], fingers_dof) # 逆运动学算出把手伸到球上方的关节角(示例第53-59行) qpos = franka.inverse_kinematics( link=end_effector, pos=np.array([0.65, 0.0, 0.135]), ) franka.control_dofs_position(qpos[:-2], motors_dof) # 闭爪:手指位置指令从 0.04 收到 0.0,再抬腕(示例第66-84行)效果:手臂先悬停在球上方,手指收拢抓住物体,末端抬高后物体被稳稳吊在空中。换个思路:把Box换成gs.morphs.Mesh(file="...wooden_sphere.obj"),再给相机加一个传感器,就是一个视觉抓取任务。
踩坑与调优
- 抓不住、手指打滑→ 手指增益太小 → 手指两维 DOF 的
set_dofs_kp提到[100.0, 100.0],set_dofs_kv设[10.0, 10.0],这是 franka_cube 示例验证过的组合。 - 物体穿模、直接爆炸→ 时步太大 →
gs.options.SimOptions(dt=0.01),刚体多时步再小一点,代价是仿真变慢。 - 两个刚体互相穿过→ 碰撞检测没开 → 场景里加
rigid_options=gs.options.RigidOptions(box_box_detection=True),开启箱-箱窄相检测。
接着往哪走
- 多物理场耦合(布料搭刚体、水轮机、沙子轮):examples/coupling/
- 传感器接入与批量环境(深度相机、IMU、接触力):examples/sensors/
- 渲染这条线有独立仓库 genesis-nyx,做物理级画面时它单独展开讲。
【免费下载链接】genesis-worldSimulation platform for general-purpose robotics & embodied AI learning.项目地址: https://gitcode.com/GitHub_Trending/genesi/genesis-world
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考