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型规划的三段式结构,核心就是边界条件。加速段和减速段的位移决定了匀速段能不能存在。实际项目中,我建议先算理论最大速度,再决定要不要降速。这样既保证了运动平滑,又不会撞到限位。