3rd S-curve velocity profile
3rd S-curve

(1)

(2)

(3)

(4)
完整的三次S曲线包括上面的七个阶段。前面三个阶段为加速阶段,从初始速度Vs加速到Vmax:
(5)
整个加速阶段的位移为:
(6)
后面三个阶段为减速阶段:
(7)
(8)
也可以看作为反向加速阶段,即速度从最终速度Ve加速到Vmax:
(9)
(10)
中间的阶段为匀速阶段:

(11)
但是在实际中,受限于Vs,Ve,以及位移L,整条速度曲线并不包含完整的七个阶段,通常Jerka = Jerkd = Jerk。那么求速度曲线可以转换为以下数学问题:已知Vs,Ve,L,Amax,Jerk,Fmax,求解下面的四元三次方程组:
(12)
其中,Sa和Sd分别由式(6)和(10)计算,并且需要满足以下限制条件:
(13)
这是一个非齐次的非线性的方程组。四个未知数,但是只有两个方程以及一些限制条件。给定初值然后利用迭代法计算也许是求解的一种途径。在设定初值上,可以分情况进行讨论。流程图如下图所示。

首先使用Vs,Ve,Fmax,Amax,Jerk的值计算T1,T2,T5,T6。计算过程中先假设T2=0,计算速度从Vs达到Fmax所需的时间T1,如果T1<Amax/Jerk,则没有上面的第二个阶段,即加速度匀速的阶段。如果T1>Amax/Jerk,则T1会受到最大加速度的限制,即T1=Amax/Jerk,T2=(Fmax-Vs)/(Jerk*T1)-T1,并且根据T1,T2通过式(6)可以计算出加速阶段的位移Sa。同理可以计算出T5,T6和Sd。
如果Sa+Sd>=L,则说明最大速度可以保持匀速一段时间T4,T4=(L-Sa-Sd)/Fmax
如果Sa+Sd<L,则说明T4=0,且整条速度曲线的峰值达不到最大速度Fmax。因此问题转换为如下的数学问题:
(14)
求T1,T2,T5,T6。
当Vs=Ve时,T1=T5,T2=T6,则求解式(14)就变成求解式(15)的解:
(15)
也是先假设T2=0,则式(15)是一个关于未知数T1的一元三次方程,且因其判别式大于零,其有唯一解。因此可以求得T1。若T1<Amax/Jerk,则T2=0,若T1>Amax/Jerk,则T1=Amax/Jerk,然后再通过式(15)计算T2。
当Vs≠Ve时,方程组有四个未知数,求不到其唯一解。因此本文中采用的是Python.scipy库中的求最小值的问题来计算T1,T2,T5,T6。即解决如下数学问题:
求T=[T1,T2,T5,T6],使得
(16)
值最小,其中,Vmax=Vs+J*T1*(T1+T2)。并满足如下的条件:
(17)
下面为这段python代码:
import numpy as np
from scipy.optimize import minimize
import math def motion_profile(args):
vs,J,Fmax,L,t = args
s=lambda x: (vs*t*(2*x[0]+x[1])+J*x[0]*math.pow(t,3)*(2*x[0]+x[1])*(x[0]+x[1])+(vs+J*x[0]*math.pow(t,2)*(x[0]+x[1]))*(2*x[2]+x[3])*t-J*x[2]*math.pow(t,3)*(2*x[2]+x[3])*(x[2]+x[3])-L)**2
return s def cons(args):
Fmax,ve,Amax,J,vs,t = args
cons = ({'type':'ineq',
'fun':lambda x:np.array([Amax/J - x[0]*t,
x[0],
x[1],
x[2],
x[3],
Amax/J - x[2]*t,
ve-vs-J*(x[0]*t)**2 -J*x[0]*t*x[1]*t + J*x[2]*t*x[3]*t + J*(x[2]*t)**2,
Fmax-ve-J*x[2]*math.pow(t,2)*(x[2]+x[3]),
vs + J*(x[0]*t)**2 + J*x[0]*t*x[1]*t - J*x[2]*t*x[3]*t -J*(x[2]*t)**2])})
return cons def optimization(args,args1,x0):
conditions = cons(args1)
res = minimize(motion_profile(args),x0,method='SLSQP',constraints = conditions) time_list = []
time_list.append(res.x[0])
time_list.append(res.x[1])
time_list.append(res.x[2])
time_list.append(res.x[3])
return time_list
整个代码可以见github:
https://github.com/Larissa1990/S-curve-Velocity-Profile
Example1:
Vs=40,Ve=35,Fmax=80,Amax=2000,Jerk=80000,L=5,interpolation_period=0.002

