4、轨迹规划入门:点到点运动(PTP)、线性插值与圆弧插补、S型速度曲线与梯形速度曲线

4.1 从“怎么动”到“动得好”

做运动控制这些年,我最大的感触是:让电机转起来容易,让负载平稳地、精准地、高效地到达目标位置,才是真功夫。轨迹规划,说白了就是回答三个问题——走哪条路?速度怎么变?加速度怎么控?

我个人习惯把轨迹规划分成两个层面:路径规划(空间几何)和速度规划(时间分配)。今天咱们先聊最基础、也最常用的几种模式。

核心观点:轨迹规划的本质是在“运动时间”和“运动平滑性”之间做权衡。梯形速度曲线简单粗暴,S型曲线优雅但计算量大。选哪个,取决于你的应用场景。

4.2 点到点运动(PTP)——最朴素的走法

点到点运动,英文叫 Point-to-Point,简称 PTP。它不关心中间路径,只关心起点和终点。你想想看,就像你从办公室走到食堂,中间绕开水坑还是跨过台阶,PTP 都不管,它只保证你最后坐在食堂里。

在工业机器人里,PTP 常用于快速定位。比如码垛机器人从抓取位移动到放置位,中间没有障碍物,那就用 PTP,效率最高。

但这里有个坑——PTP 不保证路径是直线。关节型机器人做 PTP 时,每个关节独立运动,末端走的是一条空间曲线。我在项目中遇到过,客户说“怎么机器人走起来像喝醉了?”其实就是 PTP 导致的路径不可预测。

避坑指南:我曾经在焊接项目里用了 PTP,结果焊枪在空间画了个大弧线,差点撞到夹具。后来我强制要求:凡是可能碰撞的区域,必须用线性插补或圆弧插补

4.3 线性插值与圆弧插补——让路径可控

线性插值(Linear Interpolation,简称 LIN)保证末端走直线。圆弧插补(Circular Interpolation,简称 CIRC)保证末端走圆弧。这两种模式在 CNC 和机器人里是标配。

线性插值的数学很简单:

// 线性插值示例:从 P0 到 P1,t 从 0 到 1
P(t) = P0 + (P1 - P0) * t

// 实际代码中,t 通常由速度规划给出
float t = current_time / total_time;
float x = x0 + (x1 - x0) * t;
float y = y0 + (y1 - y0) * t;
float z = z0 + (z1 - z0) * t;

圆弧插补稍微复杂一点。你需要知道圆心、半径、起始角和终止角。我常用的方法是三点定圆法:给定起点、中间点、终点,反算出圆心和半径。

// 圆弧插补示例:圆心 (cx, cy),半径 r,角度从 theta_start 到 theta_end
for (float theta = theta_start; theta <= theta_end; theta += delta_theta) {
    float x = cx + r * cos(theta);
    float y = cy + r * sin(theta);
    // 输出位置指令
}

个人经验:圆弧插补的插补步长 delta_theta 很关键。步长太大,路径会呈多边形;步长太小,计算量暴增。我一般根据弦高误差来动态调整步长,既保证精度又控制计算量。

4.4 梯形速度曲线——简单但够用

梯形速度曲线,顾名思义,速度曲线像个梯形:匀加速、匀速、匀减速三段。它是最基础的速度规划方式。

为什么叫梯形?你看速度-时间图:

速度
^
|     _________
|    /         \
|   /           \
|  /             \
| /               \
+-------------------> 时间
  加速  匀速  减速

梯形曲线的优点是计算简单、实现容易。缺点也很明显:加速度在切换点突变,导致冲击(Jerk 无穷大)。

我记得有一次做高速分拣机,用梯形曲线,结果机械臂在加减速切换点抖动得厉害,把抓取的工件都抖掉了。后来换成 S 型曲线才解决。

梯形曲线的核心公式:

// 已知:最大速度 v_max,加速度 a,总位移 s
// 计算加速段位移 s_acc = v_max^2 / (2 * a)
// 如果 s > 2 * s_acc,则有匀速段
// 否则,没有匀速段,是三角形速度曲线

