0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详解S型加减速曲线规划算法总结

strongerHuang 来源:小麦大叔 作者:小麦大叔 2021-04-09 17:18 次阅读

做过运动控制的小伙伴都知道,S曲线很重要,下面一张动图对比一下,你就知道S曲线的好处:

f9d22f2c-9910-11eb-8b86-12bb97331649.gif

下面分享一下S曲线的内容:

1 前言

S形加减速的最重要特征是该算法的加速度/减速度曲线的形状如字母 S。S形加减速的速度曲线平滑 ,从而能够减少对控制过程中的冲击,并使插补过程具有柔性 [^1]。由于T形曲线在加速到匀速的切换过程中,实际中存在较大过冲,因此这里对比一下T曲线和7段S曲线的实际过程;

T形:加速 -》 匀速 -》 减速

S形:加加速() -》 匀加速() -》 减加速()-》 匀速()-》 加减速()-》 匀减速()-》 减减速()

上文在加速这块的文字描述可能读起来起来有点绕,下面看图:

fa688bf2-9910-11eb-8b86-12bb97331649.png

2 理论

分析由于S曲线在加减速的过程中,其加速度是变化的,因此这里引入了新的一个变量 ,即加加速度。

因此对应上图的7段S速度曲线中,规定最大加速为,最小加速度为,则加速度的关系;

加加速():逐渐增大;

此时

匀加速():达到最大;

此时

减加速():逐渐减小;

此时

匀速():不变化;

此时

加减速(): 逐渐增大;

此时

匀减速(): 达到最大;

此时

减减速(): 逐渐减小;

此时

“为加速度的绝对值;其中

所以通常需要确定三个最基本的系统参数 :系统最大速度 ,最大加速度a_{max} ,加加速度,就可以可确定整个运行过程[^2] ;

最大速度:反映了系统的最大运行能力 ;

最大加速度:反映了系统的最大加减速能力 ;

加加速度:反映了系统的柔性;

柔性越大,过冲越大,运行时间越短;

柔性越小,过冲越小,运行时间越长;

2.1 加速度时间关系方程

整个加速度变化的过程具体如下图所示;

fd6f8756-9910-11eb-8b86-12bb97331649.png

再次强调一下 和 的关系,另外这里再引入变量 ,

比如,当前时刻 ,即 位于区间 ,则如果将 作为初始点,则 为 相对于时刻的时间,则有:

下面可以得到加速度与时间的关系函数,具体如下:

根据 ① 式,将 代入 ② 式可以得到:

上式中 ;

2.2 速度时间关系方程

速度和加速度满足 ;加加速度和速度的关系满足:

结合加速度时间关系并结合② 式可以得到速度曲线关系,具体关系如下图所示;

fd8a7a20-9910-11eb-8b86-12bb97331649.png

进一步简化可以得到:

fdd9a776-9910-11eb-8b86-12bb97331649.png

2.3 位移时间关系方程

位移 和加加速度 直接满足关系如下:

简单推导

因此可以得到:

“积分忘的差不多了,回去再复习一下;

最终位移的方程如下所示;

fdfa85f4-9910-11eb-8b86-12bb97331649.png

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(‘加速度曲线’);

看到最终仿真结果和预期相同;

fe0f71da-9910-11eb-8b86-12bb97331649.jpg

最后再看一下T形和S形速度曲线规划的效果对比:

5 总结

本文只对7段的S曲线规划做了详细的推导和介绍,matlab中的程序对于4段和5段都有做实现,很多是在理想情况下进行推导的,初始速度默认为0,终止速度也为0,并且假设加减速区域相互对称。最终运行结果符合预期效果。

“文中难免有错误和纰漏之处,请大佬们不吝赐教创作不易,如果本文帮到了您;

6 参考

[^1]:陈友东 魏洪兴 王琦魁。数控系统的直线和 S 形加减速离散算法[D]。北京:中国机械工程,2010.

[^2]:郭新贵 李从心 S 曲线加减速算法研究 上海交通大学国家模具 CAD 工程研究中心 , 200030
编辑:lyn

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • matlab
    +关注

    关注

    176

    文章

    2928

    浏览量

    228641
  • 运动控制
    +关注

    关注

    4

    文章

    526

    浏览量

    32477

