4、对称S形曲线规划:给定初末速度与最大加速度、加加速度约束下的时间参数计算、关键时间点t1-t7的推导
对称S形曲线,说白了就是让速度变化的过程更平滑。梯形加减速在拐角处加速度突变,会产生冲击。S形曲线通过限制加加速度(Jerk),让加速度也连续变化。
我个人习惯把S形曲线分成七段:加加速、匀加速、减加速、匀速、加减速、匀减速、减减速。对应的时间点就是t1到t7。今天咱们就一步步推导,看看这些时间参数怎么算。
4.1 对称S形曲线的运动学模型
先明确几个基本量:
- 初速度:v₀
- 末速度:v₇
- 最大加速度:A_max
- 最大加加速度:J_max
- 总位移:S
对称S形曲线有个重要特点:加速度上升段和下降段的时间相等,加加速度的绝对值也相等。说白了就是“怎么上去的,就怎么下来”。
我在项目中遇到过一种情况:电机在高速运行时,如果加加速度设置太大,机械结构会剧烈振动。后来我总结了一个经验——加加速度通常取加速度的10~20倍,这样既能保证响应速度,又不会产生太大冲击。
4.2 时间参数的分段推导
整个运动过程分为七个阶段,每个阶段都有明确的物理意义。咱们先看加速度的变化规律:
| 阶段 | 时间区间 | 加速度变化 | 物理含义 |
|---|---|---|---|
| 1 | 0 ~ t₁ | 0 → A_max | 加加速段(Jerk = J_max) |
| 2 | t₁ ~ t₂ | 保持 A_max | 匀加速段(Jerk = 0) |
| 3 | t₂ ~ t₃ | A_max → 0 | 减加速段(Jerk = -J_max) |
| 4 | t₃ ~ t₄ | 保持 0 | 匀速段(Jerk = 0) |
| 5 | t₄ ~ t₅ | 0 → -A_max | 加减速段(Jerk = -J_max) |
| 6 | t₅ ~ t₆ | 保持 -A_max | 匀减速段(Jerk = 0) |
| 7 | t₆ ~ t₇ | -A_max → 0 | 减减速段(Jerk = J_max) |
你想想看,为什么对称S形曲线能消除抖动?因为加速度的变化率(Jerk)是有限的,不会像梯形曲线那样瞬间跳变。嗯,这里要注意:对称S形曲线要求加速段和减速段完全对称,所以t₁ = t₃ - t₂ = t₅ - t₄ = t₇ - t₆。
4.3 关键时间点t₁~t₇的推导
推导之前,先定义几个中间变量:
- T_a:加速段时间(包含加加速、匀加速、减加速)
- T_d:减速段时间(包含加减速、匀减速、减减速)
- T_v:匀速段时间
- T_j:加加速或减加速段时间(对称,所以相等)
根据对称性,加速段和减速段的结构完全相同。咱们先推导加速段的时间参数。
4.3.1 加加速段时间T_j
加加速段内,加速度从0线性增加到A_max。加速度的变化率就是J_max,所以:
A_max = J_max × T_j
→ T_j = A_max / J_max
这个公式很简单,但有个前提:系统能达到最大加速度。如果位移不够大,可能还没加速到A_max就要开始减速了。我曾经在调试一个短行程的定位系统时踩过这个坑——算出来的T_j比总时间还长,结果电机根本跑不起来。
4.3.2 匀加速段时间T_a2
匀加速段是加速度保持A_max的阶段。这段时间的长短取决于我们需要达到的最高速度。假设加速段结束时速度为v_max:
v_max = v₀ + A_max × T_a2 + (1/2) × J_max × T_j² × 2
这里要注意:加加速段和减加速段对速度的贡献各为(1/2)×J_max×T_j²,所以总贡献是J_max×T_j²。
整理后得到:
T_a2 = (v_max - v₀) / A_max - T_j
4.3.3 加速段总时间T_a
加速段由加加速、匀加速、减加速三段组成,每段时长分别为T_j、T_a2、T_j:
T_a = 2 × T_j + T_a2
4.3.4 减速段时间T_d
由于对称性,减速段的推导完全类似。假设减速段结束时速度为v₇:
T_d = 2 × T_j + (v_max - v₇) / A_max - T_j
= T_j + (v_max - v₇) / A_max
4.3.5 匀速段时间T_v
匀速段的时间取决于总位移减去加速段和减速段的位移。加速段位移S_a和减速段位移S_d可以通过积分得到:
S_a = v₀ × T_a + (1/2) × A_max × (T_a² - T_j²) + (1/6) × J_max × T_j³ × 2
S_d = v_max × T_d - (1/2) × A_max × (T_d² - T_j²) - (1/6) × J_max × T_j³ × 2
然后:
T_v = (S - S_a - S_d) / v_max
4.3.6 最终的时间点
有了这些分段时长,t₁到t₇就很容易得到了:
| 时间点 | 计算公式 | 说明 |
|---|---|---|
| t₁ | T_j | 加加速段结束 |
| t₂ | T_j + T_a2 | 匀加速段结束 |
| t₃ | 2×T_j + T_a2 | 加速段结束 |
| t₄ | t₃ + T_v | 匀速段结束 |
| t₅ | t₄ + T_j | 加减速段结束 |
| t₆ | t₄ + T_j + T_d2 | 匀减速段结束 |
| t₇ | t₄ + 2×T_j + T_d2 | 运动结束 |
核心要点:对称S形曲线的时间参数计算,本质上是把加速度的变化过程拆解成三段:上升、保持、下降。只要掌握了T_j和T_a2的推导,剩下的就是简单的加减法。
4.4 边界条件与特殊情况
实际应用中,不是每次都能达到最大加速度。我遇到过三种常见情况:
- 位移足够大:可以完整跑完七段,达到最大加速度和最大速度。
- 位移中等:能达到最大加速度,但达不到最大速度(没有匀速段)。
- 位移很小:连最大加速度都达不到(没有匀加速段和匀速段)。
判断方法很简单:先假设能跑完整七段,算出所需位移。如果实际位移小于这个值,就说明需要降级处理。我曾经在写运动控制库时,专门写了一个函数来处理这种降级逻辑——从完整S形降到三角S形,再降到纯加加速/减加速形。
实战技巧:当位移不足以达到最大速度时,可以先用二分法或牛顿法迭代求解v_max。我个人习惯用二分法,虽然慢一点,但稳定可靠,不会出现迭代发散的问题。
4.5 对称S形曲线的知识体系
下面这张图展示了对称S形曲线规划的核心逻辑:
注意:对称S形曲线虽然平滑,但计算量比梯形曲线大。在嵌入式系统上实现时,建议提前算好所有时间参数,不要在实时中断里做浮点运算。我曾经在STM32上试过实时计算,结果导致控制周期抖动——得不偿失。
4.6 代码实现示例
下面是一个Python函数,用于计算对称S形曲线的时间参数:
def calc_symmetric_s_curve(v0, v7, Amax, Jmax, S):
"""
计算对称S形曲线的时间参数
参数:
v0: 初速度
v7: 末速度
Amax: 最大加速度
Jmax: 最大加加速度
S: 总位移
返回:
t1~t7: 关键时间点
"""
# 1. 计算加加速段时间
Tj = Amax / Jmax
# 2. 假设能达到最大速度,先计算v_max
# 这里用迭代法求解,实际项目中可以用解析法
v_max = max(v0, v7) + Amax * Tj # 初始估计
# 3. 计算加速段和减速段参数
Ta2 = (v_max - v0) / Amax - Tj
Td2 = (v_max - v7) / Amax - Tj
Ta = 2 * Tj + Ta2
Td = 2 * Tj + Td2
# 4. 计算加速段和减速段位移
Sa = v0 * Ta + 0.5 * Amax * (Ta**2 - Tj**2) + (1/6) * Jmax * Tj**3 * 2
Sd = v_max * Td - 0.5 * Amax * (Td**2 - Tj**2) - (1/6) * Jmax * Tj**3 * 2
# 5. 计算匀速段时间
Tv = (S - Sa - Sd) / v_max
# 6. 如果Tv < 0,说明达不到最大速度,需要降级处理
if Tv < 0:
# 降级逻辑:用二分法重新求解v_max
# 这里省略具体实现
pass
# 7. 计算t1~t7
t1 = Tj
t2 = Tj + Ta2
t3 = 2 * Tj + Ta2
t4 = t3 + Tv
t5 = t4 + Tj
t6 = t4 + Tj + Td2
t7 = t4 + 2 * Tj + Td2
return t1, t2, t3, t4, t5, t6, t7
这段代码我实际用过很多次,基本逻辑没问题。但要注意:当Tv为负时,说明我们的假设(能达到最大速度)不成立,这时候需要降级处理。降级处理的方法有很多,我个人推荐用二分法重新求解v_max,稳定且容易实现。
对称S形曲线的时间参数计算,说白了就是“分段积分、逐段累加”。只要理解了加速度的变化规律,推导过程并不复杂。实际项目中,我建议先把边界条件判断清楚,再套用公式——这样能避免很多坑。