机器人轨迹规划——五次多项式插值轨迹

本文探讨了机器人轨迹规划中的一种方法——五次多项式插值轨迹。通过数学表达式,详细介绍了如何计算五次多项式轨迹的各个参数,并提供了Python代码实现示例。这种轨迹规划方式确保加速度连续,适用于定义起点和终点的速度及加速度,具有良好的平滑特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


五次多项式

表达式

位置:

q ( t ) = k 0 + k 1 ( t − t 0 ) + k 2 ( t − t 0 ) 2 + k 3 ( t − t 0 ) t 3 + k 4 ( t − t 0 ) 4 + k 5 ( t − t 0 ) 5 (1) q(t)=k_0+k_1(t-t_0)+k_2(t-t_0)^2+k_3(t-t_0)t^3+k_4(t-t_0)^4+k_5(t-t_0)^5 \tag{1} q(t)=k0+k1(tt0)+k2(tt0)2+k3(tt0)t3+k4(tt0)4+k5(tt0)5(1)

求一阶导数可以得到速度:
q ˙ ( t ) = k 1 + 2 k 2 ( t − t 0 ) + 3 k 3 ( t − t 0 ) 2 + 4 k 4 ( t − t 0 ) 3 + 5 k 5 ( t − t 0 ) 4 (2) \dot q(t)=k_1+2k_2(t-t_0)+3k_3(t-t_0)^2+4k_4(t-t_0)^3+5k_5(t-t_0)^4 \tag{2} q˙(t)=k1+2k2(tt0)+3k3(tt0)2+4k4(tt0)3+5k5(tt0)4(2)

求二阶导数可以得到加速度:

q ¨ ( t ) = 2 k 2 + 6 k 3 ( t − t 0 ) + 12 k 4 ( t − t 0 ) 2 + 20 k 5 ( t − t 0 ) 3 (3) \ddot q(t)=2k_2+6k_3(t-t_0)+12k_4(t-t_0)^2+20k_5(t-t_0)^3 \tag{3} q¨(t)=2k2+6k3(tt0)+12k4(tt0)2+20k5(tt0)3(3)

特点:

  • 加速度连续
  • 可以定义起始和结束的位置、速度、加速度

计算
给定起始和结束的位置、速度、加速度以及轨迹时间 T T T,可以构造六个方程,解出五次多项式的6个系数。
满足的约束方程为:
q ( t 0 ) = q 0 , q ( t 1 ) = q 1 q ˙ ( t 0 ) = v 0 , q ˙ ( t 1 ) = v 1 q ¨ ( t 0 ) = a 0 , q ¨ ( t 1 ) = a 1 (4) q(t_0) = q_0 , \qquad q(t_1) = q_1 \\\dot q(t_0) = v_0, \qquad\dot q(t_1) = v_1 \\\ddot q(t_0) = a_0, \qquad\ddot q(t_1) = a_1 \tag{4} q(t0)=q0,q(t1)=q1q˙(t0)=v0,q˙(t1)=v1q¨(t0)=a0,q¨(t1)=a1(4)

把方程(4)结合(1)、(2)、(3)可以得到6个线性方程组,最终可以得到如下解:
T = t 1 − t 0 h = q 1 − q 0 k 0 = q 0 k 1 = v 0 k 2 = a 0 2 k 3 = 1 2 T 3 [ 20 h − ( 8 v 1 + 12 v 0 ) T − ( 3 a 0 − a 1 ) T 2 ] k 4 = 1 2 T 4 [ − 30 h + ( 14 v 1 + 16 v 0 ) T + ( 3 a 0 − 2 a 1 ) T 2 ] k 5 = 1 2 T 5 [ 12 h − 6 ( v 1 + v 0 ) T + ( a 1 − a 0 ) T 2 ] (5) \begin{aligned} &T = t_1 - t_0 \\ &h = q_1 - q_0 \\ &k_0 = q_0 \\ &k_1 = v0 \\ &k_2 = \frac{a_0}{2} \\ &k_3 = \frac {1}{2T^3} [20h − (8v_1 + 12v_0)T − (3a_0 − a_1)T^2] \\ &k_4 = \frac {1}{2T^4} [−30h + (14v_1 + 16v_0)T + (3a_0 − 2a_1)T^2] \\ &k_5 = \frac{1}{2T^5} [12h − 6(v_1 + v_0)T + (a_1 − a_0)T^2] \end{aligned} \tag{5} T=t1t0h=q1q0k0=q0k1=v0k2=2a0k3=2T31[20h(8v1+12v0)T(3a0a1)T2]k4=2T41[30h+(14v1+16v0)T+(3a02a1)T2]k5=2T51[12h6(v1+v0)T+(a1a0)T2](5)

代码实现

这里用python来实现五次多项式插值:

#!/usr/bin/python3
"""
Copyright © 2021 boldyoungster. All rights reserved.

@file Polynomial.py
@date: 11:06:12, February 28, 2021
"""

import numpy as np
import matplotlib.pyplot as plt


