图书分拣报告

本报告详述了斯坦福机械手臂的D-H参数建立、正运动学与逆运动学推导,用于图书分拣的路径仿真和代码实现。通过MATLAB编程,实现了机器人工作空间的绘制及路径规划。
摘要由CSDN通过智能技术生成

图书分拣实验报告

一、实验要求

在这里插入图片描述

二、实验过程

  Stanford机械手臂是斯坦福大学研发一款机器人,斯坦福机械手臂是一个拥有6个自由度的球坐标手臂,即头两个关节是旋转的,第三个关节是滑动的,最后三个腕关节全是旋转关节。斯坦福机器人如下图所示:
在这里插入图片描述

2.1 建立坐标系

采用D-H法建立坐标系,简述如下:
  (1)确定Z轴:对于旋转关节,z轴按照右手螺旋定则旋转的方向,旋转角θ为关节变量;对于滑动关节,z轴为沿着直线运动的方向,连杆长度是关节变量;
  (2)确定x轴:定义x_n轴的方向为z(n-1)和zn轴的公垂线方向;有以下特别情况:
   若z(n-1)和zn平行,此时有无数条公垂线,选取与前一关节的公垂线共线的公垂线;
  若z(n-1)和zn相交,此时没有公垂线,选取两条z轴叉积的方向作为x轴的方向。

 按照上述方法,建立如下坐标系:
在这里插入图片描述

2.2 D-H参数表

  D-H参数表分两种,一种是标准的D-H表,一种是改进的D-H表。以下采用的是标准的D-H表,根据上述信息,按照如下四个变换规则,可以确定D-H表中的值:
在这里插入图片描述
  Stanford机械手臂的旋转轴的技术参数经过调试得出关节极限,如下。可计算的D-H表为:
在这里插入图片描述
可知,由于存在5个旋转关节,1个伸缩关节,因此存在六个未知变量,即θ1 ~ θ6(除去θ3),d3也是一个变量。

2.3 斯坦福机器人正运动学推导

  分析可知,依次进行坐标系之间的变换 n T(n+1)称为A(n+1)是四个运动变换矩阵的乘积
在这里插入图片描述
化简结果为
在这里插入图片描述
故关节0与关节1之间的变换可以简化为:
在这里插入图片描述
余下关节为:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
得到以上变换的A矩阵,在机器人的基座与手之间的总变换则为:
在这里插入图片描述
代入数据可得:
在这里插入图片描述

2.4 斯坦福机器人逆运动学推导

  机器人逆运动学是求解机器臂从工作空间到关节空间的变换,一般可分为数值解法或者封闭解法(解析解)。由于解析解求解较快,目前设计的机器人多采用特定结构(正交关节轴有多个α为0或者±90°),可以进行解析解的求解。本文采用解析解。
  为了求这些角度利用逆变换A1-1左乘方程 (1) 两边, 得到:
在这里插入图片描述
  分别把计算出的4*4矩阵参数代入,不断利用逆变换A_n^(-1)左乘方程两边,再分析比较,调用matlab中的solve函数进行参数运算求解,可得出其余角度,可得出左式为:
在这里插入图片描述
由于右边式子过长,故不做展示。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
即所有求解结果如下:

在这里插入图片描述

2.5 绘制机器人工作空间

  使用MATLAB进行编程,参照D-H表计算旋转矩阵,利用三个for循环,可得仿真效果图为:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.6 路径仿真

 通过设置书本与AGV之间的位置,两点确定一条直线,求出该直线的点,让机器人沿着此路径进行移动,可实现路径仿真。
效果图如下:
在这里插入图片描述

三、代码展示

主函数

clear all

ToDeg = 180/pi;
ToRad = pi/180;

th1=0;th2=0;th3=0;th4=0;th5=0;th6=0;th7=0;

stp=30;
d3=200;
%% 关节移动
%%关节1移动
for i=90:stp:360  
     [Link]=DHfk3Dof_Lnya(th1+i,th2,th3,th4,th5,th6,d3,1)
end
%%关节2移动
for i=150:-stp:-90 
     [Link]=DHfk3Dof_Lnya(th1,th2+i,th3,th4,th5,th6,d3,1)
end
%%关节3伸缩移动
for i=0:stp+100:1800  
     [Link]=DHfk3Dof_Lnya(th1,th2,th3,th4,th5,th6,d3+i,1)
end
%%关节4移动
for i=180:-stp:0  
     [Link]=DHfk3Dof_Lnya(th1,th2,th3,th4+i,th5,th6,d3,0)
end
%%关节5移动
for i=180:-stp:0  
     [Link]=DHfk3Dof_Lnya(th1,th2,th3,th4,th5+i,th6,d3,1)
end
%%关节6移动
for i=180:-stp:0  
     [Link]=DHfk3Dof_Lnya(th1,th2,th3,th4,th5,th6+i,d3,1)
end
%%

%% 绘制工作空间
x=[];y=[];z=[];
for i=90:stp:360
   for j=150:-stp:-90
       for k=0:stp+100:1800
           [Link]=DHfk3Dof_Lnya(th1+i,th2+j,th3,th4,th5,th6,d3+k,1)
           x=[x Link(7).p(1,1)];
           y=[y Link(7).p(2,1)];
           z=[z Link(7).p(3,1)];
       end
   end
end
plot3(x,y,z,"o");
           

