两种定义方式
1
<body name="arm_low_l" pos="-.06 0 -.016" quat="0 0 0.707107 0.707107">
<joint name="l_elbow" range="-1.3 1.57" type="hinge"/>
<geom type="cylinder" size="0.001 0.008"/>
</body>
2
<body pos="0 0 2" euler="0 0 0">
<joint name="pin" type="hinge" axis = "0 -1 0" pos="0 0 0.5"/>
<geom type="cylinder" size="0.05 0.5" rgba="0 .9 0 1" mass="1"/>
</body>
差异:
- 到第1种的定义方法,有一个四元数quat=“0 0 0.707107 0.707107”,第2种没有
- 到第2种的定义方法,body有euler,子元素joint有axis,pos属性,第1种没有
原因
任何姿态,等效于饶一个特定旋转轴旋转一定角度
—《机器人操作的数学导论》
- 第1种的定义方法,是依据上面的理论来的,用一个四元数来表示了旋转轴了,这里的四元数还包含了初始姿态。
- 第2种方法,是比较传统的方法,直接先定义一个连杆,然后再定义旋转轴的方向以及所在位置
第二种方法的一些解读
Mujoco中默认的body是垂直方向的,所以如果我们需要建一些水平会其他
形式的body,需要用euler以及axis属性组合起来
<body name="shoulder_l" pos="0 0.06035 0" euler="0 0 0">
<inertial diaginertia="0.0118742 0.00851644 0.00537304" mass="0.013" pos="-0.0135226 0.0102641 0.00139357" quat="0.89853 0.0814684 0.0409894 0.429332"/>
<joint name="l_shoulder_pitch" range="-2.61799 2.61799" type="hinge" axis="1 0 0" pos="0 0 -0.03" />
<geom type="cylinder" size="0.001 0.03"/>
</body>
1 euler:定义了下个关节所所在的局部坐标系在本关节的局部坐标系中的姿态
1.1 例子1
axis=“1 0 0”
euler=" 0 0 0",表示子坐标系与父坐标系的姿态相同
1.2 例子2
axis=“1 0 0”
euler=" -1.57 0" 表示子坐标系绕父坐标系的x轴顺时针旋转pi/2
1.3 例子3
axis=“0 0 1”
euler=" -1.57 0"
旋转原先是指向上边的,因为euler的值的影响,变成了指向右面
1.4 例子4
axis=“0 1 0”
euler=" -1.57 0"
旋转原先是指向右边的,因为euler的值的影响,变成了指向下面