用MATLAB三步完成机器人搭建
全世界只有3.14 %?的人關(guān)注了
爆炸吧知識
如果說機(jī)器人是一粒種子,那么《機(jī)器人大擂臺》這檔節(jié)目就是那個播種人。節(jié)目中,不同選手操縱著機(jī)器人,在擂臺上各顯神威 —— 沖撞、翻滾、撬杠、噴火等各種技能,總能令人眼花繚亂,同時點燃心中關(guān)于機(jī)器人的各種幻想。
圖片來自?https://giphy.com/gifs/
?如今的機(jī)器人應(yīng)用廣泛,機(jī)器人技術(shù)也開始源源不斷地向人類活動的各個領(lǐng)域滲透,機(jī)器人分揀系統(tǒng)和隨處可見的無人機(jī)。
例如機(jī)器人分揀系統(tǒng),顯著地提升了物流公司貨物配送的效率:
另一個例子是無人機(jī)。如果說分揀機(jī)器人還屬于各大物流公司的核心機(jī)密,如下凡天仙一般平日里難得一睹芳容,那無人機(jī)早已化身鄰家女孩,平易近人地裝點著我們的生活:
機(jī)器人的發(fā)展不會止步于此。2020年以來,新基建概念大熱,其三大方向更是與機(jī)器人產(chǎn)業(yè)密切相關(guān)。教育機(jī)器人、送餐機(jī)器人、情感機(jī)器人及自動駕駛技術(shù),都是機(jī)器人及自動化技術(shù)的下一個重要落地目標(biāo):
動圖來自《美國國家地理》
銀河補(bǔ)習(xí)班里有句經(jīng)典臺詞:“我的孩子,上的是全世界最好的補(bǔ)習(xí)班,銀河補(bǔ)習(xí)班。”今天,MATLAB就為你帶來宇宙最強(qiáng)機(jī)器人補(bǔ)習(xí)班,手把手教你如何建造屬于自己的機(jī)器人!?
許多人認(rèn)為 MATLAB 是數(shù)學(xué)或教育軟件。事實上,MATLAB 最初被廣泛采用是在控制工程領(lǐng)域,隨后開發(fā)了多種技術(shù)領(lǐng)先的算法包和工具箱,并被全球各大高校廣泛采納為數(shù)學(xué)教育軟件 [1]。即將進(jìn)入機(jī)器人補(bǔ)習(xí)班的你,準(zhǔn)備好了嗎?
第一步:安裝機(jī)器人工具箱
工欲善其事,必先利其器,我們首先需要安裝 MATLAB 的機(jī)器人工具箱(Robotics System Toolbox)。我們既可以上MathWorks 官網(wǎng) [2] 下載,又可以通過打開 MATLAB 主界面,單擊“添加項”(Add-Ons) 選項進(jìn)行操作。
然后在搜索欄中輸入?“Robotics System Toolbox”,進(jìn)入第一個搜索結(jié)果即可安裝:
目前軟件已更新至最新版本R2020a,增加更多功能,小伙伴可以嘗試康康
操作完成后,打開 MATLAB 并輸入
>> ver如果能找到如下信息
Robotics System Toolbox Version 2.x (Rxxxxx)那么恭喜,機(jī)器人工具箱已安裝成功!
第二步:你想要什么樣的機(jī)器人?建模是關(guān)鍵
我們要設(shè)計的第一個機(jī)器人,是一條可以自由轉(zhuǎn)動的機(jī)械手臂。在 MATLAB 中,機(jī)械手臂由不同的連桿(Link)通過關(guān)節(jié)(Joint)拼接而成。依活動狀態(tài)分,關(guān)節(jié)又可分為旋轉(zhuǎn)型和平移型,其意義顧名思義 [2]:
旋轉(zhuǎn)型與平移型連桿
為簡單起見,我們先創(chuàng)建一個三連桿的機(jī)械臂:
%設(shè)置 DH 參數(shù)dhparams = [0 pi/2 0 0; 0.4318 0 0 0; ]; robot?=?rigidBodyTree;?% 初始化機(jī)械臂body1?=?rigidBody( body1 );?%?定義第一個連桿jnt1 = rigidBodyJoint( jnt1 , revolute ); % 定義第一個關(guān)節(jié)setFixedTransform(jnt1,dhparams(1,:), dh );?body1.Joint?=?jnt1;?%?給底座加上關(guān)節(jié)addBody(robot,body1, base )?%?定義機(jī)械臂為機(jī)器人的底座 %?添加第二、三只連桿body2 = rigidBody( body2 ); jnt2 = rigidBodyJoint( jnt2 , revolute );body3 = rigidBody( body3 );jnt3?=?rigidBodyJoint( jnt3 , revolute );setFixedTransform(jnt2,dhparams(2,:), dh );setFixedTransform(jnt3,dhparams(3,:), dh );body2.Joint = jnt2;body3.Joint?=?jnt3;上面的 dhparams 是一個 n*4?矩陣(n 是機(jī)械臂的個數(shù)),被稱為 DH 參數(shù)(Denavit–Hartenberg parameters)。dhparams 的每一行由 [a alpha d theta] 四個變量組成,它們分別表示:
a:?關(guān)節(jié)(垂直連桿方向的)偏移量
alpha:?關(guān)節(jié)扭曲角度(垂直于兩個連桿構(gòu)成的平面的角度)
d:?關(guān)節(jié)(朝著連桿方向的)伸長量
theta:?關(guān)節(jié)起始旋轉(zhuǎn)角度(平行于兩個連桿構(gòu)成的平面的角度)
如果不小心忘了我們搭建的機(jī)器人長啥樣,那么下面的命令?
showdetails(robot)可以幫助我們回憶起它的基本特征:
而輸入下面的命令,我們即可一睹該機(jī)械手臂的廬山真面目:
addBody(robot,body2, body1 )addBody(robot,body3, body2 )show(robot);?%?畫圖因為我們只搭建了最基本的連桿和關(guān)節(jié),所以這個機(jī)械手臂難免有些瘦骨嶙峋。不過如果我們把上面的圖片放大,就可以看到每個連桿、關(guān)節(jié)的名字、序號和類型具體信息:
此外,我們還可以給連桿和關(guān)節(jié)賦予諸如質(zhì)量、轉(zhuǎn)動慣量、慣性矩陣之類的參數(shù),此處限于篇幅故略去之,有興趣的小伙伴可以參考鏈接 [1] 或 [2]。實踐出真知,理解以上概念最好的方式,就是逐個調(diào)整代碼中的參數(shù),觀測結(jié)果變化。
第三步:看!它左手右手一個慢動作!
我們已經(jīng)知道如何用 MATLAB 搭建一個簡單的機(jī)器人了。然而這樣搭建的機(jī)器人,和小朋友用積木搭建的玩具并無二致 —— 既然是用軟件做成的機(jī)器人,我們自然希望它能動起來。我們以加拿大機(jī)器人公司 Kinova 的第三代機(jī)械臂為例,來看看 MATLAB 如何讓這支麒麟臂動起來。
圖片來自?https://www.kinovarobotics.com/en/products/gen3-robot
在 MATLAB 界面中輸入
>> robot = loadrobot("kinovaGen3");>> showdetails(robot)我們可以看到輸出如下?
不難看出,第三代 Kinova 是由 8 根連桿和 8 個關(guān)節(jié)拼接而成。如果我們要想知道某個具體連桿的信息,例如名叫 “Shoulder_Link” 的連桿,?依次輸入
>> robot.getBody( Shoulder_Link ).Joint>> robot.getBody( Shoulder_Link ).Joint.JointToParentTransform>> robot.getBody( Shoulder_Link ).Joint.ChildToJointTransform即可分別查詢屬于該連桿的關(guān)節(jié),以及關(guān)節(jié)到母連桿和子連桿的轉(zhuǎn)移矩陣。如此一來,我們就可以從這種方法重建出第三代 Kinova 機(jī)械臂了!
現(xiàn)在我們有兩種方法可以讓讓機(jī)械臂動起來。第一種方法是通過變換關(guān)節(jié)旋轉(zhuǎn)角度的方式,這種方法叫正運動學(xué)(Forward kinematics);第二種方法是通過給定每個連桿末端位置,這種方法叫逆運動學(xué)(Inverse kinematics)。正運動學(xué)可以很方便地對機(jī)械臂進(jìn)行直接操控,而逆運動學(xué)則更有利于直接指定機(jī)械臂完成任務(wù),例如抓取處于某位置的快遞等等。這兩種方法各有千秋。
有幾何背景的讀者知道,n 維歐式空間中的剛體形變可分為平移(Translation)、旋轉(zhuǎn)(Rotation)和鏡像(Reflection)三種,這三種變化可以用群作用,或者矩陣來表示。由這三種作用組成的群叫做歐幾里得群(Euclidean Group)記作 E(n),因為 E(n) 中的元素都可以用矩陣表示,所以 E(n) n+1 階矩陣群的子群(具體解釋見下圖)。群 E(n) 中只由平移和旋轉(zhuǎn)(不含鏡像)構(gòu)成的子群叫做特殊歐幾里得群,記作 SE(n)。
下面我們 MATLAB 中的逆運動學(xué)函數(shù) inverseKinematics 來讓機(jī)械臂動起來。我們只需要定義出機(jī)械臂所要經(jīng)過的幾個路徑點的位置、速度以及加速度,MATLAB 即可通過對特殊歐幾里得群求逆來計算出整個機(jī)械臂所經(jīng)過的路徑,以及每個時刻的速度以及加速度等信息。
機(jī)械臂的初始位置。紅色點表示機(jī)械臂所要經(jīng)過的路徑點
%?初始化機(jī)械臂的逆運動學(xué)方程ik = inverseKinematics( RigidBodyTree ,robot);ikWeights = [1 1 1 1 1 1];ikInitGuess?=?robot.homeConfiguration; % 隨機(jī)設(shè)置一個初始狀態(tài) %?讓機(jī)器人動起來!for idx = 1:numel(trajTimes) % 解逆運動學(xué)方程 tgtPose = trvec2tform(q(:,idx) );????[config,info]?=?ik( EndEffector_Link , tgtPose,ikWeights,ikInitGuess);????ikInitGuess?=?config;?%?以上一時刻的狀態(tài)作為下一時刻的初始值% 畫出機(jī)器人的動態(tài)????show(robot,config, Frames , off , PreservePlot ,false);????title([ Trajectory?at?t?=? ?num2str(trajTimes(idx))]) drawnow end最后得到的軌跡圖如下:
有興趣的讀者可以修改上面代碼中的參數(shù)(例如路徑點的位置、機(jī)械臂的速度加速度等),來看看結(jié)果會出現(xiàn)怎樣的變化。
更高級的智能
在實際使用中,除了要讓機(jī)器人會動外,還需要賦予它們自主性。在本節(jié)中,我們希望機(jī)器人擁有路徑規(guī)劃以及障礙躲避的能力,讓我們來一起見證什么是更高級的智能。
我們以即時定位與地圖構(gòu)建算法(Simultaneous localization and mapping,SLAM)作為例子。該算法可以通過著名的卡曼濾波(Kalman Filter)來得以實現(xiàn)。在如雷達(dá)、聲吶、天氣預(yù)報、火箭發(fā)射、計算機(jī)視覺、控制理論等諸多工程應(yīng)用中,都離不開卡曼濾波的身影。
從抽象角度看來,卡曼濾波無非就是傳感器不斷根據(jù)外部環(huán)境,調(diào)控機(jī)器狀態(tài)的一種裝置。記機(jī)器狀態(tài) x (位置、速度等),傳感器測量的外部環(huán)境變量為?z(溫度、氣壓等),可調(diào)控的變量為 u?(電磁波發(fā)射頻率、前進(jìn)方向等),v 和 w 分別表示機(jī)器和傳感器誤差,那么卡曼濾波可以表達(dá)為一個數(shù)學(xué)模型:
k 表示離散的時刻。如果 f 和 h 都是線性矩陣,那直接讓上面兩式對 x, z 分別求偏導(dǎo)數(shù),然后再更新 x 和 z 的值即可(F_a, H_a 分別表示 f 和 h 對變量 a 的偏導(dǎo)數(shù)向量):
如果 f 和 h 并非線性,由于誤差項的累計,直接簡單粗暴地線性化勢必會帶來更大的誤差。為此,人們采用預(yù)測-更新(Predict-Update)兩階段算法來解決非線性的卡曼濾波問題 —— 在預(yù)測階段,我們不僅要預(yù)測機(jī)器的狀態(tài) x,還要預(yù)測卡曼濾波的矩陣 P。這種算法叫擴(kuò)展卡曼濾波(Extended Kalman Filter,EKF),是 SLAM 的靈魂所在,有興趣的讀者可參考文獻(xiàn)?[2]。
P<k> 是卡曼濾波在時刻 k 的協(xié)方差矩陣,該矩陣在更新變量 x 時會起到作用
推導(dǎo)過程令人頭禿?那我們來看一看代碼及實現(xiàn)過程吧!
%?初始化機(jī)器人及起始點、終點%?我們的目的是希望機(jī)器人能順利躲過障礙物并到達(dá)終點map?=?LandmarkMap(20,?10);?%?10*10?地圖,20 個障礙物V?=?diag([0.005,?0.5*pi/180].^2);?%?機(jī)器(每個步長)的誤差矩陣robot = Bicycle( covar , V); % 初始化機(jī)器人robot.add_driver(?RandomPath(10)); % 定義終點%?定義傳感器% angle:傳感器掃射角度范圍% range:傳感器掃射距離W?=?diag([0.1,?1*pi/180].^2);?% 傳感器(每個步長)的誤差矩陣sensor?=?RangeBearingSensor(robot,?map,? covar ,?W, ...??? animate ,? angle ,?[-pi/2?pi/2],? range ,?5); %?初始化?EKF,?并運行?150?個步長P0 = diag([0.005, 0.005, 0.001].^2); % 卡曼濾波初始時刻的協(xié)方差矩陣ekf?=?EKF(robot,?V,?P0,?sensor,?W,?[]);ekf.run(150);上圖中藍(lán)色三角形表示機(jī)器人,紅色菱形表示目標(biāo),粉紅色扇形表示傳感器掃查范圍
造機(jī)器人?就是如此簡單!
讀到這里,相信大家對 MATLAB 的機(jī)器人工具包已經(jīng)有了充足的認(rèn)識。身邊無人陪伴倍感孤獨?—— MATLAB 幫你打造屬于你自己的機(jī)器人!
機(jī)器人行業(yè)快速發(fā)展的同時,要面臨各種各樣的機(jī)遇和挑戰(zhàn)。MATLAB 的機(jī)器人工具包也一樣,仍需不斷的革新和研發(fā),在以下方面得以改善:
工具包沒有覆蓋機(jī)器視覺方面的內(nèi)容,因此機(jī)器人的傳感器只能處理非圖像環(huán)境信息。要想給機(jī)器人加一雙眼睛,需要下載計算機(jī)視覺工具箱(Computer Vision Toolbox)或圖像處理工具箱(Image Processing Toolbox);
工具包無法利用大數(shù)據(jù),這在高度信息化的今天,對機(jī)器人的成長是不利的。要想讓機(jī)器人擁有大數(shù)據(jù)處理技能,需要統(tǒng)計及機(jī)器學(xué)習(xí)工具箱(Statistics and Machine Learning Toolbox)或深度學(xué)習(xí)工具箱(Deep Learning Toolbox)。?
小時候在看《終結(jié)者》、《黑客帝國》等科幻電影時,總認(rèn)為像“機(jī)器人三定律”這樣的元素離真實世界還很遙遠(yuǎn)。然而隨著計算機(jī)視覺、機(jī)器學(xué)習(xí)、深度學(xué)習(xí)等人工智能相關(guān)領(lǐng)域的迅速發(fā)展,這些科幻電影里的元素會離現(xiàn)實越來越近。小編希望這篇文章能對大家有所啟發(fā),真正的學(xué)習(xí)要從興趣開始,而總有一天,你我會圓夢在今朝!?
號外:5月28日北京時間13:30,線上技術(shù)研討會(機(jī)器人與人工智能專題):加速智能化融合,提高產(chǎn)品開發(fā)效率開播,感興趣的小伙伴可以掃描二維碼或點擊閱讀原文報名參與喲!
參考文獻(xiàn)
[1]https://ww2.mathworks.cn/campaigns/products/trials.html?prodcode=RO&s_eid=PEP_23398
[2]?https://ww2.mathworks.cn/products/robotics.html?s_eid=PEP_23398
[3]?蔡自興, 謝斌. 《機(jī)器人學(xué)》. 清華大學(xué)出版社; 2000.
[4]https://www.mathworks.com/matlabcentral/fileexchange/71130-trajectory-planning-for-robot-manipulators
總結(jié)
以上是生活随笔為你收集整理的用MATLAB三步完成机器人搭建的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何交到一个女朋友?
- 下一篇: 分享一个理工男必学的撩妹姿势