机器人技术大作业(报告,项目源码,演示视频)

160 阅读10分钟

课程名称:机器人技术
设计题目:六自由度机械臂正逆运动演示
任课教师:
小组成员:

20xx年 月 日

目录

  1. 机器人选择与建模
    1.1机器人介绍
    本次课程设计选择得是6-DOF机械臂。
    为了方便进行逆运动学求解,我们在机械臂末端添加了两个伪连杆,让机械臂末端更方便调整角度,这样,在逆运动学求解时就不用考虑机械臂末端的角度,只用输入末端的位置就可以完成求解。

这是我们选择的机器人模型,其关节转向纵横交错,能够比较灵活的伸到他的长度能够抵达的地方。
1.2 机器人建模
连杆长度 :2个相邻关节轴线之间的距离
连杆扭角 :2个相邻关节轴线之间的角度
连杆偏距 :2个关节坐标系的X轴之间的距离
关节角度 :关节变量 计算时需要加初始角度偏移
按D-H参数对机械臂进行建模如下:
关节 关节转角 连杆偏移 连杆长度 连杆扭角
1 0 0 1 -pi/2
2 0 0 1 -pi/2
3 0 0 1 -pi/2
4 0 0 1 -pi/2
5 0 0 1 -pi/2
6 0 0 0 -pi/2
7 0 1 0 pi/2
8 0 0 0 pi/2
其中关节7、8为伪连杆

  1. 正问题求解

2.1原理

定义:已知各关节的运动参数,求末端执行器的相对参考坐标系的位姿。

求解步骤:

(1)各连杆首尾相连;

(2)确定各连杆间的齐次变换矩阵;

(3)得到最后的总变换矩阵。

且该总变换矩阵内的未知数只有各轴的旋转角度,因此得到旋转角度即可得到六自由度机器人的末端笛卡尔空间坐标。

2.2正问题求解过程

2.2.1 齐次变换矩阵

对DH参数的符号约定

DH约定参数符号约定
θjoint angle 关节转角
dlink offset 连杆偏移
alink length 连杆长度
α(alpha)link twist 连杆扭角
  1. 参数a是轴z0和轴z1之间沿轴线x测得的距离;
  2. 角度α是在垂直于x1平面内测得的轴线z0和z1之间的夹角。角度α的正向取值定义为z0到z1,由右手规则来确定。
  3. 参数d为从远点O0到轴线x1到z0交点之间的距离,该距离沿z0轴线进行测量得到
  4. θ是垂直于z0的平面内测得的从x0到x1的角度。

在此基础上,每个齐次变换矩阵T都可以表示为是个基本矩阵的乘积。

标准型的D-H参数其乘积顺序为:

通用齐次变换矩阵为:

改进型的D-H参数其乘积顺序为:

通用齐次变换矩阵为:

2.2.2总变换

确定好DH参数建立方式并构建各关节的DH参数,代入各自的通用齐次变换矩阵,得到

共六个矩阵。因此各矩阵分别为:

对该六个齐次变换矩阵按顺序相乘后得到六自由度机器人的总变换:

2.3结果

三、逆问题求解

2.1原理

机械臂逆运动学求解的过程包括以下几个步骤:

  1. 确定机械臂的运动目标,包括机械臂的末端位置和姿态。
  2. 建立机械臂的运动学模型,包括各关节的长度、角度和连接方式。
  3. 确定机械臂的运动范围和限制条件,包括关节的转动范围和机械臂的碰撞限制。
  4. 利用机械臂的运动学模型和运动目标,求解机械臂的关节角度或关节位置。
  5. 根据求解的结果,调整机械臂的关节角度或关节位置,使其能够完成特定的运动任务。

2.2逆问题求解过程

下面以六自由度机器人为例来阐述逆问题求解的方法。

该机器人的运动方程(设为方程式1)如下:

末端连杆的位姿已经给定,即 n , o , a和 p为已知,则求关节变量θ1​,θ2​,⋯,θ6​ 的值称为运动反解。用末知的连杆逆变换左乘方程式1两边,把关节变量分离出来,从而求解。具体步骤如下:

  1. 求θ1​0
    ​可用逆变换 0T1−1​(θ1​)左乘方程式1两边:
    0T1−1​(θ1​)0T6​=1T2​(θ2​)2T3​(θ3​)3T4​(θ4​)4T5​(θ5​)5T6​(θ6​)

