MATLAB-Robotics工具箱(3)机器人学课程中期作业MassageRobot仿真
第二学期开始上机器人学课程,用上以前玩的MATLAB-Roboitcs ToolBox
中期作业的目标:建立一个按摩机器人的仿真机械臂系统,画出机械臂按摩的工作空间(合理,可演示)
周末两天搞了一个四自由度和一个六自由度的机械臂模型来画工作空间,这里下载资源要积分,这个分享出去,两个机器人的模型和具体代码在这个GitHub。参考了以前上过课的师兄师姐的代码,老师那套代码是自己写的底层,没有用到Roboitcs ToolBox,但是实现的功能上来说,当然工具箱会丰富的多。
这里我使用的是工具箱的底层代码来实现,工具箱的使用教程网上已经非常多了
https://blog.****.net/xuehuafeiwu123/article/category/6454679
https://blog.****.net/jldemanman/article/details/79229312
这些都是一些基本操作的代码,简单易懂
我在这些基础上加上自己定义的工作空间和灰度化后的图像当目标,形成一个工作空间。
基本的实现结果如图
红色是机器人末端按摩过程的工作空间,黑色是人体背部灰度化图像
在这个过程中有几个问题
1/
我只定义了末端的目标点的三维坐标位置,没有定义姿态
就是,只用了坐标变换的位移变换,没有用旋转变换,其实可以用旋转变换,可以使机器人的姿态多变,能够到达更多的角度,但是我还没找到一个完美的解决办法取寻找可定义旋转的角度值。
这个问题导致后面描点的时候出现机器人逆变换反解的时候是空解,就是不能使末端以这个姿态到达目的区域,所以那两天我在设置图像位置来满足所有可到达的工作空间这个问题上花了至少一天的时间(单单对6自由度机械臂而言,我的四自由度机械臂做的非常简单,很好实现目标任务)
2/(问题解决)
四自由度机械臂正逆变换
在工具箱可以定义四自由度的机械臂,我也参照了网上的方法,用不同的LINK函数方式构造存在一个移动关节的机械臂(嘿嘿嘿)
构造代码如下:
%建立机器人模型
global L1 L2 L3 L4 L5 L6
global robot
L1=Link('d',0,'a',5.5,'alpha',0);
L2=Link('d',0,'a',4.5,'alpha',0);
L3=Link('d',0,'a',0,'alpha',-pi);
L4=Link('theta',0,'a',0,'alpha',0);%三自由度机械臂,最后末端加入工具或者移动关节,整体四自由度
L5=Link('d',0,'a',0,'alpha',0);
L6=Link('d',0,'a',0,'alpha',0);
L4.qlim=[0 5];%移动关节长度限制
robot = SerialLink([L1 L2 L3 L4 L5 L6],'name','Massage_Robot');
% q=[pi/2 0 0 0 0 0];
% robot.plot(q);
单纯的构造一个四自由度机械臂只需要四个LINK加一个serialink就能完成,但是这里有个麻烦的地方,在求四自由度机械臂正反变换矩阵的时候,工具箱需要用在robot.ifine or robot.kfine函数中添加option来表示我这个机械臂是四自由度的,默认状态下他是六自由度的解算方式。
OJBK,我就多加了俩旋转关节,重复覆盖在第四个关节位置,看上去和用起来都是四自由度机械臂。
3/
构造最大最小角度
这种描点的方法快,不需要步进的动机械臂,也就没有演示效果。得到的点密度有稀疏有密集的地方,但是取的随机点够多,就能密集,但是会变慢。
%建立机器人模型
clear;
clc;
% theta d a alpha offset
L1=Link([0 0 2 0 0 ]); %定义连杆的D-H参数
L2=Link([0 0 1.8 0 0 ]);
L3=Link([0 0 0.8 0 0 ]);
% L4=Link([0 0 1 0 0 ]);
% L5=Link([0 0 2 0 0 ]);
% L6=Link([0 0 2 0 0 ]);
robot=SerialLink([L1 L2 L3 ],'name','manman'); %连接连杆,机器人取名manman
A=unifrnd(-pi,pi/2,[1,30000]);%第一关节变量限位
B=unifrnd(-pi/2,pi/2,[1,30000]);%第二关节变量限位
C=unifrnd(-pi,pi,[1,30000]);%第三关节变量限位
G= cell(30000, 3);%建立元胞数组
for n = 1:30000
G{n} =[A(n) B(n) C(n)];
end %产生3000组随机点
H1=cell2mat(G); %将元胞数组转化为矩阵
T=double(robot.fkine(H1)); %机械臂正解
figure(1)
scatter3(squeeze(T(1,4,:)),squeeze(T(2,4,:)),squeeze(T(3,4,:)))%随机点图
robot.plot([pi/2 pi/4 0],'workspace',[-5 5 -5 5 -5 5 ],'tilesize',2)%机械臂图
(网上代码,参照)
我遇到的问题就这几个,具体代码细节还是在GIthub上看。