if (s > v_max * v_max / a) {
    // 有匀速段
    t_acc = v_max / a;
    t_const = (s - v_max * v_max / a) / v_max;
    t_dec = t_acc;
} else {
    // 三角形速度曲线
    t_acc = sqrt(s / a);
    t_const = 0;
    t_dec = t_acc;
}

关键点:梯形曲线适用于对冲击不敏感的场景,比如传送带定位、简单搬运。如果负载上有精密器件或易碎品,请慎重。

4.5 S型速度曲线——平滑至上

S 型速度曲线在梯形的基础上,增加了加加速度(Jerk)约束。加速度不再突变,而是线性变化。速度曲线从梯形变成了 S 形。

为什么叫 S 型?你看速度-时间图:

速度
^
|        ___________
|       /           \
|      /             \
|     /               \
|    /                 \
|   /                   \
|  /                     \
| /                       \
+---------------------------> 时间

S 型曲线有 7 段:加加速、匀加速、减加速、匀速、加减速、匀减速、减减速。听着复杂,但实际代码实现有套路。

我常用的 S 型曲线参数:

参数 符号 说明
最大速度 v_max 系统允许的最高速度
最大加速度 a_max 系统允许的最大加速度
最大加加速度 j_max 系统允许的 Jerk,通常设为 a_max 的 5~10 倍
// S型曲线核心逻辑(简化版)
// 1. 计算加速阶段时间
t_acc = a_max / j_max;  // 匀加速段时间
t_jerk = a_max / j_max; // 加加速段时间

// 2. 计算各段位移
s_jerk = (1/6) * j_max * t_jerk^3;
s_acc = (1/2) * a_max * t_acc^2 + s_jerk;

// 3. 判断是否有匀速段
if (s > 2 * s_acc) {
    // 有匀速段
    t_const = (s - 2 * s_acc) / v_max;
} else {
    // 没有匀速段,重新计算
    // ... 需要解方程,这里不展开
}

我的习惯:在调试 S 型曲线时,我会先设一个较大的 Jerk 值(比如 a_max 的 10 倍),然后逐步减小,直到运动平稳。这样能快速找到 Jerk 的合理范围。

4.6 梯形 vs S 型——怎么选?

这个问题我经常被问到。我的回答是:看应用,看成本,看心情(最后一句是玩笑)。

实际选型参考:

  • 梯形曲线:适合高速、低精度、对冲击不敏感的场景。比如物流分拣、简单搬运。计算量小,CPU 资源占用低。
  • S 型曲线:适合高精度、对冲击敏感的场景。比如精密装配、医疗设备、激光切割。计算量大,但运动平滑。

我曾经在一个半导体设备项目里,客户要求定位精度 1 微米,且不能有振动。梯形曲线根本不行,加减速切换时的冲击直接导致过冲。换成 S 型曲线后,问题解决。

注意:S 型曲线不是万能的。如果 Jerk 设置过大,它和梯形曲线没区别。如果 Jerk 设置过小,运动时间会显著增加。需要根据实际负载和机械特性来调参。

4.7 本章知识体系

下面这张图总结了本章的核心逻辑:

轨迹规划知识体系 轨迹规划 路径规划(空间) 速度规划(时间) PTP(点到点) 线性插补(LIN) 圆弧插补(CIRC) 梯形速度曲线 S型速度曲线 核心权衡:运动时间 vs 运动平滑性

4.8 本章小结

嗯,到这里,轨迹规划入门的内容就差不多了。我们聊了:

  • PTP:简单快速,但路径不可控
  • 线性插补和圆弧插补:让路径可控,适合有障碍物的场景
  • 梯形速度曲线:计算简单,但有冲击
  • S 型速度曲线:平滑无冲击,但计算复杂

我个人觉得,做运动控制,理解这些基础比会调参数更重要。参数可以慢慢试,但方向错了,再调也白搭。

最后送大家一句话:轨迹规划没有银弹,只有最适合你应用场景的方案。多试、多测、多总结,你也能成为高手。


公众号:蓝海资料掘金营,微信deep3321