热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Matlab机器人工具箱

因为需要用到和机器人相关的东西,就用到了这个工具箱,作者官网http:www.petercorke.comRobotics_Toolbox.html老爷子很厉害,那本《Robotics,V

因为需要用到和机器人相关的东西,就用到了这个工具箱,作者官网 http://www.petercorke.com/Robotics_Toolbox.html 

老爷子很厉害,那本《Robotics, Vision & Control》就是他本人写的,可以看做是工具箱的一个详细说明书。另外,在网站那里提到了rvctools/robot/robot.pdf这个pdf可以看做一个函数的使用说明文档,有不懂的函数可以在pdf中查查它的API。

关于安装方法可以参考http://blog.sina.com.cn/s/blog_a16714bf0101hygu.html

首先,输入rtbdemo可以看到一个列表,这个列表包含了常用的一些功能。我们也可以通过学习这个来快速上手这个工具箱。


  1. 旋转

%二维平面内的姿态(x, y, theta), Special Euclidean(2)
clear;
clc;
T1 = se2(1, 2, 30*pi/180)
trplot2(T1, 'frame', '1', 'color', 'b')
T2 = se2(2, 1, 0)
hold on
trplot2(T2, 'frame', '2', 'color', 'r');
T3 = T1*T2
trplot2(T3, 'frame', '3', 'color', 'g');
T4 = T2*T1
trplot2(T4, 'frame', '4', 'color', 'c');
P = [3 ; 2 ];
plot_point(P, '*');% 画出点的方位(world)
P1 = inv(T1) * [P; 1] % 点P在坐标系{1}中的方位,P齐次,原始式 h2e(inv(T1) * e2h(P))
axis([0 5 0 5]);

P2 = homtrans( inv(T2), P) % 点P在坐标系{2}中的方位

注意:点为列向量



>> R = rotx(pi/2) 

R =

 

    1.0000         0         0

         0   0.0000   -1.0000

         0   1.0000    0.0000

 >> tranimate(R) 动画显示

>> det(R) 行列式

>> R = rotx(30, 'deg') * roty(50, 'deg') * rotz(10, 'deg')

>> trplot(R)    最终形态

>> [theta,vec] = tr2angvec(R)   绕空间中的轴vec旋转theta角

>> eul = tr2eul(R)    转化为Eular角(Z,Y,Z)

>> rpy = tr2rpy(R)  转化为RPY(X,Y,Z),相对于上一个坐标系

>> q = Quaternion(R)

>> q.R

>>q1 = Quaternion( rotx(pi/2) )

>>q2 = Quaternion( roty(pi/2) )

>> q1 * q2


=======================三维坐标==============================

clc;
clear;
close all;


t1 = eye(4);
trplot(t1,'frame','R','arrow','width', '1', 'color', 'r', 'text_opts', {'FontSize', 10, 'FontWeight', 'light'},'view', [-0.3 0.5 0.6],'thick',0.9,'dispar',0.8 );
hold on;

robotHcam =[ -120.2117270943047, -700.033498810312, 759.864364912089, -3.137243821744305, -0.007451761425653, -0.207643158709979 ];
robotHcam(1,1) = robotHcam(1,1) /1000.0;
robotHcam(1,2) = robotHcam(1,2) /1000.0;
robotHcam(1,3) = robotHcam(1,3) /1000.0;
robotHcam1 = transl(robotHcam(1,1), robotHcam(1,2), robotHcam(1,3)) * trotx(robotHcam(1,4)) * troty(robotHcam(1,5))* trotz(robotHcam(1,6))
trplot(robotHcam1,'frame','C');

eef_real = [-0.0190283,-0.63227,-0.101349,-3.09773,-0.0104572,-0.33805];% -179.545 15.2654 -4.47882
robotHobj_real = transl(eef_real(1,1), eef_real(1,2), eef_real(1,3)) * trotx(eef_real(1,4)) * troty(eef_real(1,5))* trotz(eef_real(1,6))
trplot(robotHobj_real,'frame','E2', 'color', 'magenta')%cyan

