一文教你快速搞懂速度曲線規划之S形曲線(超詳細+圖文+推導+附件代碼)


 

本文介紹了運動控制終的S曲線,通過matlab和C語言實現並進行仿真;本文篇幅較長,請自備茶水;
請幫忙點個贊 👍👍👍;
請幫忙點個贊 👍👍👍;
請幫忙點個贊 👍👍👍;

之前有介紹過T形曲線,具體可以參考《一文教你快速搞懂速度曲線規划之T形曲線》,本文將在原先的基礎上進行進一步擴展,另外由於介紹速度曲線的論文較多,本文會在具體引用的地方給出原文出處;先對比一下兩者的差別;

在這里插入圖片描述
網圖侵刪

 

1 前言

S形加減速的最重要特征是該算法的加速度/減速度曲線的形狀如字母 S。S形加減速的速度曲線平滑 ,從而能夠減少對控制過程中的沖擊,並使插補過程具有柔性 1
由於T形曲線在加速到勻速的切換過程中,實際中存在較大過沖,因此這里對比一下T曲線和7段S曲線的實際過程;

  • T形加速 -> 勻速 -> 減速
  • S形加加速(T1T_1T1) -> 勻加速(T2T_2T2) -> 減加速(T3T_3T3)-> 勻速(T4T_4T4)-> 加減速(T5T_5T5)-> 勻減速(T6T_6T6)-> 減減速(T7T_7T7)

上文在加速這塊的文字描述可能讀起來起來有點繞,下面看圖:

在這里插入圖片描述

2 理論分析

由於S曲線在加減速的過程中,其加速度是變化的,因此這里引入了新的一個變量 JJJ,即加加速度
J=dadt J = \cfrac{d_a}{d_t} J=dtda
因此對應上圖的7段S速度曲線中,規定最大加速為amaxa_{max}amax,最小加速度為−amax-a_{max}amax,則加速度的關系;

  • 加加速(T1T_1T1):aaa逐漸增大,此時a=JT1,0<t≤t1;a = JT_1,\qquad 0<t\le t_1;a=JT1,0<tt1;
  • 勻加速(T2T_2T2):aaa達到最大,此時a=amax,t1<t≤t2;a = a_{max}, \qquad t_1<t\le t_2;a=amax,t1<tt2;
  • 減加速(T3T_3T3):aaa逐漸減小,此時a=amax−JT3,t2<t≤t3;a = a_{max}-JT_3, \qquad t_2<t\le t_3;a=amaxJT3,t2<tt3;
  • 勻速(T4T_4T4):aaa不變化,此時a=0,t3<t≤t4;a = 0, \qquad t_3<t\le t_4;a=0,t3<tt4;
  • 加減速(T5T_5T5):∣a∣|a|a 逐漸減小,此時a=−JT5,t4<t≤t5;a = -JT_5, \qquad t_4<t\le t_5;a=JT5,t4<tt5;
  • 勻減速(T6T_6T6):∣a∣|a|a 達到最小,此時a=−amax,t5<t≤t6;a = -a_{max}, \qquad t_5<t\le t_6;a=amax,t5<tt6;
  • 減減速(T7T_7T7):∣a∣|a|a 達到最小,此時a=−amax+−JT7,t6<t≤t7;a = -a_{max}+-JT_7, \qquad t_6<t\le t_7;a=amax+JT7,t6<tt7;

其中 Tk=tk−tk−1(k=1,...,7)T_k =t_k - t_{k -1} (k =1 , ..., 7)Tk=tktk1(k=1,...,7)

所以通常需要確定三個最基本的系統參數 :系統最大速度 vmaxv_{max}vmax ,最大加速度a_{max} ,加加速度JJJ,就可以可確定整個運行過程2

  • 最大速度:反映了系統的最大運行能力 ;
  • 最大加速度:反映了系統的最大加減速能力 ;
  • 加加速度:反映了系統的柔性;
    • 柔性越小,過沖越大,運行時間越短;
    • 柔性越大,過沖越小,運行時間越長;

