草庐IT

MATLAB机器人工具箱 机械臂仿真

随机惯性粒子群 2023-10-12 原文

MATLAB机器人工具箱 机械臂仿真

  • 学习自B站:Nino_FM

  • 采用 Standard DH 建模法


旋转算子

R = rotx(pi/2)

R =

 1.0000         0         0
      0    0.9996   -0.0274
      0    0.0274    0.9996    % 显然结果有问题

rotx(pi/2/pi*180)

ans =

  1     0     0
  0     0    -1
  0     1     0

rotx(90)

ans =

  1     0     0
  0     0    -1
  0     1     0

机械臂建模

Standard DH

 clc;clear
 % Standard DH
 L(1) = Link('revolute','d',0.216,'a',0,'alpha',pi/2);
 L(2) = Link('revolute','d',0,'a',0.5,'alpha',0,'offset',pi/2);
 L(3) = Link('revolute','d',0,'a',sqrt(0.145^2+0.42746^2),'alpha',0,'offset',-atan(427.46/145));
 L(4) = Link('revolute','d',0,'a',0,'alpha',pi/2,'offset',atan(427.46/145));
 L(5) = Link('revolute','d',0.258,'a',0,'alpha',0);
 Five_dof = SerialLink(L,'name','5-dof');
 Five_dof.base = transl(0,0,0.28);
 Five_dof.teach

代码显示

机器人工具箱 常用函数

rotx() roty() rotz() eul2r() tr2eul() rpy2r() tr2rpy()

欧拉角

例子: r1 = eul2r(90,60,30) 与 r2 = rotz(90) * roty(60) * rotz(30) 等价

r1 =

    -0.5000   -0.8660         0
     0.4330   -0.2500    0.8660
    -0.7500    0.4330    0.5000

r2 =

    -0.5000   -0.8660         0
     0.4330   -0.2500    0.8660
    -0.7500    0.4330    0.5000

例子: r3 = rpy2r(90,60,30) 与 r4 = rotz(30)roty(60)rotx(90) 等价

r3 =

 0.4330    0.7500    0.5000
 0.2500    0.4330   -0.8660
 -0.8660   0.5000         0

r4 =

 0.4330    0.7500    0.5000
 0.2500    0.4330   -0.8660
 -0.8660   0.5000         0

旋转<------------------>变换矩阵

trotx() troty() trotz() eul2tr() tr2eul() rpy2tr() tr2rpy()

例子: T1 = eul2tr(90,60,30) 与 T2 = trotz(90) * troty(60) * trotz(30) 等价

T1 =

    -0.5000   -0.8660         0         0
     0.4330   -0.2500    0.8660         0
    -0.7500    0.4330    0.5000         0
          0         0         0    1.0000

T2 =

    -0.5000   -0.8660         0         0
     0.4330   -0.2500    0.8660         0
    -0.7500    0.4330    0.5000         0
          0         0         0    1.0000

例子: T3 = rpy2tr(90,60,30) 与 T4 = trotz(30) * troty(60) * trotx(90) 等价

T3 =

  0.4330    0.7500    0.5000         0
  0.2500    0.4330   -0.8660         0
 -0.8660    0.5000         0         0
       0         0         0    1.0000

T4 =

  0.4330    0.7500    0.5000         0
  0.2500    0.4330   -0.8660         0
 -0.8660    0.5000         0         0
       0         0         0    1.0000

位移、旋转矩阵<------------------>变换矩阵

transl() t2r() r2t()

例子: T = transl(1.5,1,0.5) * trotx(30) * trotz(60)

P = transl(T)

R = t2r(T)

T =

 0.5000   -0.8660         0    1.5000
 0.7500    0.4330   -0.5000    1.0000
 0.4330    0.2500    0.8660    0.5000
      0         0         0    1.0000

P =

 1.5000
 1.0000
 0.5000

R =

 0.5000   -0.8660         0
 0.7500    0.4330   -0.5000
 0.4330    0.2500    0.8660

