设计要求:
1.建立一个三自由度的机器人
2.建立坐标系,给出 D-H 参数表;
3.推导正运动学,并写出机器人的齐次变换矩阵;
4.推导逆运动学,并让机器人完成按要求绘制给定图形。
5.MATLAB 程序源代码;

一、 设计三轴机器人

设计出如上图的三轴机器人,第一个和第三个轴是旋转的,第二个是伸长的。第一个轴到第二个轴的距离是100cm,第二个轴的伸长量是0~100cm,第三个轴到手持器的距离是100cm。因此可以得出D-H参数表。

二、 建立坐标系,给出 D-H 参数表
建立坐标系如下所示,由下图得出下面的D-H参数表


三、 推导正运动学,并写出三个齐次变换矩阵
假设现在位于本地参考坐标系xn-zn,那么通过以下4步标准运动即可到达下一个本地参考坐标系xn+1-zn+1。

  1. 绕z_n轴旋转θ_(n+1),使得x_n 和x_(n+1)互相平行;
  2. 沿z_n 轴平移d_(n+1) 距离,使得x_n 和x_(n+1) 共线;
  3. 沿已经旋转过的x_n轴平移a_(n+1)的距离,使得x_n 和x_(n+1)的原点重合;
  4. 将z_n轴绕x_(n+1)轴旋转α_(n+1),使得z_n轴与z_(n+1)轴对准;
    根据矩阵右乘可得到以下结果

    根据3dof_robot D-H表表以及上面公式,可得机器人的正运动学方程如下


    四、 推导逆运动学,并让机器人完成按要求绘制给定图形


    U1与A3对应颜色相比较得如下三个式子:
    100 – pz=100cos(zeta3)
    py
    cos(zeta1) - d2 - pxsin(zeta1)= 100sin(zeta3)
    pxcos(zeta1) + pysin(zeta1)=0

三式联合求解得出
zeta1=-arctan(px/py)
zata3=arccos((100-pz)/100)
D2=pycos(zeta1)-pxsin(zeta1)-100*sin(zata3)




主要matlab代码
1.建机器人
zq_3dof_robot.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,  'dy', 0, 'dx', 0, 'alf',90*ToRad,'az',UZ);     % az
Link(1)= struct('name','Base' , 'th',  0*ToRad, 'dz', 0, 'dy', 0,'dx', 0, 'alf',0*ToRad,'az',UZ);        %Base To 1
Link(2) = struct('name','J1' , 'th',   0*ToRad, 'dz', 100, 'dy', 0, 'dx', 0, 'alf',-90*ToRad,'az',UZ);       %1 TO 2
Link(3) = struct('name','J2' , 'th',  90*ToRad, 'dz', 200, 'dy', 0,  'dx', 0, 'alf',90*ToRad,'az',UZ);    %2 TO 3
Link(4) = struct('name','J3' , 'th',  0*ToRad, 'dz', 0, 'dy', 0, 'dx', 100, 'alf',0*ToRad,'az',UZ);          %3 TO E

2.画工作空间
draw_6DOF_Workplace.m

close all;    %删除其句柄未隐藏的所有图窗。
clear;        %清除工作空间ToDeg = 180/pi;   %转化为度数
ToRad = pi/180;   %转化为弧度point1=[];    %设为矩阵
point2=[];
point3=[];
th_interval = 40;    %弧间隔
z_interval = 4;      %线间隔th1=0;   %为th1至th6设定初始值
th2=0;
th3=0;global Linknum = 1;for theta1=-180:th_interval:180   %循环画工作空间for dt2=00:z_interval:100for theta3=-180:th_interval:180zq_robot_dh(th1+theta1,th2+dt2,th3+theta3,1);  %,d4+dz4,th5+theta5,th6+theta6point1(num) = Link(4).p(1);    %用这个矩阵来存数据,这里共存三行数据point2(num) = Link(4).p(2);point3(num) = Link(4).p(3);num = num + 1;plot3(point1,point2,point3,'r*');hold on;   %这里用了point1,point2,point3,而不用 point1(num),point2(num), point3(num)?  endend
endcla;       %cla 从当前坐标区删除包含可见句柄的所有图形对象,把上面的图形清除。
plot3(point1,point2,point3,'r*');      %这里再画一个图形
axis([-400,400,-400,400,-400,400]);    %设置轴范围和纵横比
grid on;                %显示 gca 命令返回的当前坐标区或图的主网格线。主网格线从每个刻度线延伸。grid off 删除当前坐标区或图上的所有网格线。

