Trajectory Planning (2)——三次样条的程序实现

在这里插入图片描述
Matlab Code:

% referce:Trajectory Planning for Automatic Machines and Robots
% Page:17-Example 2.7-2.8
% time:2019/09/22
% Note:several parabolic trajectory
%*************************************************************************%
clc;clear all;
syms tt;
t=[0,2,4,8,10];
q=[10,20,0,30,40];
v=[0,-10,10,3,0];
[qt,vt,at,jt]=myCubicTraj(t,q,v);


%%
% 分段函数处理
k=0:0.05:10;
for i=1:length(k)
    if (t(1)<k(i) & k(i)<=t(2))   %注意使用逻辑运算符&
        qt1=qt(1);
        qty(i)=subs(qt1,{tt},{k(i)});
        
        vt1=vt(1);
        vty(i)=subs(vt1,{tt},{k(i)});
        
        at1=at(1);
        aty(i)=subs(at1,{tt},{k(i)});
        
        jt1=jt(1);
        jty(i)=subs(jt1,{tt},{k(i)});
        
    elseif (t(2)<k(i) & k(i)<=t(3))
        qt2=qt(2);
        qty(i)=subs(qt2,{tt},{k(i)});
        
        vt2=vt(2);
        vty(i)=subs(vt2,{tt},{k(i)});
        
        at2=at(2);
        aty(i)=subs(at2,{tt},{k(i)});
        
        jt2=jt(2);
        jty(i)=subs(jt2,{tt},{k(i)});
        
    elseif (t(3)<k(i) & k(i)<=t(4))
        qt3=qt(3);
        qty(i)=subs(qt3,{tt},{k(i)});
        
        vt3=vt(3);
        vty(i)=subs(vt3,{tt},{k(i)});
        
        at3=at(3);
        aty(i)=subs(at3,{tt},{k(i)});
        
        jt3=jt(3);
        jty(i)=subs(jt3,{tt},{k(i)});  
               
    elseif (t(4)<k(i) & k(i)<=t(5))
        qt4=qt(4);
        qty(i)=subs(qt4,{tt},{k(i)});
        
        vt4=vt(4);
        vty(i)=subs(vt4,{tt},{k(i)});
        
        at4=at(4);
        aty(i)=subs(at4,{tt},{k(i)});
        
        jt4=jt(4);
        jty(i)=subs(jt4,{tt},{k(i)});
    end
    
end

%%
%绘图
subplot(2,2,1);plot(k,qty,'linewidth',0.5);title('qt');grid on;
subplot(2,2,2);plot(k,vty,'linewidth',0.5);title('vt');grid on;
subplot(2,2,3);plot(k,aty,'linewidth',0.5);title('at');grid on;
subplot(2,2,4);plot(k,jty,'linewidth',0.5);title('jt');grid on;


%%
function [qt,vt,at,jt]=myCubicTraj(t,q,v)
% 多段曲线,每段曲线为抛物线形式
%输入参数:[t],[q],[v],行矩阵
%输出参数:曲线表达式
%位置和速度约束
%*************************************%
%经过n个点拟合n-1段曲线构成
%    t      T     qt    vt
%    t0     -     q0    v0
%    t1   t1-t0   q1    v1
%    t2   t2-t1   q2    v2
%    t3   t3-t2   q3    v3
%    t4   t4-t3   q4    v4
% *************************************%
% q(t) = a0 + a1(t − t0) + a2(t − t0).^2 + a3(t − t0).^3, t0 ≤ t ≤ t1

syms tt;
N=size(t,2);   %获取节点数
if N<2
    print("Error! N must more than 2.\n");
    return;
end
for k=1:N-1
    a0(1,k)=q(1,k);
    a1(1,k)=v(1,k);
    a2(1,k)=(3*(q(1,k+1)-q(1,k))-(2*v(1,k)+v(1,k+1))*(t(1,k+1)-t(1,k)))/(t(1,k+1)-t(1,k)).^2;
    a3(1,k)=(-2*(q(1,k+1)-q(1,k))+(v(1,k)+v(1,k+1))*(t(1,k+1)-t(1,k)))/(t(1,k+1)-t(1,k)).^3;
    
    qt(k,:) = a0(1,k)+a1(1,k)*(tt-t(1,k))+a2(1,k)*((tt-t(1,k))).^2+a3(1,k)*((tt-t(1,k))).^3;
    qt(k,:)= vpa(qt(k,:));  %转化为数值
    vt(k,:)= diff(qt(k,:));
    at(k,:)= diff(vt(k,:));
    jt(k,:)= diff(at(k,:));    
end
end

Output:
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

easy_R

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值