python实现6自由度机械臂的五次多项式插值轨迹规划


前言

提示:已经熟悉多项式插值法的可以直接跳转代码部分

多项式插值(polynomial interopolation)是机械臂常见的轨迹规划方法,适用于关节空间内的规划,在机械臂规划过程中能够有效的减少抖动,增加机械臂使用寿命。

但是我搜索CSDN上寻找用python实现的代码较少,MATLAB中的库又过于集成,并且在实际项目中无法应用,故自己研究了一下产生笔记如下,供各位参考。


正文开始,代码可供参考,转载需注明

一、五次多项式插值法理论分析

如果要确定在路径曲线段的起始点和终止点的位置、速度和加速度,需要用一个五次多项式进行插值。

关于三次多项式插值和五次多项式的插值法在《机器人学导论》这本书中有系统的推导过程,在此只给出五次多项式的推导过程。

给出五次多项式如下:
θ ( t ) = a 0 + a 1 t + a 2 t 2 + a 3 t 3 + a 4 t 4 + a 5 t 5 \theta(t) = a_0+a_1t+a_2t^2+a_3t^3+a_4t^4+a_5t^5 θ(t)=a0+a1t+a2t2+a3t3+a4t4+a5t5
始末状态对应的是 θ 0 \theta_0 θ0 θ f \theta_f θf,可以得到约束条件见下:
θ 0 = a 0 θ f = a 0 + a 1 t f + a 2 t f 2 + a 3 t f 3 + a 4 t f 4 + a 5 t f 5 θ 0 ˙ = a 1 θ f ˙ = a 1 + 2 a 2 t f + 3 a 3 t f 2 + 4 a 4 t f 3 + 5 a 5 t f 4 θ 0 ¨ = 2 a 2 θ f ¨ = 2 a 2 + 6 a 3 t f + 12 a 4 t f 2 + 20 a 5 t f 3 \theta_0= a_0\\ \theta_f= a_0+a_1t_f+a_2t_f^2+a_3t_f^3+a_4t_f^4+a_5t_f^5\\ \dot{\theta_0}= a_1\\ \dot{\theta_f}= a_1+2a_2t_f+3a_3t_f^2+4a_4t_f^3+5a_5t_f^4\\ \ddot{\theta_0}= 2a_2\\ \ddot{\theta_f}= 2a_2+6a_3t_f+12a_4t_f^2+20a_5t_f^3\\ θ0=a0θf=a0+a1tf+a2tf2+a3tf3+a4tf4+a5tf5θ0˙=a1θf˙=a1+2a2tf+3a3tf2+4a4tf3+5a5tf4θ0¨=2a2θf¨=2a2+6a3tf+12a4tf2+20a5tf3
这些约束条件确定了一个具有6个方程和6个未知数的线性方程组,其解如下(通过矩阵求解求出):
a 0 = θ 0 a 1 = θ 0 ˙ a 2 = θ 0 ¨ 2 a 3 = 20 θ f − 20 θ 0 − ( 8 θ ˙ f + 12 θ ˙ 0 ) t f − ( 3 θ ¨ 0 − θ ¨ f ) t f 2 2 t f 3 a 4 = 30 θ 0 − 30 θ f + ( 14 θ ˙ f + 16 θ ˙ 0 ) t f + ( 3 θ ¨ 0 − 2 θ f ) t f 2 2 t f 4 a 5 = 12 θ f − 12 θ 0 − ( 6 θ ˙ f + 6 θ ˙ 0 ) − ( θ ¨ 0 − θ ¨ f ) t f 2 2 t f 5 a_0=\theta_0\\ a_1=\dot{\theta_0}\\ a_2=\frac{\ddot{\theta_0}}{2}\\ \begin{array}{l} a_{3}=\frac{20 \theta_{f}-20 \theta_{0}-\left(8 \dot{\theta}_{f}+12 \dot{\theta}_{0}\right) t_{f}-\left(3 \ddot{\theta}_{0}-\ddot{\theta}_{f}\right) t_{f}^{2}}{2 t_{f}^{3}} \\ a_{4}=\frac{30 \theta_{0}-30 \theta_{f}+\left(14 \dot{\theta}_{f}+16 \dot{\theta}_{0}\right) t_{f}+\left(3 \ddot{\theta}_{0}-2 \theta_{f}\right) t_{f}^{2}}{2 t_{f}^{4}} \\ a_{5}=\frac{12 \theta_{f}-12 \theta_{0}-\left(6 \dot{\theta}_{f}+6 \dot{\theta}_{0}\right)-\left(\ddot{\theta}_{0}-\ddot{\theta}_{f}\right) t_{f}^{2}}{2 t_{f}^{5}} \end{array} a0=θ0a1=θ0˙a2=2θ0¨a3=2tf320θf20θ0(8θ˙f+12θ˙0)tf(3θ¨0θ¨f)tf2a4=2tf430θ030θf+(14θ˙f+16θ˙0)tf+(3θ¨02θf)tf2a5=2tf512θf12θ0(6θ˙f+6θ˙0)(θ¨0θ¨f)tf2

二、python代码实现

话不多说,直接上代码:

1. 代码

# encoding: utf-8

import numpy as np
from scipy.interpolate import CubicHermiteSpline
import matplotlib as mpl
import matplotlib.pyplot as plt
import math


# 给定关节起始位置 
start_angle = np.array([15, 34, 56, 34, 66, 90])
end_angle = np.array([75, 45, 45, 56, 43, 70])
# 我用的角度,如果需要弧度可以放开下面的两行代码
# start_angle = np.deg2rad(start_angle1)
# end_angle = np.deg2rad(end_angle1)

# 设定起始时间
start_time = 0
end_time = 5
t_time = np.array([0, 0, 0, 0, 0, 0])

