Robotics

Disney Olaf Robot

Olaf 设计特点

腿部结构的核心创新可以概括为一条:为了在很小的体积内实现腿部所需的机动性,他们采用了非对称腿设计, 并把腿藏在柔软的泡沫裙下。具体来说,他们设计了一种"新颖的非对称六自由度腿"——本质上是把两条腿做成 彼此翻转的。

左腿髋 ROLL 执行器朝后、膝盖朝前;右腿则相反。两条腿不是镜像,而是同一个零件翻转 180° 安装。

这样做有两个好处:

  1. 在腿绕 YAW 旋转时避免两个髋 ROLL 执行器和两个膝盖互相碰撞,把运动空间在极小包围盒里最大化;
  2. 因为左右"同件",零件种类直接减半。

整机约 88.7 cm、14.9 kg,共 25 个自由度(每腿 6、每肩 2、颈 3、颌 1、眉 1、眼 4),腿用 Unitree、 表演功能用 Dynamixel,下半身是聚氨酯泡沫"裙",可形变并吸收倒地冲击。


URDF 设计要点

Olaf 的腿不是左右镜像的。它采用一种非对称(asymmetric)6-DoF 腿设计:左右腿是同一个零件 其中一条被整体翻转 180° 安装。URDF 必须忠实表达这种"同件异装"的结构,否则仿真与实物会对不上。这是本设计中唯一不能改的硬约束。

1. 机器人背景参数(用于配重与校验)

项目数值说明
身高约 88.7 cm(不含头发)角色比例,非人形比例
重量约 14.9 kg头重、脚轻、颈细
总自由度25见下表
单腿自由度6(×2 = 12)本文档重点
2/肩(×2 = 4)球面五连杆远程驱动
3细颈撑大头,有过热风险
下颌 / 眉 / 眼1 / 1 / 4表演功能,远程连杆驱动
执行器品牌Unitree + Dynamixel腿用大扭矩、表演功能用小型

注意角色形态:大而重的头 + 细颈 + 雪球小脚,重心高、支撑面小。配重时务必把头部质量与惯量放准,这是控制稳定性的关键。


2. 非对称腿设计的创新点(设计前必须理解)

论文的核心机械创新有三条,URDF 必须体现前两条:

  1. 一条腿被翻转(inverted)

    • 左腿:髋 roll 执行器朝后膝盖朝前
    • 右腿:髋 roll 执行器朝前膝盖朝后
    • 这不是镜像,而是把同一条腿绕竖直轴旋转后装上去。
  2. 避免内部碰撞 / 最大化工作空间

    • 两腿都藏在很小的下半身雪球壳内,运动包络被限制在一个很小的"包围盒"里。
    • 翻转设计让两个髋 roll 执行器错开,也让两个膝盖在腿绕 yaw 旋转时不互相打架。

3. 必须遵守的运动学拓扑(Kinematic Tree)

整机为浮动基座(floating base),根 link 为躯干 base_link。每条腿是一条 6-DoF 串联链。

world
└── base_link (floating base, 根)
    ├── L_hip_yaw_link   ── L_hip_yaw    (revolute, 轴 Z)
    │   └── L_hip_roll_link  ── L_hip_roll  (revolute, 轴 X)
    │       └── L_hip_pitch_link ── L_hip_pitch (revolute, 轴 Y)
    │           └── L_knee_link  ── L_knee  (revolute, 轴 Y)
    │               └── L_ankle_pitch_link ── L_ankle_pitch (revolute, 轴 Y)
    │                   └── L_foot_link ── L_ankle_roll (revolute, 轴 X)
    └── R_hip_yaw_link   ── R_hip_yaw    (revolute, 轴 Z)
        └── R_hip_roll_link  ── R_hip_roll  (revolute, 轴 X)
            └── R_hip_pitch_link ── R_hip_pitch (revolute, 轴 Y)
                └── R_knee_link  ── R_knee  (revolute, 轴 Y)
                    └── R_ankle_pitch_link ── R_ankle_pitch (revolute, 轴 Y)
                        └── R_foot_link ── R_ankle_roll (revolute, 轴 X)

关于 6-DoF 的具体分配:论文明确给出的是"每腿 6 DoF" "髋 ROLL" "膝" "腿绕 yaw 旋转" "脚跟-脚尖(heel-toe)步态"。 上面这套 hip(yaw+roll+pitch) + knee(pitch) + ankle(pitch+roll) 是 legged robot 最标准、且与论文描述自洽的分配, 作为默认方案必须逐一核对每个关节的实际轴向后再定稿,不要凭习惯假设。


4. 命名规范(强制,保证多人一致)

  • link 名<侧>_<部位>_link,侧别用 l_ / r_。例:l_knee_link
  • joint 名<侧>_<动作>。例:r_hip_roll
  • foot link 统一叫 <侧>_foot_link,且必须是接触体(控制器要检测落地与双脚碰撞)。
  • 顺序固定为 hip_yaw → hip_roll → hip_pitch → knee → ankle_pitch → ankle_roll,左右两腿严格同序。
  • 不允许出现 leg1 / leg2left/L 混用等模糊命名。

