IK Retargeting 全概念百科¶
从人手解剖到机器人硬件、从控制理论到 Sim-to-Real,系统梳理 IK Retargeting 涉及的所有核心概念。每个概念均包含定义、数学原理、代码示例和在 Retargeting 中的角色。
目录¶
1. 运动学与几何基础¶
1.1 DH 参数(Denavit-Hartenberg Parameters)¶
定义:一种标准化的方法,用 4 个参数 描述相邻连杆之间的几何关系,建立机器人运动学模型。
四个参数:
| 参数 | 符号 | 含义 | 单位 |
|---|---|---|---|
| 连杆长度 | \(a_i\) | 沿 \(x_i\) 轴从 \(z_i\) 到 \(z_{i+1}\) 的距离 | m |
| 连杆转角 | \(\alpha_i\) | 绕 \(x_i\) 轴从 \(z_i\) 到 \(z_{i+1}\) 的旋转角 | rad |
| 关节距离 | \(d_i\) | 沿 \(z_{i-1}\) 轴从 \(x_{i-1}\) 到 \(x_i\) 的距离 | m |
| 关节角 | \(\theta_i\) | 绕 \(z_{i-1}\) 轴从 \(x_{i-1}\) 到 \(x_i\) 的旋转角 | rad |
变换矩阵(从连杆 \(i-1\) 到连杆 \(i\)):
DH 参数表示例(O10 灵巧手指食指链):
import numpy as np
# 食指的 DH 参数表(3 关节:MCP 外展 → MCP 屈曲 → PIP 屈曲)
finger_dh = [
# a alpha d theta
[0.0, np.pi/2, 0.0, theta_abd], # MCP 外展
[0.035, 0.0, 0.0, theta_mcp], # MCP 屈曲 (近端指节 35mm)
[0.025, 0.0, 0.0, theta_pip], # PIP 屈曲 (中间指节 25mm)
]
在 Retargeting 中的角色:
- DH 参数是 FK 和 IK 的数学基础
- 不同灵巧手有不同的 DH 参数表,需要分别建模
- Vector Optimization 中的 FK(ctrl) 函数就是基于 DH 参数的齐次变换
1.2 正运动学(Forward Kinematics, FK)¶
定义:已知关节角 \(\theta\),计算末端执行器在空间中的位置和姿态。
在 Retargeting 中的角色: - Vector Optimization 中:\(FK(\theta_t)\) 将机器人关节角映射为指尖位置 - 优化目标:\(\min || \text{target\_landmark} - FK(\theta_t) ||\)
1.3 逆运动学(Inverse Kinematics, IK)¶
定义:已知末端执行器的目标位姿,求解关节角。
IK 方法分类:
| 方法 | 类型 | 速度 | 精度 | 适用场景 |
|---|---|---|---|---|
| 解析法 | 封闭解 | 最快 | 精确 | 6-DOF 以下,有特殊几何结构 |
| Jacobian 伪逆法 | 数值迭代 | 快 | 好 | 实时控制 |
| 阻尼最小二乘(DLS) | 数值迭代 | 快 | 好 | 越过奇异点 |
| 非线性优化 | 数值迭代 | 慢 | 最好 | 离线规划 |
| CCD | 数值迭代 | 中等 | 一般 | 简单游戏 |
在 Retargeting 中的角色: - Rule-based 方法直接映射关节角,不涉及 IK - Vector Optimization 本质上是 IK 求解(任务空间→关节空间) - 多指手的 IK 参数多、冗余大,需要 DLS 或约束优化
1.4 Jacobian 矩阵¶
定义:描述关节空间速度与任务空间速度之间的线性映射关系。
其中 \(J \in \mathbb{R}^{m \times n}\),\(m\) 是任务空间维度,\(n\) 是关节空间维度。
几何意义:Jacobian 的每一列表示对应关节单位速度对末端速度的贡献。
在 Retargeting 中的角色: - DLS 求解器:\(\dot{\theta} = J^T (J J^T + \lambda^2 I)^{-1} \dot{x}\) - 可操作度分析:\(w = \sqrt{\det(J J^T)}\),评估关节构型是否接近奇异 - 零空间投影:\(\dot{\theta} = J^+ \dot{x} + (I - J^+ J) \nabla \phi\),在完成任务的同时优化次要目标
1.5 关节空间 vs 任务空间¶
| 维度 | 关节空间(Joint Space) | 任务空间(Task Space) |
|---|---|---|
| 坐标 | \(\theta_1, \theta_2, ..., \theta_n\) | \(x, y, z, roll, pitch, yaw\) |
| 维度数 | = 关节数(如 O10 是 10 维) | = 6(3 位置 + 3 姿态) |
| 物理含义 | 电机角度 | 手指位置和朝向 |
| 直观性 | 不直观 | 直观 |
| 约束 | 关节限位 | 工作空间边界 |
| FK/IK | 原点 | 目标 |
| 插值效果 | 线性插值可能导致任务空间轨迹弯曲 | 线性插值产生直线轨迹 |
关键区别:同样的关节空间差值,在任务空间可能产生完全不同的轨迹。
# 关节空间线性插值(任务空间路径可能弯曲)
theta_start = np.array([0.0, 0.0]) # 伸直
theta_end = np.array([1.0, 1.0]) # 弯曲
for t in np.linspace(0, 1, 10):
theta = theta_start + t * (theta_end - theta_start)
tip = forward_kinematics(theta) # 可能不是直线
# 任务空间线性插值(直线路径)
tip_start = forward_kinematics(theta_start)
tip_end = forward_kinematics(theta_end)
for t in np.linspace(0, 1, 10):
tip_target = tip_start + t * (tip_end - tip_start)
theta = inverse_kinematics(tip_target) # 求解对应关节角
2. 人手解剖学¶
2.1 手部骨骼结构¶
人手由 27 块骨骼 组成,分为腕骨(8 块)、掌骨(5 块)、指骨(14 块):
手腕 (Carpal) ── 掌骨 (Metacarpal) ── 指骨 (Phalanges)
├─ 拇指: 近节 + 远节 (2 节)
├─ 其他手指: 近节 + 中节 + 远节 (3 节)
2.2 关节缩写体系¶
| 缩写 | 全称 | 位置 | 手指 | DOF | 功能 |
|---|---|---|---|---|---|
| CMC | Carpometacarpal | 腕掌 | 拇指 | 3 | 拇指对掌、外展、屈曲 |
| MCP | Metacarpophalangeal | 掌指 | 所有手指 | 2 | 屈伸 + 外展/内收 |
| PIP | Proximal Interphalangeal | 近端指间 | 食指~小指 | 1 | 屈伸 |
| DIP | Distal Interphalangeal | 远端指间 | 食指~小指 | 1 | 屈伸 |
| IP | Interphalangeal | 指间 | 拇指 | 1 | 屈伸 |
人手 DOF 分布:
拇指: CMC(3) + MCP(2) + IP(1) = 6 (实际约 5 个有效自由度)
食指: MCP(2) + PIP(1) + DIP(1) = 4
中指: MCP(2) + PIP(1) + DIP(1) = 4
环指: MCP(2) + PIP(1) + DIP(1) = 4
小指: MCP(2) + PIP(1) + DIP(1) + 掌骨 = 5
总计: 约 23 DOF
2.3 MediaPipe 21 点映射¶
MediaPipe 的 21 个 landmarks 对应实际解剖位置:
0: WRIST (腕关节)
1: THUMB_CMC (拇指腕掌关节)
2: THUMB_MCP (拇指掌指关节)
3: THUMB_IP (拇指指间关节)
4: THUMB_TIP (拇指指尖)
5: INDEX_FINGER_MCP (食指掌指关节)
6: INDEX_FINGER_PIP (食指近端指间关节)
7: INDEX_FINGER_DIP (食指远端指间关节)
8: INDEX_FINGER_TIP (食指尖)
9: MIDDLE_FINGER_MCP (中指掌指关节)
10: MIDDLE_FINGER_PIP (中指近端指间关节)
11: MIDDLE_FINGER_DIP (中指远端指间关节)
12: MIDDLE_FINGER_TIP (中指指尖)
13: RING_FINGER_MCP (环指掌指关节)
14: RING_FINGER_PIP (环指近端指间关节)
15: RING_FINGER_DIP (环指远端指间关节)
16: RING_FINGER_TIP (环指尖)
17: PINKY_MCP (小指掌指关节)
18: PINKY_PIP (小指近端指间关节)
19: PINKY_DIP (小指远端指间关节)
20: PINKY_TIP (小指尖)
2.4 弯曲角与外展角¶
弯曲角(Flexion Angle):相邻 3 个关键点形成的夹角,反映手指卷曲程度。
def flexion_angle(p1, p2, p3):
"""p1-p2-p3 三点形成的夹角"""
v1 = p1 - p2
v2 = p3 - p2
cos_a = np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2) + 1e-8)
return np.arccos(np.clip(cos_a, -1.0, 1.0))
外展角(Abduction Angle):相邻手指根部方向向量之间的夹角,反映手指张开程度。
def abduction_angle(wrist, mcp_a, mcp_b):
"""手指 A 和手指 B 之间的外展角"""
v_a = mcp_a - wrist
v_b = mcp_b - wrist
cos_a = np.dot(v_a, v_b) / (np.linalg.norm(v_a) * np.linalg.norm(v_b) + 1e-8)
return np.arccos(np.clip(cos_a, -1.0, 1.0))
3. 控制理论¶
3.1 PD 控制(比例-微分控制)¶
定义:根据位置误差和速度误差计算控制力矩。
| 参数 | 含义 | 作用 | 调大影响 |
|---|---|---|---|
| \(k_p\) | 比例增益 | 抵抗位置偏差 | 响应更快,但可能振荡 |
| \(k_d\) | 微分增益 | 抵抗速度偏差 | 阻尼更大,更稳定 |
MuJoCo 中的 position actuator 本质就是 PD 控制:
<actuator>
<!-- kp = 比例增益, kv = 微分增益 -->
<position joint="index_mcp" kp="100" kv="10"/>
</actuator>
# MuJoCo 内部等效的 PD 控制(简化)
def pd_controller(q_desired, q_current, qdot_current, kp=100, kv=10):
error = q_desired - q_current
torque = kp * error - kv * qdot_current # 注意 kv 项是负号
return torque
在 Retargeting 中的角色:
- data.ctrl[i] 设置了 position actuator 的目标角度 \(q_d\)
- \(k_p\) 和 \(k_v\) 决定关节响应速度和稳定性
- 高 \(k_p\) 使关节快速跟随,但可能超调;低 \(k_p\) 导致跟踪延迟
3.2 PID 控制(比例-积分-微分控制)¶
定义:在 PD 基础上增加积分项,消除稳态误差。
其中 \(e(t) = q_d(t) - q(t)\)。
| 参数 | 含义 | 作用 | 调大影响 |
|---|---|---|---|
| \(k_p\) | 比例增益 | 快速响应 | 响应更快,但可能振荡 |
| \(k_i\) | 积分增益 | 消除稳态误差 | 消除静差,但可能积分饱和 |
| \(k_d\) | 微分增益 | 阻尼振荡 | 更稳定,但对噪声敏感 |
PID 位置闭环控制流程(O10 硬件内部):
目标角度 → 误差计算 → PID 控制器 → 电流指令 → 电机 → 减速器 → 关节
↑ |
└────────────────── 编码器反馈 ──────────────────────────────────────┘
在 Retargeting 中的角色:
- 真实机器人硬件内部使用 PID 控制(如 O10 的 set_all_active_joint_angles())
- 仿真中常用 PD 控制(MuJoCo position actuator 默认无积分项)
- \(k_i\) 在仿真中通常不需要(无摩擦建模),但在真实机器人中必不可少
3.3 阻抗控制(Impedance Control)¶
定义:控制机器人表现出期望的机械阻抗(质量-弹簧-阻尼特性),而非直接控制位置或力。
| 参数 | 含义 | 类比 |
|---|---|---|
| \(M_d\) | 惯性矩阵 | 质量 |
| \(B_d\) | 阻尼矩阵 | 减震器 |
| \(K_d\) | 刚度矩阵 | 弹簧 |
| \(F_{ext}\) | 外力 | 机械扰动 |
阻抗控制与位置控制的关系:
位置控制: target → ┌───PID───→ 电机 → 关节 → 实际位置
↑ │
└─────── 编码器 ──────┘
阻抗控制: target → ┌───Mass-Spring-Damper───→ 期望力 → 电机 → 关节
↑ │
└─────────────── 力传感器 ─────────────────┘
在 Retargeting 中的角色: - 遥操作中,阻抗控制提供"柔顺性",人手操作更自然 - 与人接触时,低阻抗(低刚度)更安全 - 与物体交互时,需要根据任务调整阻抗参数
3.4 刚度(Stiffness)¶
定义:抵抗外力导致位置变化的度量。\(K = \frac{dF}{dx}\),单位 N/m。
- 高刚度:位置精度高,但对外力不柔顺(如工业机器人)
- 低刚度:柔顺性好,但位置精度低(如协作机器人)
在 Retargeting 中的角色: - 灵巧手抓取物体时,需要调整刚度以平衡"抓稳"和"不损坏" - 仿真中通过 position actuator 的 \(k_p\) 间接控制刚度 - 真实硬件中通过电机电流环控制刚度
3.5 阻尼(Damping)¶
定义:抵抗速度导致的能量耗散。\(B = \frac{dF}{d\dot{x}}\),单位 N·s/m。
- 高阻尼:运动平稳,不振荡,但响应慢
- 低阻尼:响应快,但可能振荡
在 Retargeting 中的角色: - 人手遥操作时,机器人手指的阻尼影响操作手感 - 过高阻尼导致手指"粘滞"、运动不自然 - 过低阻尼导致手指振荡、无法稳定抓持
3.6 柔顺性(Compliance)¶
定义:刚度的倒数。\(C = \frac{1}{K}\),单位 m/N。
主动柔顺:通过控制算法(如阻抗控制)实现的柔顺行为。 被动柔顺:通过机械结构(如弹簧、腱绳)实现的柔顺行为。
在 Retargeting 中的角色: - 主动柔顺:人手抓取物体时,机器人手指主动随物体形状调整姿态 - 被动柔顺:腱驱动灵巧手(如 Shadow Hand、ORCA Hand)天生具有机械柔顺性
3.7 控制频率与实时性¶
| 级别 | 频率范围 | 典型周期 | 用途 |
|---|---|---|---|
| 位置环 | 100-1000 Hz | 1-10 ms | 关节角度控制 |
| 速度环 | 1-10 kHz | 0.1-1 ms | 电机速度控制 |
| 电流环 | 10-100 kHz | 0.01-0.1 ms | 电机力矩控制 |
| 视觉/遥操作 | 30-100 Hz | 10-33 ms | 人手视觉捕捉 |
在 Retargeting 中的关键约束: - MediaPipe 视觉捕捉上限约 30-60 Hz - 机械臂+灵巧手控制通常需要 100 Hz 以上 - 需要插值/滤波填补视觉捕捉与控制的频率差距
4. 机器人硬件¶
4.1 编码器(Encoder)¶
定义:将机械运动(角度/位置)转换为电信号的传感器,是机器人关节的"眼睛"。
类型:
| 类型 | 原理 | 精度 | 特点 |
|---|---|---|---|
| 增量式编码器 | 光栅/磁栅脉冲计数 | 中等 | 需上电回零 |
| 绝对式编码器 | 码盘编码 | 高 | 断电不丢位置 |
| 磁性编码器 | 霍尔效应 | 中等 | 成本低、抗振动 |
| 光学编码器 | 光栅干涉 | 极高 | 精度最高、怕油污 |
关键参数: - 分辨率:每转脉冲数(PPR),如 4096 PPR,角度分辨率 = 360°/4096 ≈ 0.088° - 精度:测量值与真实值的偏差,通常比分辨率低 1-2 个数量级 - 采样率:编码器数据更新频率,通常 10-100 kHz
在 Retargeting 中的角色:
- 编码器提供 qpos(当前关节角)的真实测量值
- 编码器分辨率决定了关节角控制精度下限
- 灵巧手通常使用前臂侧编码器(电机端)而非指尖侧,存在传动间隙误差
4.2 减速器(Reducer / Gearbox)¶
定义:将电机高速低扭矩转换为低速高扭矩的机械装置。
类型:
| 类型 | 减速比 | 传动级典型效率 | 背隙 | 特点 |
|---|---|---|---|---|
| 谐波减速器 | 50-160:1 | 80-90% | 极小 | 高精度、紧凑、昂贵 |
| 行星减速器 | 3-10:1 | 90-97% | 小 | 效率高、响应快 |
| RV 减速器 | 30-200:1 | 85-95% | 极小 | 高刚度、重载 |
| 蜗轮蜗杆 | 10-80:1 | 40-70% | 大 | 自锁、效率低 |
| 直驱(无减速器) | 1:1 | 不适用(无减速级) | 无减速器背隙 | 反向驱动好、关节扭矩密度通常较低 |
表中效率是传动级的典型量级,不包含电机、驱动器、轴承和线缆等损耗;实际系统效率必须查阅器件曲线或通过实验测量,任何真实系统都不应按 100% 效率建模。
关键参数: - 减速比 \(n\):电机转速 / 输出转速,\(n = \omega_{motor} / \omega_{joint}\) - 力矩放大:\(T_{out} = n \cdot T_{motor} \cdot \eta\)(\(\eta\) 为效率) - 惯量匹配:\(J_{eff} = n^2 \cdot J_{motor}\),减速比越大,反射惯量越大
在 Retargeting 中的角色: - 减速比影响了关节角与控制指令的映射关系 - 高减速比 → 高精度、高力矩、但低反向驱动能力 - 灵巧手通常使用小减速比(3-10:1)或直驱,以保持较好的反向驱动性
4.3 传动比(Gear Ratio / Transmission Ratio)¶
定义:输入端与输出端的转速比(或力矩比)。\(i = \frac{\omega_{in}}{\omega_{out}} = \frac{T_{out}}{T_{in}}\)
含义: - 传动比 > 1:减速增矩 - 传动比 < 1:增速减矩(很少用于机器人)
在 Retargeting 中的角色: - 影响人手关节角到机器人关节角的缩放因子 - 例如:人手屈曲 90° → 电机转动 90° × 齿轮比 = 机器人关节 90° / 减速比 - 高减速比意味着编码器能分辨更细微的角度变化
4.4 反向驱动(Backdrivability)¶
定义:从输出端(关节侧)施加外力时,能否反向带动电机转动的能力。
其中 \(n\) 为减速比,\(\eta\) 为传动效率。
| 反向驱动能力 | 减速比 | 典型应用 | 遥操作适配性 |
|---|---|---|---|
| 高 | 1:1(直驱) | LEAP Hand V2 | 最佳:人手可自由推动 |
| 中 | 3-10:1 | O10 / Allegro | 好:可反向驱动但需力量 |
| 低 | 50-160:1 | 工业机器人 | 差:很难反向驱动 |
在 Retargeting 中的角色: - 高反向驱动允许力反馈遥操作:操作者感受到机器人接触的力 - 低反向驱动需要力传感器才能实现力反馈 - 真机调试时,高反向驱动的手更安全(可手动推回)
4.5 电机(Motor / Actuator)¶
类型:
| 类型 | 功率密度 | 控制精度 | 适用场景 |
|---|---|---|---|
| 直流有刷电机 | 低 | 中 | 低成本、简单应用 |
| 直流无刷电机(BLDC) | 高 | 高 | 灵巧手主流选择 |
| 步进电机 | 中 | 中(开环) | 低精度位置控制 |
| 伺服电机 | 高 | 极高 | 工业机器人 |
| 舵机(Servo) | 低 | 低 | 低成本灵巧手(AR10) |
BLDC 在灵巧手中的优势: - 高扭矩密度,体积小 - 高效率(>85%),发热小 - 无刷磨损,寿命长
5. 通信与软件架构¶
5.1 CAN 总线(Controller Area Network)¶
定义:一种差分信号串行通信协议,广泛用于机器人内部通信。
关键特性: - 差分信号:CAN_H 和 CAN_L 两根线,抗干扰能力强 - 多主架构:任何节点均可发起通信 - 优先级仲裁:ID 越小优先级越高 - 速率:经典 CAN 最高 1 Mbps,CAN FD 最高 8 Mbps
在 Retargeting 中的角色:
- O10 灵巧手通过 CAN 总线(zlgcan 或 hcan)与主控通信
- 控制数据包格式:{关节ID, 目标角度, 控制模式, 校验位}
- CAN 总线延迟(通常 < 1 ms)影响实时性
# O10 SDK 中的 CAN 通信(简化)
from omnihand import OmniHand2025, HandType
# 通过 CAN 总线初始化灵巧手
hand = OmniHand2025.create_hand_by_zlgcan(
hand_device_id=0,
canfd_device_id=0,
hand_type=HandType.RIGHT,
canfd_channel_id=0
)
# 发送关节角通过 CAN
hand.set_all_active_joint_angles([0.5, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])
5.2 CMD(命令 / Command)¶
定义:发送给机器人执行器的控制指令,与 ctrl 概念类似但更广泛。
CMD 的层级:
高层次 CMD (应用层) 低层次 CMD (硬件层)
┌─────────────────┐ ┌─────────────────┐
│ set_joint_angle │ → CAN → │ 电机驱动器 │
│ (0.5 rad) │ │ (PID 目标) │
└─────────────────┘ └─────────────────┘
↓ ↓
retargeting 输出 编码器反馈
CMD 与 Ctrl 的关系:
| 术语 | 作用域 | 含义 |
|---|---|---|
| CMD | 应用层 | 发送给硬件的控制指令(含模式、ID、校验) |
| Ctrl | 仿真层 | MuJoCo 中 actuator 的控制量 |
| Command | 一般 | 泛指所有控制指令 |
在 Retargeting 中的角色: - Retargeting 的最终输出是一组 CMD(目标关节角) - CMD 通过总线(CAN/EtherCAT)发送到电机驱动器 - 低延迟的 CMD 通信是实时遥操作的基础
5.3 EtherCAT¶
定义:一种基于以太网的实时工业通信协议,广泛用于机器人控制。
特点: - 极低延迟(< 100 μs) - 分布式时钟同步(< 1 μs) - 支持 100+ 轴同步控制
对比:
| 协议 | 典型延迟 | 同步精度 | 拓扑 | 应用 |
|---|---|---|---|---|
| CAN | 1-5 ms | 100 μs | 总线 | 灵巧手 |
| EtherCAT | 10-100 μs | 1 μs | 菊花链 | 机械臂 |
| UDP | 1-10 ms | 10 ms | 网络 | 视觉传数据 |
| ROS 2 | 1-100 ms | 10 ms | 网络 | 上层通信 |
6. Sim-to-Real¶
6.1 Sim-to-Real Transfer(仿真到真机迁移)¶
定义:将在仿真环境中训练的策略/模型成功迁移到真实机器人上的过程。
核心挑战:仿真与现实之间的"现实差距(Reality Gap)"。
仿真环境 (Sim) 真实环境 (Real)
┌──────────────┐ ┌──────────────┐
│ 理想物理模型 │ │ 真实物理世界 │
│ 无摩擦/精确建模 │ → 差距 ← │ 摩擦/间隙/噪声 │
│ 完美传感器 │ │ 传感器噪声/漂移 │
│ 确定性执行 │ │ 电机误差/延迟 │
└──────────────┘ └──────────────┘
Sim-to-Real 的完整流程:
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ 系统辨识 │ → │ 域随机化 │ → │ 策略训练 │ → │ 真机迁移 │
│ 识别关键参数 │ │ 覆盖真实分布 │ │ 在仿真中 │ │ 零样本/微调 │
└──────────┘ └──────────┘ └──────────┘ └──────────┘
三种主要方法:
| 方法 | 原理 | 适用场景 | 难度 |
|---|---|---|---|
| Domain Randomization | 训练时随机化仿真参数 | 参数范围可覆盖真实分布 | 低 |
| System Identification | 精确校准仿真参数匹配真实 | 可精确建模的场景 | 中 |
| Domain Adaptation | 特征空间对齐 | 视觉/感知差异大 | 高 |
在 Retargeting 中的角色: - 仿真中调试好的 retargeting 参数(缩放系数、关节限位)需要迁移到真机 - 仿真与真机的关节范围差异、传动比误差、编码器噪声都需要校准 - 常见做法:先在仿真中调通,再在真机中微调缩放系数
6.2 系统辨识(System Identification / SysID)¶
定义:通过实验数据确定机器人系统物理参数的过程。
辨识参数:
| 参数类别 | 具体参数 | 辨识方法 |
|---|---|---|
| 运动学 | 连杆长度、关节偏移 | 标定仪测量 |
| 动力学 | 质量、质心、惯量 | 激励轨迹 + 最小二乘 |
| 摩擦 | 库仑摩擦、粘性摩擦 | 恒速运动 + 力测量 |
| 电机 | 力矩常数、电阻电感 | 阶跃响应 + 系统辨识 |
| 传动 | 减速比、背隙、刚度 | 编码器差分 + 力矩测量 |
在 Retargeting 中的角色: - 关节角校准:仿真中的关节角与真机实际关节角需要校准 - 传动比校准:人手屈曲角度与机器人关节角之间的缩放因子需要通过 SysID 确定 - 延迟校准:视觉捕捉 → 控制指令 → 机器人动作的总延迟
6.3 域随机化(Domain Randomization)¶
定义:在仿真训练过程中随机化各种物理参数,使策略对真实世界的变化具有鲁棒性。
随机化参数:
| 参数 | 典型范围 | 在 Retargeting 中的影响 |
|---|---|---|
| 关节摩擦 | ±50% | 影响关节响应速度 |
| 连杆质量 | ±20% | 影响惯性力 |
| 关节阻尼 | ±30% | 影响关节平滑度 |
| 传感器噪声 | ±5% | 影响编码器读数 |
| 控制延迟 | 0-50 ms | 影响实时跟踪 |
| 初始关节角 | ±10° | 影响初始姿态匹配 |
在 Retargeting 中的角色: - 训练 retargeting 网络时,对 landmarks 做随机旋转、缩放、噪声 - 仿真中随机化关节限位,使策略适应不同机器人的关节范围差异
def domain_randomized_landmarks(landmarks):
"""对 landmarks 应用域随机化"""
noisy = landmarks.copy()
# 随机旋转(±30°)
angle = np.random.uniform(-np.pi/6, np.pi/6)
R = rotation_matrix(angle)
noisy = noisy @ R.T
# 随机缩放(±20%)
scale = np.random.uniform(0.8, 1.2)
noisy = noisy * scale
# 随机噪声(±5mm)
noise = np.random.randn(*noisy.shape) * 0.005
noisy += noise
return noisy
6.4 零样本迁移(Zero-Shot Transfer)¶
定义:仿真中训练的策略在真机上直接运行,无需额外微调。
前提条件: - 充分的域随机化(覆盖真实分布) - 高保真仿真模型 - 良好的系统辨识
在 Retargeting 中的角色: - 理想情况下,人手 → 机器人手的 retargeting 参数可零样本迁移 - 实际中至少需要校准缩放系数和关节偏移
6.5 现实差距(Reality Gap)¶
定义:仿真与真实世界之间的不可消除差异。
主要来源:
| 差距来源 | 仿真 | 真实 | 影响 |
|---|---|---|---|
| 摩擦 | 简化为库仑+粘性 | 复杂的非线性摩擦 | 关节响应不同 |
| 间隙 | 无 | 齿轮背隙、机械间隙 | 位置精度差 |
| 柔性 | 刚体假设 | 连杆弹性变形 | 动力学误差 |
| 延迟 | 通常为 0 | 通信+计算+执行延迟 | 跟踪滞后 |
| 噪声 | 理想传感器 | 传感器噪声、漂移 | 控制抖动 |
7. 动作表示与策略¶
7.1 动作表示(Action Representation)¶
4 种常见表示:
| 表示 | 维度 | 示例 | 适用场景 |
|---|---|---|---|
| 关节角 | \(n\)(关节数) | [0.5, 0.3, ...] |
直接控制机器人 |
| 末端位姿 | 6(位置+姿态) | [x, y, z, qx, qy, qz, qw] |
任务空间控制 |
| Delta 动作 | 6-7(增量) | [dx, dy, dz, droll, ...] |
增量式控制 |
| Landmarks | 21×3 | [[x,y,z], ...] |
视觉捕捉输入 |
7.2 动作空间(Action Space)¶
定义:策略可输出的所有可能动作的集合。
连续 vs 离散:
| 类型 | 描述 | 示例 | 维度 |
|---|---|---|---|
| 连续动作空间 | 实数向量 | 关节角 [0.0, 1.2] |
无穷 |
| 离散动作空间 | 有限集合 | 手势 {fist, open, pinch} |
有限 |
在 Retargeting 中的角色: - Retargeting 通常输出连续动作空间(关节角) - 每个关节有独立的范围(关节限位),构成动作空间约束 - 动作空间维度 = 控制自由度(如 O10 是 10 维)
7.3 观察空间(Observation Space)¶
定义:策略可感知的所有环境信息的集合。
在 Retargeting 中的角色: - 观察空间 = 手部 landmarks(21×3) - 可能还包括:机器人当前关节角、手掌位置、物体位置
7.4 Action Chunking(动作分块)¶
定义:一次预测多步连续动作,而非单步动作。
$$
\text{Action Chunking: } \quad a_t \rightarrow [a_t, a_{t+1}, ..., a_{t+H-1}] $$
为什么需要:
| 问题 | 单步预测 | Action Chunking |
|---|---|---|
| 高频控制 | 策略需 100Hz 运行 | 策略可 10Hz 运行 |
| 时序平滑 | 每步独立,易抖动 | 整体序列,平滑自然 |
| 延迟容忍 | 对延迟敏感 | 可容忍更大延迟 |
常见分块大小:
| 应用 | 典型分块长度 | 控制频率 | 策略频率 |
|---|---|---|---|
| Diffusion Policy | 16-32 步 | 50 Hz | 1.5-3 Hz |
| ACT | 100 步 | 50 Hz | 0.5 Hz |
| 灵巧手遥操作 | 4-8 步 | 100 Hz | 12-25 Hz |
在 Retargeting 中的角色: - 人手视觉捕捉(30-60 Hz)通常低于机器人控制频率(100-1000 Hz) - Action Chunking 弥补频率差距:一次预测多步,逐步执行 - 灵巧手遥操作中,通常使用 4-8 步的 Action Chunking
def action_chunking_example(landmark_seq, chunk_size=8):
"""
对 landmarks 序列做 Action Chunking,生成连续关节角预测
"""
# 输入: 连续 N 帧 landmarks
# 输出: 一次预测 chunk_size 步的关节角
# 方法 1: 对 landmarks 做插值,再逐帧 IK
interpolated_lm = spline_interpolate(landmark_seq, num_steps=chunk_size)
joint_angles = [ik_solve(lm) for lm in interpolated_lm]
# 方法 2: 网络一次输出 chunk_size 步
# joint_angles = policy(landmark_seq, chunk_size=chunk_size)
return joint_angles # [chunk_size, n_joints]
7.5 行为克隆(Behavioral Cloning, BC)¶
定义:通过监督学习,直接从人类示教数据中学习策略。
在 Retargeting 中的角色: - 从人手 landmarks 直接学习机器人关节角映射 - 需要大量高质量的人-机器人配对数据 - 简单但受限于数据质量
7.6 扩散策略(Diffusion Policy)¶
定义:使用扩散模型生成动作序列的策略表示方法。
流程:
训练: 动作序列 → 添加噪声 → 去噪网络 → 预测噪声
推理: 随机噪声 → 去噪网络(逐步) → 动作序列
在 Retargeting 中的角色: - 可生成多模态、平滑的动作序列 - 天然支持 Action Chunking - 适合灵巧手的高维连续动作空间
8. 轨迹与插值¶
8.1 轨迹插值(Trajectory Interpolation)¶
定义:在已知关键帧之间生成平滑过渡路径的方法。
插值方法对比:
| 方法 | 连续性 | 计算量 | 特点 | 适用场景 |
|---|---|---|---|---|
| 线性插值 | \(C^0\) | 最低 | 速度不连续 | 低帧率过渡 |
| 三次样条 | \(C^2\) | 中 | 最优平滑 | 手势过渡 |
| 贝塞尔曲线 | \(C^1\) | 中 | 可调控制点 | 路径规划 |
| B 样条 | \(C^2\) | 高 | 局部控制 | 复杂轨迹 |
| 五次多项式 | \(C^3\) | 低 | 可控加速度 | 高精度运动 |
| 指数平滑/EMA | 无 | 最低 | 简单实时 | 噪声滤波 |
插值空间选择:
# 错误的做法:关节空间插值 → 任务空间路径弯曲
θ_lerp(t) = θ_0 + t * (θ_1 - θ_0)
# 指尖位置 FK(θ_lerp(t)) 可能不是直线
# 正确的做法:Landmarks 插值 → IK 求解
lm_lerp(t) = lm_0 + t * (lm_1 - lm_0)
θ(t) = IK(lm_lerp(t)) # 任务空间路径更自然
在 Retargeting 中的关键原则: - 对 landmarks 插值,而非对关节角插值(避免任务空间失真) - 插值帧数取决于控制频率与视觉捕捉频率之比 - 三次样条插值保持 \(C^2\) 连续性,确保加速度连续
8.2 指数移动平均(Exponential Moving Average, EMA)¶
定义:一种加权移动平均滤波,旧的观测权重呈指数衰减。
参数 \(\alpha\) 的影响:
| \(\alpha\) | 滤波强度 | 响应速度 | 噪声抑制 |
|---|---|---|---|
| 0.1 | 强 | 慢 | 好 |
| 0.3 | 中 | 中 | 中 |
| 0.7 | 弱 | 快 | 差 |
在 Retargeting 中的角色: - 平滑 landmarks 的视觉捕捉噪声 - 平滑关节角输出,防止手指振荡 - 引入延迟(\(\approx 1/\alpha\) 帧),需要在平滑度和延迟之间权衡
8.3 轨迹平滑度(Trajectory Smoothness)¶
度量:
- Jerk(加速度变化率):\(j = \frac{da}{dt} = \frac{d^3 x}{dt^3}\)
- 加速度峰值:\(\max |a(t)|\)
- 速度连续性:\(\|\dot{x}(t^+) - \dot{x}(t^-)\|\)
在 Retargeting 中的角色: - 平滑的 retargeting 输出产生更自然的机器人运动 - 高频抖动(> 10 Hz)在视觉上明显,需通过滤波抑制 - 评估指标中的 Jerk 就是衡量轨迹平滑度
9. 机械传动¶
9.1 腱绳驱动(Tendon-Driven)¶
定义:通过柔性腱绳(类似生物肌腱)传递动力,电机置于前臂,腱绳拉动手指。
原理:
电机 (前臂) → 腱绳 (柔性) → 滑轮/导向 → 手指关节
优点 vs 缺点:
| 优点 | 缺点 |
|---|---|
| 手指轻量化(电机不在手上) | 非线性传动(腱绳有弹性) |
| 被动柔顺性(可缓冲冲击) | 需要腱绳张力控制 |
| 仿生设计(如人手肌腱) | 腱绳蠕变/磨损 |
| 易于紧凑设计 | 传递效率较低 |
在 Retargeting 中的角色:
- 腱绳驱动的关节角与电机转角非线性(因为腱绳伸长、摩擦)
- 需要额外的校准步骤:motor_angle = f(joint_angle)
- 常见于 Shadow Hand、ORCA Hand
9.2 腱绳耦合(Tendon Coupling)¶
定义:一根腱绳同时驱动多个关节,导致关节之间存在运动约束。
耦合类型:
| 类型 | 耦合关系 | 示例 |
|---|---|---|
| PIP-DIP 耦合 | DIP 角度 = PIP 角度 × 0.7 | Shadow Hand 食指~小指 |
| 交叉耦合 | 外展与屈曲耦合 | 某些灵巧手拇指 |
| 对角耦合 | 对侧手指同时运动 | 欠驱动夹爪 |
数学建模:
def tendon_coupling(joint_angles, coupling_matrix):
"""
考虑腱绳耦合的关节角映射
coupling_matrix: [n_actuator, n_joint]
每行表示一个 actuator 驱动的关节组合
"""
# 如果 PIP 和 DIP 耦合:
# actuator_angle[0] = joint_angles[0] (MCP 独立)
# actuator_angle[1] = joint_angles[1] + 0.7 * joint_angles[2] (PIP + DIP 耦合)
return coupling_matrix @ joint_angles
在 Retargeting 中的角色: - 耦合限制了独立控制自由度 - Retargeting 需要将人手多个关节角合并为机器人耦合的关节角 - 例如:人手 DIP 角度 → 机器人 DIP 角度 = PIP 角度 × 耦合比
9.3 直驱(Direct Drive)¶
定义:电机直接连接关节,无减速器或腱绳。
特点: - 反向驱动性好(可自由推动) - 无背隙(精度高) - 扭矩密度低(需要大电机) - 传动效率高
代表:LEAP Hand V2、Allegro Hand、O10
9.4 欠驱动(Underactuation)¶
定义:驱动器数量少于关节数量,通过机械结构(弹簧/腱绳)实现自适应。
在灵巧手中的应用: - Robotiq 3F:3 指,每指 1 个驱动器驱动 3 个关节 - Shadow Hand:PIP 和 DIP 欠驱动耦合 - 抓取时,手指自适应包裹物体形状
在 Retargeting 中的角色: - 欠驱动关节无法独立控制,映射时需合并或忽略 - 例如:O10 的每指只有 2 个驱动器,但 PIP 和 DIP 作为一个联合关节
10. 评估与度量¶
10.1 关节角度误差(Joint Angle Error, JAE)¶
定义:机器人关节角与预期关节角之间的平均绝对偏差。
单位:rad
10.2 指尖位置误差(Fingertip Position Error, FPE)¶
定义:机器人指尖位置与预期指尖位置之间的欧氏距离。
单位:m(毫米)
10.3 Jerk(加加速度)¶
定义:位置的三阶导数,衡量轨迹平滑度。
在 Retargeting 中的角色: - 高 Jerk 值表示运动不平滑、有抖动 - 人手自然运动 Jerk 低,机器人应模仿
10.4 延迟(Latency)¶
定义:从人手动作到机器人响应的总耗时。
延迟组成:
人手动作 → 视觉捕捉 → 坐标转换 → IK 求解 → 通信 → 电机响应 → 机器人动作
t=0 t=33ms t=35ms t=40ms t=42ms t=47ms t=50ms
各环节典型延迟:
| 环节 | 典型延迟 | 优化方向 |
|---|---|---|
| 视觉捕捉 (MediaPipe) | 15-33 ms | GPU 加速 |
| 坐标转换/预处理 | < 1 ms | 算法优化 |
| IK 求解 (DLS) | 1-3 ms | 减少迭代次数 |
| 通信 (CAN/UDP) | 0.5-5 ms | 提高波特率 |
| 电机响应 (PID) | 3-10 ms | 提高 PID 频率 |
容忍范围:
| 场景 | 可接受延迟 | 不可接受延迟 |
|---|---|---|
| 慢速遥操作 | < 100 ms | > 300 ms |
| 灵巧操作 | < 50 ms | > 150 ms |
| 力反馈 | < 10 ms | > 50 ms |
附录:概念关系图¶
┌──────────────────────────────────────────────────────────────────┐
│ IK Retargeting 概念体系 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 人手解剖 │ → │ 运动学 │ → │ 控制方法 │ → │ 机器人硬件│ │
│ │ CMC/MCP │ │ DH/FK/IK │ │ PD/PID │ │ 编码器 │ │
│ │ PIP/DIP │ │ Jacobian │ │ 阻抗控制 │ │ 减速器 │ │
│ │ 21points │ │ 关节/任务│ │ 刚度/阻尼 │ │ CAN/CANFD│ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ │ │ │ │ │
│ └───────┬───────┘ └───────┬───────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ │
│ │ 动作表示 │ │ 机械传动 │ │
│ │ Action │ │ 腱驱动 │ │
│ │ Chunking │ │ 齿轮比 │ │
│ │ 扩散策略 │ │ 反向驱动 │ │
│ └──────────┘ └──────────┘ │
│ │ │ │
│ └───────────┬───────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ Sim-to-Real │ │
│ │ 系统辨识 │ │
│ │ 域随机化 │ │
│ │ 现实差距 │ │
│ └──────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 评估指标: JAE / FPE / Jerk / Latency / 限位违规率 / 成功率 │ │
│ └──────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────┘
索引:概念速查¶
| 概念 | 章节 | 核心一句话 |
|---|---|---|
| DH 参数 | 1.1 | 4 个参数标准描述相邻连杆的几何关系 |
| 正运动学 (FK) | 1.2 | 关节角 → 末端位置 |
| 逆运动学 (IK) | 1.3 | 末端位置 → 关节角 |
| Jacobian | 1.4 | 关节速度与任务速度的线性映射 |
| 关节空间 | 1.5 | 机器人关节角构成的坐标系 |
| 任务空间 | 1.5 | 末端执行器位置/姿态构成的坐标系 |
| MCP/PIP/DIP/CMC | 2.2 | 人手关节缩写体系 |
| 弯曲角 | 2.4 | 相邻 3 个 landmarks 的夹角 |
| 外展角 | 2.4 | 相邻手指根部向量的夹角 |
| PD 控制 | 3.1 | 比例+微分的位置控制 |
| PID 控制 | 3.2 | 比例+积分+微分的闭环控制 |
| 阻抗控制 | 3.3 | 控制机器人表现出质量-弹簧-阻尼特性 |
| 刚度 | 3.4 | 抵抗外力导致位置变化的度量 |
| 阻尼 | 3.5 | 抵抗速度导致能量耗散的度量 |
| 柔顺性 | 3.6 | 刚度的倒数,意味着适应外力 |
| 编码器 | 4.1 | 将机械运动转换为电信号的传感器 |
| 减速器 | 4.2 | 将高速低扭矩转换为低速高扭矩的装置 |
| 传动比 | 4.3 | 输入转速与输出转速之比 |
| 反向驱动 | 4.4 | 从输出端推动能否带动电机 |
| CAN 总线 | 5.1 | 差分信号串行通信协议 |
| CMD / Command | 5.2 | 发送给机器人执行器的控制指令 |
| Sim-to-Real | 6.1 | 仿真策略迁移到真实机器人 |
| 系统辨识 | 6.2 | 通过实验确定系统物理参数 |
| 域随机化 | 6.3 | 训练时随机化仿真参数 |
| 现实差距 | 6.5 | 仿真与真实世界的不可消除差异 |
| 动作空间 | 7.2 | 策略可输出的所有可能动作 |
| Action Chunking | 7.4 | 一次预测多步连续动作 |
| 轨迹插值 | 8.1 | 关键帧之间生成平滑过渡 |
| EMA | 8.2 | 指数加权移动平均滤波 |
| 腱驱动 | 9.1 | 通过柔性腱绳传递动力 |
| 腱绳耦合 | 9.2 | 一根腱绳驱动多个关节 |
| 欠驱动 | 9.4 | 驱动器数 < 关节数 |
| JAE | 10.1 | 关节角度误差 |
| FPE | 10.2 | 指尖位置误差 |
| Jerk | 10.3 | 加加速度,轨迹平滑度 |
| Latency | 10.4 | 从人手动作到机器人响应的总延迟 |