帮助文档

doc SerialLink

  • 创建一个SerialLink机器人对象

 SerialLink.teach
  • 模型展示(SerialLink.plot)

 q = [0 0 0 0 0]; % 初始位姿
 Five_dof = SerialLink(L,'name','5-dof');
 Five_dof.plot(q)
  • 三维模型展示(plot3d)

 mdl_puma560;
 p560.plot3d(qz,'view',[0 0]);
  • 正向运动学(fkine)

 q0 = [pi/2 pi/2 0 0 0];
 T = Five_dof.fkine(q0)

T =

       0         1         0         0
      -1         0         0    -0.645
       0         0         1    0.9015
       0         0         0         1

  • 逆向运动学(ikine、ikunc......)

 q1 = Five_dof.ikine(T,'mask',[1 1 1 1 1 0])
 q2 = Five_dof.ikunc(T)

q1 =

 1.5708    1.5708   -0.0000    0.0000         0

q2 =

 1.5708    1.5708    0.0000    0.0000   -0.0000

工作空间可视化

关节空间随机生成变量------(fkine)------>变换矩阵------(transl)------>三维坐标

  • rand函数

在[m,n]内随机生成一个数字:m + rand * (m-n)

  • 随机关节空间变量:q= q_min + rand * (q_max - q_min)

 L(1).qlim = [-150,150]/180*pi;
 L(2).qlim = [-100,90]/180*pi;
 L(3).qlim = [-90,90]/180*pi;
 L(4).qlim = [-100,100]/180*pi;
 L(5).qlim = [-180,180]/180*pi;
 ​
 num = 30000; % 迭代次数
 P = zeros(num, 3); % 初始化P
 for i =1:num
     
     q1 =L(1) .qlim(1) + rand * (L(1).qlim(2) - L(1).qlim(1));
     q2 =L(2) .qlim(1) + rand * (L(2).qlim(2) - L(2).qlim(1));
     q3 =L(3) .qlim(1) + rand * (L(3).qlim(2) - L(3).qlim(1));
     q4 =L(4) .qlim(1) + rand * (L(4).qlim(2) - L(4).qlim(1));
     q5 =L(5) .qlim(1) + rand * (L(5).qlim(2) - L(5).qlim(1));
     
     q = [q1 q2 q3 q4 q5];
     
     T = Five_dof.fkine(q);
     P(i, :) = transl(T);
     
 end
 ​
 plot3(P(:,1),P(:,2),P(:,3),'b.','markersize',1);
 ​
 hold on
 grid on
 daspect([1 1 1]);
 view([45 45]);
 Five_dof.plot([0 0 0 0 0]);

可视化显示

轨迹规划

  • 五次多项式轨迹(tpoly)

 t = linspace(0,2,51);
 [P,dP,ddP] = tpoly(0,3,t);
 % 指定初末速度
 %[P,dP,ddP] = tpoly(0,3,51,0.02,0.01);
  • 混合曲线轨迹(lspb)

 t = linspace(0,2,51);
 [P,dP,ddP] = lspb(0,3,t);
 % 指定最大速度
 %[P,dP,ddP] = tpoly(0,3,51,0.1);
  • 多维轨迹(mtraj)

 % 例子: (0,0)--------->(3,4)
 t = linspace(0,2,51);
 [P,dP,ddP] = mtraj(@tpoly,[0 0],[3 4],t);
  • 多维多段轨迹(mstraj)

 % 例子: (0,0)----(2s)---->(3,4)----(1s)---->(1,2)
 % TRAJ = mstraj(WP,QDMAX,TSEG,Q0,DT,TACC,OPTIONS)
 WP = [0,0;3,4;1,2];
 P1 = mstraj(wp,[],[2,1],[],0.04,0);
 P2 = mstraj(wp,[],[2,1],[],0.04,0.5);

  • 实例演示

