基于Matlab的空间描点机器人建模与仿真报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计
课程名称机器人学
题目名称空间描点机器人建模仿真学生学院
专业班级
学号
学生姓名
指导教师
目录
1.课程设计要求 (1)
2.空间描点机器人的设计 (2)
2.1机器人构型及坐标 (2)
2.2D-H参数表 (4)
3.正运动学 (5)
3.1齐次变换矩阵 (5)
3.2 空间描点机器人工作空间 (6)
4.几何法求逆解 (7)
5.程序流程图 (8)
6.总结分析 (9)
7.Matlab程序附录 (10)
7.1 Mov_6DOF_Rob_Lnya.m (10)
7.2 DHfk6Dof_Lnya.m (12)
7.3 IK_6DOF_Rob_Lnya.m (13)
7.4 Build_6DOFRobot_Lnya.m (14)
7.5 Erzhihua.m (14)
7.6 draw_Workplace.m (15)
7.7 Matrix_DH_Ln.m (16)
7.8 Connect3D.m (17)
1. 课程设计要求
一,按照附件模板填写,要求有封面和目录,除签名处不能有手写。
二,主要内容包括下面几个部分,
1,设计一款六自由度机器人,要求2,3,4,5关节中有一个是滑动关节,其余关节应为转动关节。
试构想该机器人的功能,并根据功能设定机器人的介绍参数(杆件长度及关节极限)
2,建立机器人的正运动学模型,进行Matlab 运动仿真。
(分析机器人的工作空间,制作机器人各个运动的动画。
)
注意事项:
1)要求画出机器人的关节坐标系,列出DH 参数表,以及各个关节间的齐次变换矩阵。
2)Matlab仿真应画出工作空间的立体图和剖面图。
采用机器人产品的同学应与实际说明书的工作空间做对比。
自行设计的同学要做简单的分析讨论。
3)直接采用例程里面的三自由度机器人该部分得0 分。
3,实现逆运动学轨迹规划
注意事项:
1)这里特指机器人末端的轨迹规划,不是关节空间的轨迹规划。
2)要实现控制机器人末端在空间中完成某种轨迹。
(如直线,圆弧,心型,写字等)
3)可以采用求解逆运动的方程或者是利用微分运动。
4)写出详细的推导过程(公式)。
5)要求有仿真截图及动画。
6)只能使用matlab 及本课程提供的例程,不能使用工具箱。
7)仅仅使用3自由度例程的同学本部分分数会很低
4,自由发挥项(完成这一部分的同学才能够得到90分以上)
1)机器人完整逆解的求解方式(数值解);
2)寻找奇异点,分析奇异位型。
5,Matlab程序作为附录应添加在课程设计报告书的最后面。
要求在第一页附上程序流程图,注明函数调用过程,此外,程序要排好版。
2. 空间描点机器人的设计
2.1机器人构型及坐标
本课程设计通过matlab对一个六自由度的空间描点机器人进行设计,并对其进行仿真分析。
该机器人的第一关节为固定关节,主要是用于机器人本体的固定,第四关节为滑动关节,剩余关节为转动关节,在第六关节的连杆末端,可以带上各类的设备,在运行时带动连杆对进行空间三维描点或其他动作。
机器人的结构和大致效果示意图分别如如图1和图2所示:
图1 机器人结构图
图2 机器人大致效果图
机器人关节坐标系和运行图如图3和图4所示:
图3 机器人关节坐标系
图4 机器人运行图
2.2 D-H参数表
根据本设计按摩机器人的各关节的坐标系及连杆长度,我们可以得到如下表1的DH 参数表。
表1 D-H参数表
3正运动学
3.1 齐次变换矩阵
由课堂知识可易知,机器人关节n 到关节n+1的坐标变换步骤为如下的模式:
()()()()1*0,0,*,0,0*n
n n n n n n T A Rot a Trans d Trans a Rot n θα+==轴,轴,
具体的齐次变换矩阵为:
10010
001
0010
000010001000000
1000
10
0100000010001000100
1S 00
00n n n n
n n n n
n n n
n n n n n n n n n
n n n n n n n n n C S a S C C S T d S C C C S S a C S C C S C a S S C d θθθθααααθαθαθθθαθαθθαα+-⎡⎤⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥-⎢⎥⎢⎥⎢⎥⎢
⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢
⎥⎢⎥⎢
⎥⎣⎦⎣⎦⎣⎦⎣⎦
--=1⎡⎤⎢⎥⎢⎥⎢⎥
⎢⎥⎣⎦
由上述知识,以及根据第三节的D-H 参数表,可求得如下各个关节之间的齐次变化矩阵:
1111
112000*********
01C S S C A T θθθθ⎛⎫ ⎪- ⎪
== ⎪
⎪⎝⎭
(1) 22222
230
0 00001800001C S S C A T θθθθ-⎛⎫ ⎪
⎪
== ⎪
⎪⎝⎭
(2)
3333
333
340
100010001000001C S C S C S A T θθθθθθ-⎛⎫
⎪
⎪
== ⎪- ⎪
⎝⎭ (3) 4
45100a450010000100
001A T +⎛⎫
⎪
⎪
== ⎪
⎪
⎝⎭
(4)
555
55
560
0000011000001C S S C A T θθθθ-⎛⎫ ⎪ ⎪
== ⎪
⎪⎝⎭
(5)
66666666705005000100
01C S C S C S A T θθθθθθ-⎛⎫
⎪
⎪
== ⎪
⎪
⎝⎭
(6)
3.2 空间描点机器人工作空间 通过matlab 程序仿真,我们可以得到如下结果:
图5 立体图 图6 X-Y 视角
图7 Y-Z 视图 图8 X-Z 视图
4 几何法求逆解
本课程设计所建立的机器人模型的逆解是通过几何法来进行求解的,总体的思路是第四个关节为滑动关节,第五、六关节为固定关节,所以当知道目标点的位置信息后,可以通过第四节中的各个关节
间的齐次变换矩阵,求得1
4T ,接着的话便可以通过3自由度机器人几
何法求逆解的方法求出相应的关节转动角度。
具体的公式推导过程如下:
4
4567567
55666556665656565656565656**100a45000050010000050**0010001100001000010001000105050a450S T T T T C S C S C S C S C S C C S S C S S S C C S S C C S θθθθθθθθθθθθθθθθθθθθθθθθθθ=+--⎛⎫⎛⎫⎛⎫
⎪ ⎪ ⎪
⎪ ⎪ ⎪= ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭⎝⎭----+++-=56565656050500011000001S S C C S C C S θθθθθθθθ⎛⎫ ⎪++ ⎪ ⎪ ⎪
⎝⎭
(7)
由于本设计的机器人模型结构特殊,后两个关节变化角度为0,
即12==0θθ,所以可得
4
71
0050a4500100001100
001T ++⎛⎫
⎪
⎪= ⎪ ⎪
⎝⎭
(8)
由于
1
1234567234567*****T T T T T T T = (9)
可得
()1
1
14477T T T -= (10)
接着便可以通过课堂上三自由度机器人对前三个关节角度求逆解
的几何法进行求解。
5 程序流程图
本设计主要是两个功能,一个是通过所设计机器人末端在空间中画球,另外一个是通过所设计机器人末端对在空间中对加载的图片实现一个复现,把图片描出来。
大致的流程图如下:
图9 程序流程图
6 分析总结
由matlab的实验结果来看,本次课程设计达到了实验的目的。
所设计空间描点机器人的工作空间也符合描点机器人工作的需要。
在本次课程设计中,虽然达到了实验要求的工作,可实现三维空间的描点,相对于前一次的大作业,本次课程设计有了很大进步。
可实现对目标点逆解的求解,在画工作空间中,采用的是通过齐次变换矩阵的计算,事先在matlab中画出工作空间点,最后再对该工作空间数组直接描点,大大提高了效率。
不过还存在着一些问题需要改进:
1)在描字过程中,描出来的字并不算整齐。
2)在工作空间的X-Y视角图中,出现了一个空心点。
在本次课程设计中,通过对机器人建模,增强了对这方面的了解,对机器人有了更加全面的认识,我将会在此课程设计的基础上,进一步摸索解决上述还存在问题的原因,不断从中学习机器人的知识。
7 matlab代码附录
7.1 Mov_6DOF_Rob_Lnya.m:
close all;
clear;
num = 1
ToDeg = 180/pi;
ToRad = pi/180;
L1=150;
L2=100;
L3=100;
th1=180;
th2=0;
th3=0;
d4=50;
th5=0;
th6=0;
DHfk6Dof_Lnya(th1,th2,th3,d4,th5,th6,0);
view(134,12);
pause;
stp=30;
%%%%%%%%%%%%%%%%%%%正运动学%%%%%%%%%%%%%%%%%%%%%%%% for i=0:stp:360
DHfk6Dof_Lnya(th1+i,th2,th3,d4,th5,th6,1);
end
for i=0:stp:360
DHfk6Dof_Lnya(th1,th2+i,th3,d4,th5,th6,1);
end
for i=0:stp:360
DHfk6Dof_Lnya(th1,th2,th3+i,d4,th5,th6,1);
end
for i=0:60:360
DHfk6Dof_Lnya(th1,th2,th3,d4+i,th5,th6,1);
end
for i=360:-60:0
DHfk6Dof_Lnya(th1,th2,th3,d4+i,th5,th6,1);
end
for i=0:stp:360
DHfk6Dof_Lnya(th1,th2,th3,d4,th5+i,th6,1);
end
for i=0:stp:360
DHfk6Dof_Lnya(th1,th2,th3,d4,th5,th6+i,1);
end
pause;
%%%%%%%%%%%%%%%%%%%%%%%画球%%%%%%%%%%%%%%%%%%%%%%%% cla;
global Link;
point11=[];
point12=[];
point13=[];
a=100;
b=100;
c=100;
r=30;
[x,y,z]=sphere(30);
X=x*r+a;
Y=y*r+b;
Z=z*r+c;
for i=1:1:31
for j=1:1:31
px=X(i,j); py=Y(i,j); pz=Z(i,j);
[th1,th2,th3]=IK_6DOF_Rob_Lnya(L1,L2,L3,px,py,pz);
th1=th1*ToDeg;
th2=th2*ToDeg;
th3=th3*ToDeg;
DHfk6Dof_Lnya(th1,th2,th3,d4,th5,th6,1);
point11(num) = Link(7).p(1);
point12(num) = Link(7).p(2);
point13(num) = Link(7).p(3);
num = num + 1;
plot3(point11,point12,point13,'k*');hold on;
end
end
% %%%%%%%%%%%%%%%%%%%%描字%%%%%%%%%%%%%%%%%%%%%
global Link
point21=[];
point22=[];
point23=[];
num=1;
ToDeg = 180/pi;
load('FP.mat');
[FPh,FPl]=size(FP);
for i=1:FPh;
[th1,th2,th3]=IK_6DOF_Rob_Lnya(L1,L2,L3,FP(i,2),100,FP(i,1));
num=num+1;
th1=th1*ToDeg;
th2=th2*ToDeg;
th3=th3*ToDeg;
th4=0;th5=0;th6=0;
if i==FPh
DHfk6Dof_Lnya(th1,th2,th3,d4,th5,th6,0);
else
DHfk6Dof_Lnya(th1,th2,th3,d4,th5,th6,1);
end
point21(num)= Link(7).p(1);
point22(num)=Link(7).p(2);
point23(num)=Link(7).p(3);
plot3(point11,point12,point13,'k*');hold on;
plot3( point21, point22, point23,'r.');hold on;
end
cla;
plot3(point11,point12,point13,'k*');hold on;
plot3( point21, point22, point23,'r.');hold on;
7.2 DHfk6Dof_Lnya.m
function pic=DHfk6Dof_Lnya(th1,th2,th3,d4,th5,th6,fcla) global Link
Build_6DOFRobot_Lnya;
radius = 10;
len = 30;
joint_col = 0;
plot3(0,0,0,'ro');
Link(2).th=th1*pi/180;
Link(3).th=th2*pi/180;
Link(4).th=th3*pi/180;
Link(5).dx=d4;
Link(6).th=th5*pi/180;
Link(7).th=th6*pi/180;
p0=[0,0,0]';
for i=1:7
Matrix_DH_Ln(i);
End
for i=2:7
Link(i).A=Link(i-1).A*Link(i).A;
Link(i).p= Link(i).A(:,4);
Link(i).n= Link(i).A(:,1);
Link(i).o= Link(i).A(:,2);
Link(i).a= Link(i).A(:,3);
Link(i).R=[Link(i).n(1:3),Link(i).o(1:3),Link(i).a(1:3)];
Connect3D(Link(i-1).p,Link(i).p,'b',2); hold on;
DrawCylinder(Link(i-1).p, Link(i-1).R * Link(i).az, radius,len, joint_col); hold on;
end
grid on;
axis([-600,500,-500,500,-500,500]);
xlabel('x');
ylabel('y');
zlabel('z');
drawnow;
pic=getframe;
if(fcla)
cla;
end
7.3 IK_6DOF_Rob_Lnya.m
function [th1,th2,th3]=IK_6DOF_Rob_Lnya(L1,L2,L3,px,py,pz)
ToDeg = 180/pi;
ToRad = pi/180;
th1=atan2(py,px);
P=[px,py,pz];
J2=[0,0,L1];
th3=pi-acos( ( L2^2+L3^2-norm(P-J2)^2)/(2*L2*L3) );
th3=-th3;
C1=cos(th1);
S1=sin(th1);
C3=cos(th3);
S3=sin(th3);
A=C1*px + S1*py;
B=pz - L1;
W1=(L2+C3*L3);
W2=(L3*S3);
fprintf('W1^2+W2^2=%4.2f \n',W1^2+W2^2);
th2=atan2( (W1*B-W2*A),(W1*A+W2*B) );
fprintf('th1=%4.2f \n',th1*ToDeg);
fprintf('th2=%4.2f \n',th2*ToDeg);
fprintf('th3=%4.2f \n',th3*ToDeg);
7.4 Build_6DOFRobot_Lnya.m
ToDeg = 180/pi;
ToRad = pi/180;
UX = [1 0 0]';
UY = [0 1 0]';
UZ = [0 0 1]';
Link=struct('name','Body','th',0,'dz',0,'dx',0,'alf',90*ToRad,'az',UZ ); % az
Link(1)=struct('name','Base','th',0*ToRad,'dz',-200,'dx',100,'alf',0* ToRad,'az',UZ); %Base To 1
Link(2)=struct('name','J1','th',180*ToRad,'dz',250,'dx',0,'alf',90*To Rad,'az',UZ); %1 TO 2
Link(3)=struct('name','J2','th',0*ToRad,'dz',0,'dx',100,'alf',0*ToRad ,'az',UZ); %2 TO 3
Link(4)=struct('name','J3','th',0*ToRad,'dz',0,'dx',100,'alf',-90*ToR ad,'az',UZ); %3 TO 4
Link(5)=struct('name','J3','th',0*ToRad,'dz',0,'dx',50,'alf',0*ToRad, 'az',UZ); %4 TO 5
Link(6)=struct('name','J3','th',0*ToRad,'dz',100,'dx',0,'alf',0*ToRad ,'az',UZ); %5 TO 6
Link(7)=struct('name','J3','th',0*ToRad,'dz',0,'dx',50,'alf',0*ToRad, 'az',UZ); %6 TO 7
7.5 Erzhihua.m
clear,clc
A=imread('广工.png');
B=rgb2gray(A);
g_max=double(max(max(B)));
g_min=double(min(min(B)));
T=round((g_max-g_min)/2);
D=(double(B)>=T);
[Dm,Dn]=size(D);
num=1;
for m=1:Dm
if mod(m,2)==0
n=Dn;
for ii=1:Dn
if D(m,n)==0
FP(num,1)=(Dm-m);
FP(num,2)=(Dn-n);
num=num+1;
end
n=n-1;
end
else
n=1;
for ii=1:Dn
if D(m,n)==0
FP(num,1)=(Dm-m);
FP(num,2)=(Dn-n);
num=num+1;
end
n=n+1;
end
end
end
save('FP.mat','FP');
7.6 draw_Workplace.m
close all;
clear;
ToDeg = 180/pi;
ToRad = pi/180;
num=1;
th_interval = 30;
d_interval = 10;
for th1=-180:10:180
for th2=-90:th_interval:90
for th3=-180:th_interval:0
for d4=-40:d_interval:200
for th5=-180:th_interval:180
for th6=-90:th_interval:90
theta1=th1*ToRad;
theta2=th2*ToRad;
theta3=th3*ToRad;
theta5=th5*ToRad;
theta6=th6*ToRad;
A1 =[[ cos(theta1), 0, sin(theta1), 0] [ sin(theta1), 0, -cos(theta1), 0] [ 0, 1, 0, 250]
[ 0, 0, 0, 1]];
A2 =[[ cos(theta2 ), -sin(theta2 ), 0, 0]
[ sin(theta2 ), cos(theta2 ), 0, 0]
[ 0, 0, 1,80]
[ 0, 0, 0, 1]];
A3 =[[ cos(theta3), 0, -sin(theta3), 100*cos(theta3)] [ sin(theta3), 0, cos(theta3), 100*sin(theta3)] [ 0, -1, 0, 0]
[ 0, 0, 0, 1]]; A4 =[[ 1, 0, 0, 0]
[ 0, 1, 0, 0]
[ 0, 0, 1, d4 + 50]
[ 0, 0, 0, 1]];
A5 =[[ cos(theta5), -sin(theta5), 0, 0]
[ sin(theta5), cos(theta5), 0, 0]
[ 0, 1, 0, 100]
[ 0, 0, 0, 1]];
A6 =[[ cos(theta6), -sin(theta6), 0, 50*cos( theta6)] [ sin(theta6), cos(theta6), 0, 50*sin( theta6)] [ 0, 0, 1, 0] [ 0, 0, 0, 1]];
A = A1 * A2 * A3 * A4 * A5 * A6;
point1(num) = A(1,4);
point2(num) = A(2,4);
point3(num) = A(3,4);
num = num + 1;
end
end
end
end
end
end
plot3(point1,point2,point3,'r*');
axis([-600,600,-600,600,-400,700]);
grid on;
7.7 Matrix_DH_Ln.m
function Matrix_DH_Ln(i)
global Link
ToDeg = 180/pi;
ToRad = pi/180;
C=cos(Link(i).th);
S=sin(Link(i).th);
Ca=cos(Link(i).alf);
Sa=sin(Link(i).alf);
a=Link(i).dx; %distance between zi and zi-1
d=Link(i).dz; %distance between xi and xi-1
Link(i).n=[C,S,0,0]';
Link(i).o=[-1*S*Ca,C*Ca,Sa,0]';
Link(i).a=[S*Sa, -1*C*Sa,Ca,0]';
Link(i).p=[a*C,a*S,d,1]';
Link(i).R=[Link(i).n(1:3),Link(i).o(1:3),Link(i).a(1:3)];
Link(i).A=[Link(i).n,Link(i).o,Link(i).a,Link(i).p];
7.8 Connect3D.m
function Connect3D(p1,p2,option,pt)
h = plot3([p1(1) p2(1)],[p1(2) p2(2)],[p1(3) p2(3)],option); set(h,'LineWidth',pt)。