3.根据逆运动学方程求关节角度
zq_robot_qiunijie.m

function [ th1,d2,th3] = zq_robot_qiunijie( px,py,pz )
ToDeg = 180/pi;
ToRad = pi/180;th1=-atan2(px,py);        %逆运动学方程
th3=acos((100-pz)/100);
d2=py*cos(th1)-px*sin(th1)-100*sin(th3);fprintf('th1=%4.2f \n',th1*ToDeg);   %观察输出结果
fprintf('d2=%4.2f \n',d2);
fprintf('th3=%4.2f \n',th3*ToDeg);end

4.画正方体(此处用到正、逆运动学)
draw_cube.m

close all;
clear;ToDeg = 180/pi;
ToRad = pi/180;
point1=[];    %设为矩阵
point2=[];
point3=[];num=1;
global Linkfor z=0:5:50for y=-25:5:25for x=50:5:100[th1,d2,th3]= zq_robot_qiunijie(x,y,z); %逆运动学th1=th1*ToDeg;th3=th3*ToDeg;move=zq_robot_dh(th1,d2,th3,1);  %正运动学point1(num) = Link(4).p(1);    %用这个矩阵来存数据,这里共存三行数据point2(num) = Link(4).p(2);point3(num) = Link(4).p(3);plot3(point1,point2,point3,'r.');hold on;   %这里用了point1,point2,point3,而不用 point1(num),point2(num), point3(num)?  fprintf('point1=%4.2f \n',point1(num));     %观察输出点的情况fprintf('point2=%4.2f \n',point2(num));fprintf('point3=%4.2f \n',point3(num));num = num + 1;endend
end
grid on;   

5.写“志”字(此处用到正、逆运动学)
draw_writing.m

close all;
clear;ToDeg = 180/pi;
ToRad = pi/180;
point1=zeros(100,1);    %设为矩阵
point2=zeros(100,1);
point3=zeros(100,1);  num=1;
global Linkxx=50;
yy=[20;20;12;14;16;18;20;22;24;26;28;20;18;20;22;14;12;16;18;20;22;24;26;26;18;20;22];
zz=[50;48;46;46;46;46;46;46;46;46;46;44;42;42;42;38;36;36;34;34;34;34;35;34;38;37;38];for i=1:1:27[th1,d2,th3]= zq_robot_qiunijie(xx,yy(i),zz(i));    %求逆解th1=th1*ToDeg;th3=th3*ToDeg;move=zq_robot_dh(th1,d2,th3,1);point1(num) = Link(4).p(1);    %用这个矩阵来存数据,这里共存三行数据point2(num) = Link(4).p(2);point3(num) = Link(4).p(3);plot3(point1,point2,point3,'r*');hold on;   %这里用了point1,point2,point3,而不用 point1(num),point2(num), point3(num)?  fprintf('point1=%4.2f \n',point1(num));     %观察输出点的情况fprintf('point2=%4.2f \n',point2(num));fprintf('point3=%4.2f \n',point3(num));num = num + 1;end
grid on;   

6.连杆
Connect3D.m

function Connect3D(p1,p2,option,pt)        %这是连接两个关节成一条杆的函数,Link(i).p表示第i个关节的空间位置。h = plot3([p1(1) p2(1)],[p1(2) p2(2)],[p1(3) p2(3)],option);    %画p1点到p2点的直线,p1,p2两点都是四行一列的矩阵,不过这里取前三行的值。option是线条颜色值。
set(h,'LineWidth',pt)    %这里pt为线宽,即机器人杆的宽度。

7.画工作空间(封装成函数而已,无他)
DHfk6Dof_Workplace.m