%% 逆解路径运动
num=1;
for i=1:20
    x(num)=600;
    y(num)=-500;
    z(num)=100*i;
    [th1,th2,th3,th4,th5,th6,d3]=IK_3DOF_Rob_Lnya(100,x(num),y(num),z(num));
    num=num+1;
    th1=th1*ToDeg;th2=th2*ToDeg;th3=th3*ToDeg;
    th4=th4*ToDeg;th5=th5*ToDeg;th6=th6*ToDeg;
    plot3(x,y,z,'o'); hold on;
    DHfk3Dof_Lnya(th1,th2,th3,th4,th5,th6,d3,0);
    th1=0;th2=0;th3=0;th4=0;th5=0;th6=0;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% 移动书本
num=1;
for t=1:-0.1:0  
    x=(750-155)*t+155;
    y=100*t-100;
    z=(1000-300)*t+250;
    [th1,th2,th3,th4,th5,th6,d3]=IK_3DOF_Rob_Lnya(100,x,y,z); 
    th1=th1*ToDeg;th2=th2*ToDeg;th3=th3*ToDeg;
    th4=th4*ToDeg;th5=th5*ToDeg;th6=th6*ToDeg;
    DrawBook(x,y,z+100);
    DHfk3Dof_Lnya(th1,th2,th3,th4,th5,th6,d3,1) 
    th1=0;th2=0;th3=0;th4=0;th5=0;th6=0;
end

正运动

function [Link]=DHfk3Dof_Lnya(th1,th2,th3,th4,th5,th6,d3,fcla)
%% 求正解,进行姿态的转换,画图,可修改参数为Matrix_DH_Ln(i);的i和转换for循环里的i
global Link
ToDeg = 180/pi;
ToRad = pi/180;
UX = [1 0 0]';
UY = [0 1 0]';
UZ = [0 0 1]';

Build_3DOFRobot_Lnya
radius    = 20;
len       = 80;
joint_col = 0;

 Link(2).th=th1*pi/180;
 Link(3).th=th2*pi/180;
 Link(4).th=th3*pi/180;
 Link(5).th=th4*pi/180;
 Link(6).th=th5*pi/180;
 Link(7).th=th6*pi/180;

 Link(4).dz=d3;


for i=1:7
    Matrix_DH_Ln(i);
end
for i=2:7
      Link(i).A=Link(i-1).A*Link(i).A;%右乘4*4变换位姿矩阵
      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;
view(134,12);
axis([-2000,2000,-2400,2400,-200,2200]);

%% 绘制书架、书和坐标轴
PlotCuboid([-100,-100,0],[200 200 10]);%% 绘制机器人底座
PlotCuboid([600,-500,0],[300 1000 2000/6]);
PlotCuboid([600,-500,2000*1/6],[300 1000 2000/6]);
PlotCuboid([600,-500,2000*2/6],[300 1000 2000/6]);
PlotCuboid([600,-500,2000*3/6],[300 1000 2000/6]);
PlotCuboid([600,-500,2000*4/6],[300 1000 2000/6]);
PlotCuboid([600,-500,2000*5/6],[300 1000 2000/6]);
PlotCuboid([10,-500,0],[300 300 300]);%% 绘制AGV

DrawFrame(Link(7).R, Link(7).p(1:3,1),0)
%%

xlabel('X');
ylabel('Y');
zlabel('Z');
drawnow;
pause(0.001);
% pic=getframe;
if(fcla)
    cla;
end
end

逆运动

function [th1,th2,th3,th4,th5,th6,d3]=IK_3DOF_Rob_Lnya(d2,px,py,pz)
%%作用:求逆解算出各个th
ToDeg = 180/pi;
ToRad = pi/180;

nx=1;ny=0;nz=0;
ox=0;oy=1;oz=0;
ax=0;ay=0;az=1;

r=sqrt((px)^2+(py)^2);
th1=atan2(py,px)-atan2(d2,sqrt(r^2-(d2)^2));   
C1=cos(th1);
S1=sin(th1);
th2=atan2(C1*px+S1*py,pz);
C2=cos(th2);
S2=sin(th2);
d3=S2*(C1*px+S1*py)+C2*pz;
th3=0;
th4=atan2(-S1*ax+C1*ay,C2*(C1*ax+S1*ay)-S2*az);
C4=cos(th4);
S4=sin(th4);
x5=C4*(C2*(C1*ax+S1*ay)-S2*az)+S4*(-S1*ax+C1*ay);
y5=S2*(C1*ax+S1*ay)+C2*az;
th5=atan2(x5,y5);
C5=cos(th5);
S5=sin(th5);
x6=C4*(C2*(C1*ox+S1*oy)-S2*oz)+S4*(-S1*ox+C1*oy);
y6=S2*(C1*ox+S1*oy)+C2*oz;
S6=-C5*x6+S5*y6;
C6=-S4*(C2*(C1*ox+S1*oy)-S2*oz)+C4*(-S1*ox+C1*oy);
th6=atan2(S6,C6);

end

建立DH表

%Build Robot by D_H methods
%%用DH表构建机器人模型,存到link结构体里面
% function aa=Build_3DOFRobot_Lnya(a)
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',0*ToRad,'az',UZ) ;    % az 
Link(1) = struct('name','base' , 'th',  0*ToRad, 'dz', 50, 'dx', 0, 'alf',0*ToRad,'az',UZ
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值