(二)五次多项式轨迹规划

一、三次多项式轨迹规划的缺陷

上一篇文章说道,三次多项式轨迹规划只能够保证速度和位移连续,并不能保证加速度连续。加速度不连续将会对使电机抖动、甚至冲击。

二、轨迹规划中的五次多项式

我们对加速度数值进行指定,将会增加两个加速度方程,总计6个方程组。他们分别是:

  • 起末位移方程组
  • 起末速度方程组
  • 起末加速度方程组
    x ( t ) = c 0 + c 1 t + c 2 t 2 + c 3 t 3 + c 4 t 4 + c 5 t 5 v ( t ) = c 1 + 2 c 2 t + 3 c 3 t 2 + 4 c 4 t 3 + 5 c 5 t 4 a ( t ) = 2 c 2 + 6 c 3 t + 12 c 4 t 2 + 20 c 5 t 3 (1) \begin{aligned} & x(t)=c_0+c_1t+c_2t^2+c_3t^3+c_4t^4+c_5t^5\\ & v(t)=c_1+2c_2t+3c_3t^2+4c_4t^3+5c_5t^4\\ & a(t)=2c_2+6c_3t+12c_4t^2+20c_5t^3 \end{aligned} \tag{1} x(t)=c0+c1t+c2t2+c3t3+c4t4+c5t5v(t)=c1+2c2t+3c3t2+4c4t3+5c5t4a(t)=2c2+6c3t+12c4t2+20c5t3(1)
    带入初始条件有:

x ( t s ) = c 0 + c 1 t s + c 2 t s 2 + c 3 t s 3 + c 4 t s 4 + c 5 t s 5 v ( t s ) = c 1 + 2 c 2 t s + 3 c 3 t s 2 + 4 c 4 t s 3 + 5 c 5 t s 4 a ( t s ) = 2 c 2 + 6 c 3 t s + 12 c 4 t s 2 + 20 c 5 t s 3 x ( t e ) = c 0 + c 1 t e + c 2 t e 2 + c 3 t e 3 + c 4 t e 4 + c 5 t e 5 v ( t e ) = c 1 + 2 c 2 t e + 3 c 3 t e 2 + 4 c 4 t e 3 + 5 c 5 t e 4 a ( t e ) = 2 c 2 + 6 c 3 t e + 12 c 4 t e 2 + 20 c 5 t e 3 (2) \begin{aligned} &x(t_s)=c_0+c_1t_s+c_2t_s^2+c_3t_s^3+c_4t_s^4+c_5t_s^5\\ &v(t_s)=c_1+2c_2t_s+3c_3t_s^2+4c_4t_s^3+5c_5t_s^4\\ &a(t_s)=2c_2+6c_3t_s+12c_4t_s^2+20c_5t_s^3\\ &x(t_e)=c_0+c_1t_e+c_2t_e^2+c_3t_e^3+c_4t_e^4+c_5t_e^5\\ &v(t_e)=c_1+2c_2t_e+3c_3t_e^2+4c_4t_e^3+5c_5t_e^4\\ &a(t_e)=2c_2+6c_3t_e+12c_4t_e^2+20c_5t_e^3 \end{aligned}\tag{2} x(ts)=c0+c1ts+c2ts2+c3ts3+c4ts4+c5ts5v(ts)=c1+2c2ts+3c3ts2+4c4ts3+5c5ts4a(ts)=2c2+6c3ts+12c4ts2+20c5ts3x(te)=c0+c1te+c2te2+c3te3+c4te4+c5te5v(te)=c1+2c2te+3c3te2+4c4te3+5c5te4a(te)=2c2+6c3te+12c4te2+20c5te3(2)
写成矩阵形式:
[ 1 t s t s 2 t s 3 t s 4 t s 5 1 t e t s 2 t s 3 t s 4 t s 5 0 1 2 t s 3 t s 2 4 t s 3 5 t s 4 0 1 2 t e 3 t e 2 4 t e 3 5 t e 4 0 0 2 6 t s 12 t s 2 20 t s 3 0 0 2 6 t e 12 t e 2 20 t e 3 ] [ c 0 c 1 c 2 c 3 c 4 c 5 ] = [ x s x e v s v e a s a e ] (3) \begin{bmatrix} 1 & t_s & t_s^2&t_s^3&t_s^4&t_s^5 \\ 1 & t_e & t_s^2&t_s^3&t_s^4&t_s^5 \\ 0 & 1 & 2ts&3t_s^2&4t_s^3&5t_s^4\\ 0&1&2t_e&3t_e^2&4t_e^3&5t_e^4\\ 0&0&2&6t_s&12t_s^2&20t_s^3\\ 0&0&2&6t_e&12t_e^2&20t_e^3\\ \end{bmatrix} \begin{bmatrix}\tag{3} c_0 \\ c_1 \\ c_2 \\ c_3\\ c_4\\ c_5 \end{bmatrix}= \begin{bmatrix} x_s \\ x_e \\ v_s \\ v_e\\ a_s\\ a_e \end{bmatrix} 110000tste1100ts2ts22ts2te22ts3ts33ts23te26ts6tets4ts44ts34te312ts212te2ts5ts55ts45te420ts320te3c0c1c2c3c4c5=xsxevsveasae(3)
记为 T C = P TC=P TC=P,则 C = T − 1 P C=T^{-1}P C=T1P