令上式矩阵方程两端的元素 ( 2 , 4 ) (2,4)(2,4) 对应相等,可得:

利用三角代换

式中,

通过代换得到θ1​ 的解

式中,正、负号对应于θ1​ 的两个可能解。

  1. 求 θ3​
    在选定θ1​ 的一个解之后,再令矩阵方程1T6​ 两端的元素的 ( 1 , 4 ) (1,4)(1,4) 和 ( 3 , 4 ) (3,4)(3,4) 分别对应相等,即得两方程

方程a3​c3​−d4​s3​=k中已经消去θ2,且方程a3​c3​−d4​s3​=k与−s1​px​+c1​py​=d2具有相同形式,因而可由三角代换求解得到θ3

式中,正、负号对应θ3​ 的两种可能解。

  1. 求 θ2
    为求解 θ2​,在矩阵方程1两边左乘逆变换0T3−1​

式中,变换 3T6​ 由正解出来的矩阵推出。令上式矩阵方程两边的元素 ( 1 , 4 ) (1,4)(1,4) 和 (2.4) 分别对应 相等可得

联立求解得s23​ 和c23​

s23​ 和c23​ 表达式的分母相等,且为正。于是

根据 θ1​ 和θ3​ 解的四种可能组合,由上式可以得到相应的四种可能值θ23​,于是可得到θ2​ 的四种可能解

式中,θ2​ 取与θ3​ 相对应的值。

  1. 求θ4

因为式 (3.75) 的左边均为已知,令两边元素 ( 1 , 3 ) (1,3)(1,3) 和 ( 3 , 3 ) (3,3)(3,3) 分别对应相等,则可得

只要 s5​​=0,便可求出θ4​

当 s5​=0 时,机械手处于奇㫒形位。此时,关节轴4 和6 重合,只能解出θ4​ 与 θ6​ 的和或 差。奇异形位可以由式 (3.79)中atan2 的两个变量是否都接近零来判别。若都接近零,则为奇异形位,否则,不是奇异形位。在奇异形位时,可任意选取θ4​ 的值,再计箅相应的θ6​ 值。

5.求θ5

据求出的θ4​,可进一步解出 θ5​,将方程1两端左乘逆变换0T4​(θ1​,θ2​,θ3​,θ4​),

因下面方程式的左边θ1​,θ2​,θ3​ 和 θ4​ 均已解出, 逆变换0T4−1​(θ1​,θ2​,θ3​,θ4​) 为

上式方程式的右边 4T6​(θ5​,θ6​)=4T5​(θ5​)5T6​(θ6​),由正解得到的4T6​给出。据矩阵两边元素 ( 1 , 3 ) (1,3)(1,3) 和 ( 3 , 3 ) (3,3)(3,3) 分别对应相等,可得

由此得到θ5​ 的封闭解

6.求θ6

将方程式1改写为

令上式的矩阵方程两边元素 ( 3 , 1 ) (3,1)(3,1) 和 ( 1 , 1 ) (1,1)(1,1) 分别对应相等,可得

从而可求出 θ6​ 的封闭解

六自由度机器人的运动学反解可能存在8种解。但是,由于结构的限制,例如各关节变量不 能在全部360∘ 范围内运动,有些解不能实现。在机器人存在多种解的情况下,应选取其中满意的一组解,以满足机器人的工作要求。

2.3结果

逆运动学求解实现了动画演示。

四、代码

1.正运动学matlab代码:

clear;

clc;

%建立机器人模型

% theta d a alpha offset

SL1=Link([0 0 1 -pi/2 0 ],'standard');

SL2=Link([0 0 1 -pi/2 0 ],'standard');

SL3=Link([0 0 1 -pi/2 0 ],'standard');

SL4=Link([0 0 1 -pi/2 0 ],'standard');

SL5=Link([0 0 1 -pi/2 0 ],'standard');

SL6=Link([0 0 0 -pi/2 0 ],'standard');

SL7=Link([0 1 0 pi/2 0 ],'standard');

