3、轨迹规划入门:梯形速度曲线、S形速度曲线、T型与S型对比

各位工程师朋友,今天我们来聊聊运动控制里最基础、也最绕不开的话题——轨迹规划。

说实话,我刚入行那会儿,觉得轨迹规划不就是让电机从A点跑到B点嘛,有什么难的?直到第一次调试一台高速贴片机,电机一启动就"哐"的一声,整个机台都在抖。老工程师走过来看了一眼,说:"你用的梯形速度曲线吧?加速度突变太大了。"

嗯,从那以后我才真正开始研究速度曲线这回事。

3.1 梯形速度曲线——简单粗暴,但小心冲击

梯形速度曲线,也叫T型曲线。名字很形象,速度曲线画出来像个梯形。

它的逻辑很简单:

  • 先匀加速
  • 再匀速
  • 最后匀减速

说白了,就是三段直线拼在一起。加速度在整个过程中只有三个值:正、零、负。

优点很明显:

  • 计算量极小,单片机都能跑
  • 实现简单,几行代码搞定
  • 时间最优,同样的距离跑得最快

缺点也很致命:

  • 加速度在拐点处突变,产生无穷大的加加速度(Jerk)
  • 机械冲击大,容易引起振动
  • 不适合高精度、高速场景
⚠ 我曾经踩过的坑: 有一次做龙门架系统,用了梯形曲线。空载时跑得挺好,一加上负载,每次加减速切换时整个龙门架都在晃。后来换成S型曲线,问题才解决。记住:梯形曲线只适合对冲击不敏感的低速场景。

3.2 S形速度曲线——平滑才是王道

S形速度曲线,也叫S型曲线。它解决了梯形曲线的核心问题——加速度突变。

怎么解决的?

很简单:把加速度从"跳变"改成"渐变"。

S型曲线把整个运动过程分成七段:

  1. 加加速度段(Jerk为正,加速度线性增加)
  2. 匀加速段
  3. 减加速度段(Jerk为负,加速度线性减小到零)
  4. 匀速段
  5. 加减速度段(Jerk为负,加速度线性减小)
  6. 匀减速段
  7. 减减速度段(Jerk为正,加速度线性增加到零)

你想想看,加速度不再突变,而是平滑变化。机械冲击自然就小了。

S型曲线的核心参数:

参数 含义 我的建议
Vmax 最大速度 根据电机额定转速留20%余量
Amax 最大加速度 别超过电机额定转矩对应的加速度
Jmax 最大加加速度 这个值决定了曲线的"平滑程度"
💡 个人经验: Jmax这个参数很多人会忽略。我一般把Jmax设为Amax的10倍左右。太小了曲线太平,运动时间太长;太大了又接近梯形曲线,失去S型的意义。

3.3 T型 vs S型——到底怎么选?

这个问题我经常被问到。其实没有绝对的好坏,关键看场景。

我整理了一个对比表,大家一看就明白:

对比项 T型曲线 S型曲线
加速度变化 突变 渐变
加加速度 无穷大 有限值
机械冲击
运动时间 稍长(约5%-15%)
计算复杂度
适用场景 低速、低精度、简单搬运 高速、高精度、精密加工

我个人习惯是这样选的:

  • 如果设备对节拍要求极高,机械刚性又好,用T型
  • 如果设备有精密部件,或者负载变化大,用S型
  • 实在拿不准,默认用S型,安全第一
🔑 核心观点: 梯形曲线追求的是"快",S型曲线追求的是"稳"。在工业现场,"稳"往往比"快"更重要。一台因为振动而频繁报警的设备,再快也没用。

3.4 代码实现——手写一个S型曲线生成器

光说不练假把式。我给大家写一个简单的S型曲线位置规划函数。这个代码我在好几个项目里都用过,稍微改改就能用。

// 简化版S型曲线位置规划
// 输入:总位移S,最大速度Vmax,最大加速度Amax,最大加加速度Jmax
// 输出:每个时刻的位置、速度、加速度

void S_Curve_Plan(float S, float Vmax, float Amax, float Jmax) {
    // 1. 计算各阶段时间
    float Ta = Amax / Jmax;          // 加加速度段时间
    float Tv = (Vmax / Amax) - Ta;   // 匀加速段时间
    float Tu = (S / Vmax) - Ta - Tv; // 匀速段时间
    
    // 2. 检查是否达到最大速度
    if (Tu < 0) {
        // 没达到最大速度,需要重新计算
        // 这里省略详细计算,实际项目中需要迭代求解
        printf("距离太短,未达到最大速度\n");
    }
    
    // 3. 生成轨迹点
    float t = 0;
    float dt = 0.001; // 1ms周期
    
    while (t < 总时间) {
        float pos, vel, acc;
        // 根据t所在阶段计算位置、速度、加速度
        // 具体公式参考S型曲线标准方程
        // ...
        t += dt;
    }
}
⚠ 注意: 上面的代码是简化版。实际项目中,你还需要处理"距离太短"、"速度太低"等边界情况。我曾经在一个项目中没处理好这些边界,结果电机在起点附近来回震荡,差点把丝杠搞坏。

3.5 知识体系总览

为了让大家对本章内容有个整体认识,我画了一张图:

轨迹规划知识体系 速度曲线规划 T型(梯形)曲线 S型曲线 三段:加速-匀速-减速 加速度突变,Jerk无穷大 适用:低速、简单搬运 七段:加加速-匀加速-减加速-匀速... 加速度渐变,Jerk有限 适用:高速、高精度、精密加工 选择原则:刚性差、精度高 → S型;节拍紧、刚性好 → T型

这张图把T型和S型的核心差异都标出来了。大家做选型时,对着这张图看就行。

3.6 避坑指南——我踩过的那些坑

最后,分享几个实战中容易忽略的点:

  • 参数匹配问题:我曾经把Jmax设得太大,结果S型曲线跑出来跟T型差不多,白费功夫。记住:Jmax决定了曲线的"圆角"大小。
  • 边界条件处理:短距离运动时,可能达不到最大速度或最大加速度。这时候需要降阶处理,从七段变成五段甚至三段。
  • 实时性要求:S型曲线计算量比T型大,在低端MCU上要注意优化。我一般会提前算好轨迹表,运行时直接查表。
  • 与伺服驱动器的配合:有些高端伺服驱动器自带轨迹规划功能,这时候你只需要给位置指令就行。但大部分情况下,还是得自己算。
💡 一个小技巧: 调试时先把Jmax设得大一点,让曲线接近T型。等机械没问题了,再慢慢减小Jmax,找到冲击和时间的平衡点。这样调试效率最高。

好了,关于梯形和S形速度曲线,今天就聊到这儿。这两种曲线是轨迹规划的基础,后面的章节我们会在这个基础上,聊更复杂的规划算法。


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