Mujoco足式机器人强化学习训练05(XML机器人模型文件)
本文介绍了Mujoco仿真环境中XML文件夹的使用方法,重点解析了机器人模型文件和环境文件的配置。文章以scene_mjx_feetonly_rough_terrain.xml为例,详细说明了文件结构:首先引入机器人模型,然后创建地形,最后设置关键帧。特别讲解了粗糙地形的实现方式,即通过高度场(hfield)将黑白PNG图像转换为三维地形。作者指出使用全碰撞模型比仅足端碰撞效果更好,并提醒高度场地
注:本文为个人学习笔记,仅为个人理解,如有错误欢迎讨论
前言
本文将对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/
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)