梯形速度曲线基础:匀加速、匀速、匀减速三段式结构
做运动控制这些年,我见过太多新手一上来就怼PID参数,结果电机抖得像筛子。其实,很多问题的根源不在控制算法,而在最基础的速度规划上。今天咱们就聊聊梯形速度曲线——这个看似简单,但门道不少的东西。
核心思想:梯形速度曲线把整个运动过程切成三段——匀加速、匀速、匀减速。说白了,就是让电机先平稳加速到目标速度,跑一会儿,再平稳停下来。
为什么是梯形?
你想想看,如果让电机直接全速启动,冲击力有多大?我早期做过一个贴标机项目,就是因为加速太猛,标签飞出去好几米。梯形曲线的好处在于:加速度恒定,意味着力是平稳的,机械结构不会受到冲击。
嗯,这里要注意:梯形曲线不是万能的。它适合大多数点位运动,但如果你做的是高精度轨迹跟踪,那得考虑S形曲线。不过那是后面章节的事,今天先把梯形吃透。
三段式结构拆解
我们用一个实际例子来说明。假设电机要从位置0走到位置100mm,最大速度100mm/s,加速度500mm/s²。整个过程是这样的:
- 匀加速段:速度从0线性增加到100mm/s,用时0.2秒,走了10mm
- 匀速段:以100mm/s跑80mm,用时0.8秒
- 匀减速段:速度从100mm/s降到0,用时0.2秒,走了10mm
总时间1.2秒,总位移100mm。你看,速度曲线画出来就是个梯形。
我的习惯:做运动规划时,我总会在纸上先画速度-时间图。图形出来了,参数就清楚了。梯形曲线最怕的就是距离太短,还没加速到目标速度就得减速——这种情况叫"三角曲线",后面会讲。
运动学公式推导
这部分是硬核内容,但别怕,我用最直白的方式讲。
设加速度为a,最大速度为v_max,总位移为S。三段分别用下标1、2、3表示:
匀加速段
加速度a恒定,初速度0,末速度v_max:
- 时间:t₁ = v_max / a
- 位移:S₁ = ½ · a · t₁² = v_max² / (2a)
匀速段
速度v_max恒定,加速度为0:
- 时间:t₂ = S₂ / v_max
- 位移:S₂ = S - S₁ - S₃
匀减速段
加速度-a(减速),初速度v_max,末速度0:
- 时间:t₃ = v_max / a
- 位移:S₃ = v_max² / (2a)
总时间:T = t₁ + t₂ + t₃ = 2·v_max/a + S₂/v_max
我曾经踩过的坑:有一次做多轴同步,我直接用上面的公式算时间,结果发现实际运动比理论慢了0.1秒。查了半天,原来是加减速时间算对了,但忽略了控制器内部的插补周期。所以,实际应用中一定要留余量,至少多算5%的时间。
位移与速度的几何关系
这个关系特别直观。你想想看,在速度-时间图上,曲线下方的面积就是位移。梯形面积怎么算?上底加下底乘高除以2?不对,那是梯形面积公式。这里更简单:
梯形面积 = 矩形面积 + 两个三角形面积
矩形面积 = v_max × t₂(匀速段位移)
三角形面积 = ½ × v_max × t₁(加速段位移)
所以总位移:S = v_max·t₂ + 2 × (½·v_max·t₁) = v_max·(t₁ + t₂ + t₃) - v_max·t₁
嗯,绕晕了?直接看下面的图就明白了。
上图就是典型的梯形速度曲线。加速区、匀速区、减速区一目了然。我个人习惯把加速和减速的斜率画成一样,这样对称,计算方便。但实际中,如果负载变化大,加减速时间可以不同。
实际应用中的参数选择
| 参数 | 影响 | 我的建议 |
|---|---|---|
| 加速度 a | 越大,启停越快,但冲击也大 | 先按电机额定转矩的70%算,再实测调整 |
| 最大速度 v_max | 决定匀速段效率 | 别超过电机额定转速的80%,留余量 |
| 总位移 S | 决定是否出现三角曲线 | 如果 S < v_max²/a,自动降速 |
避坑指南:我曾经在一个项目中,为了赶节拍,把加速度设得很大。结果电机是跑得快了,但机械臂末端抖得厉害,定位精度从0.1mm掉到0.5mm。后来把加速度降了30%,精度就回来了。所以,加速度不是越大越好,要综合考虑机械刚性和负载惯量。
代码实现示例
下面是一个简单的梯形速度规划函数,用C语言写的。实际项目中我会加上滤波和异常处理,这里展示核心逻辑:
// 梯形速度规划 - 核心函数
// 输入:总位移S,最大速度v_max,加速度a
// 输出:各段时间和位移
void trapezoidal_plan(float S, float v_max, float a) {
float t_acc = v_max / a; // 加速时间
float S_acc = 0.5 * a * t_acc * t_acc; // 加速位移
// 检查是否够距离加速到v_max
if (2 * S_acc >= S) {
// 三角曲线模式 - 到不了v_max
float v_peak = sqrt(a * S); // 实际能达到的最高速度
t_acc = v_peak / a;
S_acc = 0.5 * a * t_acc * t_acc;
printf("三角曲线模式,峰值速度: %.2f\n", v_peak);
} else {
// 标准梯形模式
float S_const = S - 2 * S_acc; // 匀速段位移
float t_const = S_const / v_max;
printf("梯形模式,匀速时间: %.2f\n", t_const);
}
printf("加速时间: %.2f, 加速位移: %.2f\n", t_acc, S_acc);
}
小技巧:实际调试时,我习惯先用上面的公式算出理论值,然后在示波器上抓速度曲线对比。如果实际曲线和理论偏差超过5%,说明要么电机力矩不够,要么机械有卡滞。这个方法帮我排查过好几次机械故障。
好了,梯形速度曲线的基础就这些。匀加速、匀速、匀减速三段式结构,配上运动学公式和几何关系,你已经掌握了核心。下一节我们会深入讨论梯形曲线的变种——三角曲线和带S形过渡的改进型。但今天先到这里,消化一下,动手算个例子试试。