MATLAB的rvctools工具箱熟悉运动学【机械臂机器人示例】

1、rvctools下载安装

rvctools下载地址:rvctools下载
截图如下,点击红色箭头指示的Download Shared Folder即可下载

下载之后进行解压,解压到D:\MATLAB\toolbox这个工具箱目录,这个安装路径根据自己的情况来选择,没有安装MATLAB,感兴趣的可以查阅:MatLab的下载、安装与使用(亲测有效)

然后我们打开MATLAB,打开上面解压的这个机器人工具箱,双击startup_rvc.m,点击运行,如下图:

这样就愉快的安装好了这个机器人工具箱了,其中startup_rvc.m的代码如下: 

function startup_rvcdisp('Robotics, Vision & Control: (c) Peter Corke 1992-2020 http://www.petercorke.com')if verLessThan('matlab', '7.0')warning('You are running a very old (and unsupported) version of MATLAB.  You will very likely encounter significant problems using the toolboxes but you are on your own with this');endtb = false;startup_path = fileparts( mfilename('fullpath') );[~,folder]=fileparts(startup_path);if strfind(folder, 'common')% startup_rvc is in common folderrvcpath = fileparts(startup_path);else% startup_rvc is in folder above commonrvcpath = startup_path;endrobotpath = fullfile(rvcpath, 'robot');if exist(robotpath, 'dir')addpath(robotpath);tb = true;if exist('startup_rtb') == 2startup_rtbendendvisionpath = fullfile(rvcpath, 'vision');if exist(visionpath, 'dir')addpath(visionpath);tb = true;if exist('startup_mvtb') == 2startup_mvtbendendif tb% RTB or MVTB is present% add spatial math toolboxp = fullfile(rvcpath, 'spatial-math');if exist(p, 'dir')tryfp = fopen( fullfile(p, 'RELEASE'), 'r');release = fgetl(fp);fclose(fp);catch MErelease = [];endif releaserelease = ['(release ' release ')'];elserelease = '';endfprintf('- Spatial Math Toolbox for MATLAB %s\n', release)addpath(p);end% add common filesaddpath(fullfile(rvcpath, 'common'));elsefprintf('Neither Robotics Toolbox or MachineVision Toolbox found in %s\n', rvcpath);end% check for any install problemsrvccheck(false)
end

后期如果关闭了MATLAB,想要运行机器人的话,运行函数startup_rvc即可

2、运动学

机器人或者说飞行器,随着时间而发生动作变换,叫做运动学(kinematics),这个跟动力学(dynamics)是不一样的,动力学是研究影响运动的因素,而动力学是不考虑作用力和质量等因素,研究的是随着时间在空间中的位置问题。对于运动基本上就是平移和旋转了,就会牵涉到坐标系和角度等转换,接下来我们来学习下

2.1、平移

物体的平移比较简单,就是沿着XYZ三轴平移
沿着X轴平移:transl(2,0,0)

沿着Y轴平移:transl(0,2,0) 

沿着Z轴平移:transl(0,0,2) 

当然也可以在XYZ轴都进行平移:transl(1,3,2) 

我们对最后这个画图看下效果:trplot(transl(1,3,2)),如下图:

我标注红点的位置是(1,3,2),因为是在三维空间的展示,所以看起来XYZ轴的数值不对,其实是对的,大家可以在MATLAB中的这张图进行拖动旋转,然后就会发现红点的坐标就是(1,3,2) 

2.2、旋转

旋转就是绕轴做圆周运动

绕X轴旋转:Rx = rotx(pi/2) 

绕Y轴旋转:Ry = roty(pi/2)

绕Z轴旋转:Rz = rotz(pi/2) 

旋转叠加:Rxy = Rx * Ry

动画演示:tranimate(Rxy),这样看起来非常清晰直观。 

我们来看下点(3,4),旋转60度的情况:

T1=SE2(3,4,pi/3)T1 = 0.5000   -0.8660         30.8660    0.5000         40         0         1

对其画图:trplot(T1),如下:

我们也可以使用transforms3d库中的结果,用来验证在MATLAB中生成的结果,代码如下:

import transforms3d as tfs
import math
print(tfs.euler.euler2mat(math.pi/3,0,0))
/*
[[ 1.         0.         0.       ][ 0.         0.5       -0.8660254][-0.         0.8660254  0.5      ]]
*/

 MATLAB中的结果如下:

T2=rotx(pi/3)
/*
T2 =1.0000         0         00    0.5000   -0.86600    0.8660    0.5000
*/

上述是弧度制,也可以使用角度制, 指定deg参数:rotx(60,'deg')

3、六轴机器人

3.1、Link关节连杆

这里我们使用更改的D-H参数,也就是接下来的Link函数指定modified参数 

L = Link([1 2 3 4],'modified')
%L = Revolute(mod): theta=q, d=2, a=3, alpha=4, offset=0

Link函数里面的参数分别表示为,关节角度[L1.theta]、连杆偏距[L1.d]、连杆长度[L1.a]、连杆旋转角度[L1.alpha],参数modified表示的是改进版本的DH参数
这里附带介绍下D-H的相关知识:
DH参数是一种描述机器人关节之间关系的参数化方法,由Denavit和Hartenberg提出。DH参数法可以用4个参数来表示刚体之间的相对关系,包括沿Z轴的平移长度a、沿共同法线的旋转角度α、在XZ平面内的偏移距离d、绕Z轴的旋转角度θ。
DH参数在ROS中被广泛应用,用于描述机器人关节和坐标系之间的关系,主要用于正向运动学计算,可以通过DH表获取每个关节的变换矩阵,将所有变换矩阵相乘,最终获得从基准坐标系到末端执行器坐标系的变换矩阵。
这个D-H方法是在运动学中求解比较通用的,其余还有李代数方法等。

连杆类型

L.type()
%ans =    'R'

也就是说这个是旋转的R(revolute)关节类型,除此之外还有一种是柱状形(prismatic)的关节

接下来就是分别创建6个关节,也就是为6轴的机械臂做准备:

L1 = Link([0 0 0 0],'modified')
L2 = Link([0 0.138+0.024 0 -pi/2],'modified')
L3 = Link([0 -0.127-0.024 0.42 0],'modified')
L4 = Link([0 0.114+0.021 0.375 0],'modified')
L5 = Link([0 0.114+0.021  0 -pi/2],'modified')
L6 = Link([0 0.09+0.021  0 pi/2],'modified')

3.2、SerialLink机械臂

上面定义好了6个关节,接下来我们使用SerialLink将这些关节连接起来成为一个六轴机械臂的机器人。 

MyBot = SerialLink([L1,L2,L3,L4,L5,L6],'name','Six Axis Robot')

我们先来看下SerialLink有哪些方法:help(SerialLink)

--- SerialLink 的帮助 ---

 SerialLink Serial-link robot class
 
  A concrete class that represents a serial-link arm-type robot.  Each link
  and joint in the chain is described by a Link-class object using Denavit-Hartenberg
  parameters (standard or modified).
 
  Constructor methods::
   SerialLink    general constructor
   L1+L2         construct from Link objects
 
  Display/plot methods::
   animate       animate robot model
   display       print the link parameters in human readable form
   dyn           display link dynamic parameters
   edit          display and edit kinematic and dynamic parameters
   getpos        get position of graphical robot
   plot          display graphical representation of robot
   plot3d        display 3D graphical model of robot
   teach         drive the graphical robot
 
  Testing methods::
   islimit       test if robot at joint limit
   isconfig      test robot joint configuration
   issym         test if robot has symbolic parameters
   isprismatic   index of prismatic joints
   isrevolute    index of revolute joints
   isspherical   test if robot has spherical wrist
   isdh          test if robot has standard DH model
   ismdh         test if robot has modified DH model
 
  Conversion methods::
   char          convert to string
   sym           convert to symbolic parameters
   todegrees     convert joint angles to degrees
   toradians     convert joint angles to radians

SerialLink类提供的方法,我们了解到可以用来描述机器人的连杆结构:SerialLink类描述机器人的连杆结构,包括每个连杆的长度、方向和旋转轴。有了这些信息,我们可以用于计算机器人的运动学模型,从而对机器人做出控制和运动规划。 

显示连接参数:MyBot.display()

MyBot = Six Axis Robot:: 6 axis, RRRRRR, modDH, slowRNE                  
+---+-----------+-----------+-----------+-----------+-----------+
| j |     theta |         d |         a |     alpha |    offset |
+---+-----------+-----------+-----------+-----------+-----------+
|  1|         q1|          0|          0|          0|          0|
|  2|         q2|      0.162|          0|    -1.5708|          0|
|  3|         q3|     -0.151|       0.42|          0|          0|
|  4|         q4|      0.135|      0.375|          0|          0|
|  5|         q5|      0.135|          0|    -1.5708|          0|
|  6|         q6|      0.111|          0|     1.5708|          0|
+---+-----------+-----------+-----------+-----------+-----------+

 操作机械臂:MyBot.teach()

 这样就会生成六轴机械臂的机器人,然后我们就可以通过操作不同关节来操作机器人的机械臂了,如下图:

我们操作左边q1~q6,就会看到机械臂的运动以及XYZ轴和RPY欧拉角的变化

4、运动学

4.1、正运动学

运动学分为正解和逆解,正运动学(Forward kinematics):已知每个关节的位姿与连杆的长度等参数,求解末端执行器的位姿。
我们来看下正解

MyBot.fkine([pi/2 -pi/4 pi/2 pi/3 -pi/2 pi/6])
/*
ans = -0.8660    0.5000         0    -0.146-0.4830   -0.8365    0.2588    0.46050.1294    0.2241    0.9659     0.1740         0         0         1
*/

生成的是对应关节角度的末端的齐次变换矩阵。

4.2、逆运动学

逆运动学(Inverse kinematics)跟正运动学是反过来的,根据机器人的末端执行器的位姿,计算出机器人各个关节的位姿等运动参数。这个要复杂点,因为它的求解可能是不确定的唯一解,会产生多重解的问题,当然也可能得不到解析解的情况。

迭代法:

%起始状态
init = [0.795 0.257 -0.135 0 0 -pi/2]
%目标状态
targ = [0 0.836 -0.135 0 -pi/3 -pi/2]
T0=MyBot.fkine(init)
/*
T0 = 0.0852    0.6951   -0.7139    0.35010.0869    0.7086    0.7003    0.72390.9926   -0.1217         0   -0.28640         0         0         1
*/
TF=MyBot.fkine(targ)
/*
TF = 0.6450    0.3821   -0.6618    0.40760    0.8660    0.5000    0.20150.7642   -0.3225    0.5586   -0.59470         0         0         1
*/
%每次迭代的末端执行器相对于首端的齐次变换矩阵
step =50
%ctraj是Matlab中机器人轨迹(trajectory)规划的函数
TC=ctraj(T0,TF,step)
%比如迭代到第50次
/*
TC(50) = 0.6450    0.3821   -0.6618    0.40760    0.8660    0.5000    0.20150.7642   -0.3225    0.5586   -0.59470         0         0         1
*/
qq = MyBot.ikine(TC,'mask',[1 1 1 0 0 0])

返回的就是50*6的双精度数组,长度是50:length(qq)

    0.7951    0.1852    0.0167   -0.0314    0.0432         0
    0.7946    0.1853    0.0174   -0.0303    0.0422         0
    0.7931    0.1856    0.0196   -0.0267    0.0394         0
......
   -0.1278    0.6478    0.4212    0.2245   -0.2429         0
   -0.1317    0.6494    0.4203    0.2230   -0.2419         0
   -0.1330    0.6500    0.4201    0.2226   -0.2416         0 

接下来我们使用ctraj来规划轨迹,使用ikine函数来做逆解,沿着轨迹进行运动。 

5、直线轨迹规划

这里使用标准的DH参数来测试下,三个自由度的机械臂如何做运动规划的,一起来了解下:

%这里是第一次开启MATLAB时,运行这个函数,启动rvc:startup_rvc
%参数:关节角、偏置距离、连杆长度、连杆扭角、sigma为0表示旋转关节
L1 = Link([0 84.72 41.04 pi/2 0]);
L2 = Link([0 0 200 0 0]);
L3 = Link([0 0 214.8 0 0]);% 可以限制旋转角度范围
L1.qlim = [deg2rad(-170) deg2rad(170)];
L2.qlim = [deg2rad(-60) deg2rad(85)];
L3.qlim = [deg2rad(-90) deg2rad(10)];Bot2 = SerialLink([L1 L2 L3], 'name', '机械臂运动学');
%手动操作关节进行旋转
Bot2.teach()%起点
T1 = transl(100,-10,50);
%终点
T2 = transl(300,-30,200);
%规划轨迹(trajectory)
T = ctraj(T1,T2,50);
Tj = transl(T);
%输出末端轨迹
plot3(Tj(:,1),Tj(:,2),Tj(:,3));
%当反解的机械臂自由度少于6时,要用mask掩码减少自由度,否则无法直接调用ikine作为运动学反解函数
q = Bot2.ikine(T,'mask',[1 1 1 0 0 0]);
Bot2.plot(q);

 这样就会看到沿着规划好的直线,自动进行运动了,简单起见截个图如下(实质是运动的):

6、圆轨迹规划

