基于Matlab|基于Matlab Robotics Toolbox的Dobot机械臂运动规划(1)

【基于Matlab|基于Matlab Robotics Toolbox的Dobot机械臂运动规划(1)】【基于Matlab Robotics Toolbox的Dobot机械臂运动规划】
系列文章是我在学习robotics toolbox中所做工作的记录,方便自己后面复习、改进。
基于Matlab R2018b 9.5; Peter Corke的Robotics Toolbox 10.3.1
(1)主要介绍了机器人D-H表建立、画直线和画圆

0.软件环境 MATLAB 版本: 9.5.0.944444 (R2018b)
Robotics Toolbox for MATLAB 版本:10.3.1
1.Dobot机械臂结构模型 为了对机械臂进行建模,从越疆官网下载Dobot Magician User Guide V1.5.1。
由用户手册图3.2及表3.2,
基于Matlab|基于Matlab Robotics Toolbox的Dobot机械臂运动规划(1)
文章图片

得到机械臂的Denavit-Hartenberg参数表:

连杆i 关节变量θ 连杆偏距d 连杆长ai-1 轴转角αi-1 变量范围
1 θ1 138 0 pi/2 rad -90°~90°
2 θ2 0 135 0 rad 0°~85°
3 θ3 0 147 0 rad -90°~10°
其中,大臂与底座z轴成90°(pi/2)角。
于是有:
clear all; close all; %定义连杆% %thetadaalpha L1 = Link([0138 0pi/2]); L2 = Link([00 1350]); L3 = Link([00 1470]); %定义关节角范围% L1.qlim = [deg2rad(-90) deg2rad(90)]; L2.qlim = [deg2rad(0) deg2rad(85)]; L3.qlim = [deg2rad(-90) deg2rad(10)]; %连接连杆% dobot = SerialLink([L1 L2 L3],'name','Dobot');

这里定义连杆时使用的是弧度单位;定义关节角范围时,使用了deg2rad()。应注意区分。
机械臂搭建完成后,可以使用dobot.plot([0 0 0 ]); 显示机器人,然后使用dobot.teach; 可以用滑块驱动机器人。
plot有时候会弹出
警告: floor tiles too small, making them 300.000000 x bigger - change the size or disable them
可改成dobot.plot([0 0 0],'tilesize',300);
2.画一个两点之间的线段 基于Matlab|基于Matlab Robotics Toolbox的Dobot机械臂运动规划(1)
文章图片

先做一个简单的demo试试吧。
在teach中拖动滑块,找到两个合适的点,用ctraj做运动规划。
这里用了(200,120,40)和(220,-150,220)两个点。
在robotics toolbox的帮助文档里,ctraj()要求输入始末点的齐次变换矩阵,其中transformation matrix可用transl()得到。
于是有:
%直线规划测试% T1 = transl(200,120,40); %起点 T2 = transl(220,-150,220); %终点 %ctraj 利用匀加速匀减速规划轨迹% T = ctraj(T1,T2,50); Tj = transl(T); %输出末端轨迹% plot3(Tj(:,1),Tj(:,2),Tj(:,3)); grid on;

于是得到了由起点至终点的一系列齐次变换矩阵T,接下来用ikine进行逆运动学求解。
这时,如果直接使用q = dobot.ikine(T); 会报错:
错误使用 SerialLink/ikine
Number of robot DOF must be >= the same number of 1s in the mask matrix
因ikine不能直接解6自由度以下的机器人。查robotics toolbox帮助文档,发现SerialLink.ikine的options里有一项'mask',M
mask vector (6 × 1) that correspond to translation in X, Y and Z, and rotation about X, Y and Z respectively.
我这里没有XYZ三个方向的rotation自由度,应构造一个mask矩阵[1 1 1 0 0 0]。
于是有:
%当反解的机器人对象的自由度少于6时,要用mask vector减少自由度% q = dobot.ikine(T,'mask',[1 1 1 0 0 0]); %调整了一下角度,方便观察% view(113,23); dobot.plot(q,'tilesize',200);

画直线结果如下:
基于Matlab|基于Matlab Robotics Toolbox的Dobot机械臂运动规划(1)
文章图片

3.画一个圆 参考上面画直线的方法,发现只要有起点到终点的一系列齐次变换矩阵,便可由ikine进行逆运动学求解,就能让机械臂动起来。
画一个以(175,0,5)为圆心,半径为50的圆。代码如下:
%定义连杆% %thetadaalpha L1 = Link([0138 0pi/2]); L2 = Link([00 1350]); L3 = Link([00 1470]); %定义关节角范围% L1.qlim = [deg2rad(-90) deg2rad(90)]; L2.qlim = [deg2rad(0) deg2rad(85)]; L3.qlim = [deg2rad(-90) deg2rad(10)]; %连接连杆% dobot = SerialLink([L1 L2 L3],'name','Dobot'); %定义圆% N = (0:0.5:100)'; center = [175 0 5]; radius = 50; theta = ( N/N(end) )*2*pi; points = (center + radius*[cos(theta) sin(theta) zeros(size(theta))])'; plot3(points(1,:),points(2,:),points(3,:),'r'); %pionts矩阵是“横着”的,取其转置矩阵,进一步得到其齐次变换矩阵 T = transl(points'); %当反解的机器人对象的自由度少于6时,要用mask vector进行忽略某个关节自由度% q = dobot.ikine(T,'mask',[1 1 1 0 0 0]); hold on; dobot.plot(q,'tilesize',300);

画圆结果如下:
基于Matlab|基于Matlab Robotics Toolbox的Dobot机械臂运动规划(1)
文章图片

    推荐阅读