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