function pic=DHfk6Dof_Workplace(th1,th2,th3,fcla,fplot)
%这是用来画工作空间的函数内核  d4,th5,th6,
% close all
global Link% zq_3dof_robot;
%Build_3DOFRobot_Lnya;
radius    = 10;
len       =   20;
joint_col = 0;plot3(0,0,0,'ro'); Link(2).th=th1*pi/180;           %变成弧度,th1取至draw_6DOF_Workplace。
Link(3).th=th2*pi/180;
Link(4).th=th3*pi/180;% p0=[0,0,0]';for i=1:4
Matrix_DH_Ln(i);  %生成关节链接的D-H矩阵。
endfor i=2:4Link(i).A=Link(i-1).A*Link(i).A;     %第i+1个矩阵乘第i个矩阵,矩阵右乘,把所有矩阵相乘。 Link(i)函数取至Matrix_DH_Ln(i)。Link(i).p= Link(i).A(:,4);     %取Link(i).A中所有行的第4列放到Link(i).p,把第i个关节的位置存在Link(i).p中。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)];  %把第i个关节的姿态存在 Link(i).R中if fplot   %当fplot为1时执行下面两个函数Connect3D(Link(i-1).p,Link(i).p,'b',2); hold on;             %'b',是指线条为蓝色,Link(i)函数取至Matrix_DH_Ln(i)。画杆  ,hold on 保留当前坐标区中的绘图,从而使新添加到坐标区中的绘图不会删除现有绘图。DrawCylinder(Link(i-1).p, Link(i-1).R * Link(i).az, radius,len, joint_col); hold on;   %画圆筒end
endgrid on;
% view(134,12);
axis([-500,500,-500,500,-500,500]);    %指定范围
xlabel('x');
ylabel('y');
zlabel('z');
drawnow;
pic=getframe;if(fcla)cla;
end

8.D-H矩阵的算法函数
Matrix_DH_Ln.m

function Matrix_DH_Ln(i)
%这个是D-H矩阵的算法函数
% Caculate the D-H Matrix
global LinkToDeg = 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
y=Link(i).dy;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-y*S,a*S+y*C,d,1]';    %书本第57页的D-H矩阵Link(i).R=[Link(i).n(1:3),Link(i).o(1:3),Link(i).a(1:3)];%把上面D-H矩阵前面的3*3矩阵存起来
Link(i).A=[Link(i).n,Link(i).o,Link(i).a,Link(i).p];%把第i到i+1的D-H矩阵存进Link(i).A

9.画关节
DrawCylinder.m

function h = DrawCylinder(pos, az, radius,len, col)        %这是个画圆筒(关节)的函数
% draw closed cylinder
%
%******** rotation matrix
az0 = [0;0;1];
ax  = cross(az0,az);
ax_n = norm(ax);
if ax_n < eps rot = eye(3);
elseax = ax/ax_n;ay = cross(az,ax);ay = ay/norm(ay);rot = [ax ay az];
end%********** make cylinder
% col = [0 0.5 0];  % cylinder colora = 20;    % number of side faces
theta = (0:a)/a * 2*pi;x = [radius; radius]* cos(theta);
y = [radius; radius] * sin(theta);
z = [len/2; -len/2] * ones(1,a+1);
cc = col*ones(size(x));for n=1:size(x,1)xyz = [x(n,:);y(n,:);z(n,:)];xyz2 = rot * xyz;x2(n,:) = xyz2(1,:);y2(n,:) = xyz2(2,:);z2(n,:) = xyz2(3,:);
end%************* draw
% side faces
h = surf(x2+pos(1),y2+pos(2),z2+pos(3),cc);for n=1:2patch(x2(n,:)+pos(1),y2(n,:)+pos(2),z2(n,:)+pos(3),cc(n,:));
end

10.用于显示的
zq_robot_dh.m

function pic = zq_robot_dh( th1,distance,th3,fcla )
%UNTITLED4 此处显示有关此函数的摘要
%   此处显示详细说明global Linkzq_3dof_robot;
radius = 10;
len = 30;
joint_col = 0;plot3(0,0,0,'ro');Link(2).th=th1*pi/180;
Link(3).dz=distance;
Link(4).th=th3*pi/180;p0=[0,0,0]';for i=1:4
Matrix_DH_Ln(i);
endfor i=2:4
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;
endgrid on;
% view(134,12);
axis([-200,200,-200,200,-100,200]);
xlabel('x');
ylabel('y');
zlabel('z');
drawnow;
pic=getframe;
if(fcla)
cla;
endend

11.正运动学(内核函数)
zhengyundongxue.m