给定位置(0.7,-0.5,0)--------------------->(0.7,0.5,0.5)

 T1 = transl(0.7,-0.5,0)*trotx(180);
 T2 = transl(0.7,0.5,0)*trotx(180);
 ​
 q1 = Five_dof.ikunc(T1);
 q2 = Five_dof.ikunc(T2);
 ​
 Five_dof.plot(q1);
 pause;
 Five_dof.plot(q2);

P1/P2 -----------(mtraj)----------->Traj-----------(transl)----------->T-----------(ikunc)----------->Qtraj

轨迹:'trail' , 'b'

保存动画:'movie' , 'trail.gif'

 P1 = [0.7,-0.5,0];
 P2 = [0.7,0.5,0.5];
 ​
 t = linspace(0,2,51);
 Traj = mtraj(@tpoly,P1,P2,t);
 ​
 n = size(Traj,1);
 T = zeros(4,4,n);
 ​
 for i = 1:n
     T(:, :, i) = transl(Traj(i,:))*trotx(180);
 end
 ​
 Qtraj = Five_dof.ikunc(T);
 ​
 Five_dof.plot(Qtraj);
 % 绘制末端轨迹
 %Five_dof.plot(Qtraj,'trail','b')
 % 自动保存动画
 %Five_dof.plot(Qtraj,'movie','trail.gif');

绘制图像

 hold on
 plot(t,Traj(:,1),'.-','linewidth',1);
 plot(t,Traj(:,2),'.-','linewidth',1);
 plot(t,Traj(:,3),'.-','linewidth',1);
 ​
 grid on
 legend('x','y','z');
 xlabel('time');
 ylabel('position');

 % 线性插值
 T_liner = trinterp(T1,T2,51);
 P_liner = transl(T_liner);
 t1 = linspace(0,2,51);
 ​
 subplot(1,2,1);
 hold on 
 plot(t1,P_liner(:,1),'.-','linewidth',1);
 plot(t1,P_liner(:,2),'.-','linewidth',1);
 plot(t1,P_liner(:,3),'.-','linewidth',1);
 ​
 grid on 
 legend('x','y','z');
 xlabel('time');
 ylabel('position');
 % 五次多项式插值
 T_tpoly = trinterp(T1,T2,tpoly(0,2,50)/2);
 P_tpoly = transl(T_tpoly);
 t2 = linspace(0,2,50);
 ​
 subplot(1,2,2);
 hold on
 plot(t2,P_tpoly(:,1),'.-','linewidth',1);
 plot(t2,P_tpoly(:,2),'.-','linewidth',1);
 plot(t2,P_tpoly(:,3),'.-','linewidth',1);
 ​
 grid on 
 legend('x','y','z');
 xlabel('time');
 ylabel('position');

笛卡尔轨迹ctraj

 % 笛卡尔轨迹ctraj
 T = ctraj(T1,T2,51);
 t1 = linspace(0,2,51);
 P1 = transl(T);
 ​
 hold on 
 plot(t1,P1(:,1),'.-','linewidth',1);
 plot(t1,P1(:,2),'.-','linewidth',1);
 plot(t1,P1(:,3),'.-','linewidth',1);
 ​
 T = ctraj(T1,T2,tpoly(0,2,50)/2);
 t2 = linspace(0,2,50);
 P2 = transl(T);
 ​
 hold on 
 plot(t2,P2(:,1),'.-','linewidth',1);
 plot(t2,P2(:,2),'.-','linewidth',1);
 plot(t2,P2(:,3),'.-','linewidth',1);
 ​
 grid on 
 legend('x1','y1','z1','x2','y2','z2');
 xlabel('time');
 ylabel('position');

给定位置和姿态

(0.7,-0.5,0)* troty(150)--------------->(0.7,0.5,0.5)* trotx(200)

 T1 = transl(0.7,-0.5,0)*troty(150);
 T2 = transl(0.7,0.5,0.5)*trotx(200);
 ​
 q1 = Five_dof.ikunc(T1);
 q2 = Five_dof.ikunc(T2);
 ​
 Five_dof.plot(q1);
 pause
 Five_dof.plot(q2);

