当前位置:   article > 正文

MATLAB机器人工具箱学习(一)

matlab机器人工具箱

一. 下载地址:

Robotics Toolbox - Peter Corke

在matlab中打开安装包:RTB.mltbx 将自动下载

注:最好下载R2021a或以上的最新版,R2016a示教会报错。

二. 基本命令和常用函数:

在命令行窗口输入rtbdemo 可打开自带的demo

>> rtbdemo

输入doc rotx,可查看旋转矩阵matrix函数的文档。旋转矩阵R=rotx(arg)中要填角度而不是弧度。

>> doc rotx

1.旋转——旋转矩阵 

 rotx(), roty(), rotz(),给定一个旋转角度就可得到一个旋转矩阵。

  1. r = rotx(90)
  2. %输出结果为
  3. r =
  4. 1 0 0
  5. 0 0 -1
  6. 0 1 0

 eul2r() 为由欧拉角得到一个旋转矩阵,tr2eul() 为由旋转矩阵得欧拉角

  1. r1 = eul2r(90,60,30) %分别对应于绕自身坐标系Z、Y、Z轴的旋转。
  2. 输出结果为
  3. r =
  4. -0.5000 -0.8660 0
  5. 0.4330 -0.2500 0.8660
  6. -0.7500 0.4330 0.5000
  7. %等价于r1 = rotz(90)*roty(60)*rotz(30),旋转矩阵的右乘

 rpy2r() 为由横滚-俯仰-偏航角得到旋转矩阵,tr2rpy() 为由旋转矩阵得到横滚-俯仰-偏航角

  1. r2 = rpy2r(90,60,30) %分别绕固定坐标系的XYZ旋转
  2. 输出结果为
  3. r2 =
  4. 0.4330 0.7500 0.5000
  5. 0.2500 0.4330 -0.8660
  6. -0.8660 0.5000 0
  7. %等价于 r2 = rotz(30)*roty(60)*rotx(90) 旋转矩阵的左乘

2.旋转——变换矩阵 

 trotx(), troty(), trotz(),给定一个旋转角度就可得到一个变换矩阵。

  1. t = trotx(90)
  2. %输出结果为
  3. t =
  4. 1 0 0 0
  5. 0 0 -1 0
  6. 0 1 0 0
  7. 0 0 0 1

eul2tr() ,tr2eul()      rpy2tr() ,tr2rpy() 与上相似

3.位移加旋转——变换矩阵,旋转矩阵——变换矩阵

  1. T = transl(1.510.5)*trotx(30)*trotz(60);
  2. P = transl(T);
  3. R = t2r(T);
  4. 输出结果为
  5. T =
  6. 0.5000 -0.8660 0 1.5000
  7. 0.7500 0.4330 -0.5000 1.0000
  8. 0.4330 0.2500 0.8660 0.5000
  9. 0 0 0 1.0000 %最右一列为为一体,左上角3×3为旋转矩阵
  10. P =
  11. 1.5000
  12. 1.0000
  13. 0.5000 %位移
  14. R =
  15. 0.5000 -0.8660 0
  16. 0.7500 0.4330 -0.5000
  17. 0.4330 0.2500 0.8660 %旋转矩阵

 三.Link类

类属性和类方法的详细介绍引用 http://t.csdn.cn/NP1N5

‘ revolute ‘为旋转关节,’d‘为连杆偏移量,’a'为连杆长度,‘alpha’为连杆扭角。

L = Link('revolute','d','0.216','a',0,'alpha',pi/2);