5. 坐标轴与"非对称"的正确表达方式(最易错环节)

URDF 里表达"右腿是翻转件"有两种方式,必须二选一并写进文档头部注释

方式 A(推荐,物理最真实):右腿子树整体在 <origin> 里加上绕 Z 轴 180°(rpy = 0 0 3.14159)的安装旋转,关节 axis 与左腿写成完全相同的常量。

  • 优点:直接对应"同件翻转 180°"的真实装配,网格/惯量复用最干净。
  • 代价:右腿关节正方向在世界系里会与左腿相反,必须在第 6 节关节方向表里登记清楚

方式 B:保持两腿安装姿态相同,靠在 axis 上对个别关节取负号来模拟翻转。

  • 优点:左右关节正方向一致,写控制器省心。
  • 缺点:掩盖了真实装配关系,惯量/网格容易放错,不推荐,除非有特殊理由。

无论选哪种,全局统一:右脚 R_foot_link 落地时的 z 高度、髋安装点的左右对称偏移(±y)必须与机械装配一致。

6. Solidworks 导出

要让 r_hip_yaw 出 rpy=0 0 π,只需让右腿 hip_yaw 的参考坐标系相对 base_link 的参考坐标系正好绕 Z 转了 180°、其余只差平移。要让它自动成立、且下游关节自动与左腿完全相同,关键动作是:

把所有关节的参考坐标系(Coordinate System)和参考轴(Axis)建在「腿的子装配体内部」,而不是建在顶层装配体里。

具体步骤:

  1. 在左腿子装配体内部,用 Insert → Reference Geometry → Coordinate System 给每个关节建坐标系,用 → Axis 建每个关节的旋转轴。按你的左腿约定摆好(如 X 朝前、Z 朝上)。这些是子装配体的特征,会跟着每个实例一起走。
  2. 回到顶层(含 base_link)装配体:
    • 插入这个子装配体作为左腿(不转)。
    • 再插入一次,用 mate 或 Move Component 绕顶层竖直 Z 轴精确旋转 180°,放到右髋位置。
    • 因为坐标系在子装配体内部,右腿实例的 hip_yaw 坐标系此刻就是左腿那个绕 Z 转了 180°的版本。
  3. 在 SW2URDF 导出器的 link 树里:
    • base_link 选顶层(未旋转)的坐标系;
    • l_hip_yaw 选左实例的 hip_yaw 坐标系/轴;
    • r_hip_yaw 选右实例的 hip_yaw 坐标系/轴;
    • 下游每个关节都选各自实例对应的坐标系/轴。
  4. 导出结果:
    • r_hip_yaw 的 origin:平移到右髋 + rpy = 0 0 3.14159(父 torso 未转、子髋系转了 180°)。
    • 下游所有右腿关节的 xyz/rpy 与左腿逐项相同,axis 也是和左腿相同的常量——因为父子坐标系都在被整体旋转的子树里,相对变换与全局那 180°无关。
    • 网格/惯量:两腿同一子装配体,局部系里完全一致,可让左右 visual/collision 指向同一个 STL复用。

BOM

  • Robstride RS-02 x 2
  • Robstride RS-03 x 6
  • Robstride RS-00 x 4
  • Raspberry Pi 5 4GB x 1
  • N100 IMU x 1
  • USB to CAN Canable Adapter x 2

Joystick

飞智沙漠狐手柄

sudo apt update && sudo apt install joystick
ls -l /dev/input/js*
jstest /dev/input/js0

部署过程

M2.0-2 齿轮比测量

src/dreambo_hardware/config/motor_layout.yaml 中定义了所有关节电机的减速比,你可以看到都是 1.0,因为 Robstride RS 系列把行星减速器集成在电机内部,固件读取的 mech_pos(param 0x7019)汇报的是减速器输出端的角度。也就是说编码器已经帮我们除过 gear_ratio 了。

gear_ratios: [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
  1. 如果 motor_layout.yaml 是你自己手写的,先将 YAML 文件上传到机器人主控,不需要重新 build(YAML 是 install 里 symlink 的),机器人摆回 URDF 零位,重新 launch:
cd ~/dreambo_ws
source install/setup.bash
ros2 launch dreambo_hardware motor_bus.launch.py
  1. 新开一个 Terminal 窗口,运行:
source install/setup.bash
ros2 topic echo /joint_states --once
  1. 抽样验证:

例如我们将 l_hip_pitch 这个关节抬高,类似人抬起大腿与地面平行,也就是转动 90度, 我们期望: position[2] 应该读 +1.571 rad ± 0.03 rad(即 ±5%,对应手转的 ±2.5° 误差)。


Previous
Livewire