注:本文为个人学习笔记,仅为个人理解,如有错误欢迎讨论

前言

本文将对mujoco_playground中的xml文件夹进行介绍,其他脚本以在前文中介绍完毕
Mujoco足式机器人强化学习训练03(四足机器人)
Mujoco足式机器人强化学习训练04(四足机器人)


一、XML文件夹介绍

xml文件夹用来存放mujoco playground中机器人模型文件和环境文件,如下
在这里插入图片描述
go1_mjx_fullcollisions.xml是go1机器人全碰撞模型文件
scene_mjx_…xml是环境(地形)文件
scene中是直接将机器人xml文件include进去,这样可以实现只需要一个xml文件就可以实现多个地形的结合

注:这个全碰撞机器人模型文件中的碰撞体是简化碰撞体,这个很重要!!!
虽然mujoco支持mesh网格文件(即stl文件)进行碰撞,但是在训练的时候会一致warning,而且会降低训练速度(mujoco训练本来就吃显存,个人不建议直接用stl碰撞)

虽然文件夹中有一个xml文件是feetonly,即只有足端是碰撞体,但是个人在实践过程中认为,不如直接使用全碰撞模型效果更好🐶

二、scene_mjx_feetonly_rough_terrain.xml

本文仅以这个文件为例子进行介绍,其他文件和其有异曲同工之处
总体代码如下:

<mujoco model="go1 feet only rough terrain scene">
  <include file="go1_mjx_feetonly.xml"/>

  <statistic center="0 0 0.1" extent="0.8" meansize="0.04"/>

  <visual>
    <rgba force="1 0 0 1"/>
    <global azimuth="120" elevation="-20"/>
    <map force="0.01"/>
    <scale forcewidth="0.3" contactwidth="0.5" contactheight="0.2"/>
    <quality shadowsize="8192"/>
  </visual>

  <asset>
    <!-- https://polyhaven.com/a/rock_face -->
    <texture type="2d" name="groundplane" file="assets/rocky_texture.png"/>
    <material name="groundplane" texture="groundplane" texuniform="true" texrepeat="5 5" reflectance=".8"/>
    <hfield name="hfield" file="assets/hfield.png" size="10 10 .05 1.0"/>
  </asset>

  <worldbody>
    <geom name="floor" type="hfield" hfield="hfield" material="groundplane" contype="1" conaffinity="0" priority="1"
      friction="1.0"/>
  </worldbody>

  <include file="sensor_feet.xml"/>

  <keyframe>
    <key name="home" qpos="
    0 0 0.35
    1 0 0 0
    0.1 0.9 -1.8
    -0.1 0.9 -1.8
    0.1 0.9 -1.8
    -0.1 0.9 -1.8"
      ctrl="0.1 0.9 -1.8 -0.1 0.9 -1.8 0.1 0.9 -1.8 -0.1 0.9 -1.8"/>
    <key name="home_higher" qpos="0 0 0.35 1 0 0 0 0 0.82 -1.63 0 0.82 -1.63 0 0.82 -1.63 0 0.82 -1.63"
      ctrl="0 0.82 -1.63 0 0.82 -1.63 0 0.82 -1.63 0 0.82 -1.63"/>
  </keyframe>
</mujoco>

scene这些xml文件的整体均是先引入机器人模型xml文件,

  <include file="go1_mjx_feetonly.xml"/>

第二步就是创建地形了,本文举的例子是粗糙地形的文件,这个比较特殊所以放在后面去说,如果仅仅想使用平地,可以直接复制flat.xml文件。

第三步一般是keyframe,这个比较重要,因为在joystick.py里面,会读取这个keyframe的信息,作为初始位置,qpos后面的就是xyz坐标和四元数,如果不写就默认是0。

  <keyframe>
    <key name="home" qpos="
    0 0 0.35
    1 0 0 0
    0.1 0.9 -1.8
    -0.1 0.9 -1.8
    0.1 0.9 -1.8
    -0.1 0.9 -1.8"
      ctrl="0.1 0.9 -1.8 -0.1 0.9 -1.8 0.1 0.9 -1.8 -0.1 0.9 -1.8"/>
    <key name="home_higher" qpos="0 0 0.35 1 0 0 0 0 0.82 -1.63 0 0.82 -1.63 0 0.82 -1.63 0 0.82 -1.63"
      ctrl="0 0.82 -1.63 0 0.82 -1.63 0 0.82 -1.63 0 0.82 -1.63"/>
  </keyframe>

ctrl就是控制量,对于position模式的电机来讲,就是电机的位置,如果对于general模式的电机来讲,就是电机的控制信号

三、粗糙地形

mujoco中的复杂地形是通过高度场(hfield)来实现的,主要的实现方式就是创建一个黑白png图像,通过0-255的像素值来反映地形高度,png文件存储在xml文件下的assets文件夹下,go1中的叫hfield.png,assets文件夹下的另一个png图片是颜色图片,就是给地形赋予外观的(把图片贴在地形上)

  <asset>
    <!-- https://polyhaven.com/a/rock_face -->
    <texture type="2d" name="groundplane" file="assets/rocky_texture.png"/>
    <material name="groundplane" texture="groundplane" texuniform="true" texrepeat="5 5" reflectance=".8"/>
    <hfield name="hfield" file="assets/hfield.png" size="10 10 .05 1.0"/>
  </asset>

  <worldbody>
    <geom name="floor" type="hfield" hfield="hfield" material="groundplane" contype="1" conaffinity="0" priority="1"
      friction="1.0"/>
  </worldbody>

调用方法也十分容易,具体代码如上

但是需要注意的是,mujoco playground的gpu加速方法是jax,个人理解是要先把脚本进行一次静态编译,这就会导致hfield的地形不可以在训练中进行更改,而且使用高度场进行训练,训练的时间较长约为5s左右,想较与plane(1.3s左右)慢了不少。


参考文献
1.https://playground.mujoco.org/

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