原文标题:硬核 | S速度曲线规划算法总结

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    stm32控制步进电机加减速的稳定性?

    加减速的时候,在固定的时间内增加或者减少固定的转速。网上看了s曲线或者梯形加减速的一些介绍,也仿照s
    发表于 05-06 07:21

    STM32的电机库适合用来做步进电机吗? 里面包含有加减速算法没呢?

    STM32 的电机库 适合用来做步进电机吗? 里面包含有加减速算法没呢?
    发表于 05-06 07:02

    如何用stm32f103zet6控制伺服电机的加减速运动?

    想用stm32f103zet6控制伺服电机的加减速运动,不知该怎么做,请大神指教。具体情况是有个机械凸轮,有一根顶杆顶着凸轮边沿,随着凸轮转动及其外径的变化,水平顶杆会沿水平方向作直线运动。现在可以
    发表于 04-30 08:00

    汇川变频器加减速时间设置参数

    汇川变频器是一种广泛应用于工业控制领域的电气设备,用于控制电动机的转速和运行状态。在使用汇川变频器时,加减速时间设置参数是非常重要的,它决定了电动机在启动和停止过程中的速度变化情况。本文将详细介绍
    的头像 发表于 01-11 14:19 2427次阅读

    全局路径规划RRT算法原理

    通往目的地的安全和无碰撞的路径。 路径规划问题可以分为两个方面: (一)全局路径规划:全局路径规划算法属于静态规划算法,根据已有的地图信息(SLAM)为基础进行路径
    的头像 发表于 11-24 15:57 552次阅读

    拐角减速设置技术揭秘

    拐角减速应用范围: 在点胶、CNC、激光加工运动规划中,拐角减速可优化路径规划和运动轨迹,提高效率和加工品质。 技术优势: 平滑运动过渡:拐角减速
    发表于 11-14 16:14

    步进电机S加减速算法与查表方式哪个更好?

    步进电机S加减速算法与查表方式哪个更好,有谁用过,能否提供实例?
    发表于 11-08 08:10

    机器人技术中常用的路径规划算法的开源库

    如何规划机器人的运动方式是机器人开发领域的一大课题,本文分享GitHub的一个机器人技术中常用的路径规划算法的开源库,并用动图直观演示运行过程。其中大部分代码由Python实现。
    的头像 发表于 10-21 09:36 504次阅读
    机器人技术中常用的路径<b class='flag-5'>规划算法</b>的开源库

    步进电机加减速时间长短有什么不一样吗?

    步进电机加减速时间长短有什么不一样吗?一般步进电机的加减速时间是多少?  步进电机是一种常用的电机类型,在很多应用场景中都有广泛的使用。与其他电机相比,步进电机有许多独特的优点,如定位精度高、运动
    的头像 发表于 10-13 17:39 1302次阅读

    步进电机加减速是通过改变哪个参数实现的?

    步进电机加减速时间一般如何设定?步进电机加减速是通过改变哪个参数实现的? 步进电机是一种常用的电动机类型,特点是相对于其他类型的电动机具有精准的位置控制能力,是自动化控制领域广泛应用的一种电机
    的头像 发表于 10-13 17:39 1113次阅读

    机器人基于搜索和基于采样的路径规划算法

    基于搜索的路径规划算法已经较为成熟且得到了广泛应用,常常被用于游戏中人物和移动机器人的路径规划
    发表于 10-13 14:23 219次阅读
    机器人基于搜索和基于采样的路径<b class='flag-5'>规划算法</b>

    PWM控制直流电机加减速正反转

    源码已经经过验证,C语言,实现对直流电机的控制(正反转,加减速),硬件需要直流电机驱动板
    发表于 09-20 07:15

    电机运动控制算法之S速度曲线规划算法

    S形加减速的最重要特征是该算法的加速度/减速度曲线的形状如字母 S。S形加减速的速度曲线平滑 ,从而能够减少对控制过程中的冲击,并使插补过程
    的头像 发表于 09-14 09:28 4726次阅读
    电机运动控制<b class='flag-5'>算法</b>之S速度<b class='flag-5'>曲线规划算法</b>

    自动驾驶轨迹规划之路径规划总结

    路径算法。而局部路径规划是在全局路径规划之后对 路径进行一个符合车辆动力学,平稳性的轨迹优化,主要采用计算几何与数值分析中的拟合曲线。本篇文章主要是介绍路径
    发表于 06-07 14:23 0次下载
    自动驾驶轨迹<b class='flag-5'>规划</b>之路径<b class='flag-5'>规划</b><b class='flag-5'>总结</b>

    自动驾驶决策规划算法第一章笔记

    第一章 自动驾驶决策规划算法数学基础 第一节:决策规划算法的地位和作用 该笔记来自b站up主(偶像):憨厚老实的老王 视频链接主页 第二节:为什么规划中经常见到五次多项式
    发表于 06-02 14:17 0次下载
    自动驾驶决策<b class='flag-5'>规划算法</b>第一章笔记