文章目录
MJCF和URDF的区别
MJCF(MuJoCo XML Format)与 URDF(Unified Robot Description Format)都是一种基于XML文件格式,URDF主要用于描述机器人本身,而MJCF的描述范围更丰富,还包括环境信息以及复杂的物理属性。二者在文件结构逻辑上一致,但标签有所不同。
一、URDF
URDF中描述的机器人本体信息,由连杆(link)和关节(joint)组成。link由joint连接起来。其拓扑结构类似于数据结构中的树,link为节点,joint为边,如下图:
该拓扑结构存在一定的限制,即:
- 无闭环
- 一个child 只能有一个parent link
- 只有root link(也就是connectivity graph的起源)可以有多个分支
- 一个模型只能由一个root link
参考:URDF学习(一)什么是URDF以及怎么理解一个URDF文件
另外,link和joint中都有一些属性,见如下代码及注释:
<robot name> <!-- 定义机器人模型的顶层元素,name 为机器人名称 -->
<link name> <!-- 定义机器人的一个链接(或部件),name 是链接的名称 -->
<inertial> <!-- 定义链接的惯性属性 -->
<origin xyz="0 0 0" rpy="0 0 0" /> <!-- 惯性中心相对于链接参考点的位置和方向,xyz 表示位置,rpy 表示绕 x, y, z 轴的旋转(单位为弧度) -->
<mass value /> <!-- 链接的质量 -->
<inertia ixx iyy izz ixy ixz iyz /> <!-- 定义惯性矩阵的六个值(ixx, iyy, izz, ixy, ixz, iyz) -->
</inertial>
<visual name> <!-- 定义链接的视觉外观 -->
<origin xyz="0 0 0" rpy="0 0 0" /> <!-- 视觉几何体的位姿,xyz 表示位置,rpy 表示旋转 -->
<geometry> <!-- 定义视觉模型的几何形状 -->
<box size /> <!-- 定义一个盒子,size 指定其尺寸 -->
<cylinder radius length /> <!-- 定义一个圆柱体,radius 和 length 指定其半径和长度 -->
<sphere radius /> <!-- 定义一个球体,radius 指定其半径 -->
<mesh filename scale="1" /> <!-- 使用外部网格文件定义形状,filename 为文件路径,scale 为缩放因子 -->
</geometry>
<material name> <!-- 定义视觉模型的材质 -->
<color rgba="0.5 0.5 0.5 1" /> <!-- 设置颜色,rgba 表示红、绿、蓝、透明度值 -->
<texture filename /> <!-- 定义材质的纹理文件,filename 为纹理路径 -->
</material>
</visual>
<collision name> <!-- 定义链接的碰撞属性 -->
<origin xyz="0 0 0" rpy="0 0 0" /> <!-- 碰撞几何体的位置和方向,xyz 和 rpy 定义位姿 -->
<geometry> <!-- 定义碰撞模型的几何形状,格式与 <visual> 中相同 -->
<box size /> <!-- 定义一个盒子,size 指定其尺寸 -->
<cylinder radius length /> <!-- 定义一个圆柱体,radius 和 length 指定其半径和长度 -->
<sphere radius /> <!-- 定义一个球体,radius 指定其半径 -->
<mesh filename scale="1" /> <!-- 使用外部网格文件定义形状,filename 为文件路径,scale 为缩放因子 -->
</geometry>
</collision>
</link>
<joint name type> <!-- 定义两个链接之间的关节,name 为关节名称,type 为关节类型(如 revolute、continuous、prismatic、fixed 等) -->
<origin xyz="0 0 0" rpy="0 0 0" /> <!-- 关节的原点位置和方向,xyz 和 rpy 定义其位姿 -->
<parent link /> <!-- 定义父链接名称 -->
<child link /> <!-- 定义子链接名称 -->
<axis xyz="1 0 0" /> <!-- 定义关节的旋转轴,xyz 表示旋转轴方向 -->
<calibration rising /> <!-- 校准关节的上升值 -->
<calibration falling /> <!-- 校准关节的下降值 -->
<dynamics damping="0" friction="0" /> <!-- 定义关节的动力学属性,damping 为阻尼系数,friction 为摩擦系数 -->
<limit lower="0" upper="0" effort velocity /> <!-- 定义关节的限制,lower 为最小限位,upper 为最大限位,effort 为最大允许力或力矩,velocity 为最大速度 -->
<mimic joint multiplier="1" offset="0" /> <!-- 定义从属关节的模仿关系,joint 为模仿的目标关节,multiplier 为放大因子,offset 为偏移值 -->
<safety_controller soft_lower_limit="0" soft_upper_limit="0" k_position="0" k_velocity="0" /> <!-- 定义关节的安全控制器,soft_lower_limit 和 soft_upper_limit 为软限位,k_position 为位置增益,k_velocity 为速度增益 -->
</joint>
</robot>
二、MJCF
参见官方文档:https://mujoco.readthedocs.io/en/stable/modeling.html
1.mjcf的嵌套结构和默认设置
mjcf在描述机器人结构时不是用parent link和child link的方式,而是通过直接的嵌套表示其父子关系。且mjcf不仅能表示机器人本体信息,还能表示环境信息,其根主体并不是robot,而是worldbody,worldbody内可嵌套多个body。
此外,mjcf还可以设置默认属性值,以下是一个简单的例子:
<mujoco>
<!-- 定义默认属性组,类名为 "main" -->
<default class="main">
<!-- 设置默认几何体的颜色为红色 (rgba: 红, 绿, 蓝, 透明度) -->
<geom rgba="1 0 0 1"/>
<!-- 嵌套的默认属性组,类名为 "sub",继承自 "main" 类 -->
<default class="sub">
<!-- 覆盖 "main" 类中的默认颜色,将几何体的颜色设置为绿色 -->
<geom rgba="0 1 0 1"/>
</default>
</default>
<!-- 定义场景中的主体 -->
<worldbody>
<!-- 定义一个几何体类型为 "box" 的物体,使用默认的属性(此处无具体颜色,因此使用继承的颜色设置) -->
<geom type="box"/>
<!-- 定义一个子物体,应用 "sub" 类的默认属性 -->
<body childclass="sub">
<!-- 定义一个椭球形几何体,继承 "sub" 类的颜色(绿色) -->
<geom type="ellipsoid"/>
<!-- 定义一个球形几何体,并设置颜色为蓝色 (rgba: 0 0 1 1);此处会覆盖子类的默认颜色 -->
<geom type="sphere" rgba="0 0 1 1"/>
<!-- 定义一个圆柱体几何体,应用 "main" 类的默认属性(红色) -->
<geom type="cylinder" class="main"/>
</body>
</worldbody>
</mujoco>
该例子表示的各个几何体的颜色分别为: