rtb 学习笔记

前言

机器人学工具箱(rtb)是一个快速验证自己想法的一个matlab工具箱,简单点说,如果要求解一个复杂的方程组,通过各种算法求出来后,如何知道所求的解不是错误的呢,当然,最简单的办法,带入到原方程即可,这是所求出来的答案必要非充分的条件。类似的,如果可以运用好这个工具,无疑可以快速验证自己的想法,而不必拘泥于具体的细节,同时里面的代码都是开源的,就是说可以阅读里面代码的实现过程,通过阅读优秀的代码来提升自己的编程能力。CSDN上的关于这个工具箱的使用的内容有些让人失望,所以还是自己记录下学习的过程吧。这个并不是一个教程,只是用来激发对此工具箱感兴趣的小伙伴们。

当初因为玩不了真的机械臂,所以极力的寻找一个可以仿真的软件,当时对于我这个单枪匹马走入机器人领域的小白来说,什么都不懂,大多数时间都在探索中渡过,不过这并不是件坏事,从中学习到不少的软件的使用方法,就自己目前的学习经验来看,rtb工具箱是个性价比超高的学习机器人学的工具了。 这个工具箱的下载可直接进入petercorke.com网站,里面有matlab工具箱以及作者写的书,虽然作者写的书被翻译成了中文,不过还是建议学习这个工具的小伙伴能够阅读英文,熟悉下相关的术语。 由于才疏学浅,文中错误难免,有任何问题可以发邮件。

工具箱的获取

登陆网站下载好机器人工具箱并解压,如下图所示并运行文件 startup_rvc.m即可开始使用,或者是在此文件夹下,输入

addpath(genpath(pwd))

如果初次接触,可以输入

rtbdemo

快速了解这个软件的概况。里面内置了不少的著名的机器人模型,其模型均以mdl_为开头,比如导入puma560这款经典的机械臂模型和查看其基本信息。

这里的p560的类型为Seriallink,通过 help Seriallink 指令可以一览这个类可以用来做什么了。

说到这可能有些犯迷糊了,话说这个到底怎么用的呢,首先从最基础的建立机械臂的运动学模型开始说起,rtb提供了标准和改进的DH方法建立机械臂的模型,这里仅以标准的为例,只要给出了机械臂的DH参数,就可以使用rtb工具快速的建立模型,这里以ur5协作机械臂为例,使用Link建立连杆,再使用Seriallink来将连杆组合起来。如果你不是做机械臂结构的设计的话,一开始分析机械臂时,其机械臂DH参数已经确定好了,直接带入公式即可,这里只说工具的使用,而不谈具体的原理。建立ur5运动学模型的代码如下

DOF=6;
%offset=0;
alpha=[pi/2,0,0,pi/2,-pi/2,0];
a=[0,-0.425,-0.39225,0,0,0];
d=[0.089459,0,0,0.10915,0.09465,0.0823];
for i=1:DOF
ur5Link(i) = Link([0,d(i),a(i),alpha(i)],'standard');
end
ur5=SerialLink(ur5Link,'name','ur5');
W=[-1.5, 1.5 -1.5 1.5 -1.5 1.5 ];
%ur5.teach([0,0,0,0,0,0],'workspace',W,'noshading','jaxes')
ur5.teach([-pi/2,-pi/2,0,-pi/2,0,0])

运行此段代码后的结果如下所示

在命令行中输入ur5. 然后按下tab键,就可以看到其提供的很多功能,真心想了解这些功能的话,还是去查看SerialLink.m的代码,带有目的性的去阅读代码就行,如果有相关的知识,阅读那些代码,并不是个困难的事情。 对于这款机械臂,使用自带的求逆解的函数目前还没有成功过。。。所以需要自己分析如何求逆解了,求出逆解后可以做一些有趣的事情,比如说写字(代码可以做的优化工作有很多,因为没怎么优化,所以比较慢)。

这里给出很久之前的工作,这里就不重复把原来的内容给抄一遍,而且可以通过检索一些文献,可以知道在改进DH下的运动/动力学的推导过程,这里仅给出其正逆解,然后会在一个专门的一篇文章中给出多种动力学建模方法以及相关代码,其推导过程整理成文档,如下所示:

其中需要注意的是,以自身为参考系右乘变换矩阵,相对于静坐标系左乘变换矩阵。如果建立了动力学模型,那么就可以做一些相关的动力学仿真,比如仅受重力时的动态变化过程

重要函数说明

由于此工具箱涵盖的内容非常多,这里仅对类函数SerialLink的功能进行了罗列。 通过peter的网站关于串联机器人SerialLink类函数的讲解, 其方法(Methods)有

