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="x2"> <geom mass="0"/> <motor ctrlrange="0 13"/> <default class="collision"> <geom group="3" type="box"/> <default class="rotor"> <geom type="ellipsoid" size=".13 .13 .01"/> </default> </default> <site group="5"/> </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="3" type="box"/> <default class="rotor"> <geom type="ellipsoid" size=".13 .13 .01"/> </default> </default> <site group="5"/> </default> </default>首先我们要学会无人机建模中的类建模。这三个类并不是随机创建的,它们代表了机器人建模中的三个抽象层级:
fly (顶级:身份层):定义了“只要属于这架无人机,就必须遵守的基本准则”。比如无论机身还是旋翼,它们的控制输入范围和基本质量规则是统一的。
collision(中级:物理属性层):定义了“所有实体的、会撞到东西的零件”的共性。它把“看得见、摸得着”的物体从抽象的逻辑中分离出来。rotor(底层:特殊形状层):定义了“旋翼这种特殊零件”的几何特征。旋翼和方方正正的机身不同,它需要特殊的形状描述。
那么为什么每个类下面是这些元素(geom, motor 等)
这是根据属性的作用域来决定的:
顶级类 (
x2) 放motor和geom mass="0":为什么?因为电机(Motor)是全局的,整个无人机的所有电机通常使用相同的电调(ESC)信号范围。
关于
mass="0":这是一个建模技巧。在顶级类设为 0,意味着除非你在具体的零件里手动指定质量,否则默认不计重(通常是为了配合 MuJoCo 自动计算惯量,或者在body层级统一设定质量)。
中间类 (
collision) 放geom group="3":为什么?
group是 MuJoCo 用来控制显示的。通常 group 3 专门给“看不见的碰撞体”用。放在这里,所有碰撞零件就一键归类了。
底层类 (
rotor) 放特定的geom size:为什么?因为只有旋翼才需要定义成“扁平的椭球体”来模拟它扫过的空间。机身是不需要这个尺寸的。
这么做的作用就是避免重复写代码。如果你的无人机有 4 个旋翼、1 个机身、4 个支架,你肯定不想给每个零件都手动设置一遍颜色、碰撞属性和质量。