SL8=Link([0 0 0 pi/2 0 ],'standard');

starobot=SerialLink([SL1 SL2 SL3 SL4 SL5 SL6,SL7,SL8],'name','Xinje-mod');

%figure(1),teach(starobot);

teach(starobot);

starobot.plot([0,0,0,0,0,0,0,0]*pi/180);

set(gcf,'position',[100 100 800 500]);

xx=inputdlg({'1','2','3','4','5','6'},'请输入',[1 30;1 30;1 30;1 30;1 30;1 30],{'0','0','0','0','0','0'})

xxx=str2double(xx)

t = starobot.fkine([xxx(1,1) xxx(2,1) xxx(3,1) xxx(4,1) xxx(5,1) xxx(6,1) 0,0]*pi/180) %末端执行器位姿

Th=starobot.ikine(t)

t=starobot.fkine(Th)

starobot.plot(Th);

2.逆运动学matlab代码

clear;

clc;

%建立机器人模型

% theta d a alpha offset

SL1=Link([0 0 1 -pi/2 0 ],'standard');

SL2=Link([0 0 1 -pi/2 0 ],'standard');

SL3=Link([0 0 1 -pi/2 0 ],'standard');

SL4=Link([0 0 1 -pi/2 0 ],'standard');

SL5=Link([0 0 1 -pi/2 0 ],'standard');

SL6=Link([0 0 0 -pi/2 0 ],'standard');

SL7=Link([0 1 0 pi/2 0 ],'standard');

SL8=Link([0 0 0 pi/2 0 ],'standard');

starobot=SerialLink([SL1 SL2 SL3 SL4 SL5 SL6,SL7,SL8],'name','Xinje-mod');

%figure(1),teach(starobot);

teach(starobot);

starobot.plot([0,0,0,0,0,0,0,0]*pi/180);

set(gcf,'position',[100 100 800 500]);

% xx=inputdlg({'1','2','3','4','5'},'请输入',[1 30;1 30;1 30;1 30;1 30],{'0','0','0','0','0'})

% xxx=str2double(xx)

% t = starobot.fkine([xxx(1,1) xxx(2,1) xxx(3,1) xxx(4,1) xxx(5,1) 0,0,0]*pi/180) %末端执行器位姿

% Th=starobot.ikine(t)

% t=starobot.fkine(Th)

% starobot.plot(Th);

yy=inputdlg({'x','y','z'},'请输入',[1 30;1 30;1 30;],{'6','0','0'})

yyy=str2double(yy)

p = transl(yyy(1,1),yyy(2,1),yyy(3,1))*rpy2tr(0,0,0);%得出位姿矩阵

Th=starobot.ikine(p)

tt=Th*180/pi

starobot.plot(Th);

t=starobot.fkine(Th)

[qt,qdt,qddt] = jtraj([0,0,0,0,0,0,0,0]*pi/180, Th, 80)

T=starobot.fkine(qt);%根据插值,求得末端执行器的位姿

plot3(squeeze(T(1,4,:)),squeeze(T(2,4,:)),squeeze(T(3,4,:)));%画出末端轨迹

hold on

starobot.plot(qt,'tilesize',2);%动画演示

五、总结

本次课程设计我们小组认真的完成,刚开始的时候课程设计中的许多细节都没有注意,老是求快,想早点完成设计和机械臂的问题求解的工作,但是这反而导致了很多次的失败。好在最终摆正了心态,细心检查之后,最终完成了课程设计。

从这次的设计中还感受到坚持的重要性。做事情不能轻言谈放弃,虽然过程不顺利,与想象中相去甚远。但是只要我们能坚持,朝着自己既定的目标前进,就一定会走到终点。一点小小的挫折实际上是在为最后的美景做铺垫,当我们守得云开见月明的时候,就会发现,沿途的曲折其实是在考验我们的目标是否坚定。坚持下来,我们会收获丰硕的果实。机器人技术课程设计,不仅让我们的知识更加牢固,还让我意识到我们所学的知识可以与生活紧密的联系起来。这让我对自己有了更多的信心,因为我们在大学里面不是混日子,而是在学习真正对我们的生活有帮助的知识和能力,运用机器人技术不断完善我们的生活。