1. 速度规划基础:S形曲线、T形曲线、梯形曲线原理与数学建模

速度规划,说白了就是让机器人怎么走才稳。你想想看,如果电机一启动就直接给最大速度,那冲击力能把机械结构震散架。我刚开始做机器人那会儿,就吃过这个亏——电机直接跳变,结果末端抖得跟筛子似的。

所以我们需要速度规划曲线。常见的就三种:T形(梯形)、S形、以及更平滑的S形变种。今天咱们就把它们的数学底子扒干净。

核心观点: 速度规划的本质是约束加速度和加加速度(Jerk),从而控制运动过程中的冲击力。

1.1 梯形速度曲线(T形曲线)

梯形曲线是最简单的。它由三段组成:匀加速、匀速、匀减速。名字很形象,速度-时间图就是个梯形。

数学建模:

设总位移为 \( S \),最大速度为 \( V_{max} \),加速度为 \( A \),减速度也为 \( A \)(对称情况)。

  • 加速段: \( v(t) = A \cdot t \),\( 0 \le t \le t_a \)
  • 匀速段: \( v(t) = V_{max} \),\( t_a \le t \le t_a + t_c \)
  • 减速段: \( v(t) = V_{max} - A \cdot (t - t_a - t_c) \),\( t_a + t_c \le t \le T \)

其中加速时间 \( t_a = V_{max} / A \),减速时间相同。匀速时间 \( t_c \) 由剩余位移决定。

我的经验: 梯形曲线在启停瞬间加速度会突变(从0跳到A,再跳回0),这会产生无限大的加加速度(Jerk)。在重载或高精度场景下,这种冲击会激发机械共振。我曾经在一个码垛项目里用梯形曲线,结果末端抖动超过5mm,后来换成S形才解决。

适用场景: 对启停冲击不敏感、成本敏感、计算资源有限的场合,比如一些简单的传送带、低精度点位运动。

1.2 S形速度曲线

S形曲线解决了梯形曲线的加速度突变问题。它在加速和减速阶段加入了“加加速度”约束,让加速度平滑变化。

数学建模(7段式S形):

完整的S形曲线分为7段:加加速度、匀加速、减加速度、匀速、加减速度、匀减速、减减速度。我们以加加速度 \( J \)(Jerk)为控制量。

阶段 加速度变化 速度表达式
1. 加加速度 \( a(t) = J \cdot t \) \( v(t) = \frac{1}{2} J t^2 \)
2. 匀加速 \( a(t) = A_{max} \) \( v(t) = v_1 + A_{max} \cdot t \)
3. 减加速度 \( a(t) = A_{max} - J \cdot t \) \( v(t) = v_2 + A_{max} t - \frac{1}{2} J t^2 \)
4. 匀速 \( a(t) = 0 \) \( v(t) = V_{max} \)
5. 加减速度 \( a(t) = -J \cdot t \) \( v(t) = V_{max} - \frac{1}{2} J t^2 \)
6. 匀减速 \( a(t) = -A_{max} \) \( v(t) = v_5 - A_{max} \cdot t \)
7. 减减速度 \( a(t) = -A_{max} + J \cdot t \) \( v(t) = v_6 - A_{max} t + \frac{1}{2} J t^2 \)

嗯,这里要注意:实际工程中很少用完整的7段式,因为计算量大。我一般用5段式(去掉匀加速和匀减速段),或者直接用多项式拟合。

避坑指南: 我曾经在计算S形曲线时,忽略了“短位移”情况——当位移太短,速度还没加速到 \( V_{max} \) 就得开始减速。这时候必须做三角速度规划(只有加速和减速段,没有匀速段)。否则计算出来的轨迹会超限。

1.3 梯形 vs S形 对比

特性 梯形曲线 S形曲线
加速度连续性 不连续(阶跃变化) 连续
加加速度(Jerk) 无穷大(理论) 有限值(可控)
计算复杂度 低(O(1)) 中(O(n))
启停冲击 大 小
运动时间 短(相同参数下) 略长(加Jerk约束)
适用场景 低精度、低成本 高精度、重载、高速

1.4 知识体系框架图

下面这张图帮你理清三种曲线的核心逻辑和关系:

速度规划曲线知识体系 速度规划曲线知识体系 速度规划曲线 梯形曲线 (T形) S形曲线 多项式曲线 加速度阶跃 Jerk无穷大 加速度连续 Jerk可控 高阶光滑 计算量大 选择建议 短位移、低精度 → 梯形 | 高精度、重载 → S形 | 极致平滑 → 多项式 实际项目中,我通常用S形曲线作为默认方案,梯形作为备选

1.5 代码实现:梯形曲线规划器

光讲理论不行,咱们直接上代码。下面是一个C++实现的梯形速度规划器,输入起点、终点、最大速度和加速度,输出每个时刻的速度。

// 梯形速度规划器
// 输入:起点s0,终点s1,最大速度vmax,加速度a
// 输出:在时间t时的速度v(t)
double trapezoidalProfile(double s0, double s1, double vmax, double a, double t) {
    double S = s1 - s0;  // 总位移
    double ta = vmax / a; // 加速时间
    double Sa = 0.5 * a * ta * ta; // 加速段位移
    double Sd = Sa; // 减速段位移(对称)
    
    // 检查是否达到最大速度
    if (Sa + Sd >= S) {
        // 三角速度规划(未达到vmax)
        double ta_tri = sqrt(S / a);
        if (t <= ta_tri) {
            return a * t;
        } else if (t <= 2 * ta_tri) {
            return a * (2 * ta_tri - t);
        } else {
            return 0.0;
        }
    } else {
        // 梯形速度规划(达到vmax)
        double tc = (S - Sa - Sd) / vmax; // 匀速时间
        double T = 2 * ta + tc; // 总时间
        
        if (t <= ta) {
            return a * t; // 加速段
        } else if (t <= ta + tc) {
            return vmax; // 匀速段
        } else if (t <= T) {
            return a * (T - t); // 减速段
        } else {
            return 0.0;
        }
    }
}
我的习惯: 实际项目中,我会把加速度和减速度分开设置(accel和decel),因为机械结构的加速和减速特性往往不同。另外,记得加一个最小位移保护——如果位移太小,直接跳过规划,用线性插值。

1.6 总结一下

三种曲线各有千秋。梯形简单粗暴,适合对冲击不敏感的场合;S形平滑可控,是大多数工业机器人的首选;多项式曲线更光滑,但计算开销大,一般用在高端数控或医疗机器人上。

我个人建议:新手先从梯形曲线入手理解原理,然后尽快切换到S形曲线。因为在实际调试中,梯形曲线带来的抖动问题会让你怀疑人生。嗯,我当年就是被梯形曲线坑过之后,才老老实实研究S形的。