前言

mujoco的建模其实很简单,他就和建房子一样,他是有一个基础的框架的,在框架的基础上我们不断地去完善建立一些东西。下面我们就从框架出发带大家一步一步搞清楚他是怎样建模的

1.基础概念

  • Body (刚体):不带形状的概念,只具有质量和惯性属性,也就是重心。

  • Joint (关节):定义 Body 相对于其父节点的自由度(无关节则为固定连接)。

  • Geom (几何体):附着在 Body 上的实体,用于碰撞 (Collision) 或外观 (Visual)。

  • Site (位点):Body 坐标系内的一个点,无质量,常用于定义传感器位置。

  • Transmission (传动机制):力如何作用于关节(如直接作用或通过绳索)

2.MJCF 建模的框架是什么

<mujoco model="模型名称">
    <compiler .../> 
    <option .../>
    
    <asset>
        <mesh .../> <material .../>
    </asset>

    <worldbody>
        <light .../> <geom name="floor" .../> <body name="link1">
            <joint .../>
            <geom .../>
            <body name="link2">
                <joint .../>
                <geom .../>
            </body>
         bodies>
    </worldbody>

    <equality> ... </equality> <tendon> ... </tendon>     <actuator> ... </actuator> <sensor> ... </sensor>     </mujoco>

我们来解释一下上面的框架:

2.1. 顶层配置:规则设定区

在蓝图的最开头,你得先定好“度量衡”和“物理环境”。

  • <compiler> (编译器设置)

    • 作用:告诉 MuJoCo 怎么理解你的数字。

    • 常用属性angle="degree"(我写的 90 是 90 度,不是弧度)、coordinate="local"(坐标是相对父节点的)。

  • <option> (物理选项)

    • 作用:设定模拟环境的物理规律。

    • 常用属性gravity="0 0 -9.81"(重力朝哪指)、timestep="0.002"(模拟步长,越小越精确但越慢)。

2.2 <asset>:仓库区

想象这是一个仓库。如果你想给机器人穿漂亮的衣服(材质)或者用复杂的 3D 打印件(网格模型),你得先把它们放进仓库里,并起个名字。

  • <mesh>:导入外部的 STL 或 OBJ 文件。

  • <material>:定义颜色、反光度、贴图。

  • 逻辑:在这里定义好了,后面在 <geom> 里通过名字调用。

2.3. <worldbody>:舞台区(核心)

这是最重要的地方。所有的刚体、关节、形状都写在这里。

(1) <body> —— 刚体(骨架)
  • 定义:它是一个逻辑上的“块”。它本身没有形状,只是一个坐标系。

  • 特点:Body 里面可以嵌套 Body。嵌套就代表了父子连接

  • 属性name (名字), pos (相对于父节点的位置)。

(2) <joint> —— 关节(轴承)
  • 关键点关节必须写在 <body> 标签内部。

  • 含义:它定义了这个 Body 相对于它的父节点怎么动

    • 如果没有 Joint,这个 Body 就死死地焊在父节点上。

    • 如果有 Joint,它就可以绕着轴转动或滑动。

  • 常用类型hinge (像合页一样转动), slide (像抽屉一样滑动)。

(3) <geom> —— 几何体(肉体/碰撞体)
  • 含义:给看不见的 Body 加上形状。

  • 作用:1. 视觉展示(让你看见它);2. 碰撞检测(让它能撞到地板或别人)。

  • 常用类型box (长方体), sphere (球体), capsule (胶囊体, 最常用,因为计算速度快)。

(4) <site> —— 位点(记号笔)
  • 含义:在 Body 上定一个点。它不参与物理碰撞,也不增加重量。

  • 作用:就像在手臂上贴个标签,告诉传感器“请测这个点的位置”或者“把绳索系在这个点上”。

2.4. 动力与反馈区

  • <actuator> (执行器)

    • 作用:给关节加“电机”。

    • 逻辑:你在 worldbody 里定义了一个 Joint(能动),在这里给它加一个 Actuator(给它力,让它动)。

  • <sensor> (传感器)

    • 作用:安装摄像头、力矩传感器、加速度计等。

3. 从 0-1 建立模型的建模顺序

根据 XML 结构,建议的建模逻辑顺序如下:

  1. 全局环境搭建:在 <compiler> 中设定 angle="degree" (推荐) 和坐标系,在 <worldbody> 中添加地板和灯光。

  2. 资源准备:在 <asset> 中导入复杂的 3D 模型文件 (STL/OBJ) 或定义颜色材质。

  3. 骨架构建(Kinematic Tree):这是最核心的一步。按照“父节点 -> 子节点”的顺序在 <worldbody> 中建立 Body 树。

  4. 定义自由度(Joints):在每个 Body 下添加 Joint。注意:MuJoCo 的关节是定义在子节点上的。

  5. 添加形状(Geoms):为每个 Body 添加 Geom。通常建议每个 Body 至少有两个 Geom:一个用于视觉(好看),一个用于碰撞(简单几何体,提高计算速度)。

  6. 添加约束与传动:如果有闭环链或绳索,添加 <equality><tendon>

  7. 添加动力(Actuators):定义电机,关联到对应的 Joint 上。

  8. 添加观测(Sensors):根据实验需求安装传感器。

Logo

更多推荐