camHobj = [ 0.082430 -0.075731 0.858318 -3.124834 -3.139422 3.051156];
camHobj1 = transl(camHobj(1,1), robotHcam(1,2), robotHcam(1,3)) * trotx(robotHcam(1,4)) * troty(robotHcam(1,5))* trotz(robotHcam(1,6));

robotHobj = robotHcam1 * camHobj1
trplot(robotHobj,'frame','O','arrow','width', '1', 'color', 'g');
trplot(robotBobj,'frame','O', 'color', 'g')


2. 平移

>> transl(0.5, 0.0, 0.0)

 

ans =

 

    1.0000         0         0   0.5000

         0   1.0000         0         0

         0         0   1.0000         0

         0         0         0   1.0000

>> troty(pi/2)   绕y轴旋转pi/2

 

ans =

 

    0.0000        0    1.0000         0

         0   1.0000         0         0

   -1.0000         0   0.0000         0

         0         0         0   1.0000

>> t = transl(0.5, 0.0, 0.0) * troty(pi/2) * trotz(-pi/2)


% If thistransformation represented the origin of a new coordinate frame with respect

% to the worldframe origin (0, 0, 0), that new origin would be given by

 >> t * [0 0 0 1]'

 

ans =

 

    0.5000

         0

         0

    1.0000

3. 轨迹

3.1 五次多项式轨迹规划

通常的轨迹规划限制条件:起始终止速度、加速度为0,设定起点和终点,一共6个条件,所以最容易想到的是5次多项式轨迹规划。

clear;
clc;
p0 = -1;% 定义初始点及终点位置
p1 = 2;
p = tpoly(p0, p1, 50);% 取步长为50
figure(1);

%%
plot(p);%绘图,可以看到在初始点及终点的一、二阶导均为零
[p,pd,pdd] = tpoly(p0, p1, 50);%得到位置、速度、加速度 tpoly为五阶多项式(这里的50步长并非限制条件)
figure(2);

subplot(3,1,1); plot(p); xlabel('Time'); ylabel('p');
title('初始和终止速度都为0');
grid on;
subplot(3,1,2); plot(pd); xlabel('Time'); ylabel('pd');
grid on;
subplot(3,1,3); plot(pdd); xlabel('Time'); ylabel('pdd');
grid on;

%%
[s,sd,sdd] = tpoly(0, 1, 50, 0.5, 0); % 初始速度0.5,终点速度0

figure(3);
subplot(3,1,1); plot(s); xlabel('Time'); ylabel('s');
title('初始和终止速度为0.5和0')
hold on;
n = find(s == max(s));
plot(n, s(n),'o');
cell_string{1} = ['smax = ' num2str(s(n))]; % 多行文本
cell_string{2} = ['time = ' num2str(n)];

text(n, s(n) -3, cell_string);
hold off;
grid on;
subplot(3,1,2); plot(sd); xlabel('Time'); ylabel('sd');
grid on;
subplot(3,1,3); plot(sdd); xlabel('Time'); ylabel('sdd');
grid on;
下图为路径曲线,速度曲线和加速度曲线。


可以从图中看出初始和终止速度都为0时(左图),平均速度只有52%达到了峰值,也就是说机器人运行效率不高。而当初始和终止速度分别为0.5和0时(右图),除了平均速度的问题外,它的轨迹漂移比较大,从位置0到1的运动,最大达到了5.062。因此就引入了抛物线轨迹规划。

