毕设(2)——机械臂正逆运动学分析

毕设中用到了很多代码,其中一部分我通过看书和看论文学习并实现的代码,会通过Gitee仓库分享出来,这些代码仅用于学习使用,祝各位毕业生顺利完成毕设!

毕设系列内容:毕业设计——四自由度机械臂轨迹规划


毕设(2)——机械臂正逆运动学分析

建立好运动学模型之后,就可以开始对机械臂进行运动学分析,这也是机械臂轨迹规划中重要的基础之一,B站上我看的一个课程非常好,是一位台湾的教授讲的课,网址是机器人运动学—林沛群

正向运动学分析#

改进型DH的齐次变换矩阵形式如下

ii1T=TX^i1(αi1)TX^R(αi1)TZ^Q(θi)TZ^P(di)=[cθisθi0ai1sθicαi1cθicαi1sαi1sαi1disθisαi1cθisαi1cαi1cαi1di0001]

得到五个关节的齐次变换矩阵分别如下所示

10T=[cθ1sθ100sθ1cθ10000100001]21T=[cθ2sθ2000010sθ2cθ2000001]32T=[cθ3sθ30a2sθ3cθ30000100001]

43T=[cθ4sθ40a3sθ4cθ40000100001]54T=[cθ5sθ50a4000d5sθ5cθ5000001]

然后将各个矩阵相乘即可得到机械臂的正向运动学方程

50T=10T21T32T43T54T=[nxoxaxpxnyoyaypynzozazpz0001]

但是通过观察机械臂结构可以发现第2、3、4关节均为平行的旋转关节,则可以将21T32T43T的乘积通过积化和差公式转化为一个简化的表达式,表达式形式如下所示

41T=21T32T43T=[c234s2340c23a3+c2a20010s234c2340s23a3s2a20001]

其中,c234=cos(θ2+θ3+θ4)s234=sin(θ2+θ3+θ4)
机械臂的结构几何关系如下图所示

image

根据机械臂的结构几何关系,可以得到θ2+θ3+θ40
则可以将表达式简化为以下形式

41T=21T32T43T=[100c23a3+c2a20010010s23a3s2a20001]

则可以得到正向运动学方程为以下形式

50T=10T21T32T43T54T=10T41T54T=[c1c5+s1s5c1s5+s1c50c1(c23a3+c2a2+a4)s1c5c1s5s1s5c1c50s1(c23a3+c2a2+a4)001d5s23a3s2a20001]=[nxoxaxpxnyoyaypynzozazpz0001]

逆向运动学分析#

θ1#

θ1可以通过pxpy求出

