mujoco无人机实战建模(一)
前言
我们先复习一下我们的建模顺序
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解析一下,这里不做过多赘述。
- 用途:
- 天空盒:模拟环境天空
- 棋盘格地面:让无人机飞行视觉上更有参考
- 材质控制:纹理重复、均匀度、反射
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) 放motor和geom mass="0":-
为什么? 因为电机(Motor)是全局的,整个无人机的所有电机通常使用相同的电调(ESC)信号范围。
-
关于
mass="0":这是一个建模技巧。在顶级类设为 0,意味着除非你在具体的零件里手动指定质量,否则默认不计重(通常是为了配合 MuJoCo 自动计算惯量,或者在body层级统一设定质量)。
-
-
中间类 (
collision) 放geom group="1":-
为什么?
group是 MuJoCo 用来控制显示的。通常 group 1 专门给“看不见的碰撞体”用。放在这里,所有碰撞零件就一键归类了。
-
-
底层类 (
rotor) 放特定的geom size:-
为什么? 因为只有旋翼才需要定义成“扁平的椭球体”来模拟它扫过的空间。机身是不需要这个尺寸的。
-
这么做的作用就是避免重复写代码。如果你的无人机有 4 个旋翼、1 个机身、4 个支架,你肯定不想给每个零件都手动设置一遍颜色、碰撞属性和质量。
更多推荐

所有评论(0)