MATLAB-Robotics工具箱(3)機器人學課程中期作業MassageRobot仿真

第二學期開始上機器人學課程,用上以前玩的MATLAB-Roboitcs ToolBox

中期作業的目標:建立一個按摩機器人的仿真機械臂系統,畫出機械臂按摩的工作空間(合理,可演示)

週末兩天搞了一個四自由度和一個六自由度的機械臂模型來畫工作空間,這裏下載資源要積分,這個分享出去,兩個機器人的模型和具體代碼在這個GitHub。參考了以前上過課的師兄師姐的代碼,老師那套代碼是自己寫的底層,沒有用到Roboitcs ToolBox,但是實現的功能上來說,當然工具箱會豐富的多。

這裏我使用的是工具箱的底層代碼來實現,工具箱的使用教程網上已經非常多了
https://blog.csdn.net/xuehuafeiwu123/article/category/6454679
https://blog.csdn.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上看。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章