3. T型规划三段式结构:匀加速段、匀速段、匀减速段的划分与边界条件
好,咱们今天聊聊T型速度规划的核心骨架。
说白了,T型规划就是三段直线拼起来的。哪三段?匀加速、匀速、匀减速。听起来简单吧?但实际写代码的时候,边界条件才是真正让人头疼的地方。我记得刚入行那会儿,第一次调伺服电机,就因为边界没处理好,电机直接冲过了限位,差点把机械结构撞坏。嗯,从那以后我对边界条件就特别敏感。
3.1 三段式结构长什么样?
先画个图在脑子里:横轴是时间,纵轴是速度。一个标准的T型曲线,就是先斜着上去(匀加速),然后平着走一段(匀速),最后斜着下来(匀减速)。
你想想看,为什么叫T型?因为速度曲线看起来像个梯形。如果加速段和减速段斜率一样,那就是个等腰梯形。如果总位移不够大,连匀速段都没有了,那就变成三角形了——这个我们后面会细说。
三段式的数学表达其实很直白:
- 匀加速段:速度从0线性增加到目标速度V_max,加速度为常数A
- 匀速段:速度保持V_max不变,加速度为0
- 匀减速段:速度从V_max线性减小到0,减速度为常数D(通常D = A)
我个人习惯把加速段和减速段分开定义,因为实际应用中,加减速能力往往不一样。比如有些负载,加速时电机扭矩够,但减速时惯性大,就得用更小的减速度。
3.2 边界条件——这才是关键
边界条件决定了三段能不能完整存在。我见过很多新手,上来就假设三段都有,结果一跑就出问题。为什么会这样?因为总位移不够大,速度还没加到V_max就得开始减速了。
咱们先列出三个核心边界条件:
条件一:加速段结束时的位置和速度
加速段结束时,速度达到V_max,走过的位移为:
S_acc = V_max² / (2 * A)
这里A是加速度。注意,如果A太小,加速段会很长,可能还没加速完就到终点了。
条件二:减速段开始时的位置和速度
减速段从V_max开始减速到0,需要的位移为:
S_dec = V_max² / (2 * D)
如果D和A相等,那S_acc和S_dec就一样长。
条件三:匀速段存在的条件
总位移S_total必须大于S_acc + S_dec,否则匀速段长度为0。
if S_total > S_acc + S_dec:
匀速段存在
else:
匀速段消失,变成三角形规划
我在项目中遇到过一种情况:客户要求运动时间尽量短,但电机最大速度有限。结果我算出来S_acc + S_dec已经超过了总位移,只能降低目标速度。嗯,这里要注意,降低速度后,加速段和减速段都会变短,但总时间反而可能更长——这是个典型的取舍问题。
3.3 三段的时间划分
假设三段都存在,那时间怎么算?很简单:
| 阶段 | 时间 | 位移 |
|---|---|---|
| 匀加速段 | T_acc = V_max / A | S_acc = 0.5 * A * T_acc² |
| 匀速段 | T_const = (S_total - S_acc - S_dec) / V_max | S_const = V_max * T_const |
| 匀减速段 | T_dec = V_max / D | S_dec = 0.5 * D * T_dec² |
你看,匀速段的时间就是总位移减去两头,再除以最大速度。这个公式看起来简单,但实际写代码时,一定要先判断S_total够不够大。我曾经犯过一个错:直接拿这个公式算,结果S_total - S_acc - S_dec算出来是负数,匀速段时间变成了负值——程序直接崩了。
避坑指南: 计算匀速段时间之前,务必先判断S_total是否大于S_acc + S_dec。如果小于,必须降速处理,否则会出现负时间。
3.4 边界条件的实际处理
实际工程中,边界条件往往不是理想情况。我总结了几种常见场景:
- 场景一:总位移刚好等于S_acc + S_dec
这时候匀速段长度为0,速度曲线变成三角形。时间最短,但电机需要立刻从加速切换到减速——对控制器的实时性要求很高。 - 场景二:总位移远大于S_acc + S_dec
匀速段很长,系统大部分时间在匀速跑。这时候效率最高,但要注意匀速段太长可能引起电机过热。 - 场景三:加速度或减速度受限
比如负载较重时,加速度不能太大。这时候S_acc和S_dec都会变长,可能需要降低V_max来保证三段完整。
我个人习惯在代码里先算一个「理论最大速度」:
V_theoretical = sqrt(2 * A * D * S_total / (A + D))
如果这个值小于用户设定的V_max,那就用V_theoretical代替V_max。这样能保证三段完整,而且时间最优。
小技巧: 实际调试时,我经常在示波器上同时看速度曲线和位置曲线。如果速度曲线在加速段结束时出现尖峰,说明加速度设置太大了,电机扭矩不够。这时候适当降低A,曲线就平滑了。
3.5 代码实现要点
最后给一段伪代码,展示边界条件的判断逻辑:
def t_plan(S_total, V_max, A, D):
# 先算加速和减速需要的位移
S_acc = V_max * V_max / (2 * A)
S_dec = V_max * V_max / (2 * D)
# 判断匀速段是否存在
if S_total >= S_acc + S_dec:
# 三段完整
T_acc = V_max / A
T_const = (S_total - S_acc - S_dec) / V_max
T_dec = V_max / D
else:
# 匀速段消失,降速处理
V_actual = sqrt(2 * A * D * S_total / (A + D))
T_acc = V_actual / A
T_const = 0
T_dec = V_actual / D
return T_acc, T_const, T_dec
嗯,这段代码我用了好多年,基本没出过问题。唯一要注意的是,如果A或D为0,得单独处理——不过正常规划不会出现这种情况。
总结一下:T型规划的三段式结构,核心就是边界条件。加速段和减速段的位移决定了匀速段能不能存在。实际项目中,我建议先算理论最大速度,再决定要不要降速。这样既保证了运动平滑,又不会撞到限位。