技術(shù)干貨 | Matlab機(jī)器人工具箱—機(jī)器人的建立、繪制與正逆運(yùn)動(dòng)學(xué)
文 | BFT機(jī)器人
01
引言
很多小伙伴在初學(xué)機(jī)器人學(xué)的時(shí)候,面對(duì)大量的概念和復(fù)雜的公式,往往不知道從何開(kāi)始入手。一味的啃機(jī)器人學(xué)的概念和公式枯燥又無(wú)味,堅(jiān)持不了幾天就從入門(mén)到放棄一條龍走完了。
堅(jiān)持下去的動(dòng)力之一就是能盡快看到自己的學(xué)習(xí)成果,而MATLAB機(jī)器人工具箱就是非常簡(jiǎn)單的機(jī)器人平臺(tái)快速搭建工具。
本文主要介紹如何使用matlab工具箱建立機(jī)器人模型,并對(duì)其進(jìn)行繪制。這里使用的RTB工具箱10.2版本,不同版本間代碼風(fēng)格可能會(huì)有差異,因此請(qǐng)注意工具箱的使用版本。
02
rtbdemo
rtbdemo是工具箱自帶的一個(gè)歷程腳本,在命令行窗口輸入:

就會(huì)蹦出來(lái)一個(gè)GUI界面:

如字面意思,左邊一列是通用函數(shù)的例子(如:旋轉(zhuǎn),平移,軌跡等);中間主要是機(jī)械臂的基礎(chǔ)函數(shù),右邊為移動(dòng)機(jī)器人的一些歷程。這些功能都寫(xiě)的很清楚了,都可以隨便點(diǎn)點(diǎn)看,會(huì)很有意思。
本博客主要專注于機(jī)械臂的搭建和使用,因此會(huì)對(duì)前兩列的函數(shù)進(jìn)行展開(kāi)介紹。
03
機(jī)器人的建立
以經(jīng)典的4軸機(jī)械臂Scara為例(因?yàn)榧扔修D(zhuǎn)動(dòng)關(guān)節(jié)又有移動(dòng)關(guān)節(jié)),介紹一下機(jī)械臂建立的步驟,首先上代碼:
運(yùn)行這段代碼,會(huì)出現(xiàn):

OK,現(xiàn)在可以感受下成果了。拖動(dòng)左邊的q1—q4就可以看到建立的機(jī)器人動(dòng)起來(lái)了!
說(shuō)明:q1—q4右邊的數(shù)值為角度制,xyz為工具坐標(biāo)系在世界坐標(biāo)系的位置,rpy表示相對(duì)世界坐標(biāo)系的旋轉(zhuǎn),定義可參見(jiàn):
https://blog.csdn.net/lyhbkz/article/details/83542248
代碼解析:
單個(gè)Link的解釋
theta ? ? ?d ? ? ? ?a ? ? ? ?alpha
L(1)=Link([ ?0 ? ? ? ? d1 ? ? ?a1 ? ? ?alpha1]); L(1).qlim=[-pi,pi];
L(2)=Link([ ?0 ? ? ? ? d2 ? ? ?a2 ? ? ?alpha2]); L(2).qlim=[-pi,pi]; L(2).offset=pi/2;
L(3)=Link([ ?0 ? ? ? ? d3 ? ? ?a3 ? ? ?alpha3]); L(3).qlim=[-pi,pi];
% 移動(dòng)關(guān)節(jié)需要特別指定關(guān)節(jié)類型--jointtype
L(4)=Link([theta4 ? ? ? 0 ? ? ?a4 ? ? ?alpha4]); L(4).qlim=[0,180]; L(4).jointtype='P';
Link函數(shù)是根據(jù)DH參數(shù)建立連桿,其中包含了關(guān)節(jié)的信息,DH的輸入順序見(jiàn)代碼;
qlim指定關(guān)節(jié)極限,注意,工具箱中的移動(dòng)關(guān)節(jié)變量不允許有負(fù)值;
jointtype指定關(guān)節(jié)類型,默認(rèn)為轉(zhuǎn)動(dòng)關(guān)節(jié),L(4).jointtype='P’意味著第四根link是由移動(dòng)關(guān)節(jié)連接的;
offset為關(guān)節(jié)初始值的偏置。這里要注意的是,定義好關(guān)節(jié)類型后,相應(yīng)的變量必須為0,初值必須由offset定義,例如,關(guān)節(jié)2為轉(zhuǎn)動(dòng)關(guān)節(jié),那么L(2)的theta必須為0,但是我們又希望初始狀態(tài)下關(guān)節(jié)2能有一個(gè)偏置,那么就通過(guò) L(2).offset=pi/2;來(lái)實(shí)現(xiàn)。
另外這里還有一個(gè)常用的基于改進(jìn)的DH建立模型的方法,程序中沒(méi)有說(shuō)明,格式為:

