| 课程名称: | 机器人技术 |
|---|---|
| 设计题目: | 六自由度机械臂正逆运动演示 |
| 任课教师: | |
| 小组成员: | |
20xx年 月 日
目录
- 机器人选择与建模
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为伪连杆
- 正问题求解
2.1原理
定义:已知各关节的运动参数,求末端执行器的相对参考坐标系的位姿。
求解步骤:
(1)各连杆首尾相连;
(2)确定各连杆间的齐次变换矩阵;
(3)得到最后的总变换矩阵。
且该总变换矩阵内的未知数只有各轴的旋转角度,因此得到旋转角度即可得到六自由度机器人的末端笛卡尔空间坐标。
2.2正问题求解过程
2.2.1 齐次变换矩阵
对DH参数的符号约定
| DH约定参数 | 符号约定 |
|---|---|
| θ | joint angle 关节转角 |
| d | link offset 连杆偏移 |
| a | link length 连杆长度 |
| α(alpha) | link twist 连杆扭角 |
- 参数a是轴z0和轴z1之间沿轴线x测得的距离;
- 角度α是在垂直于x1平面内测得的轴线z0和z1之间的夹角。角度α的正向取值定义为z0到z1,由右手规则来确定。
- 参数d为从远点O0到轴线x1到z0交点之间的距离,该距离沿z0轴线进行测量得到
- θ是垂直于z0的平面内测得的从x0到x1的角度。
在此基础上,每个齐次变换矩阵T都可以表示为是个基本矩阵的乘积。
标准型的D-H参数其乘积顺序为:
通用齐次变换矩阵为:
改进型的D-H参数其乘积顺序为:
通用齐次变换矩阵为:
2.2.2总变换
确定好DH参数建立方式并构建各关节的DH参数,代入各自的通用齐次变换矩阵,得到
、
、
、
、
、
共六个矩阵。因此各矩阵分别为:
对该六个齐次变换矩阵按顺序相乘后得到六自由度机器人的总变换:
2.3结果
三、逆问题求解
2.1原理
机械臂逆运动学求解的过程包括以下几个步骤:
- 确定机械臂的运动目标,包括机械臂的末端位置和姿态。
- 建立机械臂的运动学模型,包括各关节的长度、角度和连接方式。
- 确定机械臂的运动范围和限制条件,包括关节的转动范围和机械臂的碰撞限制。
- 利用机械臂的运动学模型和运动目标,求解机械臂的关节角度或关节位置。
- 根据求解的结果,调整机械臂的关节角度或关节位置,使其能够完成特定的运动任务。
2.2逆问题求解过程
下面以六自由度机器人为例来阐述逆问题求解的方法。
该机器人的运动方程(设为方程式1)如下:
末端连杆的位姿已经给定,即 n , o , a和 p为已知,则求关节变量θ1,θ2,⋯,θ6 的值称为运动反解。用末知的连杆逆变换左乘方程式1两边,把关节变量分离出来,从而求解。具体步骤如下:
-
求θ10
可用逆变换 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 的两个可能解。
- 求 θ3
在选定θ1 的一个解之后,再令矩阵方程1T6 两端的元素的 ( 1 , 4 ) (1,4)(1,4) 和 ( 3 , 4 ) (3,4)(3,4) 分别对应相等,即得两方程
方程a3c3−d4s3=k中已经消去θ2,且方程a3c3−d4s3=k与−s1px+c1py=d2具有相同形式,因而可由三角代换求解得到θ3
式中,正、负号对应θ3 的两种可能解。
-
求 θ2
为求解 θ2,在矩阵方程1两边左乘逆变换0T3−1
式中,变换 3T6 由正解出来的矩阵推出。令上式矩阵方程两边的元素 ( 1 , 4 ) (1,4)(1,4) 和 (2.4) 分别对应 相等可得
联立求解得s23 和c23
s23 和c23 表达式的分母相等,且为正。于是
根据 θ1 和θ3 解的四种可能组合,由上式可以得到相应的四种可能值θ23,于是可得到θ2 的四种可能解
式中,θ2 取与θ3 相对应的值。
- 求θ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);%动画演示
五、总结
本次课程设计我们小组认真的完成,刚开始的时候课程设计中的许多细节都没有注意,老是求快,想早点完成设计和机械臂的问题求解的工作,但是这反而导致了很多次的失败。好在最终摆正了心态,细心检查之后,最终完成了课程设计。
从这次的设计中还感受到坚持的重要性。做事情不能轻言谈放弃,虽然过程不顺利,与想象中相去甚远。但是只要我们能坚持,朝着自己既定的目标前进,就一定会走到终点。一点小小的挫折实际上是在为最后的美景做铺垫,当我们守得云开见月明的时候,就会发现,沿途的曲折其实是在考验我们的目标是否坚定。坚持下来,我们会收获丰硕的果实。机器人技术课程设计,不仅让我们的知识更加牢固,还让我意识到我们所学的知识可以与生活紧密的联系起来。这让我对自己有了更多的信心,因为我们在大学里面不是混日子,而是在学习真正对我们的生活有帮助的知识和能力,运用机器人技术不断完善我们的生活。