一文教你快速搞懂速度曲线规划之T形曲线(超详细+图文+推导+附件代码)
运动控制中常用的T速度曲线规划的原理和程序实现,最后给出了测试结果;
如果本文帮到了您,请帮忙点个赞 ;
如果本文帮到了您,请帮忙点个赞 ;
如果本文帮到了您,请帮忙点个赞 ;
1 前言
在伺服系统以及控制系统的加减速动作中,为了让速度更加平滑,可以引入T型速度曲线规划(T-curve velocity profile),T曲线是工业界广泛采用的形式,它是一种时间最优的曲线。一般情况,曲线加速和减速的过程是对称的,设给定速度上限为vmaxv_{max}vmax。加速度上限为amaxa_{max}amax,被控对象从A点运动到B点,要求生成的轨迹在这些条件下时间最优1。
2 理论分析
在整体系统高速启动,制动的状态下,可以提高整体系统的性能。每当系统完成一个动作的时候,总共包括三个过程,匀加速,匀速,匀减速,具体如下图所示;
根据vvv是否到达vmaxv_{max}vmax,这里通常要分为两种情况来讨论;
- 第一种:速度到达vmaxv_{max}vmax,最终速度曲线为梯形;
- 第二种:速度没有到达vmaxv_{max}vmax,最终速度曲线为三角形;
下面仅讨论第一种情况;
这里时间使用ttt加脚标来表示,位置量使用ppp来表示,加速度使用aaa来表示
- 设加速时间长度为tat_ata:t0—t1t_0—t_1t0—t1;
- 因为加速和减速的过程是对称的,所以减速带的时间长度也为tat_ata:t2—t3t_2—t_3t2—t3;
- 最大速度vmaxv_{max}vmaxc持续的时间长度为tmt_mtm:t1—t2t_1—t_2t1—t2;
在实际的系统中,梯形曲线通常需要设置三个参数:
- 最大速度vmaxv_{max}vmax;
- 加速度amaxa_{max}amax;
- 最终位置值PfinalP_{final}Pfinal,下面简称为PfP_fPf;
所以这三个参数可以作为已知量来处理;
下面简单推到这三个参数之间的关系:
设加减速区域经过的位置量为PaP_aPa,则:
Pa=12amta2P_a = \cfrac{1}{2}a_mt_a^2Pa=21amta2
设最大区域经过的位置量为PmP_mPm,则:
{Pm=vmtm⋯①Pf=Pa+Pm+Pa⋯②ta=vmaxamax⋯③tm=(Pf−2Pa)vmax⋯④\begin{cases}P_m=v_mt_m \cdots ①\\ \\ P_f = P_a+P_m+P_a \cdots ②\\ \\ t_a = \cfrac{v_{max}}{a_{max}} \cdots ③\\ \\ t_m = \cfrac{(P_f - 2P_a)}{v_{max}} \cdots ④\end{cases}⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧Pm=vmtm⋯①Pf=Pa+Pm+Pa⋯②ta=amaxvmax⋯③tm=vmax(Pf−2Pa)⋯④
所以输出的位置量满足以下关系:
P(t)={12amt2,t0≤t≤t112amta2+vm(t−ta),t1<t≤t212amta2+vmtm+12am(t−tm−ta)2,t2<t≤t3P(t) = \begin{cases}\cfrac{1}{2}a_mt^2,t_0 \le t \le t_1 \\ \\ \cfrac{1}{2}a_mt_a^2 + v_m(t-t_a),t_1 < t \le t_2 \\ \\ \cfrac{1}{2}a_mt_a^2 + v_mt_m+\cfrac{1}{2}a_m(t-t_m-t_a)^2,t_2 < t \le t_3\\ \end{cases}P(t)=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧21amt2,t0≤t≤t121amta2+vm(t−ta),t1<t≤t221amta2+vmtm+21am(t−tm−ta)2,t2<t≤t3
最终可以通过P(t)P(t)P(t)的关系以及①②③④式编写程序得到T型速度曲线规划。
3 matlab 实现
matlab的算法实现如下;
%% 梯形速度曲线
%% https://blog.csdn.net/u010632165
% Vm 最大熟读
% Am 最大加速度
% P 位置信号
%%
function t_curve(Vm,Am,P)
%设置初始条件
t0=0;
P0=0;
Pf=P; %最终位置
v_max=Vm; %最大速度
a_max=Am; %最大加速度
ta=v_max/a_max; %加速和减速需要的时间
Pa=0.5*a_max*ta^2; %加速或减速产生的位置量
t_m=(Pf-2*Pa)/v_max;%最大速度需要的时间
t_f=t_m+2*ta; %到达目标位置所需要的时间
t=t0:0.1:t_f;
n=size(t);
Pt=zeros(n(2),1);
i=1;
% 判断速度曲线规划属于哪一种情况
if t_f-2*ta>0
%达到最大速度,梯形
for t=t0:0.1:t_f
if t<=ta
Pt(i)=P0+0.5*a_max*t*t;
elseif ta<t && t<=t_f-ta
Pt(i)=P0+0.5*a_max*ta*ta+a_max*ta*(t-ta);
else
Pt(i)=Pf-0.5*a_max*(t_f-t)^2;
end
i=i+1;
end
else
% 未达到最大速度,速度曲线为三角形
ta=sqrt( (Pf-P0)/a_max);
t_f=2*ta;
for t=t0:0.1:t_f
if t<=ta
Pt(i)=P0+0.5*a_max*t*t;
else
Pt(i)=Pf-0.5*a_max*(t_f-t)^2;
end
i=i+1;
end
end
subplot(3,1,1);
plot(Pt);
legend('位置曲线')
subplot(3,1,2);
plot(diff(Pt))
legend('速度曲线')
subplot(3,1,3);
plot(diff(diff(Pt)))
legend('加速度曲线')
end
4 测试结果
在matlab的命令终端输入以下指令;
t_curve(3,1,20)
设置最大速度为3,加速度为1,最终位置为20;
仿真曲线如下所示;
5 c语言实现
在simulink
中调用了c
程序进行仿真测试,《一文教你快速学会在matlab的simulink中调用C语言进行仿真 》具体代码如下所示;
void sfun_myc_Outputs_wrapper(const real_T *u0,
const real_T *u1,
const real_T *u2,
const real_T *t,
real_T *y0,
real_T *y1,
real_T *y2)
{
/* %%%-SFUNWIZ_wrapper_Outputs_Changes_BEGIN --- EDIT HERE TO _END */
/* This sample sets the output equal to the input
y0[0] = u0[0];
For complex signals use: y0[0].re = u0[0].re;
y0[0].im = u0[0].im;
y1[0].re = u1[0].re;
y1[0].im = u1[0].im;
*/
/* %%%-SFUNWIZ_wrapper_Outputs_Changes_END --- EDIT HERE TO _BEGIN */
int Am = u0[0];
int Vm = u1[0];
int Pf = u2[0];
int T = t[0];
int Ta = Vm/Am;
int Tm = (Pf - Am*Ta*Ta)/Vm;
int Tf = 2*Ta+Tm;
printf("%d\r\n",Tf);
//梯形
if(Tm>0){
if(T <= Ta){
y0[0] = 0.5*Am*T*T;
y1[0] = Am*T;
y2[0] = Am;
}else if(T<=(Ta+Tm)){
y0[0] = 0.5*Am*Ta*Ta + Vm*(T-Ta);
y1[0] = Vm;
y2[0] = 0;
}else if(T<=(Ta+Tm+Ta)){
y0[0] = 0.5*Am*Ta*Ta + Vm*Tm + 0.5*Am*(T-Ta-Tm)*(T-Ta-Tm);
y1[0] = Vm-Am*(T-Ta-Tm);
y2[0] = -Am;
}
}else{
//三角形
Ta = sqrt(Pf/Am);
if(T<Ta){
y0[0] = 0.5*Am*T*T;
y1[0] = Am*T;
y2[0] = Am;
}else{
y0[0] = 0.5*Am*Ta*Ta + 0.5*Am*(T-Ta)*(T-Ta);
y1[0] = Am*Ta - Am*(T-Ta);
y2[0] = -Am;
}
}
}
仿真结果如下;
6 总结
T曲线是工业界广泛采用的形式,在运动控制上,相比较S曲线,它算法的复杂度更低,所占用的系统资源更少,但是在恒加速的拐点会出现过冲,这里S曲线就可以减少这种情况的发生。本文写的相对比较简单,笔者能力有限,难免出现错误和纰漏,希望大佬不吝赐教。
文中难免有错误和纰漏之处,请大佬们不吝赐教
创作不易,如果本文帮到了您;
请帮忙点个赞 ;
请帮忙点个赞 ;
请帮忙点个赞 ;
《S/T曲线速度规划在定点DSP上的实现》 ︎
一文教你快速搞懂速度曲线规划之T形曲线(超详细+图文+推导+附件代码)的更多相关文章
- 一文教你快速搞懂速度曲线规划之S形曲线(超详细+图文+推导+附件代码)
本文介绍了运动控制终的S曲线,通过matlab和C语言实现并进行仿真:本文篇幅较长,请自备茶水: 请帮忙点个赞
- 一文教你快速搞懂 FOC ramp function 斜坡函数的作用和实现
文章目录 定义 程序的实现 matlab 程序 C语言程序 定义 x(t)={0,t<0At,t≥0 x(t) = \begin{cases} 0,t<0\\ At,t \ge 0\\ \ ...
- 一文带你快速搞懂动态字符串SDS,面试不再懵逼
目录 redis源码分析系列文章 前言 API使用 embstr和raw的区别 SDSHdr的定义 SDS具体逻辑图 SDS的优势 更快速的获取字符串长度 数据安全,不会截断 SDS关键代码分析 获取 ...
- 一篇文章快速搞懂Qt文件读写操作
导读:Qt当中使用QFile类对文件进行读写操作,对文本文件也可以与QTextStream一起使用,这样读写操作会更加简便.QFileInfo可以用来获取文件的信息.QDir可以用于对文件夹进行操作. ...
- android基于口令加密快速搞懂(一)
import java.util.Random; import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypt ...
- [转]快速搞懂Gson的用法
原文地址:http://coladesign.cn/fast-understand-the-usage-of-gson/ 谷歌gson这个Java类库可以把Java对象转换成JSON,也可以把JSON ...
- 一文快速搞懂MySQL InnoDB事务ACID实现原理(转)
这一篇主要讲一下 InnoDB 中的事务到底是如何实现 ACID 的: 原子性(atomicity) 一致性(consistency) 隔离性(isolation) 持久性(durability) 隔 ...
- 一文教你快速读懂MQTT网关
MQTT是一种发布(publish)/订阅(subscribe)协议,MQTT协议采用发布/订阅模式,所有的物联网终端都通过TCP连接到云端,云端通过主题的方式管理各个设备关注的通讯内容,负责将设备与 ...
- 一篇文章快速搞懂Redis的慢查询分析
什么是慢查询? 慢查询,顾名思义就是比较慢的查询,但是究竟是哪里慢呢?首先,我们了解一下Redis命令执行的整个过程: 发送命令 命令排队 命令执行 返回结果 在慢查询的定义中,统计比较慢的时间段指的 ...
随机推荐
- Persona & User Scenario
Persona: Tom:男,21岁,大学生,周末经常和同学们一起出去吃饭.唱歌.打球.郊游,期间会时不时拍一些照片以作纪念,长期积累的照片数量较多且内容繁杂,很少对照片进行整理: Alisa:女,2 ...
- CentOS7.7下二进制部署MySQL多版本多实例实战
第一章 需求说明 部署MySQL5.7的三个多实例环境(端口分别为3307,3308,3309) 部署MySQL5.6和8.0版本数据库实例((端口分别为3316和3326) 第二章 环境准备 1.虚 ...
- 用 Python 黄图批量鉴别审核
前言 最近写了一款微信小程序需要用到图片审核,人工审核是不可能的人工审核的太费精力了,所以我就写了一个多线程批量识别脚本来处理,主要是调用百度AI的接口,这里我是付费了也不贵审核一条1分钱不到,再说我 ...
- 前端以BASE64码的形式上传图片
前端以BASE64码的形式上传图片 一直有一个很苦恼的问题困扰着铁柱兄,每次上传图片的时候前端要写一大堆js,然后后台也要写一堆java代码做处理.于是就在想,有没有简单又方便的方法把图片上传.今天算 ...
- sudo: 在加载插件“sudoers_policy”时在 /etc/sudo.conf 第 0 行出错 sudo: /usr/lib/sudo/sudoers.so 必须只对其所有者可写 sudo: 致命错误,无法加载插件
解决办法: su root chmod 644 /usr/lib/sudo/sudoers.so chown -R root /usr/lib/sudo 千万不要给 /usr 赋全部权限!!! ...
- weblogic补丁升级详细步骤,18.7.17补丁更新
weblogic打补丁 到weblogic官网下载补丁包 对应的补丁包 如: p22248372_1036012_Generic.zip 一 安装补丁步骤 1.登录linux的weblogic用户 ...
- composer+psr-4实现自动加载
自动加载 对于库的自动加载信息,Composer 生成了一个 vendor/autoload.php 文件.你可以简单的引入这个文件,你会得到一个免费的自动加载支持. require 'vendor/ ...
- 从蓝瘦“想哭”到 SELinux 看操作系统安全何在
最近一周,来自网络的"想哭"勒索病毒(Wannacry Ransomware)在世界各地同时上演了一部绑匪大片,台词华丽,演技出色,当仁不让地新晋世界第一网红.全球各国除了默默忙于 ...
- Boostrap Table学习笔记
最近要对项目上的table进行调整,让表格能够支持更多的操作,于是接触到了boostrapTable这个插件.研究了一天,记录下学习的内容. Boostrap Table可以支持表的分页及动态显示表的 ...
- usermod,用户密码管理,mkpasswd命令
passwd是更改用户密码的文件,如果在root下,我们可以直接输入这个命令更改密码[root@localhost ~]# passwd更改用户 root 的密码 .新的 密码:如果想更改其他用户的密 ...