电机运动S曲线位置速度规划学习并使用Matlab实现

无刷电机位置S曲线拟合轨迹

S曲线的作用

平滑位置突变,避免因为电机位置变化过大造成速度波动大导致电机启动抖动,可以提高电机的运行速度和运行效率,让电机运动起来更加平滑

S曲线的原理

S型曲线加减速是指在加减速时,加速度的导数JJJ为常数的加减速过程通过控制加速度导数来避免加速度突变,减
小运动过程中由于加速度突变而引起的机械系统振动.采用S型曲线加减速算法可以获得平滑的速度和加速度图。
对于电机位置控制来说,因为初始速度和末端速度都一样的(都是0),因此加速度变化波形曲线是对称的。因此波形实际只有以下几种情况
1.(七段式S曲线)速度变化过程包括:加加速阶段,匀加速阶段,减加速阶段,匀速阶段,加减速阶段,匀减速阶段,减减速阶段
2.(六段式S曲线)速度变化过程包括:加加速阶段,匀加速阶段,减加速阶段,加减速阶段,匀减速阶段,减减速阶段
3.(五段式S曲线)速度变化过程包括:加加速阶段,减加速阶段,匀速阶段,加减速阶段,减减速阶段
3.(四段式S曲线)速度变化过程包括:加加速阶段,减加速阶段,加减速阶段,减减速阶段
以第一种情况为例:加速度,速度,位移曲线如下:

S曲线曲线图

分别为:位置变化曲线,速度变化曲线,加速度变化曲线
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

S曲线数学方程

定义一些参数变量如下:

参数名参数含义
JJJ加速度变化率
amaxa_{max}amax最大加速度
VmaxV_{max}Vmax给定最大速度
TnT_nTn每个阶段的运行时间 nnn从1到7
ttt时间
SSS位移(如果是转动则是角位移)
第一步