plot		display graphical representation of robot
plot3d display 3D graphical model of robot
teach drive the graphical robot
getpos get position of graphical robot
jtraj a joint space trajectory
edit display and edit kinematic and dynamic parameters
isspherical test if robot has spherical wrist
islimit test if robot at joint limit
isconfig test robot joint configuration
fkine forward kinematics
A link transforms
trchain forward kinematics as a chain of elementary transforms
ikine6s inverse kinematics for 6-axis spherical wrist revolute robot
ikine inverse kinematics using iterative numerical method
ikunc inverse kinematics using optimisation
ikcon inverse kinematics using optimisation with joint limits
ikine_sym analytic inverse kinematics obtained symbolically
jacob0 Jacobian matrix in world frame
jacobn Jacobian matrix in tool frame
jacob_dot Jacobian derivative
maniplty manipulability
vellipse display velocity ellipsoid
fellipse display force ellipsoid
qmincon null space motion to centre joints between limits
accel joint acceleration
coriolis Coriolis joint force
dyn show dynamic properties of links
friction friction force
gravload gravity joint force
inertia joint inertia matrix
cinertia Cartesian inertia matrix
nofriction set friction parameters to zero
rne inverse dynamics
fdyn forward dynamics
payload add a payload in end-effector frame
perturb randomly perturb link dynamic parameters
gravjac gravity load and Jacobian
paycap payload capacity
pay payload effect
sym a symbolic version of the object
gencoords symbolic generalized coordinates
genforces symbolic generalized forces
issym test if object is symbolic

这里补充一句,差不多知道提供那些方法/功能就可以了,用到的时候,再继续深究。这里不对其进行翻译有很多原因,希望想接触机器人学的童鞋尽量去看英文。因为中文翻译错误挺多。可读写的属性有

Properties (read/write)
links vector of Link objects (1xN)
gravity direction of gravity [gx gy gz]
base pose of robot's base (4x4 homog xform)
tool robot's tool transform, T6 to tool tip (4x4 homog xform)
qlim joint limits, [qmin qmax] (Nx2)
offset kinematic joint coordinate offsets (Nx1)
name name of robot, used for graphical display
manuf annotation, manufacturer's name
comment annotation, general comment
plotopt options for plot() method (cell array)
fast use MEX version of RNE. Can only be set true if the mex file exists. Default is true.

只读属性有

Properties (read only)
n number of joints
config joint configuration string, eg. 'RRRRRR'
mdh kinematic convention boolean (0=DH, 1=MDH)
theta kinematic: joint angles (1xN)
d kinematic: link offsets (1xN)
a kinematic: link lengths (1xN)
alpha kinematic: link twists (1xN)

选项

Options
'name', NAME set robot name property to NAME
'comment', COMMENT set robot comment property to COMMENT
'manufacturer', MANUF set robot manufacturer property to MANUF
'base', T set base transformation matrix property to T
'tool', T set tool transformation matrix property to T
'gravity', G set gravity vector property to G
'plotopt', P set default options for .plot() to P
'plotopt3d', P set default options for .plot3d() to P
'nofast' don't use RNE MEX file

下面介绍重要的函数
1, Robobt.plot

Graphical display and animation

R.plot(q, options) displays a graphical animation of a robot based on the kinematic model.
A stick figure polyline joins the origins of the link coordinate frames.
The robot is displayed at the joint angle q (1xN), or if a matrix (MxN) it is animated as
the robot moves along the M-point trajectory.

Options
'workspace', W Size of robot 3D workspace, W = [xmn, xmx ymn ymx zmn zmx]
'floorlevel', L Z-coordinate of floor (default -1)
'delay', D Delay betwen frames for animation (s)
'fps', fps Number of frames per second for display, inverse of 'delay' option
'[no]loop' Loop over the trajectory forever
'[no]raise' Autoraise the figure
'movie', M Save frames as files in the folder M
'trail', L Draw a line recording the tip path, with line style L
'scale', S Annotation scale factor
'zoom', Z Reduce size of auto-computed workspace by Z, makes robot look bigger
'ortho' Orthographic view
'perspective' Perspective view (default)
'view', V Specify view V='x', 'y', 'top' or [az el] for side elevations,
plan view, or general view by azimuth and elevation angle.
'top' View from the top.
'[no]shading' Enable Gouraud shading (default true)
'lightpos', L Position of the light source (default [0 0 20])
'[no]name' Display the robot's name
'[no]wrist' Enable display of wrist coordinate frame
'xyz' Wrist axis label is XYZ
'noa' Wrist axis label is NOA
'[no]arrow' Display wrist frame with 3D arrows
'[no]tiles' Enable tiled floor (default true)
'tilesize', S Side length of square tiles on the floor (default 0.2)
'tile1color', C Color of even tiles [r g b] (default [0.5 1 0.5] light green)
'tile2color', C Color of odd tiles [r g b] (default [1 1 1] white)
'[no]shadow' Enable display of shadow (default true)
'shadowcolor', C Colorspec of shadow, [r g b]
'shadowwidth', W Width of shadow line (default 6)
'[no]jaxes' Enable display of joint axes (default false)
'[no]jvec' Enable display of joint axis vectors (default false)
'[no]joints' Enable display of joints
'jointcolor', C Colorspec for joint cylinders (default [0.7 0 0])
'jointdiam', D Diameter of joint cylinder in scale units (default 5)
'linkcolor', C Colorspec of links (default 'b')
'[no]base' Enable display of base 'pedestal'
'basecolor', C Color of base (default 'k')
'basewidth', W Width of base (default 3)

