完整示例
<mujoco model="elbow_joint">
<compiler angle="degree"/>
<option timestep="0.001"/>
<worldbody>
<!-- 定义上臂体,它将保持不动 -->
<body name="upper_arm" pos="0 0 0">
<!-- 上臂的几何形状 -->
<geom name="upper_arm_geom" type="capsule" fromto="0 0 0 0 0 0.5" size="0.1" rgba="1 0 0 1"/>
<!-- 定义下臂体,它将绕肘部关节旋转 -->
<body name="lower_arm" pos="0 0 0.5">
<!-- 肘部关节定义 -->
<joint name="elbow_joint" type="hinge" pos="0 0 0" axis="0 1 0" range="-150 0"/>
<!-- 下臂的几何形状 -->
<geom name="lower_arm_geom" type="capsule" fromto="0 0 0 0 0 0.5" size="0.1" rgba="0 1 0 1"/>
</body>
</body>
</worldbody>
<actuator>
<!-- 定义驱动肘部关节的电机 -->
<motor name="elbow_motor" joint="elbow_joint" gear="100"/>
</actuator>
</mujoco>
拖动xml到mujoco, 点击运行按钮,操控ctrl值就能看到关节控制效果
joint和body的关系
在mujoco中,joint不用指定连接两端的body名字,而是通过body包含关系来确定。joint放在body元素里面,表示该body、上一级body两者之间建立关节。
actuator
actuator定义驱动关节或肌腱的执行器,有三种类型:motor(力矩)、position、velocity、motor(肌腱)。
- motor(力矩) 通过施加力矩来直接驱动关节。含有name(执行器的名称)、joint(对应关节名称)、gear(齿轮比,缩放执行器对关节的力矩和速度的影响)
- position 通过控制关节的位置来驱动关节。含有name(执行器的名称)、joint(对应关节名称)、kp(位置增益,于控制执行器对位置误差的响应强度)。
- velocity 通过控制关节的速度来驱动关节。含有name(执行器的名称)、joint(对应关节名称)、kv(速度增益,用于控制执行器对速度误差的响应强度)
- motor(肌腱) 通过控制肌腱的长度或速度来驱动关节。含有name(执行器的名称)、tendon(对应肌腱名称)、gear(齿轮比,用于缩放执行器的力)
<!-- motor(力矩) -->
<actuator>
<motor name="elbow_motor" joint="elbow_joint" gear="100"/>
</actuator>
<!-- position -->
<actuator>
<position name="elbow_position" joint="elbow_joint" kp="100"/>
</actuator>
<!-- velocity -->
<actuator>
<velocity name="elbow_velocity" joint="elbow_joint" kv="100"/>
</actuator>
<!-- motor(肌腱) -->
<actuator>
<motor name="tendon_motor" tendon="tendon_name" gear="100"/>
</actuator>