turtlebot3-burger_150.png
turtlebot3-waffle-pi_150.png
turtlebot3-arm_150.png
walking-y2_150.png
turbot3-multi_150.png
turbot3-dl-ros1_150.png
turbot3-ai.png
turbot3-dl-ros2_150.png
turbot3-slam_150.png
turbot3-arm_150.png
turtlebot4-lite_150.png
turtlebot4-pro_150.png
turbot4-dl_150.png
turbot4-ai_150.png
aidriving-racebot_150.png
aidriving-autodrive_150.png
turtlebot-arm_150.png
openmanipulator-x_150.png
Home » OpenDuckMini强化学习框架入门教程 » OpenDuckMini强化学习框架入门教程-关节系统

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)是齿轮传动系统中的一种机械间隙,表现为:

  1. 电机转动方向变化时,齿轮间存在空行程
  2. 关节实际位置与目标位置之间存在小角度偏移
  3. 在足式机器人中,回差会影响足端位置精度和步态质量

仿真实现

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交流群,微信扫描右侧二维码立即进群交流

群二维码

标签: OpenDuckMini强化学习框架