运动控制中常用的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}vmax​c持续的时间长度为tmt_mtm​:t1—t2t_1—t_2t1​—t2​;

在实际的系统中,梯形曲线通常需要设置三个参数

  1. 最大速度vmaxv_{max}vmax​;
  2. 加速度amaxa_{max}amax​;
  3. 最终位置值PfinalP_{final}Pfinal​,下面简称为PfP_fPf​;

所以这三个参数可以作为已知量来处理;

下面简单推到这三个参数之间的关系:
设加减速区域经过的位置量为PaP_aPa​,则:
Pa=12amta2P_a = \cfrac{1}{2}a_mt_a^2Pa​=21​am​ta2​

设最大区域经过的位置量为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​=vm​tm​⋯①Pf​=Pa​+Pm​+Pa​⋯②ta​=amax​vmax​​⋯③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)=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧​21​am​t2,t0​≤t≤t1​21​am​ta2​+vm​(t−ta​),t1​<t≤t2​21​am​ta2​+vm​tm​+21​am​(t−tm​−ta​)2,t2​<t≤t3​​
最终可以通过P(t)P(t)P(t)的关系以及①②③④式编写程序得到T型速度曲线规划。

3 matlab 实现

matlab的算法实现如下;

  1. %% 梯形速度曲线
  2. %% https://blog.csdn.net/u010632165
  3. % Vm 最大熟读
  4. % Am 最大加速度
  5. % P 位置信号
  6. %%
  7. function t_curve(Vm,Am,P)
  8. %设置初始条件
  9. t0=0;
  10. P0=0;
  11. Pf=P; %最终位置
  12. v_max=Vm; %最大速度
  13. a_max=Am; %最大加速度
  14. ta=v_max/a_max; %加速和减速需要的时间
  15. Pa=0.5*a_max*ta^2; %加速或减速产生的位置量
  16. t_m=(Pf-2*Pa)/v_max;%最大速度需要的时间
  17. t_f=t_m+2*ta; %到达目标位置所需要的时间
  18. t=t0:0.1:t_f;
  19. n=size(t);
  20. Pt=zeros(n(2),1);
  21. i=1;
  22. % 判断速度曲线规划属于哪一种情况
  23. if t_f-2*ta>0
  24. %达到最大速度,梯形
  25. for t=t0:0.1:t_f
  26. if t<=ta
  27. Pt(i)=P0+0.5*a_max*t*t;
  28. elseif ta<t && t<=t_f-ta
  29. Pt(i)=P0+0.5*a_max*ta*ta+a_max*ta*(t-ta);
  30. else
  31. Pt(i)=Pf-0.5*a_max*(t_f-t)^2;
  32. end
  33. i=i+1;
  34. end
  35. else
  36. % 未达到最大速度,速度曲线为三角形
  37. ta=sqrt( (Pf-P0)/a_max);
  38. t_f=2*ta;
  39. for t=t0:0.1:t_f
  40. if t<=ta
  41. Pt(i)=P0+0.5*a_max*t*t;
  42. else
  43. Pt(i)=Pf-0.5*a_max*(t_f-t)^2;
  44. end
  45. i=i+1;
  46. end
  47. end
  48. subplot(3,1,1);
  49. plot(Pt);
  50. legend('位置曲线')
  51. subplot(3,1,2);
  52. plot(diff(Pt))
  53. legend('速度曲线')
  54. subplot(3,1,3);
  55. plot(diff(diff(Pt)))
  56. legend('加速度曲线')
  57. end

4 测试结果

matlab的命令终端输入以下指令;

  1. t_curve(3,1,20)

设置最大速度为3,加速度为1,最终位置为20;
仿真曲线如下所示;

5 c语言实现

