Robotics
Disney Olaf Robot
Olaf 设计特点
腿部结构的核心创新可以概括为一条:为了在很小的体积内实现腿部所需的机动性,他们采用了非对称腿设计, 并把腿藏在柔软的泡沫裙下。具体来说,他们设计了一种"新颖的非对称六自由度腿"——本质上是把两条腿做成 彼此翻转的。
左腿髋 ROLL 执行器朝后、膝盖朝前;右腿则相反。两条腿不是镜像,而是同一个零件翻转 180° 安装。
这样做有两个好处:
- 在腿绕 YAW 旋转时避免两个髋 ROLL 执行器和两个膝盖互相碰撞,把运动空间在极小包围盒里最大化;
- 因为左右"同件",零件种类直接减半。
整机约 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 必须体现前两条:
一条腿被翻转(inverted)
- 左腿:髋 roll 执行器朝后,膝盖朝前。
- 右腿:髋 roll 执行器朝前,膝盖朝后。
- 这不是镜像,而是把同一条腿绕竖直轴旋转后装上去。
避免内部碰撞 / 最大化工作空间
- 两腿都藏在很小的下半身雪球壳内,运动包络被限制在一个很小的"包围盒"里。
- 翻转设计让两个髋 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/leg2、left/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)建在「腿的子装配体内部」,而不是建在顶层装配体里。
具体步骤:
- 在左腿子装配体内部,用 Insert → Reference Geometry → Coordinate System 给每个关节建坐标系,用 → Axis 建每个关节的旋转轴。按你的左腿约定摆好(如 X 朝前、Z 朝上)。这些是子装配体的特征,会跟着每个实例一起走。
- 回到顶层(含 base_link)装配体:
- 插入这个子装配体作为左腿(不转)。
- 再插入一次,用 mate 或 Move Component 绕顶层竖直 Z 轴精确旋转 180°,放到右髋位置。
- 因为坐标系在子装配体内部,右腿实例的 hip_yaw 坐标系此刻就是左腿那个绕 Z 转了 180°的版本。
- 在 SW2URDF 导出器的 link 树里:
- base_link 选顶层(未旋转)的坐标系;
- l_hip_yaw 选左实例的 hip_yaw 坐标系/轴;
- r_hip_yaw 选右实例的 hip_yaw 坐标系/轴;
- 下游每个关节都选各自实例对应的坐标系/轴。
- 导出结果:
- 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]
- 如果 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
- 新开一个 Terminal 窗口,运行:
source install/setup.bash
ros2 topic echo /joint_states --once
- 抽样验证:
例如我们将 l_hip_pitch 这个关节抬高,类似人抬起大腿与地面平行,也就是转动 90度, 我们期望: position[2] 应该读 +1.571 rad ± 0.03 rad(即 ±5%,对应手转的 ±2.5° 误差)。