4. 轨迹编码与泛化:DMP、ProMP、GMM

好,咱们进入第四章。这一章讲的是怎么把示教轨迹“存下来”,还能“变着花样用”。

你想想看,机器人学了一段动作,比如倒水、拧螺丝。如果只能原封不动地回放,换个杯子位置就洒了,那这模仿学习也太“死板”了。所以我们需要一套方法——把轨迹编码成一种可调参、可泛化的形式。

我个人习惯把这类方法分成三大流派:动态运动基元(DMP)、概率运动基元(ProMP)和高斯混合模型(GMM)。它们各有各的脾气,下面我一个个说。

核心观点:轨迹编码不是为了“记住”,而是为了“理解”和“变形”。编码后的轨迹应该能根据新目标(位置、速度、障碍物)自动调整,同时保留原始动作的风格。
轨迹编码与泛化三大方法对比 动态运动基元 (DMP) 二阶系统 + 非线性强迫项 概率运动基元 (ProMP) 权重分布 + 高斯过程 高斯混合模型 (GMM) 多模态概率分布 DMP 特点 • 显式时间驱动 • 可独立调节速度/幅度 • 对目标点变化鲁棒 ProMP 特点 • 概率化权重空间 • 可融合多示教轨迹 • 支持条件概率泛化 GMM 特点 • 无时间轴假设 • 适合分段/离散动作 • 结合 GMR 做回归 选择建议 连续轨迹 + 目标点变化 → DMP | 多示教 + 不确定性 → ProMP | 离散/分段动作 → GMM

4.1 动态运动基元(DMP)

DMP 是我最早接触的轨迹编码方法。说白了,它把一条复杂轨迹拆成两部分:一个线性弹簧-阻尼系统(保证收敛到目标点),加上一个非线性强迫项(拟合示教轨迹的形状)。

数学上长这样:

τ² * ÿ = α_y * (β_y * (g - y) - ẏ) + f(x)

其中:
- y, ẏ, ÿ 是位置、速度、加速度
- g 是目标点
- τ 是时间缩放因子
- α_y, β_y 是弹簧-阻尼系数(通常 β_y = α_y/4 保证临界阻尼)
- f(x) 是非线性强迫项,由一组径向基函数加权求和得到

我在项目中遇到过一个问题:DMP 对目标点 g 的变化非常敏感。如果你把目标点移得太远,轨迹形状会“拉伸变形”,甚至出现超调。后来我加了一个目标点缩放策略——把强迫项也按比例缩放,才稳住。

实用技巧:DMP 的时间缩放参数 τ 可以让你在运行时“快放”或“慢放”轨迹,而不改变路径形状。这在需要避障时临时调整速度非常有用。

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 就特别合适——它不仅能生成平均轨迹,还能给出方差信息,告诉机器人“这里可以多探索一下”。

注意:ProMP 的基函数数量和类型对结果影响很大。基函数太少,拟合精度不够;基函数太多,容易过拟合。我一般用 10-20 个高斯径向基函数,均匀分布在时间轴上。

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 根据杯子位置自动选择最合适的抓取模式。

关键区别:DMP 和 ProMP 都假设轨迹是“时间轴上的函数”,而 GMM 没有这个假设。所以 GMM 更适合处理离散动作或多模态行为——比如机器人既可以“快抓”也可以“慢抓”,GMM 能同时建模这两种模式。

4.4 三种方法的对比与选择

我把它们放在一张表里,方便你对比:

特性 DMP ProMP GMM
时间驱动 是(显式时间变量) 是(基函数在时间轴上) 否(时间作为一维输入)
多示教融合 困难(需平均轨迹) 自然(权重分布) 自然(EM 聚类)
目标点泛化 优秀(显式 g 参数) 良好(条件概率) 一般(需重采样)
不确定性表达 无 有(协方差矩阵) 有(高斯分量协方差)
计算复杂度 低(在线可跑 1kHz) 中(需矩阵求逆) 高(EM 迭代收敛)
典型应用 连续轨迹、点到点运动 人机协作、变阻抗控制 动作识别、抓取规划

我个人习惯这样选:

  • 任务明确、目标点变化大 → DMP。比如机器人从 A 点抓取工件放到 B 点,B 点每次不同。
  • 多示教、需要不确定性 → ProMP。比如示教了多种“拧螺丝”手法,希望机器人能自适应。
  • 动作离散、多模态 → GMM。比如机器人需要从多种抓取策略中选一个。
我的建议:初学者先从 DMP 入手,它最直观、最容易调试。跑通了 DMP 之后,再尝试 ProMP 和 GMM。我在带新人时,都是让他们先用 DMP 复现一个简单的“画圆”轨迹,再逐步增加复杂度。

嗯,这一章的内容就到这里。三种方法各有千秋,没有的好坏。关键是你得清楚自己的任务场景——是连续还是离散?是单示教还是多示教?需不需要不确定性?想清楚这些,选型就不难了。