T1=0.022,T2=0,T4=0,T5=0.016,T6=0.02
Example2:
Vs=35,Ve=35,Fmax=80,Amax=2000,Jerk=80000,L=5,interpolation_period=0.002

T1=0.024,T2=0,T4=0,T5=0.024,T6=0
3rd S-curve velocity profile的更多相关文章
- an concreate example
Step 1: Creating Parts 1. Split the geometry 2. Create the INLET part. 3. Create the OUTLET part. 4. ...
- ansys 有限元自学手册
李兵.人邮2013.4 实体模型 –> 修正后划分 有限元网格 offset WP 偏移工作平面 模型的建立 将cT轮廓曲线 提取出来输入三维造型软件进行建模的方法,这种方法由于要对 ...
- ICEM相关
1,几何体建模不用讲(可以不学,因为通常是其他软件导入)在初始分块前,建立part,为建立边界条件使用(这是部分的定义最重要的作用,所以你可以按照不同的情况来定义,划分网格只是块的工作),所以对于三维 ...
- Disposable microfluidic devices: fabrication, function, and application Gina S. Fiorini and Daniel T
Disposable microfluidic devices: fabrication, function, and application Gina S. Fiorini and Daniel T ...
- 机器人关节空间轨迹规划--S型速度规划
关节空间 VS 操作空间 关节空间与操作空间轨迹规划流程图如下(上标$i$和$f$分别代表起始位置initial和目标位置final): 在关节空间内进行轨迹规划有如下优点: 在线运算量更小,即无需进 ...
- 机器人中的轨迹规划(Trajectory Planning )
Figure. Several possible path shapes for a single joint 五次多项式曲线(quintic polynomial) $$\theta(t)=a_0+ ...
- 使用yocs_velocity_smoother对机器人速度进行限制
yocs_velocity_smoother是一个速度.加速度限制器,用来防止robot navigation的速度/转速过快,加速度/快减速过大.Bound incoming velocity me ...
- AN2820 Driving bipolar stepper motors using a medium-density STM32F103xx microcontroller
AN2820 Driving bipolar stepper motors using a medium-density STM32F103xx microcontroller Introductio ...
- post processing in CFD
post post Table of Contents 1. Post-processing 1.1. Reverse flow 1.1.1. reasons 1.1.2. solutions 1.2 ...
随机推荐
- HTML 页面的动态线条背景-三岁
保存一个自己正在用的背景 会跟随鼠标变换的动态线条 以免后面还得找 挺好看的 效果图: 代码如下: <script type="text/javascript" color= ...
- LNMP架构搭建
目录 一:LNMP架构简介 1.Nginx与uwsgi 二:django框架+python 1.创建用户 2.安装依赖包 3.安装uwsgi和django 4.测试python 5.创建django项 ...
- 微服务架构 | 4.2 基于 Feign 与 OpenFeign 的服务接口调用
目录 前言 1. OpenFeign 基本知识 1.1 Feign 是什么 1.2 Feign 的出现解决了什么问题 1.3 Feign 与 OpenFeign 的区别与对比 2. 在服务消费者端开启 ...
- shell脚本的分发,测试,查看
#!/bin/bash for i in {2..64} do #远端复制文件或目录 rcp /test/cpuburn-in 10.1.1.$i:/test/ done #!/bin/bash fo ...
- Codeforces Round #740 Div. 2
题目跳转链接 A. Simply Strange Sort 题意 定义一个函数\(f_{i}\) : 如果\(a_i \ge a_{i+1}\) swap(\(a_i\) \(a_{i+1}\)) 定 ...
- CNN-卷积神经网络简单入门(2)
在上篇中,对卷积神经网络的卷积层以及池化层模块进行了简单的介绍,接下来将对卷积神经网络的整个运作流程进行分析,以便对CNN有个总体上的认知和掌握. 如下图,卷积神经网络要完成对图片数字的识别任务.网络 ...
- 【HTML】table表格拆分合并(colspan、rowspan)
代码演示 横向合并: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http:// ...
- docker的使用 (2)
使用Docker 想要玩转Docker,最简单的办法就是马上用Docker创建一些自己学习和工作中需要用到的容器,下面我们带着大家一起来创建这些容器. 运行Nginx Nginx是高性能的Web服务器 ...
- JS实现new关键字的功能
一.前言 众所周知:没有对象怎么办?那就new一个! 那么在JS中,当我们new一个对象的时候,这个new关键字内部都干了什么呢? 现在我们就来剖析一下原生JS中new关键字内部的工作原理. 二.原始 ...
- CSS 3D的魅力
用户1093975发表于Web项目聚集地订阅 151 在这篇文章中: 前言: demo1 demo2 结语: 本文介绍了CSS来实现3D效果,并且有详细代码和解释.建议大家只字不差的阅读.本文的作者是 ...