3.2 抛物线轨迹规划
抛物线轨迹规划就是起始段和终止段为抛物线,中间有部分为直线匀速段。限制条件为起始终止位置、起始终止速度、总时间。匀速段的速度在一定条件也可以作为限制条件。
[l,ld,ldd] = lspb(p0, p1, 50); % Linear Segment(匀速) with Parabolic(抛物线) Blends(过渡)注意这里的总步长是一个限制条件
figure(4);
subplot(3,1,1); plot(l); xlabel('Time'); ylabel('l');
grid on;
subplot(3,1,2); plot(ld); xlabel('Time'); ylabel('ld');% 可以看到速度是呈梯形
grid on;
subplot(3,1,3); plot(ldd); xlabel('Time'); ylabel('ldd');
grid on;
当设定匀速段的速度时,轨迹会有不同的反应。随着速度增加,他的匀速时间变短了,而且加速度会增大,也就是说震动会加大。匀速段的速度不能太大也不能太小,否则会无解。因为他是一个Over constraied system,这里有5个constrains(总时间,初始终止位置,初始终止速度)但是有6个freedom(抛物线过渡时间,抛物线方程的三个量,直线方程的两个量)。相当于有5个未知数但是有6个方程,无解。 在《机器人学导论--分析、控制及应用》——Saeed B.Niku 孙富春这本书P145提到,因为加速减速是对称的,vmax = 2(lf - l0)/ tf, lf和l0指终止和初始位置,tf是总时间。 这里vmax = 2(1-0)/ 50 = 0.04, 匀速段最大速度为0.04.不然就会没有匀速段的时间
clear;
clc;
p0 = -1;% 定义初始点及终点位置
p1 = 2;
p = tpoly(p0, p1, 50);% 取步长为50
figure(1);

%%
plot(p);%绘图,可以看到在初始点及终点的一、二阶导均为零
[p,pd,pdd] = tpoly(p0, p1, 50);%得到位置、速度、加速度
%p为五阶多项式,速度、加速度均在一定范围内
figure(2);

subplot(3,1,1); plot(p); xlabel('Time'); ylabel('p');
title('初始和终止速度都为0');
grid on;
subplot(3,1,2); plot(pd); xlabel('Time'); ylabel('pd');
grid on;
subplot(3,1,3); plot(pdd); xlabel('Time'); ylabel('pdd');
grid on;

%%
[s,sd,sdd] = tpoly(0, 1, 50, 0.5, 0); % 初始速度0.5,终点速度0

figure(3);
subplot(3,1,1); plot(s); xlabel('Time'); ylabel('s');
title('初始和终止速度为0.5和0')
hold on;
n = find(s == max(s));
plot(n, s(n),'o');
cell_string{1} = ['smax = ' num2str(s(n))]; % 多行文本
cell_string{2} = ['time = ' num2str(n)];

text(n, s(n) -3, cell_string);
hold off;
grid on;
subplot(3,1,2); plot(sd); xlabel('Time'); ylabel('sd');
grid on;
subplot(3,1,3); plot(sdd); xlabel('Time'); ylabel('sdd');
grid on;
%%
[l,ld,ldd] = lspb(0, 1, 50); % Linear Segment(匀速) with Parabolic(抛物线) Blends(过渡)
figure(4);

subplot(3,1,1); plot(l); xlabel('Time'); ylabel('l');
grid on;
hold on;
subplot(3,1,2); plot(ld); xlabel('Time'); ylabel('ld');% 可以看到速度是呈梯形
grid on;
hold on;
subplot(3,1,3); plot(ldd); xlabel('Time'); ylabel('ldd');
grid on;
hold on;

[l,ld,ldd] = lspb(0, 1, 50, 0.025);
subplot(3,1,1); plot(l,'c'); xlabel('Time'); ylabel('l');
grid on;

subplot(3,1,2); plot(ld, 'c'); xlabel('Time'); ylabel('ld');
grid on;

subplot(3,1,3); plot(ldd,'c'); xlabel('Time'); ylabel('ldd');
grid on;

[l,ld,ldd] = lspb(0, 1, 50, 0.04);
subplot(3,1,1); plot(l,'r'); xlabel('Time'); ylabel('l');
grid on;
hold off;
legend('normal','0.025','0.04','location','southeast');

subplot(3,1,2); plot(ld,'r'); xlabel('Time'); ylabel('ld');
grid on;
hold off;
legend('normal','0.025','0.04','location','northeast');

subplot(3,1,3); plot(ldd,'r'); xlabel('Time'); ylabel('ldd');
grid on;
hold off;
legend('normal','0.025','0.04','location','northeast');
3.3 多重分割轨迹规划

>> via = [4,1; 4,4; 5,2; 2,5];
>> q = mstraj(via, [2,1], [], [4, 1], 0.05, 0);% 每个坐标系上的最大速度,分段时间(与前面最大速度二者取一个),初始速度,样本间隔,加速时间,All axes reach their via points at the same time.
>> plot(q,'DisplayName','q')


