大三下(本學期)《工業機器人》課程作業,要求利用Matlab Robotics ToolBox完成對埃夫特ER3A-C60六軸機器人的正逆運動學分析。除了DH參數不一樣外,其余知識同之前的文章對斯坦福機械手的建模類似。
一、建模對象
埃夫特ER3A-C60六軸機器人。

二、D-H法建模分析
6個關節均為旋轉副,利用D-H對機器人手臂建立坐標系如下:

制D-H參數表如下:


三、Matlab Robotics ToolBox建模分析
3.1、關節定義
%關節定義
% th d a alpha sigma
L(1) = Link([ pi/2 321.5 50 pi/2 0]);
L(2) = Link([ pi/2 0 270 0 0]);
L(3) = Link([ 0 0 70 pi/2 0]);
L(4) = Link([ 0 299 0 -pi/2 0]);
L(5) = Link([ 0 78.5 0 pi/2 0]);
L(6) = Link([ 0 0 0 0 0]);
3.2、關節限位
通過參考手冊,可以知道埃夫特ER3A-C60六軸機器人具有如下關節限位:

因此,修改關節qlim屬性如下:
% 關節參數范圍限定
L(1).qlim = [-167 167]*pi/180;
L(2).qlim = [-130 90]*pi/180;
L(3).qlim = [-71 101]*pi/180;
L(4).qlim = [-180 180]*pi/180;
L(5).qlim = [-113 113]*pi/180;
L(6).qlim = [-360 360]*pi/180;
3.3、觀察模型
給定初始關節角:
init = [0 pi/2 0 0 0 0];%初始關節參數
%工作區定義
w=[-1000,1000,-1000,1000,-1000,1000]:
figure
efort.plot(init,'workspace',w);%畫出圖像
title('初始狀態');
結果顯示如左圖所示,對比右圖可以驗證建模結果是正確的:

3.4、工作空間
通過在關節角限位內隨機取1000個關節角狀態,繪制機械臂末端到達的空間點位置,可以近似得到機械臂的工作空間形狀:

3.5、正逆運動學分析
3.5.1、正運動學分析
給定期望關節角,求位姿:


輸出結果:


機械臂狀態:


動畫演示:

3.5.2、逆運動學分析
給定期望位姿,求解關節角(此處為便於驗證,將期望位姿設置為正運動分析所得到的位姿結果)。
期望位姿:




輸出結果:


由輸出結果可以看出,第二組運動學逆解求得的關節角 \(theta1\) 中我們設定的第二組期望關節角 \(aid1\) 有所不同:

進一步觀察此時機械臂狀態(左圖):

可以發現此時的機械臂末端確實到達了我們期望的位姿(右圖),但是各關節角狀態並不符合我們的要求。同時,細心觀察結果,可以發現此時由逆解計算得到的關節角狀態已經超過機械臂的關節限位。
三、總結
Matlab Robotics Toolbox的ikine函數在求機械臂運動逆解時,由於未考慮機械臂的限位及機械臂狀態(比如左手/右手、肘部在上/肘部在下、手腕翻轉/手腕不翻轉),會導致出現我們不想要的解的狀態。怎么解決?試試求解析解吧🚀 (過於復雜,我已經忘了怎么求了嘻嘻🍄)
四、附matlab源碼
close all
clc
%關節定義
% th d a alpha sigma
L(1) = Link([ pi/2 321.5 50 pi/2 0]);
L(2) = Link([ pi/2 0 270 0 0]);
L(3) = Link([ 0 0 70 pi/2 0]);
L(4) = Link([ 0 299 0 -pi/2 0]);
L(5) = Link([ 0 78.5 0 pi/2 0]);
L(6) = Link([ 0 0 0 0 0]);
% %關節參數范圍限定
L(1).qlim = [-167 167]*pi/180;
L(2).qlim = [-130 90]*pi/180;
L(3).qlim = [-71 101]*pi/180;
L(4).qlim = [-180 180]*pi/180;
L(5).qlim = [-113 113]*pi/180;
L(6).qlim = [-360 360]*pi/180;
efort = SerialLink(L, 'name', 'EFORT');%創建機器人
t = 0:0.5:8;%采樣時間
init = [0 pi/2 0 0 0 0];%初始關節參數
%期望關節參數 第一組
aid0 = [0 0 0 0 0 0];
%運動軌跡求解,第一組
[q0,qd0,qdd0]=jtraj(init,aid0,t);%運動軌跡求解,q為位移,qd為速度,qdd為加速度
Theta0 = q0(17,:)/pi*180;
Theta0
%正運動學分析 第一組
T0=efort.fkine(aid0);
T0
%逆運動學分析 第一組
theta0 =efort.ikine(T0);
theta0 = theta0/pi*180;%轉換為角度
theta0
%
%期望關節參數 第二組
aid1 = [3*pi/4 pi/4 0 pi/4 -pi/2 0];
%運動軌跡求解,第二組
[q1,qd1,qdd1]=jtraj(aid0,aid1,t);%q為位移,qd為速度,qdd為加速度
Theta1 = q1(17,:)/pi*180;
Theta1
%正運動學分析 第二組
T1=efort.fkine(aid1);
T1
%逆運動學分析 第二組
theta1 =efort.ikine(T1);
theta1 = theta1/pi*180;%轉換為角度
theta1
% %工作區定義
w=[-1000,1000,-1000,1000,-1000,1000];
waitforbuttonpress;%等待按鍵
figure
efort.plot(init,'workspace',w);%畫出圖像
title('初始狀態');
waitforbuttonpress;%等待按鍵
efort.plot(q0,'workspace',w);%畫出動態動作圖像
title('動作一');
waitforbuttonpress;%等待按鍵
efort.plot(q1,'workspace',w);%畫出動態動作圖像
title('動作二');