根据这些选项能够自定义绘图连杆的颜色,地板颜色,轴的局部坐标系等信息了。

2, SerialLink.rne

Inverse dynamics

tau = R.rne(q, qd, qdd) is the joint torque required for the robot R to achieve the specified
joint position q (1xN), velocity qd (1xN) and acceleration qdd (1xN), where N is the number of robot joints.

tau = R.rne(q, qd, qdd, grav) as above but overriding the gravitational acceleration vector (3x1) in the robot object R.

tau = R.rne(q, qd, qdd, grav, fext) as above but specifying a wrench acting on the end of the manipulator
which is a 6-vector [Fx Fy Fz Mx My Mz].

tau = R.rne(x) as above where x=[q,qd,qdd] (1x3N).

tau = R.rne(x, grav) as above but overriding the gravitational acceleration vector in the robot object R.

tau = R.rne(x, grav, fext) as above but specifying a wrench acting on the end of the manipulator
which is a 6-vector [Fx Fy Fz Mx My Mz].

[tau,wbase] = R.rne(x, grav, fext) as above but the extra output is the wrench on the base.

有几种办法可以得到其正运动学的齐次变换矩阵, 在此之前先说两个方法里的函数 R.A,R.fkine 其中A表示的是连杆之间的变换,fkine给出的是最后变换的4*4矩阵,其输入参数有两个,一个是连杆的编号,另外一个是关节角度(可以是符号)。例如

mdl_ur5;
ur5.A(1,1) %当theta1 = 1时的变换矩阵,也就是基座到坐标系1的齐次变换矩阵
ur5.A(2,[rand,1]) %当theta2 = 1时的变换矩阵,从坐标系1到坐标系2的齐次变换矩阵,此时与theta1没有什么关系
ur5.A(1:2,[1,1]) %从基座到坐标系2的齐次变换矩阵
ur5.A(1:6,ones(1,6)) %从基座到末端的变换矩阵

验证结果如下

如果喜欢花里胡哨的,可以考虑修改下R.plot中的参数,鉴于参数比较多,这里就说一个比较有意思的——写字,可以使用trail这个参数,可以需要将想写的字通过逆解求出来,然后再绘制出来,这样可以优化上面写的青春,这里做一个简要的演示,用的指令为

load('Qing'); %事先求好的逆解
mdl_ur5;
ur5.plot(qlist(1:5:end,:),'trail','-b') %为了绘制的快一些,以5个点为间隔

效果如下

理论部分

主要还是对标准的DH方法建立的模型进行阐述,因为在进行动力学代码编写的时候,感受到了那块的不易理解。顺便吐槽下国内的一些教材,当时在写递推Newton-Euler法建立的动力学的模型时,参考了国内两本教材(一本用的标准的DH,另外一本用的改进的)看得我当时就哭晕了过去.就不能标准下吗。。。。。好处就是对理论有了更好的理解(并不意味着可以很好的表述出来),当然,建立动力学模型的方法有很多,可以参考刘延柱老师的《多体系统动力学》

串联机械臂的链路是由连杆组成,这些连杆由关节(运动副)连接起来。一般用R表示转动副,P表示移动副。这里的运动副在维基百科下的定义为

运动副是两个机械构件之间通过直接接触而组成的可动连接。两个构件上参与接触而构成运动副的点、线、面等元素被称为运动副元素。

1, 两构件在未构成运动副之前,在空间中有6个相对自由度,构成运动副后,它们之间的相对运动将受到约束,约束数最少为1,最多为5。
常根据引入约束的数目将运动副分类,把引入一个约束的运动副成为一级副,以此类推引入两个约束的运动副称为二级副,还有三级,四级,五级副。

2, 按照运动副的接触形式分类。面和面接触的运动副在接触部分的压强较低,被称为低副,
而通过点或线接触构成的运动副称为高副,高副比低副容易磨损。

3, 按照相对运动的形式分类。构成运动副的两个构件之间的相对运动若是平面运动则为平面运动副,若为空间运动则称为空间运动副,
两个构件之间的相对运动为转动的运动副被称为转动副或回转副,也称铰链。相对运动为移动的运动副称为移动副;
相对运动为螺旋运动的运动副称为螺旋副;相对运动为球面运动的运动副称为球面副。