# 给定关节始末角速度与角加速度
start_vel = np.array([0, 0, 0, 0, 0, 0])
end_vel = np.array([0, 0, 0, 0, 0, 0])

start_acc = np.array([0, 0, 0, 0, 0, 0])
end_acc = np.array([0, 0, 0, 0, 0, 0])

# 初始化保存每个关节角度、速度和加速度随时间变化的列表
qq = []
vv = []
aa = []

# 计算a0-a5,并带入多项式中求解曲线
for i in range(len(start_angle)):
    # i = 1
    # print(len(start_angle))
    #初始状态
    t=[t_time[0]]
    q=[start_angle[i]]
    v=[start_vel[i]]
    a=[start_acc[i]]

    a0 = start_angle[i]
    a1 = start_vel[i]
    a2 = start_acc[i]
    # print(30*start_angle[i]-30*start_angle[0])
    a3 = (20*end_angle[i]-20*start_angle[i]-(8*end_vel[i]+12*start_vel[i])*end_time-(3*end_acc[i]-start_acc[i])*math.pow(end_time, 2))/(2 * math.pow(end_time, 3))
    a4 = (30*start_angle[i]-30*end_angle[i]+(14*end_vel[i]+16*start_vel[i])*end_time+(3*end_acc[i]-2*start_acc[i])*math.pow(end_time, 2))/(2 * math.pow(end_time, 4))
    a5 = (12*end_angle[i]-12*start_angle[i]-(6*end_vel[i]+6*start_vel[i])*end_time-(end_acc[i]-start_acc[i])*math.pow(end_time, 2))/(2 * math.pow(end_time, 5))
    # print(a0,a1,a2,a3,a4,a5)
    ti = np.arange(start_time, end_time, .01)
    
    # 求解出角度,角速度,角加速度随某个时间区间随时间变换的曲线
    qi = a0 + a1 * ti + a2 * np.power(ti, 2) + a3 * np.power(ti, 3) + a4 * np.power(ti, 4) + a5 * np.power(ti, 5)
    vi = a1 + 2 * a2 * ti  + 3 * a3 * np.power(ti , 2) + 4 * a4 * np.power(ti, 3) + 5 * a5 * np.power(ti, 4)
    ai = 2 * a2 + 6 * a3 * ti + 12 * a4 * np.power(ti, 2) + 20 * a5 * np.power(ti, 3)

    # # 将矩阵转换为List,否则进行数据整合会报错
    ti = ti.tolist()  
    qi = qi.tolist()  
    vi = vi.tolist()  
    ai = ai.tolist()  
    # print(ai)

    #进行数据整合,用来绘制函数图像
    t = t + ti[1:] 
    q = q + qi[1:] 
    v = v + vi[1:] 
    a = a + ai[1:] 
    # print(type(q))

    qq.append(q)
    vv.append(v)
    aa.append(a)

# 绘制图像
plt.figure()
for j in range(len(start_angle)):

    plt.subplot(3,2,j+1)

    plt.plot(t, qq[j], linestyle=":", color=(1, 0, 0, 1.0), label="angle curve")  # 角度变化曲线
    plt.plot(t, vv[j], linestyle="-", color=(1, 0.5, 1, 1.0), label="speed curve")  # 角速度变化曲线
    plt.plot(t, aa[j], linestyle="-.", color=(0, 0, 0, 1.0), label="acceleration curve")  # 角加速度变化曲线
    plt.title("Angle {}".format(j+1))
    plt.xlabel("Time (s)", x=1)

    # plt.rcParams['font.size'] = 15   #设置字体大小
    plt.suptitle("5th Polynomial Interpolation (6-DOF-ROBOT)")
    plt.grid()  # 显示网格
    plt.legend()  # 显示图例

plt.tight_layout()  # 调整子图布局
plt.show()

2. 结果

画出来的结果如下
在这里插入图片描述
OK!美滋滋结束 😉

总结

以上就是五次多项式插值法的python实现,本文只是简单给出了机械臂插值法的定义与应用代码,在实际应用中还需要根据具体情况进行修改,后续我会继续更新机械臂规划相关的学习心得,欢迎交流。

参考书籍

[1]机器人学导论,John J.Craig,斯坦福大学

  • 5
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
实现6自由度机械臂多项式轨迹控制,我们可以使用Arduino来进行编程和控制。首先,我们需要使用逆运动学算法来确定机械臂各个关节的角度,以便实现特定的轨迹运动。 首先,我们需要确定机械臂末端执行器(如夹爪)需要达到的目标位姿,包括位置和姿态。接下来,我们可以使用逆运动学算法来计算出实现这个目标位姿所需要的各个关节的角度。 在Arduino的程序,我们可以使用逆运动学算法来计算关节角度,并将这些角度作为输入发送到机械臂的驱动器上。我们可以通过编码器或其他位置传感器来获取关节的实际位置,以便进行位置反馈控制。 为了实现多项式轨迹,我们可以使用插值算法来计算关节角度的时间序列。可以将多项式方程应用于每个关节的角度,以便在给定的时间间隔内平滑地移动关节。我们可以根据需要调整多项式的系数来实现不同的轨迹形状,如直线、曲线或圆弧。 在Arduino的程序,我们可以将多项式方程与逆运动学算法结合起来,以便实现所需的多项式轨迹。我们可以使用计时器或延时函数来控制关节在给定时间间隔内的运动,从而实现平滑的轨迹。 总结起来,使用Arduino编程和控制6自由度机械臂多项式轨迹需要实现逆运动学算法、插值算法和位置反馈控制。这样可以计算出关节角度的时间序列,并控制机械臂按照指定的多项式轨迹进行运动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值