OpenDuckMini强化学习框架入门教程-关节系统
纠错,疑问,交流: 请进入讨论区或 请点击进入页面,扫码加入微信群或Q群进行交流
获取最新文章: 扫一扫加入“创客智造”公众号
欢迎加入我们的openduckmini交流群,微信扫描右侧二维码立即进群交流
关节系统
- 理解机器人关节系统,包含关节分类,关节定义,驱动类型,回差建模和关节坐标系统等
概述
Open Duck Mini V2 的关节系统包括主动关节(由舵机驱动)、浮动基座关节(自由运动)和回差虚拟关节(用于模拟机械间隙)。系统共有 15 个物理关节(1 浮动 + 14 主动),在启用了回差建模的版本中额外增加 14 个虚拟关节。
关节分类
总关节 (njnt)
├── 浮动基座: floating_base (1 个)
├── 执行器关节: 主动舵机关节 (14 个)
│ ├── left_hip_yaw, left_hip_roll, left_hip_pitch
│ ├── left_knee, left_ankle
│ ├── neck_pitch, head_pitch, head_yaw, head_roll
│ ├── right_hip_yaw, right_hip_roll, right_hip_pitch
│ └── right_knee, right_ankle
└── 回差虚拟关节 (14 个,仅在 backlash 模型)
├── left_hip_yaw_backlash
├── left_hip_roll_backlash
└── ... (每个执行器对应一个)
关节定义
浮动基座
浮动基座是机器人相对于世界坐标系的定位关节,使用 freejoint 类型:
<body name="base" pos="0 0 0.22">
<freejoint name="floating_base"/>
它提供:
- 7 个位置变量:
[x, y, z, qw, qx, qy, qz](位置 + 四元数) - 6 个速度变量:
[vx, vy, vz, wx, wy, wz](线速度 + 角速度)
主动关节
所有主动关节使用 hinge(转动)类型:
<joint name="left_hip_yaw" type="hinge"
range="-0.5235987755982979 0.5235987755982997"
class="sts3215"/>
回差关节
回差建模通过在主动关节旁添加虚拟关节实现。这些虚拟关节没有独立的执行器,但具有很小的运动范围:
<joint name="left_hip_yaw_backlash" pos="0 0 0" axis="0 0 1" class="backlash"/>
backlash class 定义:
<default class="backlash">
<!-- ±0.5° 运动范围 -->
<joint damping="0.01" frictionloss="0" armature="0.01"
limited="true" range="-0.008726646259971648 0.008726646259971648"/>
</default>
| 属性 | 值 | 说明 |
|---|---|---|
| 范围 | ±0.5° (±0.0087 rad) | 模拟真实舵机的回差 |
| 阻尼 | 0.01 | 较低的阻尼 |
| 摩擦 | 0 | 无摩擦(回差应自由运动) |
| 惯量 | 0.01 | 低惯量 |
驱动类型
位置控制(主模式)
所有主动关节使用位置控制模式,通过 <position> 执行器实现:
<position class="sts3215" name="left_hip_yaw" joint="left_hip_yaw" inheritrange="1"/>
位置控制的工作方式:
策略输出 (action)
│ * action_scale (0.25)
▼
关节偏移量
│ + default_actuator (home 姿态)
▼
目标位置 (motor_targets)
│
▼
位置控制器 (KP = 13.37)
│ * (target - current)
▼
输出力矩 (限于 ±3.23 Nm)
│
▼
MuJoCo 物理仿真
STS3215 舵机参数
<default class="sts3215">
<geom contype="0" conaffinity="0"/>
<joint damping="0.56" frictionloss="0.068" armature="0.027"/>
<position kp="13.37" kv="0.0" forcerange="-3.23 3.23"/>
</default>
| 参数 | 值 | 物理意义 |
|---|---|---|
damping |
0.56 Nms/rad | 关节阻尼系数 |
frictionloss |
0.068 Nm | 静摩擦力矩 |
armature |
0.027 kg·m² | 旋转惯量 |
kp |
13.37 Nm/rad | 位置比例增益 |
kv |
0.0 | 速度微分增益(未使用) |
forcerange |
±3.23 Nm | 最大输出力矩 |
电机速度限制
训练和推理中可以通过 USE_MOTOR_SPEED_LIMITS 标志启用电机速度限制:
max_motor_velocity = 5.24 # rad/s
motor_targets = clip(
motor_targets,
prev_motor_targets - max_motor_velocity * dt,
prev_motor_targets + max_motor_velocity * dt,
)
这限制了每步关节位置的最大变化量,接近真实舵机的最大转速。
回差建模
物理原理
回差(backlash)是齿轮传动系统中的一种机械间隙,表现为:
- 电机转动方向变化时,齿轮间存在空行程
- 关节实际位置与目标位置之间存在小角度偏移
- 在足式机器人中,回差会影响足端位置精度和步态质量
仿真实现
Open Duck Playground 通过在 MJCF 中添加虚拟关节来建模回差:
实际系统:
舵机 → 齿轮箱 → 关节输出
(指令位置) (回差) (实际位置)
MJCF 模型:
[执行器关节] ←→ [回差虚拟关节] ←→ [负载]
(有源驱动) (±0.5° 自由运动)
观测中的回差处理
在构建观测时,回差偏移被叠加到关节角度中:
joint_angles = self.get_actuator_joints_qpos(data.qpos)
joint_backlash = self.get_actuator_backlash_qpos(data.qpos)
# 对于没有回差关节的执行器,插入零值
for i in self.backlash_idx_to_add:
joint_backlash = jp.insert(joint_backlash, i, 0)
# 合并关节角度和回差偏移
joint_angles = joint_angles + joint_backlash
回差在域随机化中的处理
域随机化中,回差关节的摩擦损耗被排除(frictionloss 设为 0),因为回差关节应自由运动:
dof_id = [idx for idx, fr in enumerate(model.dof_hasfrictionloss) if fr == True]
# 只选择有摩擦损耗的关节(排除回差关节)
关节坐标系统
左腿关节顺序:
left_hip_yaw (偏航, Z 轴)
↓
left_hip_roll (滚动, X 轴)
↓
left_hip_pitch (俯仰, Y 轴)
↓
left_knee (膝, Y 轴)
↓
left_ankle (踝, Y 轴)
右腿关节顺序 (对称):
right_hip_yaw (偏航, Z 轴)
↓
right_hip_roll (滚动, X 轴) [注意: 与左腿符号相反]
↓
right_hip_pitch (俯仰, Y 轴)
↓
right_knee (膝, Y 轴)
↓
right_ankle (踝, Y 轴)
头部关节顺序:
neck_pitch → head_pitch → head_yaw → head_roll
纠错,疑问,交流: 请进入讨论区或 请点击进入页面,扫码加入微信群或Q群进行交流
获取最新文章: 扫一扫加入“创客智造”公众号
欢迎加入我们的openduckmini交流群,微信扫描右侧二维码立即进群交流


