标准DH与改进DH的不同

从变换公式来观察

连杆变换是由基本旋转和平移变换所组成, 标准的DH参数的变换法则如下(后置)

改进的DH参数的变换法则如下(前置)

从图中来观察

标准的DH

改进的DH

从图中可以看出,标准 DH 是将连的坐标系固定在连杆的后端,即坐标系 与关节i对齐,而改进的 DH 则是将连杆坐标系固定在连杆的前端,也即坐标系 与关节i-1 对齐。为了凸显其中的不同,可以参考下面的表格:

SDH MDH
关节坐标系为其固连坐标系 以连杆的前一个关节坐标系为其固连坐标系
以当前 Z 轴和“前一个”坐标系的 Z轴叉乘确定 X轴 以“后一个”坐标的Z轴与当前Z轴叉乘确定X轴
相关节坐标系之间的参数变化顺序为: 相关节坐标系之间的参数变化顺序为:

另外需要说明一点,MDH中所给的公式里,,与a参数下标都是i-1, 这个i-1说明的是用的SDH参数表中的内容,所以一般给的MDH表中和a都会比SDH表中往下移动一位;

微分运动和广义速度

刚体或坐标系的微分运动包含微分移动矢量d和微分转动矢量。前者由沿三个坐标轴的微分移动组成,后者由绕三坐标轴的微分转动组成,即

将两者合并为6维列矢量 D , 称为刚体或坐标系的微分运动矢量:

相应的,刚体或坐标系的广义速度V是由线速度v和角速度 组成的6维列矢量:

微分运动矢量 D 和广义速度 V 也是相对于某坐标系而言的。在不同的坐标系中表示是不同的。若相对基坐标系(或参考系)的微分运动为 D (d 和 ), 则相对坐标系 {T},

的微分运动

合并上式, 可以得到与D的关系为

上式可简写为

对于任何 3 维矢量 p= [p_x, p_y, p_z]。其反对称矩阵S(p)定义为

它具有以下性质:

(1)
(2)
(3)
相应地,广义速度 V 的坐标变换为

任意两坐标系{A}和{B}之间广义速度的坐标变换为

雅可比矩阵的构造法

雅可比矩阵J(q)既可当成是从关节空间向操作空间的速度传递的线性关系,也可看成是微分运动转换的线性关系,即

对于 n 个关节的机器人,其雅可比J(q)是 6 * n 阶矩阵。其中前 3 行代表对手爪线速度 v 的传递比;后 3 行代表对手爪的角速度 的传递比。另一方面,每一列代表相应的关节速度 , 对于手爪线速度和角速度的传递比;

力雅可比

机器人与外界环境相互作用时, 在接触的地方要产生力 f 和力矩 n, 统称为末端广义(操作)力矢量, 记为:

例如, 操作臂提取重物时承受的外界作用力和力矩。在静止状态下,广义操作力矢量F应与各关节的驱动力(或力矩)相平衡。n 个关节的驱动力组成的n维矢量

称为关节力矢量。 利用虚功原理, 可以得到关节力矢量 与相应的广义操作力矢量F之间的关系。令各关节的虚位移为 q, 末端执行器相应的虚位移为D。所谓的虚位移,是满足机械系统几何约束的无限小位移。各关节所作的虚功只和 与末端执行器所作的虚功 应该相等(总的虚功为零),即

不难得到

式中, 称为操作臂的力雅可比, 它表示在静态平衡状态下, 操作力向关节力映射的线性关系。

技巧

1, 工具箱使用的关节坐标都是行向量.

2, 判别给的是标准DH还是改进DH,可从给的参数栏的下标入手,如果有相同的下标,则是标准,否则,为改进的DH参数。

3, 想同时展示多个机器人,比如两个机器人,需要创建一个机器人的复本,其基座处在不同的位置,这样就可以同时展示两个机器人了。

参考

[1] Robotics, Vision and Control Fundamental algorithms in MATLAB: Second Edition》Peter

[2] 运动副—维基百科

[3] matlab中Link函数与SeriaLink函数学习笔记 —红烧肉不好吃

[4] 机器人技术基础 — 熊有伦

注意

由于latex.codecogs.com挂了,里面的公式目前都无法显示,正在处理中。。。。。。截止目前已经处理了百分之五十了;

CMakeLists Eigen FCPX GNU Gazebo Git Interest KDL Life Linux Matrix ODE ROS Ros UML Ubuntu VcXsrv algorithm algorithms axis-angle bode calibration chrome control cpp data_struct dots figure gdb latex launch life linux mac math matlab memory motor moveit operator optimal algorithm python robot robotics ros ros2 rtb simulation stl thread tools twist urdf velocity vim web work wsl
知识共享许可协议