三、Matlab仿真与实现

% 五次多项式插补
close all
clear;
clc;

% 0-1
t0=0; x0=30; v0=30;a0=10;
t1=5; x1=60; v1=40;a1=13;
[x01,v01,a01]=fivetimes_plan(t0,x0,v0,a0,t1,x1,v1,a1);

% 1-2
t2=13; x2=80; v2=10;a2=13;
[x12,v12,a12]=fivetimes_plan(0,x1,v1,a1,t2-t1,x2,v2,a2);

% 2-3
t3=20; x3=10; v3=0;a3=23;
[x23,v23,a23]=fivetimes_plan(0,x2,v2,a2,t3-t2,x3,v3,a3);


x=[x01 x12 x23];
v=[v01 v12 v23];
a=[a01 a12 a23];

figure(1);
subplot(3,1,1);
plot(x,'r','LineWidth',1.2);
axis([ t0*100 t3*100 -inf inf]);
ylabel('position')

subplot(3,1,2);
plot(v,'g','LineWidth',1.2)
axis([ t0*100 t3*100 -inf inf]);
ylabel('velocity')

subplot(3,1,3);
plot(a,'b','LineWidth',1.2);
axis([ t0*100 t3*100 -inf inf]);
ylabel('acceleration')
xlabel('time')

function [x,v,a]=fivetimes_plan(ts,start_x,start_v,start_a,te,end_x,end_v,end_a)
    para=[start_x,end_x,start_v,end_v,start_a,end_a]';
    Tran=[1,ts,ts^2,ts^3,ts^4,ts^5;
          1,te,te^2,te^3,te^4,te^5
          0,1,2*ts,3*ts^2,4*ts^3,5*ts^4;
          0,1,2*te,3*te^2,4*te^3,5*te^4;
          0,0,2,6*ts,12*ts^2,20*ts^3
          0,0,2,6*te,12*te^2,20*te^3];
    C=(inv(Tran))*para;
    c0=C(1);
    c1=C(2);
    c2=C(3);
    c3=C(4);
    c4=C(5);
    c5=C(6);
    x=[];v=[];a=[];
    for i=ts:0.01:te
        t=i;
        x=[x c0+c1*t+c2*t^2+c3*t^3+c4*t^4+c5*t^5];
        v=[v c1+2*c2*t+3*c3*t^2+4*c4*t^3+5*c5*t^4];
        a=[a 2*c2+6*c3*t+12*c4*t^2+20*c5*t^3];
    end
end

在这里插入图片描述
可以看出,五次多项式确实没有加速度突变,符合开始的设想。无论是三次还是五次多项式插值速度曲线并没有匀速段,这种规划方式不适用于笛卡尔空间的规划,因为大多数工业应用如涂胶、焊接都要求有匀速段,为了拥有匀速段,就有了后边的梯形和S型速度规划。