function [ result ] = zhengyundongxue( A )
%dh矩阵函数
zeta=A(1);
d=A(2);
a=A(3);
alf=A(4);result=[cos(zeta)  -sin(zeta)*cos(alf)  sin(zeta)*sin(alf)  a*cos(zeta);sin(zeta)   cos(zeta)*cos(alf)    -cos(zeta)*sin(alf)  a*sin(zeta);0          sin(alf)             cos(alf)             d;0           0                    0                  1];end

12.解算正运动学
jisuanzhengyundong.m

syms pi d2 zeta1 zeta2 zeta3 A4  a1 a2 a3   nx ny nz ox oy oz ax ay az px py pz  U1;
%这是用来求正运动学中各个dh矩阵的
%p1=[0 d2 0 0];
p1=[zeta1 100 0 -pi/2];
A1=zhengyundongxue(p1);
A1=simplify(A1)%p2=[zeta2 0 100 pi/2];
p2=[pi/2 d2 0 pi/2];
A2=zhengyundongxue(p2);
A2=simplify(A2)%p3=[zeta3 0 100 0];
p3=[zeta3 0 100 0];
A3=zhengyundongxue(p3);
A3=simplify(A3)A4=A1*A2*A3;
A4=simplify(A4)a1=inv(A1);     %求逆
a2=inv(A2);
a3=inv(A3);
a1=simplify(a1)
a2=simplify(a2)
a3=simplify(a3)U=[nx ox ax px;ny oy ay py;nz oz az pz;0 0 0 1];%设出要求的矩阵UU1=a2*a1*U;
U1=simplify(U1)

13.坐标变换,测试用的
Computer_T.m

close all;
clear;ToDeg = 180/pi;
ToRad = pi/180;syms theta d a alpha y;
T1 = [cos(theta) -sin(theta) 0 0; sin(theta) cos(theta) 0 0; 0 0 1 0; 0 0 0 1];
T2 = [1 0 0 0; 0 1 0 0; 0 0 1 d; 0 0 0 1];
T3 = [1 0 0 a; 0 1 0 0; 0 0 1 0; 0 0 0 1];
T4 = [1 0 0 0; 0 cos(alpha) -sin(alpha) 0; 0 sin(alpha) cos(alpha) 0; 0 0 0 1];
Ty = [1 0 0 0; 0 1 0 y; 0 0 1 0; 0 0 0 1];
T = T1 * T2 * Ty * T3 * T4syms theta1 theta2 theta3 d4 theta5 theta6
theta=theta1;d=100;y=0;a=0;alpha = -90*ToRad;
A1 = subs(T)
theta=-90*ToRad+theta2;d=0;y=0;a=100;alpha = 0;
A2 = subs(T)
theta=theta3;d=0;y=50;a=0;alpha = -90*ToRad;
A3 = subs(T)
% theta=0;d=50+d4;y=0;a=0;alpha = 0;
% A4 = subs(T)
% theta=theta5;d=50;y=0;a=0;alpha = 90*ToRad;
% A5 = subs(T)
% theta=90*ToRad+theta6;d=0;y=0;a=50;alpha = 0;
% A6 = subs(T)
A = A1 * A2 * A3   %* A4 * A5 * A6

上面代码比较多,逐一放到matlab中运行一下,看看各个代码的效果如何。

2022-4-27:根据评论区的一些问题更新了一下,大家把最新代码文件(.m文件)拷贝到自己的工程目录下后,运行draw_cube.mdraw_writing.m即可看到运动效果,也可以运行draw_6DOF_Workplace.m来查看工作空间绘制情况。回头看自己四年前的代码,写得有点粗糙,不想大改了,大家谅解一下,哈哈。