{c1(c23a3+c2a2+a4)=pxs1(c23a3+c2a2+a4)=py

求得θ1=arctan(pypx),得到的两个值可根据pxpy的正负情况社区一个值,得到唯一解

θ3#

{c1(c23a3+c2a2+a4)=pxs1(c23a3+c2a2+a4)=py
平方相加可得(c23a3+c2a2)2=(pxc1a4)2+(pys1a4)2
d5s23a3s2a2=pz
(s23a3+s2a2)2=(pz+d5)2
两式相加,可得

(c23a3+c2a2)2+(s23a3+s2a2)2=(pxc1a4)2+(pys1a4)2+(pz+d5)2

c3=px2+py2+pz22a4(c1px+s1py)+2pzd5+a42+d52a22a322a2a3

θ3=±arccos(px2+py2+pz22a4(c1px+s1py)+2pzd5+a42+d52a22a322a2a3)
求出来得θ3可能有两个值,可以根据"最小变化行程原则"选择一个合适得角度值

θ2#

d5s23a3s2a2=pz
s23通过和差化积公式拆开
(c3a3+a2)s2+(s3a3)c2=(pz+d5)
根据辅助角公式,可得

(c3a3+a2)2+(s3a3)2sin(θ2+arctan(s3a3c3a3+a2))=(pz+d5)

θ2=arcsin((pz+d5)(c3a3+a2)2+(s3a3)2)arctan(s3a3c3a3+a2)
根据θ2得范围可知θ2存在唯一解,只需要在求出的结果中筛选在范围内得角度值即可

θ4#

θ4可根据θ2+θ3+θ40求出

θ4=(θ2+θ3)

θ5#

{c1c5+s1s5=nxs1c5c1s5=ny
θ5=θ1arctan(nynx)

同样可以求出两个值,需要根据"最小变化行程原则"筛选合适的角度值

逆向运动学方程#

根据五个关节角度的求解,可以得到逆向运动学方程

{θ1=arctan(pypx)θ2=arcsin((pz+d5)(c3a3+a2)2+(s3a3)2)arctan(s3a3c3a3+a2)θ3=±arccos(px2+py2+pz22a4(c1px+s1py)+2pzd5+a42+d52a22a322a2a3)θ4=(θ2+θ3)θ5=θ1arctan(nynx)

Matlab代码验证#

正向运动学#

原理搞清楚之后,代码方面就很简单了

myfkine.m

function [T05] = myfkine(Angle_T)
%运动学正解
theta1 = Angle_T(1, 1);
theta2 = Angle_T(1, 2);
theta3 = Angle_T(1, 3);
theta4 = Angle_T(1, 4);
theta5 = Angle_T(1, 5);
theta23 = theta2 + theta3;
a2 = 135; a3 = 147; a4 = 61; d5 = 131;
T01 = [cos(theta1) -sin(theta1) 0 0;
       sin(theta1) cos(theta1)  0 0;
       0           0            1 0;
       0           0            0 1];
T14 = [1 0  0 cos(theta23) * a3 + cos(theta2) * a2;
       0 0  1 0;
       0 -1 0 -sin(theta23) * a3 - sin(theta2) * a2;
       0 0  0 1];
T45 = [cos(theta5)  -sin(theta5) 0 a4;
       0            0            1 d5;
       -sin(theta5) -cos(theta5) 0 0;
       0            0            0 1];
T05 = T01 * T14 * T45;

逆向运动学#

逆向运动学也是类似操作,最需要了解的内容是理论部分
代码较长,文中就不放出来了,你可以在代码仓库中找到它

验证程序#

需要注意的是,机器人工具箱中的ikine函数,支持的是带有球形手腕的6轴机械臂,通常对6自由度以下的机械臂支持不好,会报错,所以逆运动学没法用工具箱来验证,只是将逆解输入到正解函数中再次求解,看看两次正解情况是否相同

test2.m

% Modified DH 建模dobot
clear, clc, close all;

%建立机器人模型
%           关节角   关节偏距  连杆长度   连杆转角   旋转关节   偏差
%           theta    d        a         alpha     sigma      offset
L(1) = Link([0       0        0         0         0          0], 'modified');
L(2) = Link([0       0        0         -pi / 2   0          0], 'modified');
L(3) = Link([0       0        135       0         0          0], 'modified');
L(4) = Link([0       0        147       0         0          0], 'modified');
L(5) = Link([0       131      61        -pi / 2   0          0], 'modified');

%连接连杆
robot = SerialLink(L, 'name', 'Dobot');

angle1 = [-pi / 6, -pi / 6, pi / 3, -pi / 6, pi / 4];
angle2 = [pi / 3, -pi / 60, pi / 30, -pi / 60, -pi / 4];

%运动学正解
fk1 = myfkine(angle1); %正解函数
fk2 = robot.fkine(angle1);%工具箱正解函数
%fk1 = myfkine(angle2); %正解函数
%fk2 = robot.fkine(angle2);%工具箱正解函数

%运动学逆解
ik1 = myikine(fk1);%逆解函数
%实际上robot.ikine函数并不可用
%ik2 = robot.ikine(fk1);%工具箱逆解函数
degik1 = rad2deg(ik1);

%再次运动学正解
ik1_fk = myfkine(ik1(1, :));

在matlab命令行中查看fk1和ik1_fk,可以看到两个齐次矩阵是一模一样的😄

image

本文到此结束,后续会继续更新的~😃

posted @   Dragonet-Z  阅读(3208)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示