文章附錄->六軸機(jī)器人改進(jìn)的DH方法demo中為關(guān)于此用法的demo。
以上為建立連桿時(shí)常用的函數(shù),但工具箱對(duì)link的定義遠(yuǎn)不至此,如有更多需求,可在命令行窗口輸入:

來(lái)查看官方幫助文檔,說(shuō)到這里不得不提一句,學(xué)習(xí)無(wú)論是機(jī)器人工具箱還是matlab基礎(chǔ)的學(xué)習(xí),help函數(shù)都非常有用!
建立機(jī)器人整體的解釋

L為剛剛建立好的四根link,‘name’為可選項(xiàng),可以不加,就是給機(jī)器人取個(gè)名字,看它骨骼驚奇,這里就叫它‘Scara’啦。
同樣的,SerialLink函數(shù)還有其他的可選則項(xiàng)在此不一一介紹,欲了解則:

這條語(yǔ)句就建立了一個(gè)叫Scara的機(jī)器人類型的對(duì)象,下面就可以對(duì)他操作了。

具體含義為,把我們的Scara基部沿著z軸平移305mm,工具坐標(biāo)系則以最后一個(gè)坐標(biāo)為基礎(chǔ),沿z方向平移100mm。
transl函數(shù)涉及到工具箱中對(duì)旋轉(zhuǎn)、平移以及齊次坐標(biāo)的變換,可參考:
https://blog.csdn.net/weixin_43502392/article/details/105468060

字面意思,對(duì)機(jī)器人進(jìn)行示教。
04
繪制
上一節(jié)已經(jīng)介紹了teach()函數(shù),本節(jié)將簡(jiǎn)要介紹一下plot函數(shù)。
在上述代碼中加入:

即可繪制機(jī)器人關(guān)節(jié)變量為[pi/6 0 pi/3 150]時(shí)的機(jī)器人狀態(tài):

如果joint是一個(gè)數(shù)組,如:

則會(huì)繪制機(jī)器人運(yùn)動(dòng)的動(dòng)畫(huà),其中joint的列數(shù)必須和關(guān)節(jié)數(shù)目相同
其中,’jointdiam‘設(shè)置關(guān)節(jié)的圓柱體直徑的大小,‘fps’**設(shè)置繪制動(dòng)畫(huà)的幀率,,'trail’會(huì)繪制出末端的軌跡
更多plot函數(shù)的可選項(xiàng),照舊help:

有時(shí)候需要像博主一樣把結(jié)果展示給別人看,因此我把繪制動(dòng)圖的程序放在了附錄-> 繪制動(dòng)圖中,供參考。
更多關(guān)于可視化的使用方法將在機(jī)器人軌跡規(guī)劃一章中進(jìn)行介紹。
05
正運(yùn)動(dòng)學(xué)

傻瓜式操作,輸入關(guān)節(jié)角度,輸出SE3類的齊次變換矩陣
06
逆運(yùn)動(dòng)學(xué)

T為我們剛剛正解得到的齊次變換矩陣,輸出為關(guān)節(jié)向量。
常用可選項(xiàng):
‘mask’,M: mask vector (6x1) that correspond to translation in X, Y and Z, and rotation about X, Y and Z respectively.這里Scara機(jī)器人只有四個(gè)自由度,在x,y兩個(gè)方向的旋轉(zhuǎn)不存在自由度,因此為[1 1 1 0 0 1];
’q0’,Q為求解提供一個(gè)關(guān)節(jié)初值,因?yàn)閿?shù)值法逆解可能不會(huì)收斂到想要的構(gòu)型,提供一個(gè)初值,可以增大得到我們想要構(gòu)型的概率。
’lambda’,L :initial value of lambda (default 0.1) 數(shù)值解法的步長(zhǎng),如果求解失敗,可以減小步長(zhǎng)再嘗試,當(dāng)然減小步長(zhǎng)意味著求解時(shí)間更長(zhǎng);
’tol’,T容許誤差,精度要求不高的話可以適當(dāng)調(diào)大一點(diǎn),默認(rèn)為1e^-10
’ilimit’,L迭代的最大次數(shù),求解失敗時(shí)可以適當(dāng)增大重新嘗試。
’transpose’,A迭代時(shí)使用雅克比的轉(zhuǎn)置代替?zhèn)文?,關(guān)于這兩種方法的異同和思想,可參考下面推薦的知乎鏈接。
其他可選項(xiàng)有需求可參考