用matlab实现机械臂正逆运动学控制相关推荐

  1. 修正逆解文章——六轴UR机械臂正逆运动学求解_MATLAB代码(标准DH参数表)

    如下参考链接1的作者大大实现了UR5机械臂的正运动学和逆运动学的Matlab代码.但逆解部分在不同版本的Matlab中运行有错误. 本篇文章是MatlabR2016a下完成的,并说明一下原代码错误的原 ...

  2. UR5构型机械臂正逆运动学

    前言 整理之前的一个项目,当时看着一个博客硬生生计算了差不多一个星期.尝试用MatLab符号推导工具箱化简一部分工作.我使用的大象机器人一款开源入门级协作机器人产品myCobot,开发文档十分完善,但 ...

  3. UR机械臂正逆运动学求解

    最近有个任务:求解UR机械臂正逆运动学,在网上参考了一下大家的求解办法,众说纷纭,其中有些朋友求解过程非常常规,但是最后求解的8组解,只有4组可用.在这里我介绍一个可以求解8组解析解的方法,供大家参考 ...

  4. 实验一 机械臂正逆运动学

    实验一 机械臂正逆运动学 一.实验目的 1.巩固正逆运动学基础概念. 2.了解正逆运动学在机械臂控制中的实际用途. 二.实验内容 1.机械臂模型DH参数的计算. 2.机械臂正运动学的计算. 3.机械臂 ...

  5. 机械臂正逆运动学-----数值解

    机械臂正逆运动学-----数值解 建立DH坐标系 求正运动学 单关节齐次传递矩阵 正运动学:返回齐次矩阵 正运动学:返回欧拉角向量 求雅可比矩阵 求机械臂逆运动学 合成通用运动学类 机械臂的运动学包括 ...

  6. 五自由度机械臂正逆运动学算法(C语言+Matlab)

    五自由度机械臂建模 学习代码都记录在个人github上,欢迎关注~ Matlab机器人工具箱版本9.10 机械臂还是原来的机械臂,之前用ROS做底层驱动,不需要写正逆运动学和相关算法就能得到一些简单的 ...

  7. ROS机械臂正逆运动学

    这里做一个六轴机械臂用于正逆运动学实验. 这里其实一共只有3轴,只有3轴位置没有姿态.所以urdf文件里我在末端做了3个虚拟关节,以便将kdl的frame能够填满,使得齐次坐标变换是规则的. 1.ur ...

  8. 【机器人原理与实践(三)】六轴机械臂正逆解控制

    文章目录 3.1 空间转换矩阵的理解 3.1.1平移变换 3.1.2旋转变换 3.2 D-H参数法 3.3 建立机械臂模型 3.3.1 机械臂模型介绍 3.3.2 使用Matlab进行示教仿真 3.4 ...

  9. matlab欧拉迭代,matlab机械臂正逆运动学求解问题,使用牛顿-欧拉迭代算法

    代码复制的有问题,详细见本楼,谢谢. clc;clear; DR=pi/180; %time j = 1; for i = 0 : 0.1 : 2 %input theta= 45 * DR *(1+ ...

最新文章

  1. 将表中的数据自动生成INSERT、UPDATE语句
  2. Android WebView Long Press长按保存图片到手机
  3. 图片服务 - thumbor过滤器
  4. 安卓学习笔记24:常用控件 - 循环器视图
  5. MVP登录和注册页面Activity类 生成二维码 异常捕获类
  6. 06-10 Jenkins 配置 allure 报告
  7. reactnative资源
  8. stm32F4方向+脉冲发生器
  9. echolife hg8245说明书_华为光猫HG8245设置说明书
  10. 机房管理制度(试行)
  11. python OpenCV给视频去除水印
  12. Arduino DHT11温湿度传感器数据示例
  13. Python 实现数据分析中的 帕累托、漏斗、RFM、雷达图
  14. android模拟器 opengl,在Android模拟器上缺少OpenGL驱动程序
  15. python 去除水印_cv2 去除图片水印
  16. 百度女程序员半夜打车被司机嘲讽:加班到一点,收入不如我,图啥
  17. iPS细胞的最新应用
  18. 2020京东校园招聘笔试编码题小分享--大小写切换
  19. 小脚本之windows批量修改文件后缀名
  20. 1.微信好友定时发送信息

热门文章

  1. deepin开启远程桌面后鼠标右键不能复制
  2. 【JavaScript】悬浮窗口
  3. 计算机组成的相关资料,计算机组成原理资料
  4. Altium Designer生成钢网文件
  5. 【BZOJ 2716】天使玩偶
  6. 基于MFC平台的对话框软件模型
  7. C#中的异常处理try catch finally
  8. 4、easy_rsa(2)rsa.py
  9. PAT文件的输入输出
  10. matlab中syms怎么替代,科学网—Matlab中的syms与conj - 孔令才的博文