simulink中调用了c程序进行仿真测试,《一文教你快速学会在matlab的simulink中调用C语言进行仿真 》具体代码如下所示;

  1. void sfun_myc_Outputs_wrapper(const real_T *u0,
  2. const real_T *u1,
  3. const real_T *u2,
  4. const real_T *t,
  5. real_T *y0,
  6. real_T *y1,
  7. real_T *y2)
  8. {
  9. /* %%%-SFUNWIZ_wrapper_Outputs_Changes_BEGIN --- EDIT HERE TO _END */
  10. /* This sample sets the output equal to the input
  11. y0[0] = u0[0];
  12. For complex signals use: y0[0].re = u0[0].re;
  13. y0[0].im = u0[0].im;
  14. y1[0].re = u1[0].re;
  15. y1[0].im = u1[0].im;
  16. */
  17. /* %%%-SFUNWIZ_wrapper_Outputs_Changes_END --- EDIT HERE TO _BEGIN */
  18. int Am = u0[0];
  19. int Vm = u1[0];
  20. int Pf = u2[0];
  21. int T = t[0];
  22. int Ta = Vm/Am;
  23. int Tm = (Pf - Am*Ta*Ta)/Vm;
  24. int Tf = 2*Ta+Tm;
  25. printf("%d\r\n",Tf);
  26. //梯形
  27. if(Tm>0){
  28. if(T <= Ta){
  29. y0[0] = 0.5*Am*T*T;
  30. y1[0] = Am*T;
  31. y2[0] = Am;
  32. }else if(T<=(Ta+Tm)){
  33. y0[0] = 0.5*Am*Ta*Ta + Vm*(T-Ta);
  34. y1[0] = Vm;
  35. y2[0] = 0;
  36. }else if(T<=(Ta+Tm+Ta)){
  37. y0[0] = 0.5*Am*Ta*Ta + Vm*Tm + 0.5*Am*(T-Ta-Tm)*(T-Ta-Tm);
  38. y1[0] = Vm-Am*(T-Ta-Tm);
  39. y2[0] = -Am;
  40. }
  41. }else{
  42. //三角形
  43. Ta = sqrt(Pf/Am);
  44. if(T<Ta){
  45. y0[0] = 0.5*Am*T*T;
  46. y1[0] = Am*T;
  47. y2[0] = Am;
  48. }else{
  49. y0[0] = 0.5*Am*Ta*Ta + 0.5*Am*(T-Ta)*(T-Ta);
  50. y1[0] = Am*Ta - Am*(T-Ta);
  51. y2[0] = -Am;
  52. }
  53. }
  54. }

仿真结果如下;

6 总结

T曲线是工业界广泛采用的形式,在运动控制上,相比较S曲线,它算法的复杂度更低,所占用的系统资源更少,但是在恒加速的拐点会出现过冲,这里S曲线就可以减少这种情况的发生。本文写的相对比较简单,笔者能力有限,难免出现错误和纰漏,希望大佬不吝赐教。

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


  1. 《S/T曲线速度规划在定点DSP上的实现》