Note:
令人頭疼的逆解,在matlab工具箱里也是傻瓜操作。但這里是數(shù)值法,僅能求解一組解,多解情況考慮不到,且求解容易失敗。
進(jìn)行軌跡規(guī)劃時(shí)也容易跳躍,所以熟悉值后還是自己寫(xiě)逆運(yùn)動(dòng)學(xué)的解析解吧。另外關(guān)于工具箱數(shù)值解法的解析,可以看知乎上的回答:
https://www.zhihu.com/question/41673569?sort=created
微分運(yùn)動(dòng)學(xué)(求雅克比矩陣)

繼續(xù)傻瓜操作。
輸入關(guān)節(jié)角,輸出6xN的雅克比矩陣,N為機(jī)械臂的自由度數(shù),這里N為4。
有時(shí)候需要求雅克比矩陣的逆或偽逆,順便一提matlab矩陣求逆和偽逆的函數(shù):

07
總結(jié)
本文主要介紹了matlab機(jī)器人工具箱一些基礎(chǔ)函數(shù)的使用方法,主要包括機(jī)械臂的建立,繪圖,以及基礎(chǔ)的運(yùn)動(dòng)學(xué)方法。
篇幅和精力有限,一些函數(shù)的擴(kuò)展介紹僅包括高頻使用的內(nèi)容,如果需要用到一些沒(méi)有列舉到的方法,找matlab的help文檔即可。
后面會(huì)繼續(xù)更新軌跡規(guī)劃,動(dòng)力學(xué)相關(guān)的一些用法。
08
附錄
六軸機(jī)器人改進(jìn)的DH方法demo

clear ; clc; close all;
% 機(jī)器人各連桿參數(shù)值
d1 = 670;
d2 = 0;
d3 = 0;
d4 = 1280;
d5 = 0;
d6 = 215;
a1 = 0;
a2 = 312;
a3 = 1075;
a4 = 225;
a5 = 0;
a6 = 0;
alpha1 = 0 / 180 * pi;
alpha2 = -90 / 180 * pi;
alpha3 = 0 / 180 * pi;
alpha4 = -90 / 180 * pi;
alpha5 = 90 / 180 * pi;
alpha6 = -90 / 180 * pi;
% 建立連桿DH參數(shù)(修正的DH)
L(1)=Link([0 d1 a1 alpha1], 'modified'); L(1).qlim=[-pi,pi];
L(2)=Link([0 d2 a2 alpha2], 'modified'); ?L(2).qlim=[-pi,pi];L(2).offset = -pi/2;
L(3)=Link([0 d3 a3 alpha3], 'modified'); L(3).qlim=[-pi,pi];
L(4)=Link([0 d4 a4 alpha4], 'modified'); L(4).qlim=[-pi,pi];
L(5)=Link([0 d5 a5 alpha5], 'modified'); L(5).qlim=[-pi,pi];
L(6)=Link([0 d6 a6 alpha6], 'modified'); L(6).qlim=[-pi,pi];
% 定義機(jī)器人
FANUC=SerialLink(L(1:6),'name','FANUC');
FANUC.tool = transl(0,0,100);
FANUC.teach();
繪制動(dòng)圖

版權(quán)聲明:本文為CSDN博主「JY.G」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:
https://blog.csdn.net/weixin_43502392/article/details/105447785
更多精彩內(nèi)容請(qǐng)關(guān)注公眾號(hào):BFT機(jī)器人
版權(quán)歸BFT機(jī)器人所有,如需轉(zhuǎn)載請(qǐng)與我們聯(lián)系。若您對(duì)該文章內(nèi)容有任何疑問(wèn),請(qǐng)與我們聯(lián)系,將及時(shí)回應(yīng)。