首先要判断S曲线是什么类型(七段,六段还是四段S曲线)
假设S曲线加速阶段不存在匀加速阶段(因为前后速度不变,加速和减速阶段对称,所以相应也不存在匀减速阶段),此时加速度和速度满足以下关系:
amax=JTv=∫0tamaxdt=amax2/Ja_{max}=JT\\ \\ v=\int_0^ta_{max}dt=a_{max}^2/J amax=JTv=0tamaxdt=amax2/J
可以根据计算加加速度阶段和减加速阶段所求得的速度vvv和我们给定速度进行比较,判断S曲线应该是什么类型的。
1.如果加加速阶段和减加速阶段所求速度vvv小于给定速度VmaxV_{max}Vmax,说明此时应该存在匀加速阶段使得速度可以加速到达给定速度。通过前面可以知道变加速的时间,
下一步计算匀加速阶段的时间。因为速度需要加速到给定速度,所以有
T2∗amax+amax2/J=VmaxT2=Vmaxamax−amax/J T_2*a_{max}+a_{max}^2/J=V_{max}\\ \\ T_2=\frac{V_{max}}{a_{max}}-a_{max}/J T2amax+amax2/J=VmaxT2=amaxVmaxamax/J
如果大于给定速度,这个时候说明我们给的amaxa_{max}amax太大了,需要重新求解amaxa_{max}amax使得加速阶段得到的速度能够满足要求。因为我们前面得到速度关系v=amax2/Jv=a_{max}^2/Jv=amax2/J因此只要让v=Vmaxv=V_{max}v=Vmax带入前面方程就可以解得所需的加速度,并解出对应阶段的时间了
因此可以得到以下关系:
{T1=T3=T5=T7=amax/JVmax>=amax2/JT1=T3=T5=T7VmaxJVmax<amax2/J \left\{ \begin{matrix} T_1=T_3=T_5=T_7=a_{max}/J & V_{max}>=a_{max}^2/J\\ \\ T_1=T_3=T_5=T_7\sqrt{\frac{V_{max}}{J}}&V_{max}<a_{max}^2/J \end{matrix} \right. T1=T3=T5=T7=amax/JT1=T3=T5=T7JVmaxVmax>=amax2/JVmax<amax2/J

{T2=T6Vmaxamax−amax/JVmax>=amax2/JT2=T6=0Vmax<amax2/J \left\{ \begin{matrix} T_2=T_6\frac{V_{max}}{a_{max}}-a_{max}/J & V_{max}>=a_{max}^2/J\\ \\ T_2=T_6=0&V_{max}<a_{max}^2/J \end{matrix} \right. T2=T6amaxVmaxamax/JT2=T6=0Vmax>=amax2/JVmax<amax2/J
因为匀减速阶段和匀加速阶段对称,因此只要求得匀加速阶段的曲线就能得到匀减速阶段的方程。

通过速度和加速度变化率得到了加速阶段和减速阶段的时间,接下来判断是否存在匀速时间T4T_4T4
上面计算得到了加速阶段和减速阶段的时间,因此加速阶段和减速阶段总位移如下:
S′=Vmax2(2T1+T2)+Vmax2(2T3+T5) S'=\frac{V_{max}}{2}(2T_1+T_2)+\frac{V_{max}}{2}(2T_3+T_5) S=2Vmax(2T1+T2)+2Vmax(2T3+T5)

判断是否存在匀速时间的方法是,通过计算加速阶段和减速阶段的总位移S′S'S和给定位移S比较来判断,分为以下三种情况:
1.S′<SS'<SS<S说明加速段和减速段的总位移小于给定位移,因此还需要给定一段时间进行匀速运动使得达到目标位置,此时T4=S−S′VmaxT_4=\frac{S-S'}{V_{max}}T4=VmaxSS (七段S曲线)
2.S′=SS'=SS=S说明此时不存在匀速运动,T4=0T_4=0T4=0 加速减速阶段总位移刚好等于给定目标 (六段S曲线)
3.S′>SS'>SS>S说明此时不存在匀速运动,T4=0T_4=0T4=0 并且说明我们给定速度大于实际应该给的速度,这个时候需要重新求解给定速度以满足位移要求

假设这个时候不存在匀加速段,匀减速段(令T2=T6=0T_2=T_6=0T2=T6=0)和匀速段。给定速度Vmax=amax2/JV_{max}=a_{max}^2/JVmax=amax2/J,将求得的给定速度代入位移方程得到S′′S''S′′,通过S′′S''S′′SSS的比较有以下三种情况:

第一种

如果S′′<SS''<SS′′<S说明我们实际的速度应该大于amax2/Ja_{max}^2/Jamax2/J(只有加加速和减加速阶段得到的速度)而小于我们一开始给定的速度,因此这个时候应该存在匀加速段,所以实际S曲线应该有6段(加加速,匀加速,减加速,加减速,匀减速,减加速)
此时S曲线各阶段时间如下:
{T1=T3=T5=T7=amax/JT2=T6=Vmaxamax−amax/J \left\{ \begin{matrix} T_1=T_3=T_5=T_7=a_{max}/J\\ \\ T_2=T_6=\frac{V_{max}}{a_{max}}-a_{max}/J \end{matrix} \right. T1=T3=T5=T7=amax/JT2=T6=amaxVmaxamax/J
将其带入位移方程得到速度VmaxV_{max}Vmax的一元二次方程:

2JVmax2+2amax2Vmax−2JamaxS=0Vmax=−amax22J+amax4+4amaxJ2S2J 2JV_{max}^2+2a_{max}^2V_{max}-2Ja_{max}S=0\\ \\ V_{max}=-\frac{a_{max}^2}{2J}+\frac{\sqrt{a_{max}^4+4a_{max}J^2S}}{2J} 2JVmax2+2amax2Vmax2JamaxS=0Vmax=2Jamax2+2Jamax4+4amaxJ2S
将求得的VmaxV_{max}Vmax带入前面方程就可以解得对应的时间和加速度值

第二种

如果S′′==SS''==SS′′==S说明我们实际速度刚好等于amax2/Ja_{max}^2/Jamax2/J,此时只有S曲线为四段S曲线(加加速,减加速,加减速,减减速)

第三种

如果S′′>SS''>SS′′>S说明我们实际速度小于amax2/Ja_{max}^2/Jamax2/J,此时S曲线为四段S曲线(加加速,减加速,加减速,减减速),并且需要不断减小amaxa_{max}amax使得S′′S''S′′能够达到目标值

Matlab程序如下


syms target Start V_s V_e T_1 T_2 T_3 T_4 T_5 T_6 T_7 a_max J v_max V
syms S_1 s s_current v S_3 S_4
 
V_s=0;%初始速度
V_e=0;%末端速度
J=10; %加速度变化率
V=20; %给定速度
a_max=10; %给定加速度
s=10      %目标位置
S_3=[];
count=0;

if(V>=V_s+a_max^2/J)%速度判断,判断是否有匀加速阶段
    T_1=a_max/J;
    T_2=(V-V_s)/a_max-a_max/J;
    T_3=T_1;
else
    T_1=sqrt((V-V_s)/J);
    T_2=0;
    T_3=T_1;
    a_max=sqrt((V-V_s)*J)
end

if(V>=V_e+a_max^2/J)
    T_5=a_max/J;
    T_6=(V-V_e)/a_max-a_max/J;
    T_7=T_5;
else
    T_5=sqrt((V-V_e)/J);
    T_6=0;
    T_7=T_5;
end

S_1=(V+V_s)/2*(T_1+T_2+T_3)+(V+V_e)/2*(T_5+T_6+T_7)


if(s>S_1)
    T_4=(s-S_1)/V;
else
    T_4=0;
    V=a_max^2/J;%假设匀减速加速都不存在
    S_2=(V+V_s)/2*(T_1+T_3)+(V+V_e)/2*(T_5+T_7)
    if S_2<s%表示存在匀加速减速
        V=-a_max^2/(2*J)+sqrt((a_max^4-2*J*(a_max^2*(V_s+V_e)-J*(V_s^2+V_e^2)-2*a_max*J*s)))/(2*J);
        T_1=a_max/J;
        T_2=(V-V_s)/a_max-a_max/J;
        T_3=T_1;
        T_5=a_max/J;
        T_6=(V-V_e)/a_max-a_max/J;
        T_7=T_5;
    elseif S_2==s
        T_1=a_max/J;
        T_2=(V-V_s)/a_max-a_max/J;
        T_3=T_1;
        T_5=a_max/J;
        T_6=(V-V_e)/a_max-a_max/J;
        T_7=T_5;
    else
        a_0=0;
        a_1=a_max;
        while 1 %二分法求取合适加速度a_max
            count=count+1;
            a_max=(a_0+a_1)/2;
            % a_max=a_max-0.001;
            S_3(:,count)=(a_max^2/J+V_s)*a_max/J+(a_max^2/J+V_e)*a_max/J;
            if abs(S_3(:,count)-s)<=0.1
                break
            end
            if(S_3(:,count)>s)
                a_1=a_max;
            else
                a_0=a_max;
            end
            
        end
        T_1=a_max/J;
        T_2=0;
        T_3=T_1;
        T_5=a_max/J;
        T_6=0;
        T_7=T_5;
    end

end
a_max
V
T_1
T_2
T_3
T_4
T_5
T_6
T_7
T=T_1+T_2+T_3+T_4+T_5+T_6+T_7 %总的运行时间

s_current=[];
v_current=[];
a=[]
n=1;
v_1=V_s+J*T_1^2/2;
s_1=V_s*T_1+J*T_1^3/6;
v_2=v_1+a_max*T_2;
s_2=s_1+v_1*T_2+a_max*T_2^2/2;
v_3=v_2+a_max*T_3-J*T_3^2/2;
s_3=s_2+v_2*T_3+a_max*T_3^2/2-J*T_3^3/6;
v_4=v_3;
s_4=s_3+v_4*T_4;
v_5=v_4-0.5*J*T_5^2;
s_5=s_4+v_4*T_5-J*T_5^3/6;
v_6=v_5-a_max*T_6;
s_6=s_5+v_5*T_6-a_max*T_6^2/2;
%绘制位移,速度,加速度图像
for t_0= 0:0.001:T
    if t_0>=0&&t_0<=T_1
        t=t_0;
        s_current(n,:)=V_s*t+J*t^3/6;
        v_current(n,:)=V_s+J*t^2/2;   
        a(n,:)=J*t;
    elseif t_0>T_1&&t_0<=(T_2+T_1)
        t=t_0-T_1;
        s_current(n,:)=s_1+v_1*t+0.5*a_max*t^2;
        v_current(n,:)=v_1+a_max*t;
        a(n,:)=a_max;
    elseif t_0>T_2+T_1&&t_0<=T_3+T_2+T_1
        t=t_0-T_2-T_1;
        s_current(n,:)=s_2+v_2*t+0.5*a_max*t^2-1/6*J*t^3;
        v_current(n,:)=v_2+a_max*t-J*t^2/2;
        a(n,:)=a_max-J*t;
    elseif t_0>T_3+T_2+T_1&&t_0<=T_4+T_3+T_2+T_1
         t=t_0-T_3-T_2-T_1;
        s_current(n,:)=s_3+v_3*t;
        v_current(n,:)=v_3;
        a(n,:)=0;
    elseif t_0>T_4+T_3+T_2+T_1&&t_0<=T_5+T_4+T_3+T_2+T_1
        t=t_0-T_4-T_3-T_2-T_1;
        s_current(n,:)=s_4+v_4*t-J*t^3/6;
        v_current(n,:)=v_4-J*t^2/2;
        a(n,:)=-J*t;
    elseif t_0>T_5+T_4+T_3+T_2+T_1&&t_0<=T_6+T_5+T_4+T_3+T_2+T_1
        t=t_0-T_5-T_4-T_3-T_2-T_1;
        s_current(n,:)=s_5+v_5*t-a_max*t^2/2;
        v_current(n,:)=v_5-a_max*t;
        a(n,:)=-a_max;
    elseif t_0>T_6+T_5+T_4+T_3+T_2+T_1&&t_0<=T
        t=t_0-T_6-T_5-T_4-T_3-T_2-T_1;
        s_current(n,:)=s_6+v_6*t-a_max*t^2/2+J*t^3/6;
        v_current(n,:)=v_6-a_max*t+J*t^2/2;
        a(n,:)=-a_max+J*t;
    end
    n=n+1;
end
t= 0:0.001:T;
plot(t,s_current')
plot(t,v_current')
plot(t,a')
t=1:1:count
plot(t,S_3)

通过修改给定的参数J,amax,V,SJ,a_{max},V,SJ,amax,V,S就可以得到不同的S曲线了

参考文献

[1]石川,赵彤,叶佩青,等.数控系统S曲线加减速规划研究[J].中国机械工程,2007,(12):1421-1425.
[1]田军锋,林浒,姚壮,等.数控系统S型曲线加减速快速规划研究[J].小型微型计算机系统,2013,34(01):168-172.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值