械臂從零到一:硬件選型、運(yùn)動(dòng)學(xué)與調(diào)試實(shí)戰(zhàn))
1. 從6DoF說(shuō)起這臺(tái)機(jī)械臂到底在折騰什么1.1 自由度到底是什么為什么是六個(gè)六自由度機(jī)械臂圈內(nèi)人一般直接叫6DoF Robotic Arm。第一次接觸這個(gè)項(xiàng)目的朋友可能覺(jué)得它不過(guò)是個(gè)能轉(zhuǎn)六個(gè)關(guān)節(jié)的鐵架子但真正動(dòng)手做過(guò)才知道從結(jié)構(gòu)設(shè)計(jì)、電機(jī)選型到運(yùn)動(dòng)學(xué)解算、控制調(diào)參每一環(huán)都能把人折磨得夠嗆。我在實(shí)驗(yàn)室和產(chǎn)線上摸爬滾打了這些年前前后后經(jīng)手過(guò)好幾臺(tái)不同方案的六軸機(jī)械臂今天想把這套東西從零到一的完整路徑拆開(kāi)聊聊。先解決自由度這個(gè)基本概念。自由度Degrees of FreedomDoF指的是描述一個(gè)物體在空間中位姿所需的獨(dú)立參數(shù)個(gè)數(shù)。一個(gè)剛體在三維空間里有6個(gè)自由度3個(gè)平動(dòng)沿X、Y、Z軸的平移加3個(gè)轉(zhuǎn)動(dòng)繞X、Y、Z軸的旋轉(zhuǎn)也就是橫滾roll、俯仰pitch、偏航y(tǒng)aw。機(jī)械臂的每個(gè)關(guān)節(jié)本質(zhì)上就是一個(gè)自由度來(lái)源可以是旋轉(zhuǎn)關(guān)節(jié)revolute也可以是平移關(guān)節(jié)prismatic。6DoF機(jī)械臂通常是指擁有6個(gè)旋轉(zhuǎn)關(guān)節(jié)的串聯(lián)機(jī)械臂。為什么不是5個(gè)、也不是7個(gè)因?yàn)?個(gè)自由度恰好能覆蓋末端執(zhí)行器在三維空間里的完整位姿。少于6個(gè)末端姿態(tài)會(huì)受限比如常見(jiàn)的4軸SCARA機(jī)械臂雖然速度快、剛度好但它只能保證末端在平面內(nèi)的位置和繞豎直軸的旋轉(zhuǎn)末端在空間里不可能歪著抓東西。多于6個(gè)比如KUKA的iiwa是7自由度冗余機(jī)械臂多出來(lái)的自由度不是為了到達(dá)而是為了在保持末端位姿不變的前提下改變肘部位置從而躲避障礙、優(yōu)化力矩分配代價(jià)是運(yùn)動(dòng)學(xué)求解復(fù)雜度明顯上升。對(duì)絕大多數(shù)抓取、搬運(yùn)、裝配、噴涂、寫(xiě)字、焊接任務(wù)來(lái)說(shuō)6個(gè)自由度就是夠用且標(biāo)準(zhǔn)的配置。1.2 六自由度機(jī)械臂能做什么從應(yīng)用場(chǎng)景看6DoF機(jī)械臂的覆蓋面非常廣。產(chǎn)線焊接、螺絲鎖付、上下料、視覺(jué)引導(dǎo)分揀都是它的主場(chǎng)。實(shí)驗(yàn)室里常用于研究運(yùn)動(dòng)規(guī)劃算法、力控制、遙操作或者在教育場(chǎng)景里演示機(jī)器人原理。個(gè)人DIY玩家也喜歡用它做桌面機(jī)械臂配合攝像頭做色塊分揀、寫(xiě)字畫(huà)畫(huà)、甚至倒飲料??梢哉f(shuō)掌握了6DoF機(jī)械臂的完整開(kāi)發(fā)流程你對(duì)機(jī)器人學(xué)中一大半核心概念就都有數(shù)了。這篇文章適合三類(lèi)人看一是正被畢設(shè)/課設(shè)折磨的學(xué)生想搞一臺(tái)能完整跑通動(dòng)作流程的六軸機(jī)械臂同時(shí)需要一個(gè)有理有據(jù)的選型和計(jì)算過(guò)程二是企業(yè)里做自動(dòng)化集成的工程師主管扔給你一臺(tái)二手六軸讓你評(píng)估它能不能頂上一個(gè)工位的裝配工作你需要快速判斷精度、負(fù)載、控制方案能不能達(dá)標(biāo)三是純粹喜歡折騰的DIY愛(ài)好者預(yù)算有限想用幾百到幾千塊攢一臺(tái)能動(dòng)的六軸機(jī)械臂。不同的預(yù)算和目標(biāo)我會(huì)在后面給出不同的選型思路。2. 整機(jī)設(shè)計(jì)與硬件選型的底層邏輯2.1 關(guān)節(jié)驅(qū)動(dòng)方案舵機(jī)、步進(jìn)還是伺服六軸機(jī)械臂的關(guān)節(jié)驅(qū)動(dòng)方案幾乎決定了整個(gè)項(xiàng)目的成本下限、性能上限和調(diào)試難度。我見(jiàn)過(guò)太多人上來(lái)就買(mǎi)一堆MG996R舵機(jī)攢了一只六軸結(jié)果一動(dòng)起來(lái)末端抖得跟帕金森一樣拍個(gè)視頻都糊。不是說(shuō)舵機(jī)方案不行而是你要清楚它在技術(shù)地圖上的位置。舵機(jī)方案最大的優(yōu)點(diǎn)是便宜、簡(jiǎn)單、即插即用。普通PWM舵機(jī)比如MG996R、DS3218自帶減速齒輪和位置閉環(huán)給一個(gè)脈寬信號(hào)就能轉(zhuǎn)到指定角度非常適合做教學(xué)演示、玩具級(jí)機(jī)械臂。但它的缺點(diǎn)同樣扎心一是精度差普通舵機(jī)的死區(qū)范圍可能在5~10微秒脈寬左右折算到輸出軸上有好幾度的回差二是負(fù)載能力弱大扭矩舵機(jī)要么又重又慢要么價(jià)格直逼伺服三是發(fā)熱問(wèn)題嚴(yán)重長(zhǎng)時(shí)間堵轉(zhuǎn)很容易燒毀電機(jī)或驅(qū)動(dòng)板。如果你只是做一個(gè)能動(dòng)就行的演示舵機(jī)沒(méi)毛病但別指望它干精細(xì)活。步進(jìn)電機(jī)加行星減速箱是DIY六軸里性?xún)r(jià)比最高的方案。步進(jìn)電機(jī)本身是開(kāi)環(huán)控制的靠脈沖數(shù)決定轉(zhuǎn)角配上減速箱后每步對(duì)應(yīng)的末端位移非常小剛性也遠(yuǎn)好于舵機(jī)。常見(jiàn)做法是42步進(jìn)電機(jī)配1:10到1:20的行星減速箱加上電磁剎車(chē)防止斷電后掉臂。這種方案能實(shí)現(xiàn)插上電就能動(dòng)動(dòng)起來(lái)還挺穩(wěn)的效果但是步進(jìn)電機(jī)的低速共振、丟步問(wèn)題需要額外處理而且整機(jī)重量會(huì)比較大。如果預(yù)算在3000到8000元之間這個(gè)方案是主流選擇。再往上就是無(wú)刷伺服電機(jī)加諧波減速器這是工業(yè)六軸的標(biāo)準(zhǔn)配置。伺服電機(jī)內(nèi)置高分辨率編碼器17位、23位甚至更高配合驅(qū)動(dòng)器做位置、速度、力矩三環(huán)控制精度和動(dòng)態(tài)響應(yīng)完全不是步進(jìn)能比的。諧波減速器有零背隙、傳動(dòng)比大、重量輕的優(yōu)點(diǎn)代價(jià)是價(jià)格昂貴、軸向剛度有限、不能承受太大的徑向載荷。如果你要做精度要求較高的實(shí)驗(yàn)或者準(zhǔn)備長(zhǎng)期做二次開(kāi)發(fā)直接買(mǎi)成品伺服舵機(jī)比如一些國(guó)產(chǎn)一體化關(guān)節(jié)模組反而比自己拼湊更省心。2.2 結(jié)構(gòu)件與減速器的搭配機(jī)械臂的結(jié)構(gòu)件決定了整機(jī)的剛度。剛度不夠一切運(yùn)動(dòng)學(xué)精度都是空話。我見(jiàn)過(guò)有人用鋁合金方管加角碼攢了一個(gè)六軸靜態(tài)推起來(lái)晃晃悠悠動(dòng)態(tài)跑起來(lái)末端振幅有兩三毫米這種情況下你花再多功夫調(diào)運(yùn)動(dòng)學(xué)都沒(méi)有意義。剛度的核心在于三個(gè)地方底盤(pán)、大臂、關(guān)節(jié)連接處。底盤(pán)是整機(jī)的根基。六軸機(jī)械臂在高速運(yùn)動(dòng)時(shí)慣性力會(huì)通過(guò)末端和連桿傳遞到底盤(pán)如果底盤(pán)太輕或者安裝不牢固整機(jī)會(huì)跟著晃。一個(gè)可靠的做法是底盤(pán)用至少5毫米厚的鋼板或者鋁合金板用M6以上的螺栓固定在重型工作臺(tái)上必要時(shí)在底盤(pán)下面加橡膠減震墊。如果你做的是桌面級(jí)六軸至少也要保證底盤(pán)重量是整機(jī)重量的1.5倍以上否則一啟動(dòng)就跳舞。大臂和小臂的截面形狀也很有講究。方形鋁型材易于安裝連接件但抗扭性能一般圓形或者異型截面的碳纖維管/鋁管抗扭更好但不好打孔固定。我的經(jīng)驗(yàn)是桌面級(jí)機(jī)械臂的大臂用20x40mm的歐標(biāo)鋁型材就夠懸伸超過(guò)400毫米的工業(yè)級(jí)方案建議用帶加強(qiáng)筋的鑄鋁件或者鋼焊接件。關(guān)節(jié)連接處的軸承要優(yōu)先考慮圓錐滾子軸承或深溝球軸承加推力軸承的組合不能只靠諧波減速器本身承受彎矩否則關(guān)節(jié)很快就會(huì)磨損。2.3 末端執(zhí)行器與負(fù)載匹配末端執(zhí)行器末端工具的選擇常常被新手忽略但它直接決定機(jī)械臂能不能完成目標(biāo)任務(wù)。最常見(jiàn)的末端是氣動(dòng)夾爪、電動(dòng)夾爪、吸盤(pán)和焊槍/噴槍。氣動(dòng)夾爪開(kāi)合快、夾持力大但需要空壓機(jī)系統(tǒng)復(fù)雜度高電動(dòng)夾爪控制方便能調(diào)夾持力適合小負(fù)載場(chǎng)景吸盤(pán)適合抓取平面物體比如紙箱、玻璃板但對(duì)表面光潔度和透氣性有要求。這里要說(shuō)一個(gè)關(guān)鍵指標(biāo)末端負(fù)載。機(jī)械臂的額定負(fù)載不是拎起來(lái)的重量而是在最大伸展姿態(tài)、以額定速度運(yùn)動(dòng)時(shí)末端還能可靠工作的重量。很多舵機(jī)臂宣稱(chēng)能負(fù)載1.5kg結(jié)果在水平完全展開(kāi)時(shí)連一瓶500ml的礦泉水都抓不穩(wěn)這就是負(fù)載被虛標(biāo)了。實(shí)際估算負(fù)載能力的方法很簡(jiǎn)單取每個(gè)關(guān)節(jié)的峰值扭矩除以該關(guān)節(jié)到末端的距離就能得到每個(gè)關(guān)節(jié)能支撐的理論負(fù)載整機(jī)的額定負(fù)載由最小的那個(gè)關(guān)節(jié)決定。切忌按垂直姿態(tài)下的負(fù)載來(lái)標(biāo)稱(chēng)那是廠商玩數(shù)字游戲最常見(jiàn)的手法。3. 運(yùn)動(dòng)學(xué)讓機(jī)械臂知道自己該怎么動(dòng)3.1 DH參數(shù)與正運(yùn)動(dòng)學(xué)建模運(yùn)動(dòng)學(xué)是機(jī)械臂最核心的理論基礎(chǔ)分正解和逆解兩部分。正解是已知每個(gè)關(guān)節(jié)的角度求末端執(zhí)行器的位姿逆解是已知末端目標(biāo)位姿反求每個(gè)關(guān)節(jié)該轉(zhuǎn)到多少度。前者簡(jiǎn)單算一遍矩陣就行后者是真正磨人的地方。做六軸機(jī)械臂如果不理解這兩個(gè)東西就只能靠示教器手動(dòng)拖拽來(lái)編程永遠(yuǎn)無(wú)法實(shí)現(xiàn)視覺(jué)引導(dǎo)之類(lèi)的全自動(dòng)功能。正運(yùn)動(dòng)學(xué)用的是Denavit-Hartenberg參數(shù)法簡(jiǎn)稱(chēng)DH參數(shù)。工程師為每個(gè)關(guān)節(jié)建立一個(gè)坐標(biāo)系用四個(gè)參數(shù)描述相鄰兩個(gè)坐標(biāo)系之間的變換關(guān)系連桿長(zhǎng)度a、連桿轉(zhuǎn)角α、關(guān)節(jié)偏距d、關(guān)節(jié)角θ。把這四個(gè)參數(shù)按照繞Z軸旋轉(zhuǎn)θ、沿Z軸平移d、沿X軸平移a、繞X軸旋轉(zhuǎn)α的順序串起來(lái)就得到了相鄰關(guān)節(jié)坐標(biāo)系的齊次變換矩陣。整機(jī)的正解就是把從基座到末端的6個(gè)變換矩陣依次乘起來(lái)最后得到一個(gè)4x4的矩陣?yán)锩姘四┒宋恢煤妥藨B(tài)。這個(gè)過(guò)程看起來(lái)公式堆砌實(shí)際上邏輯非常機(jī)械寫(xiě)個(gè)循環(huán)就搞定了。我以典型的6R關(guān)節(jié)型機(jī)械臂為例給出一個(gè)常見(jiàn)的DH參數(shù)表關(guān)節(jié)ia(i-1)α(i-1)d(i)θ(i)100d1θ12a1-90°0θ23a200θ34a3-90°d4θ45090°0θ560-90°d6θ6其中的a、d值需要根據(jù)你實(shí)際機(jī)械臂的尺寸測(cè)量出來(lái)θ就是六個(gè)關(guān)節(jié)的實(shí)時(shí)角度。有了這張表和變換矩陣公式你就能用Python、C或者M(jìn)ATLAB把這6個(gè)矩陣乘起來(lái)。建議用Python的numpy或者機(jī)器人工具箱Robotics Toolbox的fkine函數(shù)驗(yàn)證一下確保正解結(jié)果與你在CAD模型里測(cè)出的末端位置一致這一步可以提前暴露很多連桿尺寸上的錯(cuò)誤。3.2 逆運(yùn)動(dòng)學(xué)從目標(biāo)坐標(biāo)到關(guān)節(jié)角度逆解比正解麻煩得多因?yàn)檎馐且粋€(gè)非線性方程組給定末端位姿可能有多組關(guān)節(jié)角解比如同一個(gè)點(diǎn)手臂可以肘高或肘低也可能無(wú)解目標(biāo)點(diǎn)超出機(jī)械臂的工作空間還可能處于奇異位形。六自由度機(jī)械臂的逆解沒(méi)有通用的解析方法只能分情況討論。最常用的判定是Pieper準(zhǔn)則如果存在三個(gè)相鄰關(guān)節(jié)的軸線交于一點(diǎn)機(jī)械臂的逆解可以解析求解。很多工業(yè)六軸為了簡(jiǎn)化計(jì)算故意讓第4、5、6關(guān)節(jié)的軸線交于一點(diǎn)即球形手腕這樣末端三個(gè)關(guān)節(jié)只負(fù)責(zé)姿態(tài)前三個(gè)關(guān)節(jié)負(fù)責(zé)位置解耦之后問(wèn)題大幅簡(jiǎn)化。如果你自己設(shè)計(jì)的機(jī)械臂不是球形手腕結(jié)構(gòu)也沒(méi)關(guān)系可以用數(shù)值迭代法求解核心思想是用雅可比矩陣的偽逆或者用Levenberg-Marquardt算法從初始猜測(cè)值出發(fā)反復(fù)迭代讓當(dāng)前末端位姿逼近目標(biāo)位姿。數(shù)值法普適性強(qiáng)但慢、依賴(lài)初始值、容易收斂到奇異解實(shí)時(shí)性要求高的場(chǎng)合基本不用。實(shí)操中我的建議是如果只是做固定軌跡先用逆解工具比如MATLAB的ikine、ROS的Trac-IK離線算好6個(gè)關(guān)節(jié)角序列再逐一播放給機(jī)械臂執(zhí)行。如果是視覺(jué)實(shí)時(shí)分揀那種需要?jiǎng)討B(tài)求逆的場(chǎng)景建議選擇解析逆解較好的球形手腕結(jié)構(gòu)并且在代碼里把八組候選解按最接近當(dāng)前位置原則選一組輸出這樣能有效減少關(guān)節(jié)的大幅跳變。3.3 工作空間、奇異點(diǎn)與靈巧度逆解有沒(méi)有解取決于目標(biāo)點(diǎn)是否落在機(jī)械臂的工作空間workspace內(nèi)。工作空間簡(jiǎn)單說(shuō)就是末端能到達(dá)的所有點(diǎn)的集合形狀有點(diǎn)像去掉內(nèi)部空洞的球殼。你可以用蒙特卡洛法近似計(jì)算在關(guān)節(jié)角度范圍內(nèi)隨機(jī)取幾萬(wàn)組關(guān)節(jié)角做正解得到幾萬(wàn)個(gè)末端位置畫(huà)在三維圖里就是云圖狀的工作空間。這個(gè)云圖能直觀告訴你機(jī)械臂夠不著哪些地方、在哪些區(qū)域姿態(tài)會(huì)受限。奇異點(diǎn)是運(yùn)動(dòng)學(xué)里的一個(gè)大坑。在奇異位形下機(jī)械臂會(huì)失去某個(gè)方向上的運(yùn)動(dòng)能力表現(xiàn)為末端需要以極高速度運(yùn)動(dòng)才能把關(guān)節(jié)轉(zhuǎn)過(guò)去實(shí)際效果就是機(jī)械臂在某個(gè)點(diǎn)附近劇烈抖動(dòng)甚至崩潰。奇異點(diǎn)通常出現(xiàn)在關(guān)節(jié)軸線重合的時(shí)候比如第4和第6關(guān)節(jié)軸線對(duì)齊時(shí)末端無(wú)法繞某個(gè)方向旋轉(zhuǎn)。處理奇異點(diǎn)的常見(jiàn)策略是軌跡規(guī)劃前檢查當(dāng)前點(diǎn)是否靠近奇異點(diǎn)如果靠近要么調(diào)整路徑繞過(guò)去要么在奇異點(diǎn)附近犧牲姿態(tài)精度讓末端沿可動(dòng)方向平滑過(guò)渡。靈巧度manipulability是一個(gè)衡量機(jī)械臂在某個(gè)位形下各方向運(yùn)動(dòng)能力的指標(biāo)由雅可比矩陣的行列式計(jì)算而來(lái)。靈巧度趨近于零就說(shuō)明接近奇異點(diǎn)。通過(guò)觀測(cè)整個(gè)工作空間內(nèi)靈巧度的分布可以找出靈活區(qū)域和別扭區(qū)域。在實(shí)際生產(chǎn)中工程師會(huì)把工件的抓取點(diǎn)位盡量設(shè)置在靈巧度高的區(qū)域否則機(jī)械臂很容易在某些角度下使不上勁。4. 控制系統(tǒng)搭建與實(shí)操實(shí)現(xiàn)4.1 主控選型與通信拓?fù)淇刂葡到y(tǒng)是機(jī)械臂的神經(jīng)中樞。我的建議是不要用一個(gè)控制器硬扛所有事而是分兩層底層負(fù)責(zé)實(shí)時(shí)讀取關(guān)節(jié)編碼器、輸出控制指令上層負(fù)責(zé)任意解算、軌跡規(guī)劃、用戶(hù)交互。底層對(duì)實(shí)時(shí)性要求高可以用STM32、ESP32或者Arduino平臺(tái)來(lái)做循環(huán)周期要控制在10毫秒以?xún)?nèi)讀取編碼器、跑一下位置環(huán)、輸出PWM或總線指令都來(lái)得及。上層可以用PC、樹(shù)莓派或者Jetson系列跑ROS、Python腳本或者上位機(jī)軟件負(fù)責(zé)運(yùn)動(dòng)學(xué)解算和視覺(jué)識(shí)別。通信拓?fù)浞矫娉R?jiàn)的有三種形態(tài)。最簡(jiǎn)單的PWM方案是上層直接給舵機(jī)/步進(jìn)驅(qū)動(dòng)器發(fā)脈沖或PWM信號(hào)不需要底層控制器但精度和擴(kuò)展性都差。第二種是串行總線舵機(jī)方案比如LX-16A、串行總線舵機(jī)用一根數(shù)據(jù)線串聯(lián)所有關(guān)節(jié)每個(gè)舵機(jī)有自己的ID上層通過(guò)串口分發(fā)角度指令這種方案接線少、維護(hù)方便是目前DIY六軸的主流。第三種是EtherCAT這種工業(yè)以太網(wǎng)總線方案每個(gè)關(guān)節(jié)配一個(gè)帶驅(qū)動(dòng)的伺服電機(jī)模塊時(shí)鐘同步精度達(dá)到微秒級(jí)工業(yè)級(jí)六軸基本都走這條路但成本很高入門(mén)玩家不用考慮。我自己做項(xiàng)目時(shí)比較喜歡ESP32作為底層控制器加串行總線舵機(jī)的組合ESP32的WiFi/藍(lán)牙能力讓它能直接和上位機(jī)無(wú)線通信省掉拖一根線纜的麻煩串行總線舵機(jī)內(nèi)置編碼器和PID控制雖然整體精度還是受限于舵機(jī)的機(jī)械結(jié)構(gòu)但省去焊接一堆編碼器線的時(shí)間。需要說(shuō)明的是這種組合更適合學(xué)習(xí)和原型驗(yàn)證如果你的目標(biāo)是高精度抓取還是要考慮伺服加驅(qū)動(dòng)器的工業(yè)方案。4.2 固件配置與關(guān)節(jié)標(biāo)定固定好硬件之后第一個(gè)必須做的手術(shù)是關(guān)節(jié)零點(diǎn)標(biāo)定。機(jī)械臂的每個(gè)關(guān)節(jié)都有一個(gè)機(jī)械零點(diǎn)也就是關(guān)節(jié)角的零點(diǎn)位置。如果零點(diǎn)偏了哪怕只有一個(gè)關(guān)節(jié)偏了2度末端位置會(huì)差出好幾厘米。標(biāo)定的做法是讓機(jī)械臂擺出一個(gè)已知姿態(tài)比如所有關(guān)節(jié)都轉(zhuǎn)到機(jī)械限位的基準(zhǔn)面然后用水平尺、角度尺或高精度編碼器記錄此時(shí)傳感器讀數(shù)把這個(gè)讀數(shù)寫(xiě)入固件作為零點(diǎn)偏移量。工業(yè)機(jī)械臂出廠時(shí)會(huì)用激光跟蹤儀做一次全精度標(biāo)定然后會(huì)在幾個(gè)關(guān)鍵工位設(shè)置參考定位銷(xiāo)保證零點(diǎn)不漂移。然后是運(yùn)動(dòng)學(xué)參數(shù)標(biāo)定的問(wèn)題。DH參數(shù)表里的a、d等連桿尺寸CAD模型上寫(xiě)著多少不等于實(shí)際安裝出來(lái)就是多少。加工誤差、裝配間隙都會(huì)讓實(shí)際連桿尺寸和理論值差出零點(diǎn)幾毫米最后末端誤差可能放大到毫米級(jí)。如果不追求極致精度你可以用游標(biāo)卡尺量關(guān)鍵尺寸正解驗(yàn)證的方式校準(zhǔn)比如讓機(jī)械臂分別以不同姿態(tài)到達(dá)同一個(gè)固定點(diǎn)通過(guò)多組測(cè)量數(shù)據(jù)反推DH參數(shù)這就是最樸素的自標(biāo)定。如果后續(xù)接了視覺(jué)系統(tǒng)還有一種更省事的做法讓機(jī)械臂帶著標(biāo)定板動(dòng)幾下用相機(jī)自動(dòng)辨識(shí)末端位姿反推參數(shù)誤差一次校準(zhǔn)能顯著提升手眼配合的精度。4.3 軌跡規(guī)劃與上位機(jī)交互有了運(yùn)動(dòng)學(xué)基礎(chǔ)接下來(lái)就要讓機(jī)械臂動(dòng)得漂亮。軌跡規(guī)劃分兩個(gè)層面關(guān)節(jié)空間軌跡規(guī)劃和笛卡爾空間軌跡規(guī)劃。關(guān)節(jié)空間規(guī)劃指的是直接把每個(gè)關(guān)節(jié)從當(dāng)前角度平滑過(guò)渡到目標(biāo)角度常見(jiàn)的有梯形速度曲線、S形曲線這種規(guī)劃計(jì)算量小、關(guān)節(jié)運(yùn)動(dòng)平穩(wěn)適合點(diǎn)到點(diǎn)的抓取動(dòng)作。笛卡爾空間規(guī)劃則是讓末端在空間中走直線或圓弧需要對(duì)路徑點(diǎn)逐點(diǎn)求逆解計(jì)算量大但適合需要精確保持末端直線運(yùn)動(dòng)的場(chǎng)景比如焊接、涂膠。一個(gè)常見(jiàn)的軌跡規(guī)劃坑是機(jī)械臂末端明明走的是直線結(jié)果每?jī)蓚€(gè)路徑點(diǎn)之間關(guān)節(jié)的速度出現(xiàn)尖峰機(jī)械臂就一頓一頓的。原因在于路徑點(diǎn)的間隔太大直線插補(bǔ)的中間點(diǎn)數(shù)量不夠?qū)е孪噜弮牲c(diǎn)的關(guān)節(jié)角度差超過(guò)了電機(jī)的速度極限。解決方法是增加插補(bǔ)點(diǎn)密度并且在插補(bǔ)前檢查速度和加速度是否超限必要時(shí)降低末端速度。我習(xí)慣的做法是在軌跡規(guī)劃之后加一個(gè)前瞻濾波器把即將執(zhí)行的幾個(gè)軌跡點(diǎn)提前緩存計(jì)算它們的速度分布一旦發(fā)現(xiàn)下一步要超過(guò)關(guān)節(jié)最大速度就自動(dòng)把當(dāng)前點(diǎn)的目標(biāo)速度壓低這樣機(jī)械臂跑起來(lái)順暢很多。上位機(jī)方面推薦用現(xiàn)成的機(jī)器人框架而不是自己造輪子。ROS 2加MoveIt是當(dāng)前研究圈的事實(shí)標(biāo)準(zhǔn)MoveIt自帶的OMPL運(yùn)動(dòng)規(guī)劃庫(kù)可以幫你生成避障軌跡。如果你不想碰Linux和ROS那一套復(fù)雜環(huán)境用Python寫(xiě)一個(gè)簡(jiǎn)單的上位機(jī)GUI也行把正逆解封裝成函數(shù)用pyqtgraph或者matplotlib顯示末端實(shí)時(shí)位置再用一個(gè)滑桿手動(dòng)控制六個(gè)關(guān)節(jié)角。對(duì)很多展示場(chǎng)景來(lái)說(shuō)這種輕量級(jí)方案反而更快落地。5. 調(diào)試實(shí)錄常見(jiàn)問(wèn)題與排查技巧5.1 關(guān)節(jié)抖動(dòng)、失步與溫漂我走過(guò)的坑里關(guān)節(jié)抖動(dòng)是最常見(jiàn)的也是最容易誤導(dǎo)人的。很多新手看到機(jī)械臂抖第一反應(yīng)是PID參數(shù)沒(méi)調(diào)好一頭扎進(jìn)QGroundControl或者Arduino PID庫(kù)的調(diào)參里調(diào)了一個(gè)星期。但實(shí)際上80%的抖動(dòng)問(wèn)題根源是硬件層面的而不是控制參數(shù)。最常見(jiàn)的是電源供電不足舵機(jī)或者步進(jìn)電機(jī)在加速瞬間需要幾倍于額定電流的峰值電流如果你用一個(gè)穩(wěn)壓模塊供電瞬間掉壓會(huì)導(dǎo)致舵機(jī)內(nèi)部的位置環(huán)亂跳表現(xiàn)出來(lái)就是關(guān)節(jié)在小范圍內(nèi)高頻震動(dòng)。排查方法很簡(jiǎn)單用示波器或者萬(wàn)用表監(jiān)測(cè)電機(jī)供電電壓在機(jī)械臂快速啟動(dòng)時(shí)看電壓跌不跌過(guò)額定值。另一個(gè)常見(jiàn)的抖動(dòng)來(lái)源是機(jī)械間隙。減速器的回程間隙、連桿連接處的虛位在關(guān)節(jié)反轉(zhuǎn)時(shí)會(huì)被放大末端呈現(xiàn)出明顯的一格一格的階梯感。這種問(wèn)題再怎么調(diào)PID都沒(méi)用只能從機(jī)械上解決換精度更高的減速器、給連接處加墊片消除虛位、或者把關(guān)節(jié)的運(yùn)動(dòng)方向設(shè)計(jì)成一直單向偏轉(zhuǎn)避免頻繁換向。還有溫漂問(wèn)題。長(zhǎng)時(shí)間運(yùn)行后舵機(jī)或步進(jìn)電機(jī)的殼體溫度能到60甚至80度電機(jī)內(nèi)部的永磁體在高溫下磁通量下降輸出扭矩變小于是原來(lái)能穩(wěn)定停住的位置開(kāi)始出現(xiàn)緩慢偏移。遇到這種情況先用溫度槍測(cè)一下電機(jī)外殼溫度如果超過(guò)60度就要考慮加散熱片、降低PWM頻率、降低負(fù)載如果溫度正常那就是位置反饋元件電位器/編碼器的溫漂這種問(wèn)題在工業(yè)伺服里不太明顯但在低成本舵機(jī)臂里非常常見(jiàn)。5.2 末端精度不足的排查順序末端精度差不要急著上來(lái)就去改代碼。排查順序應(yīng)該是先看結(jié)構(gòu)再看電機(jī)最后看算法。結(jié)構(gòu)方面用手抓住末端輕輕用力晃如果末端能晃動(dòng)0.5毫米以上說(shuō)明某個(gè)關(guān)節(jié)的軸承或者減速器有間隙肉眼看不見(jiàn)的間隙在末端會(huì)被杠桿放大好幾倍。這種問(wèn)題只能從機(jī)械上處理否則后面做什么都是白搭。電機(jī)方面步進(jìn)電機(jī)丟步是精度殺手。丟步的原因是力矩不足或者速度過(guò)快可以降低加減速的加速度、增加電流上限、減小負(fù)載。判斷是否丟步的方法是讓機(jī)械臂執(zhí)行一次定角度往返運(yùn)動(dòng)回到起始點(diǎn)后檢查末端位置和初始位置是否重合如果每次都不一樣基本可以斷定有丟步。算法方面最常見(jiàn)的問(wèn)題是逆解選擇不當(dāng)導(dǎo)致關(guān)節(jié)角跳變以及軌跡插補(bǔ)點(diǎn)太稀疏。前者可以通過(guò)選擇距離當(dāng)前關(guān)節(jié)角最近的解來(lái)緩解后者可以增加插補(bǔ)頻率。還有一個(gè)隱蔽問(wèn)題控制代碼里使用的DH參數(shù)和實(shí)際機(jī)械臂尺寸有誤差。你可能會(huì)想我明明畫(huà)CAD的時(shí)候尺寸記得清清楚楚怎么實(shí)際差了這么多焊接或者3D打印的熱變形、裝配時(shí)的墊圈厚度、法蘭面的微小偏斜都會(huì)導(dǎo)致DH參數(shù)和理論值不符。建議做一次末端重復(fù)定位精度測(cè)試讓機(jī)械臂去同一個(gè)定位點(diǎn)50次統(tǒng)計(jì)每次末端坐標(biāo)的離散程度如果重復(fù)定位精度好比如0.1mm內(nèi)但絕對(duì)精度差比如差5mm那就是運(yùn)動(dòng)學(xué)參數(shù)標(biāo)定問(wèn)題和電機(jī)/結(jié)構(gòu)沒(méi)關(guān)系。5.3 安全保護(hù)、限位與故障處理安全這塊很多人覺(jué)得我又不是工業(yè)現(xiàn)場(chǎng)沒(méi)那么講究但我在實(shí)驗(yàn)室見(jiàn)過(guò)幾次機(jī)械臂失控的場(chǎng)面真的會(huì)嚇出一身冷汗。桌面級(jí)機(jī)械臂的四軸/六軸如果發(fā)瘋甩起來(lái)鐵質(zhì)末端打在臉上可不是鬧著玩的。首先是硬件層面的限位開(kāi)關(guān)和急停按鈕。每個(gè)關(guān)節(jié)都應(yīng)該在正負(fù)極限位置安裝機(jī)械限位塊或者光電限位開(kāi)關(guān)觸發(fā)后立即斷開(kāi)電機(jī)供電或者終止運(yùn)動(dòng)。這個(gè)優(yōu)先級(jí)比任何軟件檢查都高。然后是電流檢測(cè)和力矩保護(hù)。如果你的控制器能讀出電機(jī)電流設(shè)置一個(gè)如果電流超過(guò)額定值持續(xù)200ms以上立即停機(jī)的保護(hù)邏輯可以有效防止機(jī)械臂撞到障礙物后堵轉(zhuǎn)燒電機(jī)。更高級(jí)的做法是實(shí)時(shí)監(jiān)控每個(gè)關(guān)節(jié)的力矩命令和實(shí)際反饋偏差過(guò)大時(shí)判定為碰撞觸發(fā)停機(jī)或柔順回退。低成本方案至少要做到在代碼里實(shí)現(xiàn)軟件限位在到達(dá)限位前減速并停止防止機(jī)械結(jié)構(gòu)硬碰硬。故障處理方面建議大家給機(jī)械臂加一個(gè)看門(mén)狗機(jī)制。上位機(jī)和控制板之間定時(shí)通信如果連續(xù)幾次握手失敗控制板要自動(dòng)進(jìn)入安全狀態(tài)鎖緊所有關(guān)節(jié)或者釋放到零力矩防止上位機(jī)死機(jī)后機(jī)械臂還在傻傻地執(zhí)行最后一條指令。我踩過(guò)一次很深的坑PC上位機(jī)藍(lán)屏后機(jī)械臂還維持著之前的末端力直接把我桌上的工件推倒了。在那之后所有項(xiàng)目無(wú)一例外都加了通信超時(shí)保護(hù)。最后再分享一個(gè)很實(shí)用的小技巧給機(jī)械臂的每個(gè)關(guān)節(jié)角度做一份軟限位地圖存到固件里同時(shí)把工作空間內(nèi)所有障礙物的包圍盒也存進(jìn)去。每次運(yùn)動(dòng)學(xué)求完逆解先檢查六個(gè)目標(biāo)角度是否都落在軟限位范圍內(nèi)然后再檢查末端路徑是否和障礙物包圍盒相交。這兩條檢查加起來(lái)不到100行代碼卻能在大多數(shù)情況下避免災(zāi)難性碰撞。很多人在這個(gè)項(xiàng)目上吃過(guò)虧之后才醒悟運(yùn)動(dòng)學(xué)上還有解不代表物理上真的能安全到達(dá)。六軸機(jī)械臂這個(gè)項(xiàng)目看起來(lái)是硬件堆料的游戲其實(shí)真正做到后面你會(huì)發(fā)現(xiàn)它是一次綜合能力的試煉機(jī)械結(jié)構(gòu)、嵌入式控制、機(jī)器人學(xué)理論、軟件架構(gòu)每一項(xiàng)都躲不掉。我個(gè)人的體會(huì)是不要追求一步到位搞一臺(tái)全功能的工業(yè)級(jí)設(shè)備先把手頭這臺(tái)能轉(zhuǎn)起來(lái)的六軸調(diào)通、摸透再去想視覺(jué)、力控這些更高級(jí)的功能路會(huì)走得穩(wěn)得多。