T1、T2------(tr2rpy)----->rpy1、rpy2------(mtraj)----->rpy_traj------(tr2rpy)----->T_raj_rot

 rpy1 = [0,150,0]; %绕y轴转150度
 rpy2 = [200,0,0]; %绕x轴转200度
 ​
 t = linspace(0,2,51);
 rpy_traj = mtraj(@tpoly,rpy1,rpy2,t);
 T_traj_rot = rpy2tr(rpy_traj);
 ​
 P1 = transl(T1);
 P2 = transl(T2);
 P_traj = mtraj(@tpoly,P1',P2',t);
 T_traj_transl = transl(P_traj);
 ​
 n = length(t);
 T_traj = zeros(4,4,n);
 for i = 1:n
    T_traj(:,:,i) = T_traj_transl(:,:,i)*T_traj_rot(:,:,i);
 end
 ​
 q_traj = Five_dof.ikunc(T_traj);
 Five_dof.plot(q_traj,'trail','r')

上面的轨迹效果不太好,可用下面的代码替换

  • 线性插值

 % 线性插值
 t = linspace(0,2,51);
 T_traj = trinterp(T1,T2,t/2);
 q = Five_dof.ikunc(T_traj);
 Five_dof.plot(q,'trail','r')

  • 梯形速度图像插值

 % 梯形速度图像插值
 t = linspace(0,2,51);
 T_traj = ctraj(T1,T2,t/2);
 q = Five_dof.ikunc(T_traj);
 Five_dof.plot(q,'trail','r')

  • jtraj

 % jtraj
 t = linspace(0,2,51);
 [q,dq,ddq] = jtraj(q1,q2,t);
 Five_dof.plot(q,'trail','r')

关节变量、速度图像、加速度图像

 % 关节变量、速度图像、加速度图像
 subplot(1,3,1)
 plot(t,q)
 grid on 
 xlabel('time')
 ylabel('q')
 legend('joint1','joint2','joint3','joint4','joint5')
 ​
 subplot(1,3,2)
 plot(t,dq)
 grid on 
 xlabel('time')
 ylabel('dq')
 legend('joint1','joint2','joint3','joint4','joint5')
 ​
 subplot(1,3,3)
 plot(t,ddq)
 grid on 
 xlabel('time')
 ylabel('ddq')
 legend('joint1','joint2','joint3','joint4','joint5')

有关MATLAB机器人工具箱 机械臂仿真的更多相关文章

  1. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  2. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  3. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  4. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  5. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  6. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  7. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

  8. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  9. ruby - 使用 Ruby 开发工具包将文件上传到 Amazon S3 - 2

    我正在尝试上传文件。一个简单的hello.txt。我正在关注文档,但无法将其上传到我的存储桶。#STARTAWSCLIENTs3=Aws::S3::Resource.newbucket=s3.bucket(BUCKET_NAME)begins3.buckets[BUCKET_NAME].objects[KEY].write(:file=>FILE_NAME)puts"Uploadingfile#{FILE_NAME}tobucket#{BUCKET_NAME}."bucket.objects.eachdo|obj|puts"#{obj.key}=>#{obj.etag}"endresc

  10. ruby - 在 StockChart (highchart) 中以编程方式显示柱形图的工具提示 - 2

    我有一个Highstock图表(带有标记和阴影的线条),并且想以编程方式显示一个highstock工具提示,例如,当我选择某个表上的一行(包含图表数据)我想显示相应的highstock工具提示。这可能吗? 最佳答案 股票图表thissolution不起作用:在thisexample你必须更换这个:chart.tooltip.refresh(chart.series[0].data[i]);为此:chart.tooltip.refresh([chart.series[0].points[i]]);解决方案可用here.

随机推荐