class PolynomialQuintic:
    def __init__(self, t0, t1, q0, q1, v0=0.0, v1=0.0, a0=0.0, a1=0.0):
        coeffs = self.__ComputeQuinticCoeffs(t0, t1, q0, q1, v0, v1, a0, a1)
        self.poly = np.poly1d(coeffs[::-1])

    @classmethod
    def __ComputeQuinticCoeffs(cls, t0, t1, q0, q1, v0, v1, a0, a1):
        T = t1 - t0
        T2 = T * T
        h = q1 - q0
        k0 = q0
        k1 = v0
        k2 = 0.5 * a0
        k3 = (20. * h - (8. * v1 + 12. * v0) * T -
              (3 * a0 - a1) * T2) / (2. * T * T2)
        k4 = (-30. * h + (14*v1 + 16*v0)*T+(3*a0 - 2*a1)*T2) / (2. * T2 * T2)
        k5 = (12 * h - 6*(v1 + v0) * T + (a1 - a0) * T2) / (2 * T2 * T2 * T)
        return (k0, k1, k2, k3, k4, k5)


if __name__ == "__main__":
    t0, t1 = 0, 3.0
    q0, q1 = 0, 1
    v0, v1 = 0, 0
    a0, a1 = 0, 0
    poly = PolynomialQuintic(t0, t1, q0, q1,
                             v0, v1, a0, a1)
    ts = np.linspace(t0, t1, 200)
    qs = poly.poly(ts)
    vs = poly.poly.deriv(1)(ts)
    dvs = poly.poly.deriv(2)(ts)
    plt.subplots_adjust(hspace=1)
    plt.suptitle("QuinticPolynomial")
    plt.subplot(311)
    plt.plot(ts, qs)
    plt.title("Position")
    plt.subplot(312)
    plt.plot(ts, vs)
    plt.title("Velocity")
    plt.subplot(313)
    plt.plot(ts, dvs)
    plt.title("Acceleration")
    plt.savefig("./QuinticPolynomial.png")
    plt.show()

举例

t 0 = 0.0 , t 1 = 3.0 q 0 = 0.0 , q 1 = 1.0 v 0 = 0.0 , v 1 = 0.0 a 0 = 0.0 , a 1 = 0.0 t_0 = 0.0, \qquad t_1 = 3.0 \\q_0 = 0.0, \qquad q_1 = 1.0 \\v_0 = 0.0, \qquad v_1 = 0.0 \\a_0 = 0.0, \qquad a_1 = 0.0 t0=0.0,t1=3.0q0=0.0,q1=1.0v0=0.0,v1=0.0a0=0.0,a1=0.0

这段轨迹是从速度、加速度为0开始,再到速度、加速度为0停止,称作rest-to-rest,其轨迹形状如下:

五次多项式轨迹

总结

五次多项式是一种经常使用的插值方式,它可以保证加速度连续,可以定义轨迹两个端点的速度、加速度,有比较好的平滑性。

### 五次多项式插值法在MATLAB中实现机械臂控制 为了实现在MATLAB中利用五次多项式插值法进行机械臂控制,可以采用如下方法: 定义起始位置、目标位置以及时间间隔作为输入变量。对于五次多项式而言,其一般形式为\[ q(t)=a_{0}+a_{1}t+a_{2}t^{2}+a_{3}t^{3}+a_{4}t^{4}+a_{5}t^{5}\] ,其中\(q\)表示关节角度或者末端执行器的位置,而系数\(\{a_i|i=0,...,5\}\)则由边界条件决定。 通过设定初始时刻的速度和加速度都等于零,并指定结束时刻的速度也为零来求解这些未知数。具体来说就是建立方程组并求得各个系数的具体数值[^1]。 下面给出一段简单的代码片段用于演示如何创建一个五阶多项式轨迹规划函数,在此过程中假设已知起点坐标`startPos`, 终点坐标`endPos` 和总耗时 `T_total`. ```matlab function traj = fifthPoly(startPos,endPos,T_total,t) % 定义符号变量 syms a b c d e f t; eqns = [ startPos == a; endPos == a+b*T_total+c*(T_total^2)+d*(T_total^3)+e*(T_total^4)+f*(T_total^5); diff(a*t,'t',0)==diff(b*t,'t')+2*c*t+3*d*t^2+4*e*t^3+5*f*t^4|subs('t'=0); diff(endPos,'t')==diff(a+b*t+c*t^2+d*t^3+e*t^4+f*t^5,'t')|subs('t'=T_total); diff(diff(startPos,'t'),'t')==diff(diff(a*t,'t','t'), 't')+2*diff(c*t,'t')+6*d*t+12*e*t^2+20*f*t^3 | subs('t' = 0); diff(diff(endPos,'t'),'t')==diff(diff(a+b*t+c*t^2+d*t^3+e*t^4+f*t^5,'t','t'),'t') | subs('t'= T_total)]; sol = solve(eqns,[a,b,c,d,e,f]); A=[sol.a,sol.b,sol.c,sol.d,sol.e,sol.f]; p=A(1)*ones(size(t))+A(2).*t+A(3).*(t.^2)+A(4).*(t.^3)+A(5).*(t.^4)+A(6).*(t.^5); v=(A(2)+2*A(3).*t+3*A(4).*(t.^2)+4*A(5).*(t.^3)+5*A(6).*(t.^4)); a=(2*A(3)+6*A(4).*t+12*A(5).*(t.^2)+20*A(6).*(t.^3)); traj.Position=p'; traj.Velocity=v'; traj.Acceleration=a'; end ``` 上述代码实现了给定两个端点之间的平滑过渡路径计算过程,并返回了对应的时间序列上的位移、速度及加速度向量。需要注意的是实际应用时还需要考虑更多因素比如物理极限约束等[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

boldyoungster

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

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

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

打赏作者

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

抵扣说明:

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

余额充值