根据提供的引用内容,我们可以得知关节空间轨迹规划是将机器人的关节变量变换成时间的函数,然后对角速度和角加速度进行约束。而五次多项式插值法是一种常用的插值方法,可以用于机械臂轨迹规划。因此,我们可以采用五次多项式插值法进行关节空间轨迹规划。 以下是C#实现关节空间五次多项式轨迹规划的示例代码: ```csharp using System; public class JointSpaceTrajectoryPlanning { // 五次多项式插值法 public static double[] QuinticPolynomial(double q0, double qf, double v0, double vf, double a0, double af, double tf, double t) { double[] result = new double[3]; double a = a0; double b = v0; double c = q0; double d = (6 * qf - 6 * q0 - 3 * vf * tf - 3 * v0 * tf - af * Math.Pow(tf, 2) + a0 * Math.Pow(tf, 2)) / Math.Pow(tf, 3); double e = (-15 * qf + 15 * q0 + 8 * vf * tf + 7 * v0 * tf + 3 * af * Math.Pow(tf, 2) - 2 * a0 * Math.Pow(tf, 2)) / Math.Pow(tf, 4); double f = (10 * qf - 10 * q0 - 6 * vf * tf - 4 * v0 * tf - af * Math.Pow(tf, 2) + a0 * Math.Pow(tf, 2)) / Math.Pow(tf, 5); result[0] = a + 2 * b * t + 3 * c * Math.Pow(t, 2) + 4 * d * Math.Pow(t, 3) + 5 * e * Math.Pow(t, 4) + 6 * f * Math.Pow(t, 5); result[1] = 2 * a + 6 * b * t + 12 * c * Math.Pow(t, 2) + 20 * d * Math.Pow(t, 3) + 30 * e * Math.Pow(t, 4) + 42 * f * Math.Pow(t, 5); result[2] = 6 * b + 24 * c * t + 60 * d * Math.Pow(t, 2) + 120 * e * Math.Pow(t, 3) + 210 * f * Math.Pow(t, 4); return result; } // 关节空间轨迹规划 public static double[,] JointSpaceTrajectory(double[] q0, double[] qf, double[] v0, double[] vf, double[] a0, double[] af, double tf, double dt) { int n = (int)Math.Ceiling(tf / dt) + 1; double[,] result = new double[n, q0.Length]; for (int i = 0; i < q0.Length; i++) { double[] q = QuinticPolynomial(q0[i], qf[i], v0[i], vf[i], a0[i], af[i], tf, 0); double[] v = QuinticPolynomial(q0[i], qf[i], v0[i], vf[i], a0[i], af[i], tf, dt); double[] a = QuinticPolynomial(q0[i], qf[i], v0[i], vf[i], a0[i], af[i], tf, 2 * dt); result[0, i] = q[0]; result[1, i] = v[0]; result[2, i] = a[0]; for (int j = 1; j < n; j++) { double t = j * dt; q = QuinticPolynomial(q0[i], qf[i], v0[i], vf[i], a0[i], af[i], tf, t); v = QuinticPolynomial(q0[i], qf[i], v0[i], vf[i], a0[i], af[i], tf, t + dt); a = QuinticPolynomial(q0[i], qf[i], v0[i], vf[i], a0[i], af[i], tf, t + 2 * dt); result[j, i] = q[0]; } } return result; } } // 示例 public class Example { public static void Main() { double[] q0 = { 0, 0, 0 }; double[] qf = { 1, 1, 1 }; double[] v0 = { 0, 0, 0 }; double[] vf = { 0, 0, 0 }; double[] a0 = { 0, 0, 0 }; double[] af = { 0, 0, 0 }; double tf = 1; double dt = 0.01; double[,] result = JointSpaceTrajectoryPlanning.JointSpaceTrajectory(q0, qf, v0, vf, a0, af, tf, dt); for (int i = 0; i < result.GetLength(0); i++) { for (int j = 0; j < result.GetLength(1); j++) { Console.Write(result[i, j] + " "); } Console.WriteLine(); } } } ```
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值