工業(yè)機器人DH參數(shù)辨識:從建模到0.5mm精度補償實戰(zhàn))
簡介面向工業(yè)機器人標(biāo)定的DH參數(shù)辨識Matlab程序?qū)崪y精度可達0.5 毫米適合需要提升機械臂絕對定位精度的研發(fā)、調(diào)試與工程人員。代碼采用模塊化設(shè)計不僅覆蓋旋轉(zhuǎn)矩陣、DH建模、雅可比求解、工具坐標(biāo)系粗標(biāo)定與DH精標(biāo)定等關(guān)鍵環(huán)節(jié)還通過細分的m腳本將底層變換函數(shù)與上層標(biāo)定流程解耦方便按需復(fù)用或改造并保留清晰注釋便于定位關(guān)鍵計算步驟。壓縮包共17個文件以15個m腳本為主另有2個txt文檔分別承擔(dān)算法實現(xiàn)與使用說明整體僅10KB目錄結(jié)構(gòu)緊湊便于快速查閱、運行和二次開發(fā)。已有227人學(xué)習(xí)下載對從事機器人離線編程、軌跡規(guī)劃或現(xiàn)場調(diào)試的讀者可作為標(biāo)定算法落地時的實用參考也適合用于教學(xué)演示或不同辨識方案的對比驗證實踐性較強能幫助使用者少走彎路。 做工業(yè)機器人精度工作的人基本都繞不開DH參數(shù)辨識這個話題。簡單說就是通過外部測量設(shè)備記錄機器人末端實際位置反推出機器人運動學(xué)模型里那一組參數(shù)的真實值。之前我把這套流程的MATLAB代碼完整跑通了實測下來辨識后的絕對定位精度能做到0.5mm左右這個數(shù)字對于工業(yè)現(xiàn)場很多應(yīng)用場景來說已經(jīng)屬于“能打”的級別。這篇文章把我從建模、采樣、優(yōu)化到驗證的完整思路和踩坑記錄整理出來給準(zhǔn)備做機器人精度補償、離線編程或者數(shù)字孿生的朋友一個可以直接參考的路線。1. 工業(yè)機器人為什么要做DH參數(shù)辨識1.1 出廠參數(shù)不等于實際參數(shù)我在很長一段時間里默認機器人控制柜里的運動學(xué)參數(shù)是準(zhǔn)的直到有一次用激光跟蹤儀測一臺六軸機器人的絕對定位精度發(fā)現(xiàn)末端實際位置和目標(biāo)位置差了將近3mm這才意識到問題的嚴(yán)重性。機器人在出廠前確實做過標(biāo)定但那些參數(shù)經(jīng)過裝配公差、減速器回差、長期運行磨損、負載變形等一系列因素疊加之后很多已經(jīng)不適用于當(dāng)前狀態(tài)。尤其是一些低價位或二手設(shè)備名義參數(shù)和實際參數(shù)之間的偏差會更加明顯。示教模式下手動走點感覺不出來一旦走離線編程、視覺引導(dǎo)這類依賴絕對定位精度的任務(wù)誤差就完全暴露了。DH參數(shù)辨識解決的就是這個問題通過實際測量反推出一套“真參數(shù)”然后把這套參數(shù)寫進運動學(xué)模型讓機器人知道自己真正的幾何尺寸和關(guān)節(jié)零點在哪里。這套參數(shù)比出廠值更貼近設(shè)備當(dāng)前的真實狀態(tài)精度自然就上去了。1.2 0.5mm這個精度意味著什么0.5mm的絕對定位精度放在工業(yè)場景里是什么水平目前市面上大多數(shù)工業(yè)機器人標(biāo)稱的工作精度是“重復(fù)定位精度”——重復(fù)定位精度一般在±0.02mm到±0.1mm之間看著很漂亮但絕對定位精度到達任意規(guī)劃點的精度通常是2-5mm甚至更高。兩者之間差距非常大。重復(fù)定位精度衡量的是“每次到同一點是否一致”絕對定位精度衡量的則是“我說要去哪個點它是否真的能到那個點”。前者依賴編碼器和控制算法后者本質(zhì)上依賴運動學(xué)模型的準(zhǔn)確性——就像一個人的肌肉記憶再準(zhǔn)如果腦子里的身體尺寸數(shù)據(jù)是錯的伸手去夠目標(biāo)還是會偏。所以當(dāng)DH參數(shù)辨識能把絕對定位精度壓到0.5mm時意味著原來只能做示教工作的機器人具備了做弧焊軌跡、密封涂膠、視覺引導(dǎo)裝配、離線編程等高附加值任務(wù)的潛力。誤差占位比大幅降低工藝人員不必再花大量時間在機器人示教上手動修點。1.3 辨識的核心流程DH參數(shù)辨識的基本路徑可以概括為四個環(huán)節(jié)建模、測數(shù)據(jù)、算參數(shù)、驗證補償。建模是建立機器人的運動學(xué)模型明確需要辨識的參數(shù)集合測數(shù)據(jù)是通過外部測量設(shè)備記錄多組關(guān)節(jié)角度和對應(yīng)的末端實際位置算參數(shù)是找到讓模型預(yù)測位置與實測位置誤差最小的一組參數(shù)驗證補償則是用未參與辨識的數(shù)據(jù)評估效果并把辨識出的參數(shù)應(yīng)用到控制系統(tǒng)中。在MATLAB里實現(xiàn)這套流程主要工作集中在數(shù)據(jù)預(yù)處理、目標(biāo)函數(shù)設(shè)計、優(yōu)化求解和后處理可視化幾個模塊上。下面我會分別展開把我實際用過的方案和參數(shù)配置講清楚。2. 辨識方案的整體設(shè)計2.1 測量設(shè)備怎么選做DH參數(shù)辨識首先得有一雙“眼睛”去讀取機器人末端的真實位置。常用的測量設(shè)備有激光跟蹤儀、拉線式編碼器、雙目視覺系統(tǒng)、攝影測量系統(tǒng)等它們的精度、成本和操作復(fù)雜度差別很大。激光跟蹤儀是精度天花板可以達到微米級但價格也非常感人一般只有大廠或科研機構(gòu)會自購。拉線式編碼器就是那種在末端拉一根鋼線通過線長反算位置的裝置便宜很多精度一般在0.1-0.5mm級別作為辨識輸入夠用或者說“匹配”辨識本身的物理條件。雙目視覺系統(tǒng)適合動態(tài)測量但精度受視場和光照影響較大。在做第一套時我沒有直接用激光跟蹤儀而是先用拉線式編碼器驗證了整套算法流程拿到穩(wěn)定結(jié)果后才換用更高精度的測量儀器。這里有一個容易被忽略的關(guān)鍵點測量設(shè)備的精度和機器人本身要匹配測量精度比機器人重復(fù)定位精度高一個數(shù)量級數(shù)據(jù)才是有效可用的。如果測量設(shè)備本身的誤差和待辨識誤差相當(dāng)那辨識結(jié)果就沒什么意義了——就像用一把普通直尺去測量一個精密加工件量出來的尺寸很難讓人信服。2.2 數(shù)據(jù)采集不是隨便采的很多人上手辨識時隨手采幾十個點丟進優(yōu)化器里跑結(jié)果發(fā)現(xiàn)辨識出來的參數(shù)忽高忽低換一組數(shù)據(jù)結(jié)果又變了。這種不穩(wěn)定的本質(zhì)是數(shù)據(jù)信息量不夠也就是測量點沒有滿足辨識的“激勵性”。設(shè)計采樣位姿時我有幾個原則覆蓋范圍要大工作空間的不同區(qū)域都要有點避免只在某個局部區(qū)域采樣。姿態(tài)要豐富末端姿態(tài)要盡量多樣讓腕關(guān)節(jié)和肘關(guān)節(jié)都充分運動否則某些參數(shù)根本不被“激勵”到。采樣點之間的距離要拉開不能集中在很小的一塊區(qū)域里。數(shù)量上幾百組是正常水平少于50組很難穩(wěn)定收斂。實際做的時候我一般會規(guī)劃幾條連續(xù)的軌跡覆蓋整個工作空間在每條軌跡上均勻取點然后讓機器人以較慢速度運動到位后等待500ms穩(wěn)定再觸發(fā)測量。這個過程看起來很繁瑣但數(shù)據(jù)質(zhì)量是決定辨識結(jié)果上限的第一道關(guān)卡花再多時間都值得。2.3 算法路線最小二乘還是LM優(yōu)化DH參數(shù)辨識的求解核心是個優(yōu)化問題。最直接的做法是把末端位置誤差與運動學(xué)參數(shù)誤差的關(guān)系做線性化得到誤差雅可比矩陣然后用最小二乘偽逆求解。這個方法速度快、實現(xiàn)簡單但前提是初始誤差足夠小線性化才有效。如果初始誤差超過一定范圍線性近似就會失準(zhǔn)迭代也可能發(fā)散。我實際采用的是兩步走第一步用線性最小二乘估計一個初步結(jié)果第二步以它為初值用MATLAB的lsqnonlinLevenberg-Marquardt算法做非線性精修。關(guān)于lsqnonlin它是MATLAB優(yōu)化工具箱自帶的函數(shù)不需要額外寫優(yōu)化器。它支持邊界約束這對DH參數(shù)辨識很關(guān)鍵——你可以給每個參數(shù)設(shè)定物理上合理的上下限防止優(yōu)化器把參數(shù)調(diào)到離譜的數(shù)值。比如某段連桿長度標(biāo)稱500mm你限制它在480-520mm之間浮動優(yōu)化結(jié)果就會合理很多。2.4 參數(shù)辨識的邊界與約束DH參數(shù)辨識不是參數(shù)越多越好。理論上可以辨識的參數(shù)包括DH四個參數(shù)a、α、d、θ、關(guān)節(jié)零點偏移、TCP偏移、甚至關(guān)節(jié)減速比和耦合系數(shù)但參數(shù)越多自由度越大越容易出現(xiàn)參數(shù)耦合導(dǎo)致的“過擬合”——就是在訓(xùn)練數(shù)據(jù)上效果很好換一組驗證數(shù)據(jù)就露餡。我的做法是第一輪只辨識運動學(xué)參數(shù)DH參數(shù)關(guān)節(jié)零點偏移TCP偏移單獨標(biāo)定用五點法或六點法工具標(biāo)定盡量避免在一次辨識中同時處理太多類型的參數(shù)。這樣參數(shù)間耦合風(fēng)險低結(jié)果更穩(wěn)健。3. MATLAB核心代碼實現(xiàn)3.1 正運動學(xué)模型搭建代碼層面第一步是搭正運動學(xué)。我用的是改進DHModified DH模型本質(zhì)上是繞X軸旋轉(zhuǎn)平移再繞Z軸旋轉(zhuǎn)平移的復(fù)合變換。每個關(guān)節(jié)的齊次變換矩陣寫成$$T_i \text{RotX}(\alpha_{i-1}) \cdot \text{TransX}(a_{i-1}) \cdot \text{RotZ}(\theta_i) \cdot \text{TransZ}(d_i)$$MATLAB里實現(xiàn)一個fk_transformation函數(shù)輸入DH參數(shù)、關(guān)節(jié)角度輸出3x1的末端位置向量核心邏輯就是for循環(huán)逐步乘矩陣。需要注意MATLAB里矩陣乘法是右乘順序順序?qū)戝e會直接導(dǎo)致模型錯誤甚至正運動學(xué)位姿完全反掉。正運動學(xué)模型是整個辨識過程的“地基”地基錯了后面的優(yōu)化、驗證全部白搭。我建議在建完模型后先用已知關(guān)節(jié)角度把末端姿態(tài)和商用仿真軟件比如RoboDK或機器人廠家自帶仿真對比一遍確認模型沒問題再往下走。3.2 構(gòu)建誤差雅可比矩陣誤差雅可比矩陣表示“每個DH參數(shù)變化時末端位置發(fā)生多大變化”。嚴(yán)格來說這里用的是“雅可比”概念的擴展本質(zhì)是末端位置對各個參數(shù)的偏導(dǎo)數(shù)矩陣。計算方式有兩種解析法和數(shù)值法。解析法需要手動推導(dǎo)導(dǎo)數(shù)公式效率高但容易出錯數(shù)值法用有限差分實現(xiàn)簡單、通用性強代價是計算量稍大。辨識迭代次數(shù)不多數(shù)值法是投入產(chǎn)出比更高的選擇。有限差分的核心是把參數(shù)逐個小幅擾動用擾動前后的位置差除以擾動量。這一步有個細節(jié)擾動步長不能太大太大導(dǎo)致線性化誤差也不能太小太小導(dǎo)致浮點數(shù)精度受限。我實測下來取1e-6到1e-5這個量級比較合適——對于mm級的DH參數(shù)1e-6mm的擾動在雙精度浮點數(shù)下可以穩(wěn)定描述也不會破壞局部線性性。3.3 用lsqnonlin辨識參數(shù)核心代碼如下注釋寫得比較細可以直接參考% 讀取測量數(shù)據(jù)joint_meas是Nx6關(guān)節(jié)角pos_meas是Nx3末端位置 joint_meas ...; pos_meas ...; % 初始DH參數(shù)名義值向量這里用改進DH模型參數(shù)順序 % 對于6軸機器人參數(shù)包括6個a、6個alpha、6個d、6個theta_offset共24個 % 再加上關(guān)節(jié)零點偏移就是30個左右 params0 [...]; % 初始值用出廠名義參數(shù) % 設(shè)置上下界物理合理范圍例如連桿長度限制在±5%以內(nèi) lb [...]; % 下界 ub [...]; % 上界 % 定義目標(biāo)函數(shù)輸入?yún)?shù)向量輸出所有采樣點的位置誤差殘差向量 obj_fun (p) calibration_residual(p, joint_meas, pos_meas); % 設(shè)置優(yōu)化選項 options optimoptions(lsqnonlin, ... Algorithm, levenberg-marquardt, ... Display, iter, ... MaxFunctionEvaluations, 3000, ... FunctionTolerance, 1e-10, ... StepTolerance, 1e-10, ... MaxIterations, 500); % 運行辨識 params_opt lsqnonlin(obj_fun, params0, lb, ub, options);calibration_residual函數(shù)的核心思路是輸入一組參數(shù)遍歷所有采樣點的關(guān)節(jié)角用fk_transformation算出模型預(yù)測的末端位置然后減去實測位置拼成一個長殘差向量。lsqnonlin內(nèi)部會最小化這個殘差向量的平方和。有一個很實用的配置經(jīng)驗FunctionTolerance要設(shè)得比較小不要默認的1e-6否則優(yōu)化器可能提前收斂。另外MaxFunctionEvaluations不要限制得太小尤其采樣點數(shù)量幾百個時目標(biāo)函數(shù)的計算量并不大多迭代一些次數(shù)對穩(wěn)定性有好處。3.4 辨識后如何補償驗證辨識完成后不能看完誤差殘差變小就算完事了。我會做兩個層面的驗證第一層是殘差分析看訓(xùn)練數(shù)據(jù)上所有采樣點的位置誤差殘差分布計算平均值、RMS和最大值看殘差是否呈現(xiàn)出“零均值、均勻分布”的良性形態(tài)。第二層是獨立驗證把采集的數(shù)據(jù)隨機分成兩組比如80%訓(xùn)練、20%驗證只用訓(xùn)練數(shù)據(jù)辨識參數(shù)然后用驗證數(shù)據(jù)評估誤差。如果驗證集精度和訓(xùn)練集接近說明參數(shù)泛化能力好如果訓(xùn)練集很好但驗證集很差基本可以判斷是對采樣點“死記硬背”了。4. 實測精度0.5mm是怎么驗證的4.1 驗證方案與數(shù)據(jù)分離要證明辨識后的模型精度確實到了0.5mm而不是優(yōu)化器把訓(xùn)練數(shù)據(jù)“擬合”得很好我堅持用一套嚴(yán)格驗證方案預(yù)留一組獨立驗證點這些點位完全沒參與辨識過程。驗證點要分布在待評估的工作空間內(nèi)最好覆蓋不同高度、不同徑向距離和不同腕部姿態(tài)。用辨識出的參數(shù)對驗證點計算模型預(yù)測位置與實測位置做差統(tǒng)計誤差指標(biāo)。我實際跑下來辨識前這批獨立驗證點的平均位置誤差大約是3.2mm辨識后平均誤差降到0.45mm以內(nèi)最大誤差點在0.8mm左右。注意這里用的是平均誤差在0.5mm以內(nèi)不是所有點都滿足0.5mm極端點還是會超過一些。這里我額外說明一個重要前提這個0.5mm是“定位模型誤差”不是“機器人絕對精度”。它意味著運動學(xué)模型預(yù)測位置和實測位置的平均偏差已經(jīng)逼近了機器人自身的重復(fù)定位精度和測量設(shè)備精度之和的下限。換言之再往下優(yōu)化空間已經(jīng)不大了——除非換更高精度的測量設(shè)備或者考慮關(guān)節(jié)柔性、熱變形等非幾何因素。4.2 影響最終精度的關(guān)鍵因素做了整整一輪實驗之后我什么因素影響最大有了比較明確的認識按影響程度排個序數(shù)據(jù)質(zhì)量排第一某些采了幾十遍但機器人還沒真正穩(wěn)定的點引入的誤差足以毀掉整個優(yōu)化結(jié)果。測量坐標(biāo)系與機器人基坐標(biāo)系的位姿對齊精度排第二如果外部測量坐標(biāo)系和機器人基坐標(biāo)系沒有精確對齊辨識結(jié)果再準(zhǔn)也無法在機器人坐標(biāo)系下體現(xiàn)。優(yōu)化策略和初值設(shè)置排第三合理的參數(shù)上下界能讓結(jié)果穩(wěn)定不少。測量設(shè)備本身的重復(fù)性精度排第四激光跟蹤儀和拉線式編碼器的結(jié)果確實有差距。這些因素里坐標(biāo)系對齊最容易被忽略。我剛開始做的時候用最小二乘擬合方法做坐標(biāo)系粗對齊辨識結(jié)果始終不太理想后來改成用多點擬合加SVD分解求剛體變換才算把這個問題解決。4.3 什么樣的工況能到0.5mm必須坦誠地說0.5mm這個指標(biāo)是有前提條件的。根據(jù)我的實際經(jīng)驗以下條件同時滿足時用這套辨識流程可以達到0.5mm以內(nèi)的平均定位誤差一是機器人的重復(fù)定位精度要夠好如果機器人本身重復(fù)定位精度就有0.3mm以上的偏差辨識到0.5mm的難度會顯著增加。二是測量設(shè)備的分辨率和精度要夠至少0.1mm級別的測量能力。三是在辨識和驗證期間機器人的負載狀態(tài)要一致我實驗時全程保持相同負載沒有中途更換工具換負載狀態(tài)對運動學(xué)參數(shù)的影響非常大。四是工作空間規(guī)模和運動范圍不能太過極端在一個約1m見方的工作空間里驗證能得到上述指標(biāo)如果工作空間擴大到更大范圍誤差通常會上升。5. 常見問題與排查技巧5.1 辨識發(fā)散或落入局部最優(yōu)辨識結(jié)果發(fā)散或者誤差不減反增我先查的三個方向是第一初值是否合理。DH參數(shù)辨識的目標(biāo)函數(shù)是非凸的初值離真實值太遠時lsqnonlin很容易卡在局部最優(yōu)。所以我堅持先用線性最小二乘出初值再交給LM優(yōu)化效果比直接用量綱差異很大的隨機初值好很多。第二參數(shù)是否有冗余。如果同時辨識所有DH參數(shù)加上TCP偏移、基坐標(biāo)系偏移會出現(xiàn)組合型參數(shù)耦合。關(guān)節(jié)2的d參數(shù)和關(guān)節(jié)3的a參數(shù)往往強相關(guān)它們同時變化時末端位置變化很小導(dǎo)致法方程病態(tài)。解決方案是固定一部分參數(shù)或者用SVD分解查看雅可比矩陣的條件數(shù)如果條件數(shù)太大就減少待辨識參數(shù)數(shù)量。第三觀察誤差逆向變化。如果某個參數(shù)被推到上下界處卡住多半是數(shù)據(jù)沒有對該參數(shù)提供足夠的激勵。例如腕關(guān)節(jié)采樣點姿態(tài)太單一某些腕部參數(shù)就不敏感了對應(yīng)的解空間很平坦優(yōu)化器自然就“隨便給個值”了。5.2 辨識后精度反而變差遇到過一種很有意思的情況訓(xùn)練數(shù)據(jù)上的看起來誤差降得挺好驗證數(shù)據(jù)上精度卻變差了。后來我復(fù)盤發(fā)現(xiàn)原因有兩個一是過擬合訓(xùn)練數(shù)據(jù)沒有涵蓋全部工作空間優(yōu)化器把模型調(diào)成在局部區(qū)域“有效”但全局無效的模樣二是數(shù)據(jù)質(zhì)量問題訓(xùn)練數(shù)據(jù)里包含了幾組測量噪聲很大的點優(yōu)化器為迎合這些點犧牲了整體精度。解決辦法很直接增加數(shù)據(jù)覆蓋范圍增加采樣量并且在預(yù)處理階段把明顯偏離的野值剔除掉。建議在數(shù)據(jù)采集完成后畫一個誤差初步分布圖設(shè)置一個閾值把處于異常水平的點直接過濾掉。5.3 數(shù)據(jù)采集中的幾個坑這里集中說一下實際操作中容易踩的坑機器人的關(guān)節(jié)角讀數(shù)要與真實關(guān)節(jié)角一致有些機器人控制柜中的關(guān)節(jié)角是包含減速比修正和零點偏移的直接拿原始編碼器讀數(shù)不經(jīng)過處理模型對不齊。末端工具的偏移會影響測量點位置。如果末端裝了工具測量點在工具前端模型需要把TCP偏移考慮進去否則誤差殘差會整體不一致。機器人到位后要等待穩(wěn)定再觸發(fā)測量。高速運動中測量不僅包含運動學(xué)誤差還包含動態(tài)響應(yīng)誤差和振動誤差這些噪聲對辨識結(jié)果影響很大。測量坐標(biāo)系與基坐標(biāo)系對齊非常重要。我在前期這方面吃過虧后來統(tǒng)一用標(biāo)準(zhǔn)球多點擬合方式做坐標(biāo)系轉(zhuǎn)換穩(wěn)定性有了明顯提升。5.4 工程化落地的幾點建議辨識做完后要想真正在工程中用起來還有幾個落地環(huán)節(jié)需要注意。辨識出的參數(shù)要能回寫到控制系統(tǒng)不同品牌機器人有不同的參數(shù)錄入方式有些需要轉(zhuǎn)換成控制器的參數(shù)格式有些可以寫成補償表加載。參數(shù)要定期重新辨識設(shè)備經(jīng)過大修、碰撞、更換核心部件后原參數(shù)可能失效需要重新標(biāo)定。我習(xí)慣把辨識結(jié)果存成一個結(jié)構(gòu)化的配置文件比如MATLAB的.mat格式或文本表格同時把驗證集誤差分布圖保存下來這樣后期追溯和對比兩側(cè)標(biāo)定之間的精度變化會非常直觀。這套流程雖然一開始調(diào)試的時候花了不少精力但一旦跑通后續(xù)再標(biāo)定其他機器人基本就是套模板的活了效率會高非常多。做完全流程辨識之后我最大的體會是算法占三成數(shù)據(jù)占七成。優(yōu)化器和MATLAB代碼都是現(xiàn)成工具真正拉開差距的是數(shù)據(jù)采集的質(zhì)量參數(shù)模型的設(shè)計以及對殘差結(jié)果的判斷能力。這套流程我現(xiàn)在還在用每次給不同機器人做標(biāo)定時依然會花大量時間在數(shù)據(jù)準(zhǔn)備階段因為這一關(guān)才是精度上限的真正瓶頸。本文還有配套的精品資源點擊獲取