N = (0:0.5:100)'; 
center = [200 -150 -50];
radius = 60;
theta = (N/N(end))*2*pi;
points = (center + radius*[cos(theta) sin(theta) zeros(size(theta))])';  
plot3(points(1,:),points(2,:),points(3,:),'r');%沿着圆的轨迹平移
T = transl(points');
q2 = Bot2.ikine(T,'mask',[1 1 1 0 0 0]);
Bot2.plot(q2);

这样就会看到沿着规划好的圆,自动进行运动了,简单起见截个图如下(实质是运动的):

 

7、常见用法

其余的一些常见用法,如下:
关节数:MyBot.n
画出机械臂:MyBot.plot([0 0 0 0 0 0])
机器人的结构类型:Mybot.config
关节范围:MyBot.qlim
连杆向量(更直观):MyBot.links
重力方向([gx gy gz]):MyBot.gravity
连杆的动力学属性:MyBot.dyn
是否是旋转关节:MyBot.isrevolute
是否是移动关节:MyBot.isprismatic
是否是球关节:MyBot.isspherical
关节与连杆是否有符号参数:MyBot.issym
可以编辑动力学参数:MyBot.edit

 

8、小结

文章主要介绍了机器人工具箱rvctools,以及它的用法,了解运动学的相关知识,对坐标的变换,轨迹的规划等有个直观的了解,最后在进行运动规划的时候,有时候会出现下面这样的错误:
警告: failed to converge: try a different initial value of joint coordinates 
收敛失败:尝试不同的关节坐标初始值
这样的情况一般是关节不能到达那个坐标,所以需要更改坐标为合理值即可。
另外仔细观察代码中会出现一些矩阵带单引号',这个表示转置的意思,比如:
size(N)的形状是1 x 201,而size(N')的形状就是201 x 1
元素个数numel(N) 结果:201,维度ndims(N) 结果:2 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/174457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OSG编程指南<三>:利用Cmake+VS2019+OSG3.6.5编译osgVerse

目前osgearth的ralease版本和debugx64都已经编译过了并且自测可用,放到资源里osgearth下载,供需要的朋友下载参考。环境配置:win10VS2017OSG3.6.4OSGEarth2.10.2, 1、配置OSG环境 编译好osg,然后在系统变量中配置如下…

javascript 运算符

javascript 运算符 目录 javascript 运算符 一、算术运算符 1、自增运算符 2、自减运算符 二、比较运算符 三、赋值运算符 四、逻辑运算符 五、条件运算符 疑难解答: 这一节,我们来介绍JavaScript的运算符。运算符是完成一系列操作的符号&…

Rocket架构

NameServer:作为注册中心,提供路由注册、路由踢出、路由发现功能,舍弃强一致,保证高可用,集群中各个节点不会实时通讯,其中一个节点下线之后,会提供另外一个节点保证路由功能。 Rocket mq name…

基于Python获取亚马逊的评论信息的处理

文章目录 一、分析亚马逊的评论请求二、获取亚马逊评论的内容三、亚马逊评论信息的处理四、代码整合4.1 代理设置4.2 while循环翻页 总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具…

力扣hot100 和为 K 的子数组 前缀和

&#x1f468;‍&#x1f3eb; 题目地址 &#x1f37b; AC code class Solution {public int subarraySum(int[] nums, int k){int ans 0;int n nums.length;int[] s new int[n 1];// 前缀和s[0] 0;s[1] nums[0];for (int i 2; i < n; i)s[i] s[i - 1] nums[i - 1…

C#-基础及扩展合集(持续更新)

一、基础 Ⅰ 关键字 1、record record&#xff08;记录&#xff09;&#xff0c;编译器会在后台创建一个类。支持类似于结构的值定义&#xff0c;但被实现为一个类&#xff0c;方便创建不可变类型&#xff0c;成员在初始化后不能再被改变 &#xff08;C#9新增&#xff09; …

PostgreSQL + SQL Server = WiltonDB

WiltonDB 是一个基于 PostgreSQL 的开源数据库&#xff0c;通过 Babelfish 插件支持 Microsoft SQL Server 协议以及 T-SQL 语句。 Babelfish 是亚马逊提供的一个开源项目&#xff0c;使得 PostgreSQL 数据库同时具有 Microsoft SQL Server 数据查询和处理的能力。Babelfish 可…

如何提高学生的课堂参与度

提高学生的课堂参与度是让许多教师头疼的问题。不过通过采取一些简单的方法&#xff0c;就可以让学生更积极的参与课堂活动。那么&#xff0c;这些方法是什么呢&#xff1f; 激发学生的兴趣 学生如果对课堂内容感兴趣&#xff0c;他们就会更加积极地参与其中。教师可以通过使用…

详解Java中的泛型(泛型的语法,擦除机制,泛型的上界)

目录 一.什么是泛型 二.Java中为什么要使用泛型 三.泛型的语法 四.泛型类的使用 五.泛型的编译机制&#xff08;擦除机制&#xff09; 六.泛型的上界 一.什么是泛型 泛型&#xff08;Generics&#xff09;是Java SE 5中引入的一个新特性&#xff0c;可以使Java中的类和方…

联邦学习Federated Learning(FL)

联邦学习Federated Learning 序言FL流程细节FL代码实现&#xff08;Pytorch&#xff09;Reference 序言 手机的数据涉及到个人隐私和安全&#xff0c;如果将客户端的数据上传到服务端&#xff0c;终究是很容易泄漏出用户的信息&#xff0c;何况 用户也不愿意把自己的数据交给服…

Java基础小结

Java 基础小结 Java 基础概念与常识 什么是 Java ? Java 是 1995 年由 sun 公司推出的一门高级语言。 Java 的四个基本特性是面向对象、平台无关性、安全性和简单性。 具体特点如下: 简单易学。 平台无关性。 面向对象 面向对象是一种程序设计技术&#xff0c;以木匠工…

[C++]六大默认成员函数详解

☃️个人主页&#xff1a;fighting小泽 &#x1f338;作者简介&#xff1a;目前正在学习C和Linux &#x1f33c;博客专栏&#xff1a;C入门 &#x1f3f5;️欢迎关注&#xff1a;评论&#x1f44a;&#x1f3fb;点赞&#x1f44d;&#x1f3fb;留言&#x1f4aa;&#x1f3fb; …

西南科技大学数字电子技术实验一(数字信号基本参数与逻辑门电路功能测试及FPGA 实现 )预习报告

手写报告稍微认真点写,80+随便有 目录 一、计算/设计过程 1、通过虚拟示波器观察和测量信号 2、通过实际电路(电阻、开关、发光二极管)模拟逻辑门电路 二、画出并填写实验指导书上的预表

数字IC芯片验证流程及验证工具推荐?收藏专用

验证其实是一个“证伪”的过程&#xff0c;从流程到工具&#xff0c;验证工程师的终极目的都只有一个&#xff1a; 发现所有BUG&#xff0c;或者证明没有BUG&#xff0c;以保证芯片功能性能的正确性和可靠性。 验证环节对于一颗芯片的重要性也是不言而喻的&#xff1a; 从项…

数据结构 | 排序

插入排序 直接插入排序&#xff08;空间复杂度为1&#xff0c;排序后稳定&#xff09; 思路&#xff1a; 在待排序的元素中&#xff0c;假设前n-1个元素已有序&#xff0c;现将第n个元素插入到前面已经排好的序列中&#xff0c;使得前n个元素有序。按照此法对所有元素进行插入&…

【华为OD】B\C卷真题 100%通过:找城市 多叉树实现 python源码

【华为OD】B\C卷真题 100%通过:找城市 多叉树实现 python源码 目录 题目描述&#xff1a; 示例1 示例2 解题思路&#xff1a; 代码实现&#xff1a; 题目描述&#xff1a; 一张地图上有n个城市&#xff0c;城市和城市之间有且只有一条道路相连&#xff1a;要么直接相连&…

快速排序算法,这么写打败95%的程序员

1960年&#xff0c;英国计算机科学家霍尔提出了一种高效的排序算法——快速排序。其核心思想是选定一个基准元素&#xff0c;将需排序的数组分割成两部分。其中一部分都比基准元素小&#xff0c;另一部分都比基准元素大。接着对这两部分分别进行快速排序&#xff0c;最后通过递…

jQuery_07 函数的使用

在jQuery中&#xff0c;如何使用函数呢&#xff1f; 1.基本函数 函数(常用的) 其实有很多函数&#xff0c;但是我们只需要掌握常用的函数即可 1.val 操作dom对象的value val() 没有参数 获取dom数组中第一个dom对象的value值 val(value) 有参数 设置dom数组中所有dom对象的…

UE5人物残影学习(材质实现)

学习视频 UE4简单的材质球残影人教学&#xff0c;你学会了吗&#xff01;_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1rY411q7Yb/?spm_id_from333.788.top_right_bar_window_history.content.click 结果预览 1.创建残值&#xff0c;混合模式勾选半透明 “混合模…

经典神经网络——GoogLeNet模型论文详解及代码复现

论文地址&#xff1a;[1409.4842] Going Deeper with Convolutions (arxiv.org) 一、GoogLeNet概述 创新点 我认为&#xff0c;这篇文章最大的创新点是引入了一个名为Inception块的结构&#xff0c;能够增加神经网络模型大小的同时&#xff0c;减缓参数量的爆炸式增长&#x…