前言

我们先复习一下我们的建模顺序

1.全局环境搭建 2.资源准备 3.骨架构建 4.定义自由度(Joints)5.添加形状(Geoms)6添加约束与传动 7 添加动力 8 添加观测

如果有忘记的伙伴可以去看我的第一篇文章mujoco建模(一)

我们这篇文章先完成全局环境搭建与资源准备

<mujoco model="sim">
   <compiler autolimits="true" />

   <option timestep="0.01" density="1.225" viscosity="1.8e-5"/>
    

    <default>
        <default class="fly">
            
            <geom mass="0"/>
            <motor ctrlrange="0 13"/>

            <default class="collision">
                <geom group="1" type="box"/>

                <default class="rotor">
                    <geom type="ellipsoid" size=".13 .13 .01"/>
                </default>
            </default>
            
            <site group="2"/>
        </default>
    </default>

    <asset>
        <texture type="skybox" builtin="gradient" rgb1="0.3 0.5 0.7" rgb2="0 0 0" width="512" height="3072"/>
        <texture type="2d" name="groundplane" builtin="checker" mark="edge" rgb1="0.2 0.3 0.4" rgb2="0.1 0.2 0.3"
            markrgb="0.8 0.8 0.8" width="300" height="300"/>
        <material name="groundplane" texture="groundplane" texuniform="true" texrepeat="5 5" reflectance="0.2"/>
    </asset>

    <worldbody>
        <light pos="0 0 1.5" dir="0 0 -1" directional="true"/>
        <geom name="floor" size="0 0 0.05" type="plane" material="groundplane"/>
    </worldbody>
 
</mujoco>

1配置全局环境

   <compiler autolimits="true"/>

   <option timestep="0.01" density="1.225" viscosity="1.8e-5"/>

作用

  • autolimits="true":MuJoCo 会自动根据你的 geom/motor 设置生成默认的安全控制范围,保证仿真不会出现非法状态。
  • timestep 决定控制频率、积分精度。(此处参考值可直接引用)
  • density / viscosity 可用于后续建风阻或推进力模型。(此处参考值可直接引用

2让他好看一点


    <asset>
        <texture type="skybox" builtin="gradient" rgb1="0.3 0.5 0.7" rgb2="0 0 0" width="512" height="3072"/>
        <texture type="2d" name="groundplane" builtin="checker" mark="edge" rgb1="0.2 0.3 0.4" rgb2="0.1 0.2 0.3"
            markrgb="0.8 0.8 0.8" width="300" height="300"/>
        <material name="groundplane" texture="groundplane" texuniform="true" texrepeat="5 5" reflectance="0.2"/>
    </asset>
  • 这一段代码 完全是渲染资源,对物理仿真、控制和动力学没有任何影响,感兴趣的小伙伴可以交给ai解析一下,这里不做过多赘述。
  • 用途:
    1. 天空盒:模拟环境天空
    2. 棋盘格地面:让无人机飞行视觉上更有参考
    3. 材质控制:纹理重复、均匀度、反射

3添加基础的光源的地面

    <worldbody>
        <light pos="0 0 1.5" dir="0 0 -1" directional="true"/>
        <geom name="floor" size="0 0 0.05" type="plane" material="groundplane"/>
    </worldbody>
  • pos="0 0 1.5":光源在世界坐标系的位置 (x, y, z)
  • dir="0 0 -1":光线方向向量 (dx, dy, dz)(0,0,-1) 表示光线朝下照射
  • directional="true":光源类型true → 平行光(类似太阳光),光线方向固定

4无人机的全局配置(重要)

    <default>
        <default class="fly">
            
            <geom mass="0"/>
            <motor ctrlrange="0 13"/>

            <default class="collision">
                <geom group="1" type="box"/>

                <default class="rotor">
                    <geom type="ellipsoid" size=".13 .13 .01"/>
                </default>
            </default>

            <site group="2"/>
        </default>
    </default>

首先我们要学会无人机建模中的类建模。这三个类并不是随机创建的,它们代表了机器人建模中的三个抽象层级

  • fly (顶级:身份层):定义了“只要属于这架无人机,就必须遵守的基本准则”。比如无论机身还是旋翼,它们的控制输入范围和基本质量规则是统一的。

  • collision (中级:物理属性层):定义了“所有实体的、会撞到东西的零件”的共性。它把“看得见、摸得着”的物体从抽象的逻辑中分离出来。

  • rotor (底层:特殊形状层):定义了“旋翼这种特殊零件”的几何特征。旋翼和方方正正的机身不同,它需要特殊的形状描述。

那么为什么每个类下面是这些元素(geom, motor 等)

这是根据属性的作用域来决定的:

  • 顶级类 (x2) 放 motorgeom mass="0"

    • 为什么? 因为电机(Motor)是全局的,整个无人机的所有电机通常使用相同的电调(ESC)信号范围。

    • 关于 mass="0":这是一个建模技巧。在顶级类设为 0,意味着除非你在具体的零件里手动指定质量,否则默认不计重(通常是为了配合 MuJoCo 自动计算惯量,或者在 body 层级统一设定质量)。

  • 中间类 (collision) 放 geom group="1"

    • 为什么? group 是 MuJoCo 用来控制显示的。通常 group 1 专门给“看不见的碰撞体”用。放在这里,所有碰撞零件就一键归类了。

  • 底层类 (rotor) 放特定的 geom size

    • 为什么? 因为只有旋翼才需要定义成“扁平的椭球体”来模拟它扫过的空间。机身是不需要这个尺寸的。

这么做的作用就是避免重复写代码。如果你的无人机有 4 个旋翼、1 个机身、4 个支架,你肯定不想给每个零件都手动设置一遍颜色、碰撞属性和质量。

Logo

更多推荐