串联机械臂要用到SerialLink,SerialLink.teach为示教函数。

  1. bot = SerialLink(L, 'name', '5-dof') %将SerialLink赋值,定义给bot变量
  2. bot.teach %示教

 SerialLink.plot动画,可给定一个m*n的矩阵,n为机械臂所含关节个数

  1. q = [0 0 0 0 0]; 1*n
  2. bot.plot(q); 五个关节都是初始位置
  3. 若给定m*n矩阵,则运行结果为一个动画

 SerialLink.fkine正向运动学, 给一个关节变量,可以求出变换矩阵

  1. q0 = [pi/2 pi/2 0 0 0]; %5关节机器人的关节变量
  2. T = bot.fkine(q0);
  3. 输出结果为
  4. T =
  5. 0 1 0 0
  6. -1 0 0 -0.645
  7. 0 0 1 1.181
  8. 0 0 0 1

  SerialLink.ikine和SerialLink.ikunc逆向运动学,给变换矩阵,不考虑关节限制求关节变量

  1. q1 = bot.ikine(T,'mask',[1 1 1 1 1 0]); %当关节数量小于6时,要用mask向量
  2. q2 = bot.ikunc(T); %不需考虑
  3. 输出结果(1.5708为pi/2
  4. q1 =
  5. 1.5708 1.5708 -0.0000 0.0000 0
  6. q2 =
  7. 1.5708 1.5708 0.0000 0.0000 -0.0000

四.建立一个简单四关节机器人

建立一个只在xoz平面运动的四关节机器人。其中Link.qlim给关节增加限制,让第一关节锁死。

  1. clear;
  2. clc;
  3. L(1) = Link('standard','d', 100, 'a', 0, 'alpha', pi/2,'offset',0,'qlim',[0,0]/180*pi);
  4. L(2) = Link('revolute','d', 0, 'a', 420, 'alpha', 0,'offset',pi/2,'qlim',[-90,90]/180*pi);
  5. L(3) = Link('revolute','d', 0, 'a', 480, 'alpha', 0,'offset',-pi/2,'qlim',[-90,130]/180*pi);
  6. L(4) = Link('revolute','d', 0, 'a', 840, 'alpha', 0,'offset',pi/2,'qlim',[-120,90]/180*pi);
  7. bot = SerialLink(L, 'name', '4-dof'); %
  8. bot.base = transl(0,0,1); %世界坐标系定为(001
  9. bot.display(); %可查看D-H参数
  10. q = [0 0 0 0]; %初始关节角为0
  11. bot.plot(q); %SerialLink.plot动画,可给定一个m*n的矩阵,n为机械臂所含关节个数
  12. bot.teach %示教
  13. 输出结果为:
  14. bot =
  15. 4-dof:: 4 axis, RRRR, stdDH, slowRNE
  16. +---+-----------+-----------+-----------+-----------+-----------+
  17. | j | theta | d | a | alpha | offset |
  18. +---+-----------+-----------+-----------+-----------+-----------+
  19. | 1| q1| 100| 0| 1.5708| 0|
  20. | 2| q2| 0| 420| 0| 1.5708|
  21. | 3| q3| 0| 480| 0| -1.5708|
  22. | 4| q4| 0| 840| 0| 1.5708|
  23. +---+-----------+-----------+-----------+-----------+-----------+
  24. base: t = (0, 0, 1), RPY/xyz = (0, 0, 0) deg

运行结果如图 

 

 接下来我们让它动个位置。

  1. T1 = bot.fkine(q); %初始位置
  2. T2 = transl(0,0,1840); %变换位置
  3. q1 = bot.ikunc(T1);
  4. q2 = bot.ikunc(T2);
  5. pause %按下空格后继续运行
  6. bot.plot(q1);
  7. pause
  8. bot.plot(q2);

五.工作空间可视化

 在之前的代码中添加以下代码,利用rand随机绘制30000个点。

  1. num = 30000;
  2. p = zeros(num,3);%先声明0矩阵可加快运行速度
  3. for i=1:num
  4. q1 = L(1).qlim(1) + rand * (L(1).qlim(2) - L(1).qlim(1));
  5. q2 = L(2).qlim(1) + rand * (L(2).qlim(2) - L(2).qlim(1));
  6. q3 = L(3).qlim(1) + rand * (L(3).qlim(2) - L(3).qlim(1));
  7. q4 = L(4).qlim(1) + rand * (L(4).qlim(2) - L(4).qlim(1));
  8. q = [q1 q2 q3 q4];
  9. T = bot.fkine(q); % SerialLink.fkine正向运动学, 给一个关节变量,可以求出变换矩阵
  10. P(i,:) = transl(T);
  11. end
  12. plot3( P(:,1), P(:,2), P(:,3),'b.','markersize',1); %在三维空间内绘制30000个点
  13. hold on; %添加新绘图的时候保留当前绘图
  14. grid on; %在画图的时候添加网格线
  15. view([45 45]);
  16. bot.plot([0 0 0 0]);

运行结果如图:

 六.轨迹规划

从当前位置移动到(0,0,1841),用末端执行器位置来规划会出现一些bug,采用关节角较为简单,关节角为[0,0,pi/2,-pi/2]。

  1. T1 = [0,0,0,0];
  2. T2 = [0,0,pi/2,-pi/2];
  3. step = 50; %插入50个值
  4. [q,qd,qdd] = jtraj(T1,T2,step); %五次多多项式关节空间轨迹规划
  5. bot.plot(q,'trail','b'); %运行后在命令行窗口再复制运行一次,trail轨迹,b蓝色

 轨迹运行结果如图。引用链接http://t.csdn.cn/Wi0ce

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号