一文教你快速搞懂速度曲线规划之T形曲线(超详细+图文+推导+附件代码)的更多相关文章

  1. 一文教你快速搞懂速度曲线规划之S形曲线(超详细+图文+推导+附件代码)

    本文介绍了运动控制终的S曲线,通过matlab和C语言实现并进行仿真:本文篇幅较长,请自备茶水: 请帮忙点个赞

  2. 一文教你快速搞懂 FOC ramp function 斜坡函数的作用和实现

    文章目录 定义 程序的实现 matlab 程序 C语言程序 定义 x(t)={0,t<0At,t≥0 x(t) = \begin{cases} 0,t<0\\ At,t \ge 0\\ \ ...

  3. 一文带你快速搞懂动态字符串SDS,面试不再懵逼

    目录 redis源码分析系列文章 前言 API使用 embstr和raw的区别 SDSHdr的定义 SDS具体逻辑图 SDS的优势 更快速的获取字符串长度 数据安全,不会截断 SDS关键代码分析 获取 ...

  4. 一篇文章快速搞懂Qt文件读写操作

    导读:Qt当中使用QFile类对文件进行读写操作,对文本文件也可以与QTextStream一起使用,这样读写操作会更加简便.QFileInfo可以用来获取文件的信息.QDir可以用于对文件夹进行操作. ...

  5. android基于口令加密快速搞懂(一)

    import java.util.Random; import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypt ...

  6. [转]快速搞懂Gson的用法

    原文地址:http://coladesign.cn/fast-understand-the-usage-of-gson/ 谷歌gson这个Java类库可以把Java对象转换成JSON,也可以把JSON ...

  7. 一文快速搞懂MySQL InnoDB事务ACID实现原理(转)

    这一篇主要讲一下 InnoDB 中的事务到底是如何实现 ACID 的: 原子性(atomicity) 一致性(consistency) 隔离性(isolation) 持久性(durability) 隔 ...

  8. 一文教你快速读懂MQTT网关

    MQTT是一种发布(publish)/订阅(subscribe)协议,MQTT协议采用发布/订阅模式,所有的物联网终端都通过TCP连接到云端,云端通过主题的方式管理各个设备关注的通讯内容,负责将设备与 ...

  9. 一篇文章快速搞懂Redis的慢查询分析

    什么是慢查询? 慢查询,顾名思义就是比较慢的查询,但是究竟是哪里慢呢?首先,我们了解一下Redis命令执行的整个过程: 发送命令 命令排队 命令执行 返回结果 在慢查询的定义中,统计比较慢的时间段指的 ...

随机推荐

  1. Spring Boot 集成 Spring Security 入门案例教程

    前言 本文作为入门级的DEMO,完全按照官网实例演示: 项目目录结构 Maven 依赖 <parent> <groupId>org.springframework.boot&l ...

  2. CTF中的命令执行绕过

    本位原创作者:Smity 在介绍命令注入之前,有一点需要注意:命令注入与远程代码执行不同.他们的区别在于,远程代码执行实际上是调用服务器网站代码进行执行,而命令注入则是调用操作系统命令进行执行. 作为 ...

  3. F - Pearls HDU - 1300

    简单dp. 题目大意:有n种珍珠,这n种珍珠有不同的需求量,不同的价格,价格越高,质量越高,在购买每一种珍珠时,都需要在原来的基础上多买10个.也就是说如果需要买x种珍珠,那就要付x+10个的钱.每一 ...

  4. mongoDB(一)——mongoDB安装部署和常用shell命令

    1.mongoDB简介 mongoDB 是由C++语言编写的,是一种分布式的面向文档存储的开源nosql数据库.nosql是Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统 ...

  5. 硬盘性能测试工具之bonnie++

    bonnie++ 官方站点 先写内存的两倍,内存较大时比较耗时.适合简单的测试场景. # bonnie++ -u root 写测试 读测试 Version 1.97 ------Sequential ...

  6. Android App安全渗透测试(一)

    一.            实验环境搭建 1.      安装JDK 2.      安装Android Studio 3.      模拟器或真机 我的是夜神模拟器和nexus 工具 Apktool ...

  7. Calendar日历类

    package com.yhqtv.demo02.ThreadPool; import java.util.Calendar; import java.util.Date; /* * java.uti ...

  8. 获取某个时间开始 之后的 N次[周几,周几]

    废话不多说,直接上菜! 调用函数代码举例 //PS :这里需要注意的是 周日 是 0 !!!!! console.log(getBeforeDate(-10000)) //一万天之后的日期 conso ...

  9. 2020最新的web前端体系和路线图,想学web前端又不知道从哪开始的快来瞧一瞧呀

    web前端其实是相对于服务器语言是简单的,并且对于初学者是非常友好的,因为在前期学习能够看到很好的效果.但是他的路线 也就是学习体系不成熟,所以导致很多初学者不知道怎么学?下面我就讲讲web前端的体系 ...

  10. 去掉input阴影&隐藏滚动条&抛异常&预加载&curl传json

    1.隐藏滚动条:-webkit-scrollbar{ display:none; } 2.array_walk():数组里的每个元素执行一个自定义函数: array_map():数组里的每个元素执行一 ...