4. 运动规划算法:T型、S型、电子凸轮与插补

运动规划,说白了就是让电机按照我们想要的轨迹跑起来。这可不是简单给个速度指令就完事了。我做了十几年运动控制,见过太多因为规划没做好,导致设备振动、加工精度差、甚至撞机的案例。这一章,我把最核心的四种算法掰开揉碎了讲。

4.1 T型速度规划

T型规划是最基础的加减速方式。名字很形象——速度曲线像个梯形:匀加速、匀速、匀减速三段。

核心公式:

  • 加速段:v(t) = v₀ + a·t
  • 匀速段:v(t) = v_max
  • 减速段:v(t) = v_max - a·t

优点很明显:算法简单,计算量小,适合低端MCU。但缺点也致命——加速度在拐点处突变,会产生冲击力。我在做一台高速点胶机时遇到过这个问题:T型规划下,胶阀在加减速切换点抖动,导致胶点大小不均匀。后来换成S型才解决。

避坑指南:我曾经在步进电机系统里用T型规划,结果高速运行时丢步严重。原因就是加速度突变导致电机扭矩不足。如果你用步进电机,建议加速度不超过电机最大扭矩的60%。

4.2 S型速度规划

S型规划在T型基础上增加了加加速度(Jerk)控制。速度曲线变成S形,加速度连续变化,没有突变。

为什么需要加加速度?你想想看,电梯启动时如果直接给最大加速度,人会觉得被推了一下。但如果是慢慢增加加速度,人就感觉不到冲击。工业设备也是这个道理。

参数 T型 S型
加速度连续性 不连续(突变) 连续
加加速度 无穷大 有限值
计算复杂度 O(1) O(n)
适用场景 低速、低精度 高速、高精度

S型规划有7段:加加速、匀加速、减加速、匀速、加减速、匀减速、减减速。嗯,听着复杂,但实际实现时可以用查表法或者分段多项式。

// S型规划核心代码片段(伪代码)
float jerk = 1000;  // 加加速度
float acc = 0;
float vel = 0;

for (t = 0; t < T_acc; t++) {
    acc += jerk * dt;
    vel += acc * dt;
    pos += vel * dt;
}

我的经验:S型规划的参数整定有个技巧——先确定最大加速度,再根据机械刚性设定加加速度。刚性好的设备,加加速度可以设大些;柔性连接的系统,加加速度要小。我一般从最大加速度的10倍开始试。

4.3 电子凸轮(Electronic CAM)

电子凸轮是用软件模拟机械凸轮的功能。主轴旋转时,从轴按照预设的曲线运动。说白了,就是建立主轴位置和从轴位置之间的映射关系。

我在做包装机项目时用过电子凸轮。传统机械凸轮磨损快、换型麻烦。电子凸轮只要改几个参数就能切换包装规格,效率提升了好几倍。

电子凸轮的关键参数:

  • 主轴分辨率:通常用编码器脉冲数,决定凸轮表的点数
  • 从轴行程:从轴的运动范围
  • 同步相位:主轴和从轴的相对位置关系
  • 曲线类型:多项式、样条、自定义

凸轮表的生成是核心。我习惯用5次多项式插值,保证位置、速度、加速度都连续。如果点数不够,运动曲线会有抖动。

注意:我曾经在电子凸轮中犯过一个低级错误——凸轮表点数太少,导致从轴在高速运行时振动。后来把点数从360增加到3600,问题就解决了。经验公式:凸轮表点数 ≥ 主轴转速(Hz) × 10。

4.4 插补算法

插补就是让多个轴协同运动,走出直线、圆弧或任意曲线。这是运动控制的核心技术。

4.4.1 直线插补

最简单的插补方式。给定起点和终点,各轴按比例运动。我用的是DDA(数字微分分析器)算法,计算量小,适合实时系统。

// DDA直线插补
int steps = max(abs(dx), abs(dy));
int x_acc = 0, y_acc = 0;

for (int i = 0; i < steps; i++) {
    x_acc += dx;
    y_acc += dy;
    if (x_acc >= steps) { x_step++; x_acc -= steps; }
    if (y_acc >= steps) { y_step++; y_acc -= steps; }
}

4.4.2 圆弧插补

圆弧插补比直线复杂。我常用时间分割法:把圆弧分成小段直线逼近。关键在于插补周期的选择——周期太短,计算量大;周期太长,轨迹误差大。

插补周期 轨迹误差 CPU占用
1ms <0.01mm 高
5ms ~0.05mm 中
10ms >0.1mm 低

4.4.3 样条插补

样条插补用于复杂曲线。B样条和NURBS是主流。我做过一个五轴激光切割项目,用NURBS插补实现了平滑的曲面切割。

样条插补的难点在于实时性。控制周期通常只有几百微秒,要在这么短的时间内完成样条求值、速度规划、位置输出,对CPU要求很高。我建议用FPGA做硬件加速,或者用预计算+查表的方式。

实用建议:样条插补的节点向量设置很关键。节点分布不均匀会导致曲线振荡。我一般用弦长参数化法,让节点与数据点距离成正比。

4.5 算法选择决策树

下面这张图是我自己总结的算法选择逻辑,帮你快速决策。

运动规划算法选择决策树 运动规划需求 简单轨迹 复杂轨迹 低速低精度 高速高精度 直线/圆弧 任意曲线 T型规划 S型规划 直线/圆弧插补 样条插补 选择建议 电子凸轮适用于主轴-从轴同步场景,可与上述算法组合使用 实际项目中常需要混合使用多种算法,比如S型规划+样条插补

4.6 实战经验总结

最后,我把自己这些年踩过的坑和积累的经验整理成几条原则:

  1. 先仿真再上机。我习惯用MATLAB先把轨迹跑一遍,确认没问题再下载到控制器。省得烧电机。
  2. 预留安全余量。理论计算的最大加速度,实际要打7折。机械有间隙、有弹性,理论值往往偏大。
  3. 监控实时性。插补周期抖动超过10%,轨迹就会出问题。我用示波器看DAC输出,能直观看到抖动。
  4. 善用查表法。三角函数、样条求值这些计算,能查表就别实时算。我见过一个项目,样条插补周期从500μs优化到50μs,就是靠查表。

最后说一句:算法没有绝对的好坏,只有合不合适。T型简单但冲击大,S型平滑但计算复杂,电子凸轮灵活但调试麻烦。选型时多想想你的应用场景——是追求速度还是精度?是批量生产还是柔性制造?想清楚了,算法自然就选对了。