一、T型速度规划概述

什么是T型速度规划?

T型速度规划,说白了就是让电机按照「梯形」的速度曲线来运动。你想想看,速度从零开始匀加速,到达目标速度后匀速跑一段,最后匀减速到零。把速度-时间图画出来,就是个梯形——所以叫T型。

我刚开始做运动控制那会儿,第一个接触的就是T型规划。为什么?因为它简单、直观、好理解。你不需要什么高深的数学,加减速过程就是匀加速和匀减速,中间段就是匀速。每个工程师都能一眼看懂。

但简单归简单,T型规划有个硬伤——加速度会突变。嗯,这里要注意,加速度突变意味着什么?意味着冲击力。我在做数控机床项目时,就因为这个吃过亏。

T型曲线的数学模型

咱们先看数学表达。T型速度规划的核心参数就三个:

  • 最大速度 \( v_{max} \) —— 你允许电机跑多快
  • 加速度 \( a \) —— 加/减速的速率
  • 总位移 \( S \) —— 目标位置

整个运动过程分成三段:

阶段 时间区间 速度公式 位移公式
加速段 \( 0 \le t \le t_a \) \( v(t) = a \cdot t \) \( s(t) = \frac{1}{2} a t^2 \)
匀速段 \( t_a \le t \le t_a + t_c \) \( v(t) = v_{max} \) \( s(t) = v_{max} \cdot (t - t_a) + s_a \)
减速段 \( t_a + t_c \le t \le T \) \( v(t) = v_{max} - a \cdot (t - t_a - t_c) \) \( s(t) = v_{max} \cdot (t - t_a - t_c) - \frac{1}{2} a (t - t_a - t_c)^2 + s_a + s_c \)

其中 \( t_a \) 是加速时间,\( t_c \) 是匀速时间,\( T = t_a + t_c + t_d \) 是总时间。如果加速和减速的加速度大小相等,那么 \( t_a = t_d \)。

关键公式:加速段位移 \( s_a = \frac{v_{max}^2}{2a} \),减速段位移 \( s_d = \frac{v_{max}^2}{2a} \)。如果总位移 \( S < s_a + s_d \),那就到不了最大速度——这就是「三角形」速度曲线,T型的一种退化情况。

物理意义:加速度突变意味着什么?

咱们聊聊物理意义。T型规划里,加速度在三个时刻发生突变:

  • 启动瞬间:加速度从0跳到 \( a \)
  • 加速结束:加速度从 \( a \) 跳到 0
  • 减速开始:加速度从 0 跳到 \( -a \)
  • 停止瞬间:加速度从 \( -a \) 跳到 0

加速度突变,对应的是加加速度(Jerk)无穷大。加加速度是加速度的变化率,数学上就是速度的三阶导数。物理上,加加速度直接对应冲击力。

我记得有一次做精密定位平台,用的就是T型规划。平台到位后总是有微小的抖动,怎么调PID都没用。后来发现,就是加减速切换时的冲击力激起了机械共振。换成S型规划后,问题就解决了。

避坑指南:我曾经在高速龙门铣项目上吃过亏。T型规划在高速切换时,加速度突变产生的冲击力直接导致丝杠螺母松动。从那以后,但凡负载较大或精度要求高的场合,我都会优先考虑S型规划。

T型规划的适用场景

虽然T型有冲击问题,但它不是一无是处。我个人习惯这样选型:

  • 适合用T型的场景:
    • 负载轻、刚性好的系统(比如小步进电机驱动)
    • 对到位精度要求不高的场合
    • 计算资源受限的MCU(T型计算量小)
    • 低速运动(冲击力小,可以忽略)
  • 不建议用T型的场景:
    • 重负载或大惯量系统
    • 高精度定位(比如光刻机、贴片机)
    • 机械结构刚性不足
    • 对振动敏感的应用

我的经验:如果你不确定该用T型还是S型,先算一下加加速度。T型的加加速度是无穷大,S型是有限值。对于大多数工业应用,加加速度控制在 \( 1000 \, m/s^3 \) 以内就比较安全。当然,具体数值要看你的机械特性。

代码实现:最简单的T型规划

下面是一个C语言的T型规划实现,我习惯把它封装成一个结构体:

typedef struct {
    float v_max;    // 最大速度
    float a;        // 加速度
    float s_total;  // 总位移
    
    float t_acc;    // 加速时间
    float t_const;  // 匀速时间
    float t_dec;    // 减速时间
    float t_total;  // 总时间
    
    float s_acc;    // 加速位移
    float s_const;  // 匀速位移
    float s_dec;    // 减速位移
} T_Profile;

void T_Profile_Calc(T_Profile *p) {
    // 计算加速和减速所需位移
    p->s_acc = (p->v_max * p->v_max) / (2.0f * p->a);
    p->s_dec = p->s_acc;
    
    // 判断是否能达到最大速度
    if (p->s_acc + p->s_dec <= p->s_total) {
        // 能达到最大速度,梯形曲线
        p->t_acc = p->v_max / p->a;
        p->t_dec = p->t_acc;
        p->s_const = p->s_total - p->s_acc - p->s_dec;
        p->t_const = p->s_const / p->v_max;
    } else {
        // 达不到最大速度,三角形曲线
        float v_peak = sqrtf(p->a * p->s_total);
        p->t_acc = v_peak / p->a;
        p->t_dec = p->t_acc;
        p->t_const = 0.0f;
        p->s_const = 0.0f;
        p->s_acc = v_peak * v_peak / (2.0f * p->a);
        p->s_dec = p->s_acc;
    }
    
    p->t_total = p->t_acc + p->t_const + p->t_dec;
}

这段代码我用了很多年,逻辑很清楚。先算能不能到最大速度,能到就是梯形,到不了就是三角形。实际项目中,你还需要考虑加减速时间是否满足系统的最小时间要求——这个后面章节会讲。

小结

T型速度规划是运动控制的基础,理解它才能理解更复杂的S型规划。它的优点是简单、计算量小,缺点是加速度突变带来冲击。下一章我会详细讲S型规划,看看它是怎么解决这个问题的。

嗯,最后说一句:别因为T型有缺点就轻视它。很多场合下,T型规划完全够用,而且调试起来比S型快得多。选型的关键是「合适」,不是「高级」。