该文件也存在其他的描述形式,在Mujoco仿真中,就需要不同于URDF格式的XML文件进行机器人结构的描述。
2. 为什么要应用模型描述文件模型描述文件为运动学和动力学分析、仿真和可视化提供了基础数据支持。
- 运动学和动力学分析:提供机器人运动学链的信息,使得开发者可以基于该信息进行运动学求解、控制策略设计等,以Openloong开源动力学控制软件包为例,其中应用Pinocchio库进行机器人运动学和动力学分析,它依赖于URDF文件来获取机器人的结构信息,从而计算机器人动力学、运动学相关参数,Pinocchio库计算得到的正逆运动学、动力学方程、雅可比矩阵、机身惯性张量在后续核心算法中有广泛应用。
- 机器人仿真:与仿真引擎结合,模型描述文件允许在虚拟环境中进行机器人的仿真和可视化,使开发者可以验证机器人行为。它允许开发者在仿真环境中观察机器人的行为,测试控制算法,并进行调试。
- 可视化:通过模型描述文件,开发者可以在可视化工具,如Rviz、MATLAB、Mujoco中查看机器人的结构、坐标、惯量等信息,理解机器人各部分之间的关系。这对于调试和开发机器人的控制算法尤为重要。
3. 模型描述文件详解由2我们知道,模型描述文件在动力学控制中有重要作用,模型描述文件一般包括机器人结构、关节、传感器配置等,下面我们以Openloong开源动力学控制软件包为例,详细介绍模型描述文件的各主要部分,由于Openloong算法验证在Mujoco仿真平台上,就以Mujoco要求的XML文件格式进行介绍。
1. <asset>
为外部资源定义标签,一般用于定义mesh的名称和路径。
- <asset>
- <mesh name="base_link" file="base_link.STL"/>
- <mesh name="Link_head_yaw" file="Link_head_yaw.STL"/>
- ...
- </asset>
复制代码2. <worldbody>
包含了整个仿真环境中的所有物体,包括机器人和场景中的固定物体,它是定义物体和几何形状的主要部分。
以下是一个串联系统的示例,该<worldbody>表明,
base_link下并联了两个分支,其中一条分支由
body1和
body2串联而成,另外一条分支由
body3构成,机器人为浮动基座,因此在
base_link的
body下添加自由关节
freejoint 。
- <worldbody>
- <body name="base_link" pos="x x x">
- <freejoint name="float_base" />
- <body name="body1" pos="x x x">
- <inertial pos="x x x" quat="x x x" mass="x" diaginertia="x x x"/>
- <joint name="joint1" pos="0 0 0" axis="1 0 0" limited="true" range="x x"/>
- <geom type="mesh" contype="0" conaffinity="0" group="1" density="0" rgba="x x x 1" mesh="body1"/>
- <geom type="mesh" rgba="x x x 1" mesh="body1"/>
- <body name="body2" pos="x x x">
- ...
- <joint name="joint2" .../>
- ...
- </body>
- </body>
- <body name="body3" pos="x x x">
- ...
- <joint name="joint3" .../>
- ...
- </body>
- </body>
- </worldbody>
复制代码其中<inertial>定义一个物体的惯性属性,包括位置、质量和惯性矩阵:pos为惯性参考点相对于物体本地坐标系原点的位置,quat惯性参考点的四元数用于定义其方向和旋转,mass表示物体的质量,diaginertia为物体的对角惯性矩阵,表示物体在三个主要轴上的惯性。
<joint>定义物体之间的关节,用于连接和限制物体的相对运动:name为关节的名称,用于在模型中标识这个关节,pos为节的相对位置(x, y, z),相对于连接的父体,axis为关节的运动轴,表示关节可以围绕这个轴旋转或移动,limited表明是否限制关节的运动范围,range为关节的运动范围,以最小值和最大值表示。
<geom>定义物体的几何形状,用于描述物体的外观和碰撞检测:type定义几何体的类型为网格,表示用自定义网格文件定义形状,contype为碰撞类型,用于定义物体的碰撞分类(影响与其他物体的碰撞行为),conaffinity为碰撞亲和性,用于定义物体与其他物体的碰撞亲和力(影响碰撞的响应),group为碰撞组,用于将物体分组以控制碰撞检测的逻辑,density为几何体的密度(如果定义了density,通常用于计算碰撞体积和质量),rgba为几何体的颜色和透明度(红、绿、蓝、Alpha通道值)。
第二个 <geom> 标签没有碰撞相关属性,主要定义了网格的可视属性:rgba定义了几何体的颜色和透明度,mesh指定使用名为 body1 的网格文件。
3. <contact>
用于定义碰撞相关的参数,exclude表明两个body的碰撞被忽略,一般为了简化机器人的碰撞,机身body之间的碰撞会被忽略。
- <contact>
- <exclude name="ex_baselink_waist_pitch" body1="base_link" body2="Link_waist_pitch" />
- <exclude name="ex_waist_pitch_waist_roll" body1="Link_waist_pitch" body2="Link_waist_roll" />
- <exclude name="ex_waist_roll_waist_yaw" body1="Link_waist_roll" body2="Link_waist_yaw" />
- ...
- </contact>
复制代码4. <actuator>
用于定义执行器,以下示例为主动关节设置motor类型的执行器,设置了执行器名称、减速比、限幅等。
- <actuator>
- <motor name="M_arm_l_01" joint="J_arm_l_01" gear="1" ctrllimited="true" ctrlrange="-80 80"/>
- ...
- </actuator>
复制代码5. <sensor>
用于配置传感器,以下范例配置了四元数
framequat、速度计
velocimeter、角速度计
gyro、加速度计
accelerometer、力传感器
touch等传感器,安装在
body标签中已定义好的
site处,可根据需要,添加
touch、
force、
torque、
jointpos、
jointvel、
actuatorfrc等传感器。
- <sensor>
- <framequat name="baselink-quat" objtype="site" objname="imu" />
- <velocimeter name="baselink-velocity" site="imu" />
- <gyro name="baselink-gyro" site="imu" />
- <accelerometer name="baselink-baseAcc" site="imu" />
- <touch name="lf-touch" site="lf-tc" />
- <touch name="rf-touch" site="rf-tc" />
- </sensor>
复制代码
除自由度配置、执行器配置、传感器配置,其他更具体的参数修改可参考Mojoco官方
文档。
4. 如何导出描述文件3中我们详细描述了xml文件的主要部分,实际应用中XML文件可以由Mujoco根据urdf文件导出,本部分分享下xml文件的导出过程。
准备机器人的URDF文件和mesh文件(STL格式),添加用于mujoco编译的标签:
- <mujoco>
- <compiler
- meshdir="meshes/"
- balanceinertia="true"
- discardvisual="false" />
- </mujoco>
复制代码切换到mujoco-3.x.x/bin目录,运行指令
将urdf文件拖拽进simulate预览界面中,保存xml,注意,mesh文件目录需要对应。
导出后可根据3中的详解和Mujoco官方文档进行适当修改,可参考
青龙XML文件。