3. S曲线数学模型:7段式S曲线的数学推导
好,咱们今天来啃这块硬骨头——7段式S曲线的数学推导。
说实话,我刚接触运动控制那会儿,看到这些分段函数就头大。但后来我发现,只要把加加速度(Jerk)这个核心搞明白,剩下的就是水到渠成的事。
3.1 为什么是7段?
你想想看,一个完整的运动过程,无非就是:加速、匀速、减速。但S曲线比梯形曲线多了什么?多了加加速度的限制。
梯形曲线的加速度是突变的,这会导致机械振动。而S曲线通过控制加加速度,让加速度平滑变化。7段式就是最经典的划分方式:
- 加加速段:加速度从0开始增加
- 匀加速段:加速度保持最大值
- 减加速段:加速度减小到0
- 匀速段:速度保持最大值
- 加减速段:加速度从0开始反向增加
- 匀减速段:加速度保持反向最大值
- 减减速段:加速度减小到0
嗯,这里要注意:并不是所有运动都需要完整的7段。如果距离太短,可能只有4段甚至3段。但咱们先啃下完整的7段模型。
3.2 加加速度——S曲线的灵魂
加加速度(Jerk)是加速度的变化率。说白了,就是加速度的变化有多快。
核心公式:
J = da/dt
其中J是加加速度,a是加速度,t是时间
我在项目中遇到过一个问题:某次调试一台高速贴片机,发现S曲线跑起来还是有抖动。查了半天,原来是加加速度设置得太大了。你想想看,加加速度太大,虽然速度曲线看着平滑,但加速度的变化太剧烈,机械结构照样受不了。
3.3 7段式S曲线的分段函数
好,咱们直接上干货。假设总运动时间为T,各段时间分别为T1到T7。最大加速度为Amax,最大速度为Vmax,加加速度为J。
第一段:加加速段(0 ≤ t < T1)
a(t) = J × t
v(t) = v0 + (1/2) × J × t²
s(t) = s0 + v0 × t + (1/6) × J × t³
第二段:匀加速段(T1 ≤ t < T1+T2)
a(t) = Amax
v(t) = v1 + Amax × (t - T1)
s(t) = s1 + v1 × (t - T1) + (1/2) × Amax × (t - T1)²
其中v1和s1是第一段结束时的速度和位移。
第三段:减加速段(T1+T2 ≤ t < T1+T2+T3)
a(t) = Amax - J × (t - T1 - T2)
v(t) = v2 + Amax × (t - T1 - T2) - (1/2) × J × (t - T1 - T2)²
s(t) = s2 + v2 × (t - T1 - T2) + (1/2) × Amax × (t - T1 - T2)² - (1/6) × J × (t - T1 - T2)³
我的小技巧:写代码时别直接套这些公式。我习惯先算出每个分段结束时的状态(位置、速度、加速度),然后作为下一段的初始条件。这样代码更清晰,也更容易调试。
第四段:匀速段(T1+T2+T3 ≤ t < T1+T2+T3+T4)
a(t) = 0
v(t) = Vmax
s(t) = s3 + Vmax × (t - T1 - T2 - T3)
第五段:加减速段(T1+T2+T3+T4 ≤ t < T1+T2+T3+T4+T5)
a(t) = -J × (t - T1 - T2 - T3 - T4)
v(t) = Vmax - (1/2) × J × (t - T1 - T2 - T3 - T4)²
s(t) = s4 + Vmax × (t - T1 - T2 - T3 - T4) - (1/6) × J × (t - T1 - T2 - T3 - T4)³
第六段:匀减速段(T1+T2+T3+T4+T5 ≤ t < T1+T2+T3+T4+T5+T6)
a(t) = -Amax
v(t) = v5 - Amax × (t - T1 - T2 - T3 - T4 - T5)
s(t) = s5 + v5 × (t - T1 - T2 - T3 - T4 - T5) - (1/2) × Amax × (t - T1 - T2 - T3 - T4 - T5)²
第七段:减减速段(T1+T2+T3+T4+T5+T6 ≤ t ≤ T)
a(t) = -Amax + J × (t - T1 - T2 - T3 - T4 - T5 - T6)
v(t) = v6 - Amax × (t - T1 - T2 - T3 - T4 - T5 - T6) + (1/2) × J × (t - T1 - T2 - T3 - T4 - T5 - T6)²
s(t) = s6 + v6 × (t - T1 - T2 - T3 - T4 - T5 - T6) - (1/2) × Amax × (t - T1 - T2 - T3 - T4 - T5 - T6)² + (1/6) × J × (t - T1 - T2 - T3 - T4 - T5 - T6)³
3.4 对称性约束
实际应用中,我们通常让加速段和减速段对称。也就是说:
T1 = T3 = T5 = T7
T2 = T6
这样做的好处很明显——计算简单,而且运动更平稳。我曾经试过非对称的S曲线,结果调试起来特别麻烦,最后还是老老实实用了对称的。
3.5 参数计算的核心逻辑
有了分段函数,接下来就是怎么算这些时间参数了。核心逻辑是这样的:
- 根据最大速度、最大加速度、加加速度,算出理论上的最短时间
- 根据实际运动距离,判断是否需要匀速段
- 如果距离不够,就调整参数,让加速段和减速段直接衔接
注意:加加速度J不能随便设。我见过有人把J设得特别大,结果S曲线和梯形曲线几乎没区别,失去了平滑的意义。一般建议J = Amax / (0.1~0.2),这样加加速段占整个加速时间的10%~20%。
3.6 代码实现示例
下面是一个简单的Python实现,计算7段式S曲线的位置、速度、加速度:
def s_curve_7segments(t, T1, T2, T3, T4, T5, T6, T7, J, Amax, Vmax):
"""
计算7段式S曲线在时间t时的状态
返回 (位置, 速度, 加速度)
"""
# 各段结束时间
t1 = T1
t2 = t1 + T2
t3 = t2 + T3
t4 = t3 + T4
t5 = t4 + T5
t6 = t5 + T6
t7 = t6 + T7
if t <= t1:
# 加加速段
a = J * t
v = 0.5 * J * t * t
s = (1/6) * J * t * t * t
elif t <= t2:
# 匀加速段
dt = t - t1
a = Amax
v = 0.5 * J * T1 * T1 + Amax * dt
s = (1/6) * J * T1 * T1 * T1 + 0.5 * J * T1 * T1 * dt + 0.5 * Amax * dt * dt
# ... 后续段类似
return s, v, a
避坑指南:我曾经在写这段代码时,把时间参数搞混了。后来我养成了一个习惯——先在纸上画出时间轴,标清楚每个分段的时间范围,再写代码。这样基本不会出错。
3.7 知识体系总览
下面这张图展示了7段式S曲线的核心知识结构:
这张图把7段式S曲线的知识体系串起来了。从加加速度这个核心概念出发,到7段分段函数的具体形式,再到参数计算逻辑,最后落实到代码实现。我个人觉得,按照这个思路去学,会清晰很多。
好了,7段式S曲线的数学推导就讲到这里。这些公式看着多,但只要你理解了加加速度的作用,再对照着分段函数去写代码,其实并不难。下一节咱们会讲怎么根据实际运动距离来动态调整这些参数。
公众号:蓝海资料掘金营,微信deep3321