% mstraj的位移、速度和加速度曲线P48
clc;
clf;
close all;
d=0.05;
% t=0:d:400;
via = [ 4,1; 4,4; 5,2; 2,5 ];
p=mstraj(via, [2,1], [], [4,1], 0.05, 2);
mstraj(via, [2,1], [], [4,1], 0.05, 2);

pd(:,1)=gradient(p(:,1))/d;
pd(:,2)=gradient(p(:,2))/d;
pdd(:,1)=gradient(pd(:,1))/d;
pdd(:,2)=gradient(pd(:,2))/d;
subplot(3,1,1);plot([t,t],p,'Linewidth',2);xlabel('Time');ylabel('p');grid on;
subplot(3,1,2);plot([t,t],pd,'Linewidth',2);xlabel('Time');ylabel('pd');grid on;
hold on;

max1=find(abs(pd(:,1))==max(abs(pd(:,1))))
max2=find(abs(pd(:,2))==max(abs(pd(:,2))))
plot(t(max1),pd(max1,1),'*');%描点画出关节1的最大速度点
plot(t(max2),pd(max2,2),'o','markersize',12);%描点画出关节2的最大速度点

text(t(max1,1)-1,pd(max1,1)-0.3,['(',num2str(t(max1,1)),',',num2str(pd(max1,1)),')']);% 标注极值点
text(t(max2,1)-1,pd(max2,1)+1.3,['(',num2str(t(max2,1)),',',num2str(pd(max2,2)),')']);

subplot(3,1,3);plot([t,t],pdd,'Linewidth',2);xlabel('Time');ylabel('pdd');grid on;


相比抛物线轨迹规划,匀速段和加速度段较好,但是他牺牲了位置点的精确性,只是趋近于途经点。

平移与旋转复合运动


%% P49

T0 = transl(0.4, 0.2, 0) * trotx(pi);
T1 = transl(-0.4, -0.2, 0.3) * troty(pi/2) * trotz(-pi/2);
Ts = trinterp(T0, T1, [0:49]/49); % 范围是【0,1】
about(Ts);
Ts(:, :, 1)
P = transl(Ts);% 平移部分
about(P)
figure(5);
subplot(5,1,1);plot(P,'DisplayName','Translate1');grid on;

rpy = tr2rpy(Ts);% 旋转部分
subplot(5,1,2);
plot(rpy,'DisplayName','RPY1');grid on;

Ts2 = trinterp(T0, T1, lspb(0, 1, 50));% 平滑平移部分
subplot(5,1,3);plot(transl(Ts2),'DisplayName','Translate2');grid on;set(gca,'XTick',0:10:50, 'YTick',[-0.5, -0.25, 0, 0.25, 0.5]);

subplot(5,1,4);plot(tr2rpy(Ts2),'DisplayName','RPY2');grid on;

Ts3 = ctraj(T0, T1, 50);% ctraj替代trinterp(T0, T1, lspb(0, 1, 50));
subplot(5,1,5);plot(transl(Ts3),'DisplayName','Translate2');grid on;





推荐阅读
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
    本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • 本文介绍了关于Java异常的八大常见问题,包括异常管理的最佳做法、在try块中定义的变量不能用于catch或finally的原因以及为什么Double.parseDouble(null)和Integer.parseInt(null)会抛出不同的异常。同时指出这些问题是由于不同的开发人员开发所导致的,不值得过多思考。 ... [详细]
  • 本文介绍了如何将PPT格式转换成PDF,并推荐了一款高效的PPT转换成PDF转换器。该转换器利用最新的超线程技术核心和多核心CPU性能,提高了转换效率和转换质量。同时,该转换器具备万能转换模式,可以轻松实现不同类型、不同内容和不同排版的PPT文件的转换。用户可以通过下载链接获取该转换器。 ... [详细]
  • 本博文基于《Amalgamationofproteinsequence,structureandtextualinformationforimprovingprote ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
author-avatar
可靠的我还是一个人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有