3. 动作表示与编码:关节空间与任务空间表示,动作基元与轨迹编码
好,我们进入第三章。这一章,说白了就是解决一个核心问题:机器人怎么“记住”一个动作,又怎么把它“说出来”。
你想想看,我们人类做一个动作,比如拿起水杯,大脑里其实有一套很复杂的表示。但机器人不行,它得靠数学。我个人习惯把动作表示分成两个层面:一个是“身体怎么动”,另一个是“手在空间里怎么走”。
3.1 关节空间 vs 任务空间:两种“语言”
先聊关节空间。这玩意儿最直观——每个关节的角度就是一组数。比如一个六轴机械臂,它的状态就是 [θ₁, θ₂, θ₃, θ₄, θ₅, θ₆]。
我在项目里遇到过一个问题:用关节空间做轨迹规划,机器人末端走了一条完美的直线?不,其实它在关节空间里画了个弧线。因为关节角度变化和末端位置变化不是线性关系。
任务空间就不一样了。它描述的是末端执行器的位姿——位置(x, y, z)加上姿态(roll, pitch, yaw 或四元数)。
| 特性 | 关节空间 | 任务空间 |
|---|---|---|
| 直观性 | 不直观,但控制简单 | 直观,符合人类认知 |
| 奇异性 | 无奇异点 | 存在奇异位姿 |
| 计算量 | 小,直接映射到电机 | 大,需要逆运动学 |
| 适用场景 | 点到点运动、避障 | 直线运动、精细操作 |
嗯,这里要注意:实际项目中,我们经常混合使用。比如粗定位用关节空间,精调用任务空间。我做过一个抓取任务,前半段用关节空间快速接近,后半段切到任务空间做姿态微调——效果不错。
3.2 动作基元:拆解复杂动作
你有没有想过,为什么人类能学会那么多动作?因为我们有“动作基元”。说白了,就是把复杂动作拆成一个个小模块。
比如“倒水”这个动作,可以拆成:
- 基元1:移动到水壶位置
- 基元2:抓取壶柄
- 基元3:倾斜壶身
- 基元4:停止倾斜
- 基元5:放回水壶
每个基元都是一个独立的轨迹片段。我习惯用 动态运动基元(DMP) 来建模这些基元。
3.3 DMP:动态运动基元
DMP 是我个人非常喜欢的一个工具。它的核心思想很简单:用一个二阶动力系统来生成轨迹,再加一个非线性项来“塑形”。
公式长这样:
τ² * ÿ = α_y * (β_y * (g - y) - ẏ) + f(x)
其中:
- y:位置
- ẏ:速度
- ÿ:加速度
- g:目标位置
- τ:时间缩放因子
- α_y, β_y:阻尼和刚度系数
- f(x):非线性强迫项
为什么用这个?因为 DMP 有几个好特性:
- 收敛性保证:不管你怎么调,最终都会到达目标 g
- 时间缩放:改变 τ 就能加速或减速,轨迹形状不变
- 空间缩放:改变 g 就能改变终点,轨迹自动适应
- 可泛化:学一次,就能用在类似任务上
我曾经踩过一个坑:用 DMP 复现一个快速挥臂动作,结果末端速度曲线出现了振荡。后来发现是阻尼系数 α_y 设得太小了。嗯,调参的时候要记住:阻尼越大,轨迹越平滑,但响应也越慢。
3.4 ProMP:概率运动基元
DMP 有个问题:它只给出了一条确定的轨迹。但实际中,同一个动作每次做都会有细微差异。比如你拿杯子,每次手的路径都不完全一样。
ProMP 就是来解决这个问题的。它把轨迹建模成概率分布:
y(t) = Φ(t)ᵀ * w + ε_y
其中:
- Φ(t):基函数矩阵(通常用高斯或B样条)
- w:权重向量(服从高斯分布)
- ε_y:观测噪声
说白了,ProMP 学到的不是一条轨迹,而是一簇轨迹的分布。你可以从中采样,得到不同的变体。
| 特性 | DMP | ProMP |
|---|---|---|
| 输出形式 | 确定轨迹 | 轨迹分布 |
| 变体生成 | 需手动调参 | 自动采样 |
| 条件生成 | 不支持 | 支持(给定中间点) |
| 计算复杂度 | 低 | 中等 |
3.5 知识体系结构图
下面这张图,是我梳理的本章知识脉络。你可以把它当作一个“地图”,方便理解各个概念之间的关系。
3.6 实践建议
最后,给几个我自己的实践建议:
- 新手先从 DMP 入手。它简单、稳定、调试方便。ProMP 虽然强大,但调参复杂,容易出问题。
- 关节空间和任务空间要灵活切换。我一般用任务空间做示教,用关节空间做执行。这样既直观又高效。
- 动作基元不要分得太细。我见过有人把“拿起杯子”拆成20个基元,结果组合起来反而更不稳定。一般3-5个基元就够了。
- 数据采集时多录几条轨迹。ProMP 需要至少5-10条示范才能学到像样的分布。如果条件不允许,可以用 DMP 加随机噪声来扩充数据。
好了,这一章就到这里。动作表示和编码是具身智能的“语言”,掌握了它,你就能让机器人听懂你的指令,做出你想要的动作。