做过运动控制的小伙伴都知道,s曲线很重要,下面一张动图对比一下,你就知道s曲线的好处:
下面分享一下s曲线的内容:
1 前言
s形加减速的最重要特征是该算法的加速度/减速度曲线的形状如字母 s。s形加减速的速度曲线平滑 ,从而能够减少对控制过程中的冲击,并使插补过程具有柔性 [^1]。由于t形曲线在加速到匀速的切换过程中,实际中存在较大过冲,因此这里对比一下t曲线和7段s曲线的实际过程;
t形:加速 -》 匀速 -》 减速
s形:加加速() -》 匀加速() -》 减加速()-》 匀速()-》 加减速()-》 匀减速()-》 减减速()
上文在加速这块的文字描述可能读起来起来有点绕,下面看图:
2 理论
分析由于s曲线在加减速的过程中,其加速度是变化的,因此这里引入了新的一个变量 ,即加加速度。
因此对应上图的7段s速度曲线中,规定最大加速为,最小加速度为,则加速度的关系;
加加速():逐渐增大;
此时
匀加速():达到最大;
此时
减加速():逐渐减小;
此时
匀速():不变化;
此时
加减速(): 逐渐增大;
此时
匀减速(): 达到最大;
此时
减减速(): 逐渐减小;
此时
“为加速度的绝对值;其中
所以通常需要确定三个最基本的系统参数 :系统最大速度 ,最大加速度a_{max} ,加加速度,就可以可确定整个运行过程[^2] ;
最大速度:反映了系统的最大运行能力 ;
最大加速度:反映了系统的最大加减速能力 ;
加加速度:反映了系统的柔性;
柔性越大,过冲越大,运行时间越短;
柔性越小,过冲越小,运行时间越长;
2.1 加速度时间关系方程
整个加速度变化的过程具体如下图所示;
再次强调一下 和 的关系,另外这里再引入变量 ,
比如,当前时刻 ,即 位于区间 ,则如果将 作为初始点,则 为 相对于时刻的时间,则有:
下面可以得到加速度与时间的关系函数,具体如下:
根据 ① 式,将 代入 ② 式可以得到:
上式中 ;
2.2 速度时间关系方程
速度和加速度满足 ;加加速度和速度的关系满足:
结合加速度时间关系并结合② 式可以得到速度曲线关系,具体关系如下图所示;
进一步简化可以得到:
2.3 位移时间关系方程
位移 和加加速度 直接满足关系如下:
简单推导
因此可以得到:
“积分忘的差不多了,回去再复习一下;
最终位移的方程如下所示;
3 程序实现的思路
正如前面所提到的,s曲线规划需要确定三个最基本的系统参数 :系统最大速度 ,最大加速度a_{max} ,加加速度,这样就可以确定这个运行过程。这里有一个隐性的条件,就是在运行的过程中可以达到最大速度,这样才是完整的7段s曲线,另外这里还有一些中间参数:
,因此有 ;
加加速度 ;
;
,用户给定整个运行过程所需要的时间;
但是通常实际过程中关心,,;
3.1 推导
理想状态假设存在 和,则推导过程如下:
因此可以得到:
简化之后得到:
根据②式可知:
最终得到:
下面可以根据位移时间关系方程进行离散化的程序编写。
假设可以到达最大速度,且用户给定了整个过程运行时间,则 的推导如下:
简化上式可以得到:
根据 代入上式可得:
3.2 的推导
这时候还剩下需要计算,通过已量 可以推导出来;首先位移之间满足关系如下:
其中加速区长度为 ;其中减速区长度为 ;
具体推导;[^2]前面提到过,,因此在=0的时候,则
这里简单推导一下:
根据④,⑤最终简化得到:
“:为运行的总时间:为运行的总路程
详细推导过程如下:
因为:
因为:
所以,简化得到:
所以可以得到:
因为:
将其代入可以得到:
简化得到最终结果:
4 matlab
程序matlab程序亲测可以运行,做了简单的修改,因为这里直接给定了整个运行过程的时间,所以需要在scurvepara函数中求出加加速度 的值,路程为 1:
scurvepara
function [tf1,v,a,j,t] = scurvepara(tf, v, a)
t = zeros(1,7);
for i=1:1000
% 加加速度 j
j = (a^2 * v) / (tf*v*a - v^2 - a);
% tk
t(1) = a / j;
t(2) = v / a - a / j; % t2 = v / a - t1;
t(3) = t(1);
t(4) = tf - 2 * a / j - 2 * v / a; % t4 = tf - 4*t1 - 2*t2;
t(5) = t(3);
t(6) = t(2);
t(7) = t(1);
% 根据t2和t4判断s曲线的类型
if t(2) 《 -1e-6
a = sqrt(v*j);
display(‘t2《0’);
elseif t(4) 《 -1e-6
v = tf*a/2 - a*a/j;
display(‘t4《0’);
elseif j 《 -1e-6
tf = (v^2 + a) / (v*a) + 1e-1;
display(‘j《0’);
else
break;
end
end
a = a;
v = v;
tf1 = tf;
end
scurvescaling
function s = scurvescaling(t,v,a,j,t,tf)
% j = (a^2 * v) / (tf*v*a - v^2 - a);
% t(1) = a / j;
% t(2) = v / a - a / j; % t(2) = v / a - t(1);
% t(3) = t(1);
% t(4) = tf - 2 * a / j - 2 * v / a; % t(4) = tf - 4*t(1) - 2*t(2);
% t(5) = t(3);
% t(6) = t(2);
% t(7) = t(1);
%%
if (t 》= 0 && t 《= t(1))
s = 1/6 * j * t^3;
elseif ( t 》 t(1) && t 《= t(1)+t(2) )
dt = t - t(1);
s = 1/2 * a * dt^2 + a^2/(2*j) * dt.。.
+ a^3/(6*j^2);
elseif ( t 》 t(1)+t(2) && t 《= t(1)+t(2)+t(3) )
dt = t - t(1) - t(2);
s = -1/6*j*dt^3 + 1/2*a*dt^2 + (a*t(2) + a^2/(2*j))*dt 。..
+ 1/2*a*t(2)^2 + a^2/(2*j)*t(2) + a^3/(6*j^2);
elseif ( t 》 t(1)+t(2)+t(3) && t 《= t(1)+t(2)+t(3)+t(4) )
dt = t - t(1) - t(2) - t(3);
s = v*dt 。..
+ (-1/6*j*t(3)^3) + 1/2*a*t(3)^2 + (a*t(2) + a^2/(2*j))*t(3) + 1/2*a*t(2)^2 + a^2/(2*j)*t(2) + a^3/(6*j^2);
elseif ( t 》 t(1)+t(2)+t(3)+t(4) && t 《= t(1)+t(2)+t(3)+t(4)+t(5) )
t_temp = tf - t;
dt = t_temp - t(1) - t(2);
s = -1/6*j*dt^3 + 1/2*a*dt^2 + (a*t(2) + a^2/(2*j))*dt 。..
+ 1/2*a*t(2)^2 + a^2/(2*j)*t(2) + a^3/(6*j^2);
s = 1 - s;
elseif ( t 》 t(1)+t(2)+t(3)+t(4)+t(5) && t 《= t(1)+t(2)+t(3)+t(4)+t(5)+t(6) )
t_temp = tf - t;
dt = t_temp - t(1);
s = 1/2 * a * dt^2 + a^2/(2*j) * dt + a^3/(6*j^2);
s = 1 - s;
elseif ( t 》 t(1)+t(2)+t(3)+t(4)+t(5)+t(6) && t 《= t(1)+t(2)+t(3)+t(4)+t(5)+t(6)+t(7) + 1e5 )
t_temp = tf - t;
s = 1/6 * j * t_temp^3;
s = 1 - s;
end
end
测试的代码如下:test
%%
n = 500;
thetastart = 0; %起始位置
thetaend = 90; %最终位置
vtheta = 90; %1 速度
atheta = 135; %1.5 加速度
tf = 1.8; % 总行程时间
v = vtheta/(thetaend - thetastart);
a = atheta/(thetaend - thetastart);
v = abs(v);
a = abs(a);
theta = zeros(1,n);
s = zeros(1,n);
sd = zeros(1,n);
sdd = zeros(1,n);
[tf,v,a,j,t] = scurvepara(tf, v, a);
display(j, ‘j:’);
display(tf,‘tf:’);
display(v,‘v:’);
display(a, ‘da:’);
display(tf-tf,‘dtf:’);
display(v-v,‘dv:’);
display(a-a, ‘da:’);
t=linspace(0,tf,n);
dt = t(2) - t(1);
for i = 1:n
if i == n
a = a;
end
s(i) = scurvescaling(t(i),v,a,j,t,tf);
theta(i) = thetastart + s(i) * (thetaend - thetastart);
if i》1
sd(i-1) = (s(i) - s(i-1)) / dt;
end
if i》2
sdd(i-2) = (sd(i-1) - sd(i-2)) / dt;
end
end
subplot(3,1,1);
legend(‘theta’);
xlabel(‘t’);
subplot(3,1,1);
plot(t,s)
legend(‘位移’);
xlabel(‘t’);
title(‘位置曲线’);
subplot(3,1,2);
plot(t,sd);
legend(‘速度’);
xlabel(‘t’);
title(‘速度曲线’);
subplot(3,1,3);
plot(t,sdd);
legend(‘加速度’);
xlabel(‘t’);
title(‘加速度曲线’);
看到最终仿真结果和预期相同;
最后再看一下t形和s形速度曲线规划的效果对比:
5 总结
本文只对7段的s曲线规划做了详细的推导和介绍,matlab中的程序对于4段和5段都有做实现,很多是在理想情况下进行推导的,初始速度默认为0,终止速度也为0,并且假设加减速区域相互对称。最终运行结果符合预期效果。
“文中难免有错误和纰漏之处,请大佬们不吝赐教创作不易,如果本文帮到了您;
6 参考
[^1]:陈友东 魏洪兴 王琦魁。数控系统的直线和 s 形加减速离散算法[d]。北京:中国机械工程,2010.
[^2]:郭新贵 李从心 s 曲线加减速算法研究 上海交通大学国家模具 cad 工程研究中心 , 200030
物联网智能公寓设备_智能家居网关
持续创新夯实云网算力底座,软硬协同加速数智化转型
Saildrone推出72英尺长的自动驾驶海底测绘船
物联网怎样帮助患者恢复
电子分频前后级放大器后级部分(一)
详解S型加减速曲线规划算法总结
柔性上料 柔性振盘anyfeeder 弗莱克斯
RTX 40 SUPER最终规格实锤!好像不用抽奖了
六要素超声波微气象仪的详细介绍
Faraday Future称在美工厂获得临时办公许可 贾跃亭陪同考察
多光子显微镜成像技术:用于体内神经元成像的多种技术
浙江联通携手中兴通讯成功完成了5G新型智能城域网试点
联想发布哪两大智能场景解决方案?
高压跌落式熔断器结构
高频使用的几种设计模式
专家面对面研讨会合肥站-孟昊:问题解答和产品的现场调试(2)
工控项目调试全过程分享值得收藏
北斗卫星和低轨通信卫星技术对比
这几种智能门禁系统方案,一点你就明白
小米6发布会提前看:小米6和小米Note2都是炮灰,小米MIX2才是发布会的主角?