MATLAB Robot toolkit使用说明中文版
最近在用MATLAB的robot toolkit,踩了一些坑,总结一下还是没有理解基础概念或者对toolkit不熟悉。下决心翻译一下toolkit的说明文档,本着开源共享的思想没有放在积分下载区,,欢迎各位讨论。能力有限,难免出错,各位海涵。
函数和类
about
类型显示函数,类似于python的type()
about(x)为函数形式,输出类型
about x为命令形式,功能形同
举例
>> a=1;
>> about a
a [double] : 1x1 (8 bytes)
>> a = rand(5,7);
>> about a
a [double] : 5x7 (280 bytes)
关联 whos
angdiff
角度之差函数,以弧度制返回角度之差
用法1 d = angdiff(th1, th2)
用法2 d = angdiff(th)
用法1中th1如果为列向量,th2为标量,返回一个列向量。其中th2是从th1的相应元素中减去的模。
用法2 返回间隔中与th的等效角度[-pi pi)
angvec2r
转换函数
将角度和矢量方向转换为旋转矩阵
r=angvec2r(θ,v)
返回一个正交旋转矩阵(3×3),相当于θ围绕向量v的旋转。
关联 eul2r, rpy2r, tr2angvec
angvec2tr
转换函数
将角度和矢量方向转换为齐次变换
t=angvec2tr(θ,v)
返回一个齐次变换矩阵(4×4),相当于θ围绕向量v的旋转。
平移部分为0
关联eul2tr, rpy2tr, angvec2r, tr2angvec
Animate
创建动画函数
用于创建动画的帮助程序类。将图形的快照保存为单独的png格式的文件夹,其中包含编号为0000.png、0001.png等的帧。
举例
anim = Animate(’movie’);
for i=1:100
plot(...);
anim.add();
end
格式转换,从每帧转换为mp4,需要类似ffmpeg的程序
% ffmpeg -r 10 -i movie/*.png out.mp4
Animate.Animate
创建动画类
A=animate(名称、选项)
初始化动画,并创建一个名为 保存单个帧的名称。
‘resolution’, R 将保存图像的分辨率设置为每英寸R像素。
Animate.add
将当前绘图添加到动画
A.ADD()将当前PNG格式的图形以唯一的顺序文件名添加到动画文件夹中。
A .ADD(fig)如上添加(图),捕获图
关联 print
Arbotix
机器控制接口类,提供串口控制机械臂的接口
方法列表
Arbotix 构造实例对象,建立串口通信
delete 删除函数,关闭串口
getpos 获取关节角度
setpos 设置关节角度和可选速度
setpath 将轨迹加载到机械臂中
relax 关机电机失力
setled 设置控制led
gettemp 获取温度
writedata1 写入数据1,以字节形式写入
writedata2 写入数据2,以字节形式写入
readdata 读取数据,读取伺服控制表
command 执行命令
flush 刷新串口数据缓冲区
receive 接受数据
举例
arb=Arbotix(’port’, ’/dev/tty.usbserial-A800JDPN’, ’nservos’, 5);
q = arb.getpos();
arb.setpos(q + 0.1);
注意
这是实验性的代码
假设伺服电机在机械臂上是一串分布的
通过串行端口连接到运行pypose架构的arbotix控制器。
关联 Machine,RobotArm
Arbotix.Arbotix
声明一个对象
arb = Arbotix(options)
是一个对象,表示通过arbotix控制器和主机的串行链接连接到arbotix servos链的连接。
参数表
‘port’, 串口名,例如在linux下 /dev/tty.USB0
‘baud’, 波特率,默认38400
‘debug’,debug等级,默认为0
‘nservos’,伺服电机数量
Arbotix.a2e
将角度转换为编码器
E = ARB.A2E(a) 是编码器值e的矢量,与关节角度a的矢量相对应。
比例因子是常量,应为构造函数的参数。
Arbotix.char
将arbotix状态转换为字符串
C = ARB.char()
是一个简单描述arbotix控制器链接状态的字符串。
Arbotix.command
执行伺服命令
R = ARB.COMMAND(id, instruc)执行伺服id上的指令instruc。
R = ARB.COMMAND(id, instruc, data) 如上所述,但矢量数据构成命令消息的有效负载,数据中的所有数值必须在0到255之间。
可选的输出参数r是一个保持返回状态的结构。
注意
id是在0~N-1之间的数。N是伺服电机总数
instruc的值定义为类属性ins*。
如果在构造函数中启用了“debug”,那么十六进制值将被回送到屏幕并发送到arbotix。
如果请求输出参数,则首先刷新串口。
关联 Arbotix.receive, Arbotix.flush
还有不少Arbotix的方法,自己查阅吧
bresenham
用于给线分段
p = bresenham(x1, y1, x2, y2)
p = bresenham(p1, p2),p1=[x1,y1],p2=[x2,y2]
注意
端点必须是整数。
关联 icanvas
Bug2
导航规划算法类
实现bug2导航算法的导航类的具体子类。
这是一个执行本地地图map的简单的自动算法,
它只能感觉到障碍物的即时存在。
方法
path 计算从开始到目标的路径
visualize可视化显示障碍物地图(已弃用)
plot 绘图显示障碍地图
display 以可读形式显示状态/参数
char 转换为字符串
例子
load map1 % load the map
bug = Bug2(map); % create navigation object
bug.goal = [50, 35]; % set the goal
bug.path([20, 10]); % animate path to (20,10)
关联 Navigation, DXform, Dstar, PRM
Bug2.Bug2
Bug2导航对象构造函数
b = Bug2(map)
一个Bug2导航对象,map是一个占用网格,平面世界的表示形式是一个元素为0(可用空间)或1(占用)的矩阵。
参数列表
‘goal’, g指定目标点(1×2)
‘inflate’, k用k元胞数组表示所有障碍物
关联 Navigation.Navigation
ccodefunctionstring
MATLAB代码转换为C语言代码的函数,暂时用不到,先空着
## circle
计算圆上的点
circle(C, R, opt)
绘制以c(1×2)为中心的圆,当前轴上的半径为r。
x = circle(C, R, opt)
一个矩阵(2×n),其列定义了围绕以c(1×2)为中心的圆和半径r的圆周点的坐标[x,y]。
c通常为2×1,但如果为3×1,则圆为3d,x为n×3,圆总是在xy平面上,z坐标为c(3)。
参数
‘n’, N 指定点数(默认值为50)
CodeGenerator
编码生成器类
类的对象自动生成机器人特定的代码,作为M函数、C函数、C-Mex函数或实时支持的Simulink块。
包含各种函数,返回机器人运动学和动力学函数的符号表达式,例如:
具有符号机器人特定模型代码的M功能
具有实时功能的机器人专用Simulink模块
带有符号机器人特定模型表达式的mat文件
C-功能包和头文件,带有机器人特定的符号模型代码
基于生成的C代码的机器人特定MEX函数(依赖C编译器)。
% 加载机器人模型
mdl_twolink
cg = CodeGenerator(twolink);
cg.geneverything();
% 在robot目录中自动生成了一个新类
addpath robot
tl = @robot();
% 这个类是seriallink的一个子类,因此seriallink具有多态性,但是它的方法已经被机器人特定的代码所重载。
% 举例说明
T = tl.fkine([0.2 0.3]);
% 使用简洁的符号表达式而不是通用的A矩阵方法
% 包含机器人特定块的Simulink块库可以被如下方式导入。打开
open robot/robotslib.slx
% 然后这些块可以被拖进你自己的模型里.
坑比较大,先放着
colnorm
矩阵的列范数
cn = colnorm(a)
是矩阵a (N×M)每列的向量(1×M)
colorname
颜色名称和RGB值之间的映射
翻译的有点费劲,先放放,就是颜色的映射关系
ctraj
两个姿态之间的笛卡尔轨迹
tc = ctraj(T0, T1, n)
是从位姿T0到T1的一个笛卡尔轨迹(4×4×n),轨迹上有n个点沿轨迹沿梯形速度分布。笛卡尔轨迹是一个齐次转移序列,下标为点索引,即T(:,:,i)是路径上的第i个点。
tc = ctraj(T0, T1, s)
s (n×1)的元素指定了沿路径的分数距离,这些值在[0 1]范围内。第i个点对应沿路径的距离s(i)。
注意
如果T0或T1等于[],则取单位矩阵。
在第二种情况下,s可以由标量轨迹生成器生成,如TPOLY或 LSPB(默认)。
关联 lspb, mstraj, trinterp, Quaternion.interp, transl
delta2tr
将微分运动转化为齐次变换
T = delta2tr(d)
表示微分平移和旋转的齐次变换(4×4)。
向量d=(dx, dy, dz, dRx, dRy, dRz)表示无穷小运动,是空间速度乘以时间的近似。
关联 tr2delta
DHFactor
简化符号链接转换表达式
f = dhfactor(s)
是一个对象,它对机器人的运动学模型进行编码,该模型由一个字符串s提供,该字符串s表示从机器人的基座到末端的一系列基本变换。
基本旋转和平移的链被象征性地分解成一系列由DH参数描述的链接变换。
s = ’Rz(q1).Rx(q2).Ty(L1).Rx(q3).Tz(L2)’;
表示q1绕z轴旋转,q2绕x轴旋转,L1绕y轴平移,q3绕x轴旋转,L2沿z轴平移。
函数列表
base 将基座转换作为Java字符串
tool 将工具(末端)转换为Java字符串
command 一个命令字符串,它将创建一个表示指定运动学的SerialLink()对象
char 字符转换为字符串表示
display 以可读的形式显示
例程
>> s = ’Rz(q1).Rx(q2).Ty(L1).Rx(q3).Tz(L2)’;
>> dh = DHFactor(s);
>> dh
DH(q1+90, 0, 0, +90).DH(q2, L1, 0, 0).DH(q3-90, L2, 0, 0).Rz(+90).Rx(-90).Rz(-90)
>> r = eval( dh.command(’myrobot’) );%eval函数用于将括号内的字符串视为语句并运行
注意
以q开头的变量假设为关节坐标。
以L开头的变量是长度常数。
在执行上面的最后一行之前,必须在工作区中定义长度常量。
用Java实现。
不是所有的序列都可以转换成DH格式,如果不能实现转换的话会生成一个错误。
关联 SerialLink
diff2
一阶差分函数,离散函数中连续相邻两项之差。
d = diff2(v)
向量v(1×N)中序列数据的一阶差分(1×N),第一个元素为零。
d = diff2(a)
矩阵a (M×N)每一行序列数据的一阶差分(M×N),每一行第一个元素为零
注意
与内置函数DIFF不同,diff2的结果与输入的列数相同。
关联 DIFF
distancexform
占用网格的距离变换
d = distancexform(world, goal)
占用网格世界相对于指定目标点goal = [X,Y]的距离变换。网格的单元格对于自由空间的值为0,对于障碍物的值为1。
d = distancexform(world, goal, metric)
如上所述,但将距离度量指定为“cityblock”或“Euclidean”(默认值)。
d = distancexform(world, goal, metric, show)
如上所示,但是显示了正在形成的距离变换的动画,帧与帧之间的显示时间延迟为几秒。
注意
依赖机器视觉工具箱Machine Vision Toolbox
目标是[X,Y]而不是MATLAB [row,col]。
关联 imorph, DXform
distributeblocks
在Simulink块库中分布块
distributeblocks(model)
在名为model的Simulink块库中等距离分布块。
注意
MATLAB函数从符号表达式创建Simulink块,实际上将所有块放在一起。该函数扫描simulink模型并在等距网格上重新排列块。
必须在运行此函数之前打开Simulink模型
关联 symexpr2slblock, doesblockexist
dockfigs
控件图形在GUI中停靠
dockfigs使所有新图形都停靠到GUI中
dockfigs(1)如上所述。
dockfigs(0)将使所有新图形从GUI中卸载
doesblockexist
检查Simulink模型中是否存在块
res = doesblockexist(mdlname, blockaddress)
是否有逻辑结果指示Simulink模型mdlname中是否存在块地址
关联 symexpr2slblock, distributeblocks
Dstar
D*导航类
抽象导航类的一个具体子类,实现D*导航算法。提供了最小的距离路径,并有助于增量重新规划
坑有点多,,先过了
e2h
欧几里得转换为齐次形式
H = e2h(E)
欧几里德点E (K×N)的齐次形式(K+1×N),其中每一列表示R^K中的一个点
关联 h2e
edgelist
返回区域的边缘像素列表
eg = edgelist(im, seed)
从边缘坐标seed=[X,Y]开始的图像中某一区域的边缘像素列表(N×2)。每个边点坐标(x,y)对应一个行。
暂时用不到。先鸽了
EKF
扩展卡尔曼滤波导航
提出了一种基于非线性动态模型的扩展卡尔曼滤波器,用于从噪声测量中获得状态的最优估计。
针对SE(2)中运动车辆的状态估计问题。
可用于:
航迹推算定位
基于地图的定位
地图制作
同步定位和映射(SLAM)
这个坑更大。。我现在只需要一些和机械臂有关的内容,这个就先鸽了,后面填坑
eul2jac
欧拉角速率雅可比矩阵
J = eul2jac(eul)是一个雅可比矩阵(3×3)
它将欧拉角速度映射到操作点eul=[PHI, THETA, PSI]的角速度。
J = eul2jac(phi, theta, psi) 但欧拉角作为单独的参数传递。
用于建立分析雅可比矩阵。
关联 rpy2jac, SerialLink.JACOBN
## eul2r
将欧拉角转换为旋转矩阵
R = eul2r(phi, theta, psi, options)
是一个SO(2)正交旋转矩阵(3×3)等价于指定的欧拉角。
它们分别对应于Z轴,Y轴,Z轴的旋转。
如果phi, theta, psi是列向量(N×1),则假设它们表示一个轨迹,R是一个三维矩阵(3×3×N),其中最后一个指标对应于的行。
R = eul2r(eul, options)
但欧拉角是从传递矩阵eul = [phi theta psi]的连续列中提取的。
如果eul是一个矩阵(N×3),则假设它们代表一个轨迹,R是一个三维矩阵(3×3×N),其中最后一个指标对应的eul行假设为[phi theta psi]
参数
‘deg’ 以角度计算角度(默认值弧度)
注意
向量[phi theta psi]一定是相同的长度。
关联 eul2tr, rpy2tr, tr2eul
eul2tr
将欧拉角转换为齐次变换
T = eul2tr(phi, theta, psi, options)
一个等价于指定欧拉角的SE(3)齐次变换矩阵(4×4)。它们分别对应于Z轴,Y轴,Z轴的旋转。如果phi, theta, psi是列向量(N×1),则假设它们表示一个轨迹,R是一个三维矩阵(4×4×N),其中最后一个指标对应于的行。
T = eul2tr(eul, options)
如上所述,欧拉角是连续的.传递矩阵eul的列= = [phi theta psi]
如果eul是一个矩阵(N×3),则假设它们代表一个轨迹,T是一个三维矩阵(4×4×N),其中最后一个指标对应eul的行,假设为[phi, theta,psi]
参数
‘deg’ 以角度计算角度(默认值弧度)
注意
向量[phi theta psi]一定是相同的长度。
平移部分是0。
关联 eul2tr, rpy2tr, tr2eul
gauss2d
高斯核,也简称为高斯函数
out = gauss2d(im, sigma, C)
是一个单位体积的高斯核,渲染成与im (W×H)大小相同的矩阵out (W×H)。高斯函数以C=[U,V]为中心。
h2e
齐次形式转换为欧几里得
为齐次点H (K×N)的欧几里德版本(K×N),其中每一列表示P^K中的一个点。
关联 h2e
homline
两点的齐次直线
L = homline(x1, y1, x2, y2)
是一个向量(3×1),它以齐次形式描述包含两个欧几里德点(x1,y1)和(x2,y2)的直线。直线上的齐次点X(3×1)必须满足L ' *X = 0。
关联 plot homline
homtrans
应用齐次变换
p2 = homtrans(T, p)
对p中按列存储的点应用齐次变换T。
有坑,先过了
ishomog
检验SE(3)是否齐次变换
ishomog(T)
如果参数T的维数为4×4或4×4×N,是否为真(1),否则为假(0)。
ishomog(T, ‘valid’)
同上所述,还检验了旋转子矩阵的有效性。
注意
第一种形式是一个快速但不完整的转换测试SE(3)。
对SE(2)不成立
关联 isrot, isvec
还在更新,,预计在8.11日完成