2.1 加速度時間關系方程

整個加速度變化的過程具體如下圖所示;

在這里插入圖片描述
再次強調一下 TTTttt 的關系,Tk=tk−tk−1(k=1,...,7)T_k =t_k - t_{k -1} (k =1 , ..., 7)Tk=tktk1(k=1,...,7)
另外這里再引入變量 τ\tauτ
τk=t−tk−1⋯①\tau_k = t - t_{k-1}\quad \cdots \quad①τk=ttk1
比如,當前時刻 t2<t≤t3t_2<t\le t_3t2<tt3 ,即 ttt 位於區間 T3T_3T3,則如果將 t2t_2t2 作為初始點,則 τ3\tau_3τ3w為 ttt 相對於t2t_2t2時刻的時間,則有:
τ3=t−t2 \tau_3 = t - t_2 τ3=tt2
下面可以得到加速度與時間的關系函數,具體如下:
a(t)={Jt,0<t≤t1amax,t1<t≤t2amax−J(t−t2),t2<t≤t30,t3<t≤t4−J(t−t4),t4<t≤t5−amax,t5<t≤t6−amax−J(t−t7),t6<t≤t7⋯② \begin{aligned} a(t)=\begin{cases} Jt, & 0<t\le t_1 \\ a_{max}, & t_1<t\le t_2 \\ a_{max}-J(t-t_2), & t_2<t\le t_3 \\ 0,& t_3<t\le t_4 \\ -J(t-t_4),& t_4<t\le t_5 \\ -a_{max},& t_5<t\le t_6 \\ -a_{max}-J(t-t_7),& t_6<t\le t_7 \end{cases} \end{aligned} \quad \cdots \quad②a(t)=Jt,amax,amaxJ(tt2),0,J(tt4),amax,amaxJ(tt7),0<tt1t1<tt2t2<tt3t3<tt4t4<tt5t5<tt6t6<tt7

根據 ① 式,將 τ\tauτ 代入 ② 式可以得到:
a(t)={Jτ1,0<t≤t1amax,t1<t≤t2amax−Jτ3,t2<t≤t30,t3<t≤t4−Jτ3,t4<t≤t5−amax,t5<t≤t6−amax+Jτ7,t6<t≤t7 \begin{aligned} a(t)=\begin{cases} J\tau_1, & 0<t\le t_1 \\ a_{max}, & t_1<t\le t_2 \\ a_{max}-J\tau_3, & t_2<t\le t_3 \\ 0,& t_3<t\le t_4 \\ -J\tau_3,& t_4<t\le t_5 \\ -a_{max},& t_5<t\le t_6 \\ -a_{max}+J\tau_7,& t_6<t\le t_7 \end{cases} \end{aligned}a(t)=Jτ1,amax,amaxJτ3,0,Jτ3,amax,amax+Jτ7,0<tt1t1<tt2t2<tt3t3<tt4t4<tt5t5<tt6t6<tt7

上式中 J>0J > 0J>0

2.2 速度時間關系方程

速度和加速度滿足 v=atv=atv=at ;加加速度和速度的關系滿足:
v=12Jt2v = \cfrac{1}{2} Jt^2v=21Jt2

結合加速度時間關系並結合② 式可以得到速度曲線關系,具體關系如下圖所示;


在這里插入圖片描述


進一步簡化可以得到:


在這里插入圖片描述

2.3 位移時間關系方程

位移 SSS 和加加速度 JJJ 直接滿足關系如下:
S=16Jt3 S = \cfrac{1}{6} Jt^3 S=61Jt3

簡單推導
{S=∫0tvdtv=12Jt2\begin{cases} S = \int_{0}^{t}vdt \\ v = \cfrac{1}{2} Jt^2 \end{cases}S=0tvdtv=21Jt2
因此可以得到:
S=∫0t12Jt2dt=16Jt3∣0t S = \int_{0}^{t}\cfrac{1}{2}Jt^2dt = \cfrac{1}{6}Jt^3|_0^t\\ S=0t21Jt2dt=61Jt30t

積分忘的差不多了,回去再復習一下;

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

在這里插入圖片描述

3 程序實現的思路

正如前面所提到的,S曲線規划需要確定三個最基本的系統參數 :系統最大速度 vmaxv_{max}vmax ,最大加速度a_{max} ,加加速度JJJ,這樣就可以確定這個運行過程。
這里有一個隱性的條件,就是在運行的過程中可以達到最大速度,這樣才是完整的7段S曲線,另外這里還有一些中間參數:

  • tm=vmaxamaxt_m = \cfrac{v_{max}}{a_{max}}tm=amaxvmax,因此有 T1=T3=T5=T7T_1=T_3=T_5=T_7T1=T3=T5=T7
  • 加加速度 J=J1=J3=J5=J7=amaxtmJ = J_1= J_3= J_5= J_7=\cfrac{a_{max}}{t_m}J=J1=J3=J5=J7=tmamax
  • T2=T6T_2 = T_6T2=T6
  • TfT_fTf,用戶給定整個運行過程所需要的時間;

但是通常實際過程中關心amaxa_{max}amaxvmaxv_{max}vmaxTfT_fTf

3.1 TkT_kTk 推導

理想狀態假設存在 T2T_2T2T6T_6T6則推導過程如下:

{v1=12JT12v2=v1+amaxT2v3=v2+12JT32v3=vmaxT1=T3\begin{cases} v_1 = \cfrac{1}{2}JT_1^2 \\ v_2 = v_1 + a_{max}T_2\\ v_3 = v_2 + \cfrac{1}{2}JT_3^2 \\ v_3 = v_{max} \\ T_1 = T_3 \end{cases}v1=21JT12v2=v1+amaxT2v3=v2+21JT32v3=vmaxT1=T3

因此可以得到:
vmax=12JT12+amaxT2+12JT12 v_{max} = \cfrac{1}{2}JT_1^2 + a_{max}T_2 +\cfrac{1}{2}JT_1^2vmax=21JT12+amaxT2+21JT12

簡化之后得到:
vmax=JT12+amaxT2 v_{max} = JT_1^2 + a_{max}T_2vmax=JT12+amaxT2

根據②式可知:amax=JT1a_{max} = JT_1amax=JT1

最終得到:
T2=T6=Vmax−Vsamax−T1T_2 = T_6 = \cfrac{V_{max} - V_s}{a_{max}} - T_1 T2=T6=amaxVmaxVsT1

Vs為初始速度;V_s為初始速度;Vs

下面可以根據位移時間關系方程進行離散化的程序編寫。

假設可以到達最大速度,且用戶給定了整個過程運行時間TfT_fTf,則 T4T_4T4 的推導如下:
{Tf=T1+T2+T3+T4+T5+T6+T7T2=T6T1=T3=T5=T7\begin{cases} T_f = T_1 + T_2 + T_3 + T_4 + T_5 + T_6 + T_7 \\ T_2 = T_6 \\ T_1 = T_3 = T_5 = T_7 \\ \end{cases}Tf=T1+T2+T3+T4+T5+T6+T7T2=T6T1=T3=T5=T7
簡化上式可以得到:
T4=Tf−2T2−4T1 T_4 = T_f - 2T_2 - 4T_1 T4=Tf2T24T1
根據 T1=amaxJT_1 = \cfrac{a_{max}}{J}T1=Jamax代入上式可得:
T4=Tf−2vmaxamax−2amaxJ T_4 = T_f - 2\cfrac{v_{max}}{a_{max}}-2\cfrac{a_{max}}{J} T4=Tf2amaxvmax2Jamax

3.2 JJJ 的推導

這時候還剩下JJJ需要計算,通過已量 Tf,vmax,amaxT_f,v_{max},a_{max}Tf,vmax,amax可以推導出來;
首先位移之間滿足關系如下:
Sref=Sa+S4+SdS_{ref} = S_a + S_4 + S_dSref=Sa+S4+Sd
其中加速區長度為 SaS_aSa
其中減速區長度為 SdS_dSd
{Sa=vs(2T1+T2)+12JT1(2T12+3T1T2+T22)Sb=v3(2T5+T6)−12JT5(2T52+3T5T6+T62) \begin{cases} S_a = v_s(2T_1 + T_2)+\cfrac{1}{2}JT_1(2T_1^2 + 3T_1T_2 + T_2^2) \\ S_b = v_3(2T_5 + T_6)-\cfrac{1}{2}JT_5(2T_5^2 + 3T_5T_6 + T_6^2) \end{cases} Sa=vs(2T1+T2)+21JT1(2T12+3T1T2+T22)Sb=v3(2T5+T6)21JT5(2T52+3T5T6+T62)
具體推導;2
前面提到過T1=T3=T5=T7T_1 = T_3 = T_5 = T_7T1=T3=T5=T7T2=T6T_2 = T_6T2=T6,因此在VsV_sVs=0的時候,則
Sa+Sb=v3(2T5+T6)=v1(2T1+T2)⋯④S_a + S_b = v_3(2T_5 + T_6) = v_1(2T_1 + T_2) \cdots ④Sa+Sb=v3(2T5+T6)=v1(2T1+T2)

這里簡單推導一下:
{S4=v4T4T4=Tf−(T1+T2+T3+T4+T5+T6)T1=T3=T5=T7=amaxJT2=T6=Vmaxamax−T1Sref=Sa+S4+Sb⋯⑤\begin{cases} S_4 = v_4T_4 \\ T_4 = T_f - (T_1 + T_2 + T_3 + T_4 + T_5 + T_6) \\ T_1 = T_3 = T_5 = T_7 = \cfrac{a_{max}}{J} \\ T_2 = T_6 = \cfrac{V_{max}}{a_{max}} - T_1 \\ S_ref = S_a + S_4 + S_b \end{cases} \cdots ⑤ S4=v4T4T4=Tf(T1+T2+T3+T4+T5+T6)T1=T3=T5=T7=JamaxT2=T6=amaxVmaxT1Sref=Sa+S4+Sb
根據④,⑤最終簡化得到:
J=2amaxvmaxvmaxTf−vmax2−Srefamax J = \cfrac{2a_{max}v_{max}}{v_{max}T_f-v_{max}^2-S_{ref}a_{max}} J=vmaxTfvmax2Srefamax2amaxvmax

TfT_fTf:為運行的總時間
SrefS_{ref}Sref:為運行的總路程

4 matlab 程序

matlab程序親測可以運行,做了簡單的修改,
因為這里直接給定了整個運行過程的時間,所以需要在SCurvePara函數中求出加加速度 JJJ 的值,路程SSS為 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);
    % 根據T2T4判斷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('加速度曲線');

看到最終仿真結果和預期相同;
在這里插入圖片描述

5 總結

本文只對7段的S曲線規划做了詳細的推導和介紹,matlab中的程序對於4段和5段都有做實現,很多是在理想情況下進行推導的,初始速度默認為0,終止速度也為0,並且假設加減速區域相互對稱。最終運行結果符合預期效果。

文中難免有錯誤和紕漏之處,請大佬們不吝賜教
創作不易,如果本文幫到了您;
請幫忙點個贊 👍👍👍;
請幫忙點個贊 👍👍👍;
請幫忙點個贊 👍👍👍;

6 參考


  1. 陳友東 魏洪興 王琦魁.數控系統的直線和 S 形加減速離散算法[D].北京:中國機械工程,2010. ↩︎

  2. 郭新貴 李從心 S 曲線加減速算法研究 上海交通大學國家模具 CAD 工程研究中心 , 200030 ↩︎ ↩︎

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM