
机械臂速成小指南(二十三):Paul方法求解机械臂运动学逆解(含matlab代码)
🦾🌏🪐以下为正文🦾🌏🪐
多项式插值(polynomial interopolation)在工业中的应用十分常见,常用的几种多项式插值法有:直接法、拉格朗日插值法和牛顿插值法。多项式插值轨迹规划也是一种常用的关节空间轨迹规划方法。
下面,我们将以机械臂作点对点运动为例,从理论分析、程序仿真及实际应用三个方面对多项式插值轨迹规划进行介绍。
点对点运动的过程中,机械臂必须在规定的时间t_f内到达目标点,各个关节也从初始状态转变为期望状态。
机械臂初始位姿与期望位姿均已知,那么我们通过逆运动学运算就可以得到这两个状态下的关节变量。
设初始时刻为t_0,则我们需要将每一个关节在(t_0,t_f)时间内的角度变化与时间的关系使用三次多项式进行描述,该多项式称为关节角度函数。以关节1为例,初始角度为θ_0,期望角度为θ_f。那么,关节1的关节角度函数曲线一定通过(t_0,t_0)与点(t_f,t_f)。
为了确定该三次多项式的4个系数,我们必须找到4个约束条件。我们已经知道了初始时刻与终止时刻机械臂的状态,这就可以确定2个约束条件,即

此时,还缺少2个约束条件。由于机械臂进行的是点对点运动,机械臂的各关节角速度在t_0 与t_f 时刻均为0,可表示为

该三次多项式可表示为

则关节角速度与关节角加速度可分别表示为上述三次多项式的一次导数与二次导数,即

将4个约束条件与上式联立即可得到三次多项式的4个系数,即

使用MATLAB中的RTB工具箱对该轨迹规划方法进行仿真:
首先,定义3个数组用于储存机械臂关节的角度、角速度及角加速度,用于绘制图像。
q = zeros(step,N); %初始化机械臂关节的角度
qd = zeros(step,N); %初始化机械臂关节的角速度
qdd = zeros(step,N); %初始化机械臂关节的角加速度
第二步,按照上一小节中的计算思路计算多项式的4个系数。
a_0 = init_ang; %三次多项式的第1个系数
a_1 = zeros(1,6); %三次多项式的第2个系数
a_2 = 3/(step^2)*(targ_ang-init_ang); %三次多项式的第3个系数
a_3 = -2/(step^3)*(targ_ang-init_ang); %三次多项式的第4个系数
第三步,计算正运动学方程、输出末端轨迹并进行动画演示。

T=robot.fkine(q); %运动学正解
nT=T.T; %转为齐次变换矩阵
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:))); %输出末端轨迹
title('三次多项式插值轨迹');
robot.plot(q); %动画演示
最后一步,将关节的角度曲线、角速度曲线以及角加速度曲线绘制出来。

figure(f)
subplot(6, 1, 1);
plot(q(:,1));
title('关节1角度(三次多项式插值)');
与仿真不同的一点是,在对机械臂进行实际控制时,是要考虑到轨迹点生成个数对于轨迹精度的影响的。因为关节变量与时间的函数是连续的,但我们所发送给上位机的指令实际上是一个个离散的轨迹点对应的关节变量。生成的轨迹点太多,运算量会增加;生成的轨迹点太少,机械臂的运行轨迹就会不够平滑。
本文使用python编写上位机完成轨迹规划中的运算。
首先,需要检测轨迹规划运算结果是否在机械臂的可达工作空间以及关节限度之内。
if (J1newAng < J1NegAngLim or J1newAng > J1PosAngLim) or (J2newAng < J2NegAngLim or J2newAng > J2PosAngLim) or (J3newAng < J3NegAngLim or J3newAng > J3PosAngLim) or (J4newAng < J4NegAngLim or J4newAng > J4PosAngLim) or (J5newAng < J5NegAngLim or J5newAng > J5PosAngLim) or (J6newAng < J6NegAngLim or J6newAng > J6PosAngLim or TrackNew < 0 or TrackNew > TrackLength):
almStatusLab.config(text="AXIS LIMIT", bg = "red")
almStatusLab2.config(text="AXIS LIMIT", bg = "red")
tab1.runTrue = 0
其次,对于每一个关节进行运算,以关节1为例:
J1calcAng = float(J1newAng) - float(J1AngCur)
J1steps = int(J1calcAng / J1DegPerStep)
J1StepCur = J1StepCur + J1steps #Invert
J1AngCur = round(J1NegAngLim + (J1StepCur * J1DegPerStep),2) #四舍五入,小数点为2
J1steps = str(J1steps)
最后,生成指令字符串。
J1curAngEntryField.delete(0, 'end')
J1curAngEntryField.insert(0,str(J1AngCur))
当我们使用五次多项式对关节空间轨迹进行插值时,需要求解对应的6个系数,即与上文相比,我们需要再设定2个约束条件。
为保证关节速度函数的连续,假设在t_0 与t_f 时刻,机械臂的各关节角加速度为0,即

此时我们可以唯一确定一个五次多项式,同样令t_0=0 ,该多项式可表示为

将6个约束条件与上式联立,可得到五次多项式的系数为

我们使用MATLAB的RTB工具箱中自带函数jtraj()完成五次多项式轨迹规划的仿真:
其中,qt、qdt、qddt分别为关节的旋转角度、角速度以及角加速度;q0、q1分别为关节的初始角度与终止角度;tv为生成的轨迹点个数;qd0与qd1分别为机械臂在起始点处及终止点处的速度,默认为0。
关键代码段如下所示。
%轨迹规划
f = 1;
figure(f)
step = 50;
[q ,qd, qdd]=jtraj(init_ang,targ_ang,step); %五次多项式轨迹,得到关节角度,角速度,角加速度,50为采样点个数
grid on
T=robot.fkine(q); %根据插值,得到末端执行器位姿
nT=T.T;
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
其余代码与三次多项式轨迹规划仿真一致。
大家好!我对我的:username字段进行了一个小的验证,它应该是4到30个字符。我写了一个验证::length=>{:within=>4..30,:message=>I18n.t('activerecord.errors.range')-我想显示一个错误各种错误的消息(不像,太长或太短),但这里有一个问题-我可以将最小值和最大值都传递给翻译,以便有类似的东西:用户名应该在4到30个字符之间。目前我有:range:"shouldbebetween%{count}and%{count}characters",这显然不起作用(只是为了检查)。是否可以从范围中获取这些值?谢谢大家的指教!
给定这段代码:has_many:foos,:finder_sql=#{id}部分被过早插入。我如何逃脱它? 最佳答案 在定界符两边加上单引号:has_many:foos,:finder_sql= 关于ruby-如何转义Ruby字符串插值?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2052724/
文章目录前言约束硬约束的轨迹优化Corridor-BasedTrajectoryOptimizationBezierCurveOptimizationOtherOptions软约束的轨迹优化Distance-BasedTrajectoryOptimization优化方法前言可以看看我的这几篇Blog1,Blog2,Blog3。上次基于MinimumSnap的轨迹生成,有许多优点,比如:轨迹让机器人可以在某个时间点抵达某个航点。任何一个时刻,都能数学上求出期望的机器人的位置、速度、加速度、导数。MinimumSnap可以把问题转换为凸优化问题。缺点:MnimumSnap可以控制轨迹一定经过中间的
我正在尝试使用Rails在ActionMailer中设置电子邮件地址。在它被硬编码之前,但我们现在想让它们成为ENV变量,这样我们就不需要在每次电子邮件更改时都修改代码。这是它目前的定义方式:from='"NameofPerson"'我已经尝试使用ENV['EMAIL']将电子邮件设置为环境变量,但即使使用#{ENV['EMAIL'}我也没有运气。谁能指出我正确的方向? 最佳答案 您不能在Ruby中对单引号字符串使用字符串插值。但是双引号字符串可以!from="'NameofPerson'"但是如果你想用双引号将NameofPers
【动态规划】一、背包问题1.背包问题总结1)动规四部曲:2)递推公式总结:3)遍历顺序总结:2.01背包1)二维dp数组代码实现2)一维dp数组代码实现3.完全背包代码实现4.多重背包代码实现一、背包问题1.背包问题总结暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!背包问题是动态规划(DynamicPlanning)里的非常重要的一部分,关于几种常见的背包,其关系如下:在解决背包问题的时候,我们通常都是按照如下五部来逐步分析,把这五部都搞透了,算是对动规来理解深入了。1)动规四部曲:(1)确定dp数组及其下标的含义(2)确定递推公式(3)dp数组的初始化(4)确定遍历顺
有没有办法在AppleScript中实现Ruby风格的字符串插值?我需要一种灵活的方式来创建字符串模式。ruby:fn="john"=>"john"ln="doe"=>"doe"addresses=[]=>[]addresses["jdoe@company.com"]addresses["jdoe@company.com","john.doe@company.com"]苹果脚本:setfnto"john"setlnto"doe"settheAddressesto{}#jdoe@company.comcopy[somethinghere]&"@company.com"totheendof
十四届蓝桥青少组模拟赛Python-20221108T1.二进制位数十进制整数2在十进制中是1位数,在二进制中对应10,是2位数。十进制整数22在十进制中是2位数,在二进制中对应10110,是5位数。请问十进制整数2022在二进制中是几位数?print(len(bin(2022))-2)#运行结果:11T2.晨跑小蓝每周六、周日都晨跑,每月的1、11、21、31日也晨跑。其它时间不晨跑。已知2022年1月1日是周六,请问小蓝整个2022年晨跑多少天?#样例代码1ls=[0,31,28,31,30,31,30,31,31,30,31,30,31]ans=0k=6foriinrange(1,13)
中国民用飞机制造行业市场现状规模及发展战略规划报告2021-2027年详情内容请咨询鸿晟信合研究院!【全新修订】:2022年2月【撰写单位】:鸿晟信合研究研究【报告目录】第1章:中国民用飞机制造行业发展综述1.1民用飞机制造行业概述1.1.1民用飞机的概念1.1.2飞机制造的概念1.1.3民用飞机的分类1.2民机制造行业周期特性1.2.1影响行业周期的因素(1)GDP增速分析(2)运量增量分析(3)飞机更替分析(4)航空公司获利水平1.2.2行业现阶段周期分析1.2.3行业现阶段景气分析1.3民机制造信息化分析1.3.1信息化技术应用状况分析(1)MDO技术应用分析(2)供应链协同研发分析(3
我的目标是用散列中的值替换字符串中的键。我是这样做的:"hello%{name},todayis%{day}"%{name:"Tim",day:"Monday"}如果字符串中的键在散列中丢失:"hello%{name},todayis%{day}"%{name:"Tim",city:"Lahore"}然后它会抛出一个错误。KeyError:key{day}notfound预期结果应该是:"helloTim,todayis%{day}"or"helloTim,todayis"有人可以指导我只替换匹配的键而不抛出任何错误吗? 最佳答案
我不明白,为什么eval会这样工作:"123#{456.to_s}789"#=>"123456789"eval('123#{456.to_s}789')#=>123如何在eval中插入字符串?更新:谢谢friend们。有效。因此,如果您有一个带有#{}的字符串变量,您希望稍后对其进行评估,您应该按照以下说明进行操作:string='123#{456}789'eval("\""+string+"\"")#=>123456789或string='123#{456}789'eval('"'+string+'"')#=>123456789 最佳答案