4. 轨迹编码与泛化:DMP、ProMP、GMM
好,咱们进入第四章。这一章讲的是怎么把示教轨迹“存下来”,还能“变着花样用”。
你想想看,机器人学了一段动作,比如倒水、拧螺丝。如果只能原封不动地回放,换个杯子位置就洒了,那这模仿学习也太“死板”了。所以我们需要一套方法——把轨迹编码成一种可调参、可泛化的形式。
我个人习惯把这类方法分成三大流派:动态运动基元(DMP)、概率运动基元(ProMP)和高斯混合模型(GMM)。它们各有各的脾气,下面我一个个说。
4.1 动态运动基元(DMP)
DMP 是我最早接触的轨迹编码方法。说白了,它把一条复杂轨迹拆成两部分:一个线性弹簧-阻尼系统(保证收敛到目标点),加上一个非线性强迫项(拟合示教轨迹的形状)。
数学上长这样:
τ² * ÿ = α_y * (β_y * (g - y) - ẏ) + f(x)
其中:
- y, ẏ, ÿ 是位置、速度、加速度
- g 是目标点
- τ 是时间缩放因子
- α_y, β_y 是弹簧-阻尼系数(通常 β_y = α_y/4 保证临界阻尼)
- f(x) 是非线性强迫项,由一组径向基函数加权求和得到
我在项目中遇到过一个问题:DMP 对目标点 g 的变化非常敏感。如果你把目标点移得太远,轨迹形状会“拉伸变形”,甚至出现超调。后来我加了一个目标点缩放策略——把强迫项也按比例缩放,才稳住。
4.2 概率运动基元(ProMP)
DMP 有个硬伤——它只能处理单条示教轨迹。如果你录了 10 次“倒水”动作,每次手腕角度都不一样,DMP 就傻眼了。
ProMP 的思路是:把每条轨迹投影到一组基函数上,得到一个权重向量。然后对所有示教的权重向量拟合一个高斯分布。这样一来,你得到的不是一个轨迹,而是一个轨迹的概率分布。
举个例子:
# 伪代码示意
示教轨迹1 → 权重 w1
示教轨迹2 → 权重 w2
...
示教轨迹N → 权重 wN
最终模型:w ~ N(μ_w, Σ_w)
泛化时:给定新的起始/目标条件 p(y_t | obs)
→ 计算后验权重分布 p(w | obs)
→ 生成新轨迹 y = Φ^T * w
我记得有一次做装配任务,零件公差很小,需要机器人“试探着”插入。用 ProMP 就特别合适——它不仅能生成平均轨迹,还能给出方差信息,告诉机器人“这里可以多探索一下”。
4.3 高斯混合模型(GMM)
GMM 和前两种方法不太一样。它不假设轨迹是“时间驱动的”,而是把轨迹点看作高维空间中的样本点,然后用多个高斯分布去拟合这些点的分布。
你想想看,一条轨迹可以看作一系列 (t, x, y, z) 的点。GMM 会把这些点聚类成 K 个高斯分量,每个分量代表轨迹的一个“阶段”或“模式”。
生成轨迹时,用高斯混合回归(GMR)做条件概率预测:给定时间 t,预测最可能的位置。
GMM 建模步骤:
1. 收集所有示教轨迹的点 (t, pos)
2. 用 EM 算法拟合 K 个高斯分量
3. 每个分量有均值 μ_k 和协方差 Σ_k
GMR 生成步骤:
1. 输入时间 t*
2. 计算每个分量的责任度(权重)
3. 加权平均得到预测位置 pos*
4. 协方差给出置信区间
我曾经用 GMM 做抓取姿态学习。示教时记录了 50 次抓取杯子的手部姿态,GMM 自动聚类出 3 种典型抓取模式:从上方抓、从侧面抓、从斜角抓。新杯子出现时,GMM 根据杯子位置自动选择最合适的抓取模式。
4.4 三种方法的对比与选择
我把它们放在一张表里,方便你对比:
| 特性 | DMP | ProMP | GMM |
|---|---|---|---|
| 时间驱动 | 是(显式时间变量) | 是(基函数在时间轴上) | 否(时间作为一维输入) |
| 多示教融合 | 困难(需平均轨迹) | 自然(权重分布) | 自然(EM 聚类) |
| 目标点泛化 | 优秀(显式 g 参数) | 良好(条件概率) | 一般(需重采样) |
| 不确定性表达 | 无 | 有(协方差矩阵) | 有(高斯分量协方差) |
| 计算复杂度 | 低(在线可跑 1kHz) | 中(需矩阵求逆) | 高(EM 迭代收敛) |
| 典型应用 | 连续轨迹、点到点运动 | 人机协作、变阻抗控制 | 动作识别、抓取规划 |
我个人习惯这样选:
- 任务明确、目标点变化大 → DMP。比如机器人从 A 点抓取工件放到 B 点,B 点每次不同。
- 多示教、需要不确定性 → ProMP。比如示教了多种“拧螺丝”手法,希望机器人能自适应。
- 动作离散、多模态 → GMM。比如机器人需要从多种抓取策略中选一个。
嗯,这一章的内容就到这里。三种方法各有千秋,没有的好坏。关键是你得清楚自己的任务场景——是连续还是离散?是单示教还是多示教?需不需要不确定性?想清楚这些,选型就不难了。