法原理、實戰(zhàn)與避坑指南)
1. 從零開始為什么串聯(lián)機器人建模繞不開DH參數(shù)法如果你剛接觸機器人學或者正在用Matlab做機器人相關(guān)的畢設、項目大概率會聽到一個詞DH參數(shù)法。這幾乎是所有串聯(lián)機器人運動學建模的“標準答案”就像學微積分繞不開牛頓-萊布尼茨公式一樣。但很多人只是機械地記住了DH表的四個參數(shù)連桿長度a、連桿轉(zhuǎn)角α、連桿偏距d、關(guān)節(jié)角θ然后對著公式硬套結(jié)果要么是模型動不起來要么是正運動學算出來的位姿和實際對不上最后只能對著Matlab里一堆報錯的代碼干瞪眼。我剛開始做機器人仿真的時候也踩過這個坑。當時導師扔給我一個六軸機械臂的圖紙讓我在Matlab里把它的運動模型建出來。我心想這不就是套公式嘛簡單。結(jié)果光是確定每個關(guān)節(jié)的坐標系原點就折騰了我整整兩天。更別提后來發(fā)現(xiàn)不同教材、不同機器人廠商對DH參數(shù)的定義還有“標準DH”和“改進DH”之分直接把我給整懵了。后來在項目里反復折騰才算是把這里面的門道摸清楚了。今天我就以一個過來人的身份跟你聊聊怎么在Matlab里用DH參數(shù)法給串聯(lián)機器人建模并且一次就把它搞對。簡單來說DH參數(shù)法是一套“約定俗成”的規(guī)則它用四個參數(shù)就能清晰地描述出機器人相鄰兩個連桿之間的空間關(guān)系。它的核心價值在于標準化和可計算性。通過這套規(guī)則我們可以把復雜的、三維空間中的機械結(jié)構(gòu)轉(zhuǎn)化成一個整齊的表格DH表和一系列齊次變換矩陣。在Matlab里我們就能利用這些矩陣輕松地計算機械臂末端執(zhí)行器比如夾爪、焊槍相對于基座的位置和姿態(tài)這就是正運動學。反過來如果知道了末端想要到達的位置和姿態(tài)去反推每個關(guān)節(jié)需要轉(zhuǎn)動的角度這就是逆運動學。而這一切的起點就是建立一個正確無誤的DH模型。所以這篇文章適合所有需要用Matlab進行機器人仿真、算法開發(fā)或者僅僅是完成課程作業(yè)的朋友。無論你是想驗證自己設計的機械臂結(jié)構(gòu)是否合理還是為后續(xù)的軌跡規(guī)劃、控制算法提供一個精確的“數(shù)字孿生”模型一個正確的DH模型都是你必須邁過去的第一道坎。接下來我會手把手帶你走完從理解原理、建立參數(shù)表到在Matlab中實現(xiàn)和驗證的完整流程并分享幾個我踩過的大坑和避坑技巧。2. 庖丁解牛徹底搞懂DH參數(shù)法的“潛規(guī)則”與兩種慣例在動手寫代碼之前我們必須把理論基礎打牢。DH參數(shù)法的核心思想是在機器人的每個連桿上“安裝”一個坐標系然后用四個參數(shù)來描述相鄰兩個坐標系之間的變換關(guān)系。聽起來簡單但魔鬼藏在細節(jié)里。最大的 confusion 往往來自于坐標系到底應該怎么裝參數(shù)到底按什么順序來2.1 坐標系建立的“黃金法則”給串聯(lián)機器人的每個連桿建立坐標系遵循一套固定的步驟。這里以最常用的標準DH參數(shù)法為例確定關(guān)節(jié)軸Z軸第 i 個關(guān)節(jié)的旋轉(zhuǎn)或移動軸線就是連桿 i 的 Z 軸記為 Z_i。對于旋轉(zhuǎn)關(guān)節(jié)Z軸就是關(guān)節(jié)的旋轉(zhuǎn)軸對于移動關(guān)節(jié) prismatic jointZ軸就是關(guān)節(jié)的移動方向。確定坐標系原點O_i原點 O_i 是 Z_i 軸和 Z_{i-1} 軸的公垂線common perpendicular與 Z_i 軸的交點。如果兩軸平行則公垂線有無數(shù)條通常選擇使連桿偏距 d_i 為0的那一條。如果兩軸相交則原點就是交點。確定X軸X_iX_i 軸的方向沿 Z_{i-1} 軸和 Z_i 軸的公垂線由 Z_{i-1} 軸指向 Z_i 軸。確定Y軸Y_i根據(jù)右手定則由 Z_i 軸和 X_i 軸確定 Y_i 軸Y_i Z_i × X_i。這套規(guī)則必須嚴格執(zhí)行不能憑感覺亂放。一個常見的錯誤是把坐標系原點直接放在關(guān)節(jié)的物理中心上這對于某些特定結(jié)構(gòu)的關(guān)節(jié)比如兩個旋轉(zhuǎn)關(guān)節(jié)軸線相交于一點是成立的但對于大多數(shù)情況尤其是軸線異面的情況就會導致后續(xù)的變換矩陣出錯。2.2 四個參數(shù)的物理意義與“標準DH”流程坐標系建好后從坐標系 {i-1} 變換到坐標系 {i}可以通過以下四個有序的變換來實現(xiàn)對應四個DH參數(shù)繞 Z_{i-1} 軸旋轉(zhuǎn) θ_i 角將 X_{i-1} 軸旋轉(zhuǎn)到與 X_i 軸平行的方向。θ_i 是關(guān)節(jié)變量對于旋轉(zhuǎn)關(guān)節(jié)它是變化的對于移動關(guān)節(jié)它是固定的。沿 Z_{i-1} 軸平移 d_i將原點 O_{i-1} 移動到 O_i 在 Z_{i-1} 軸上的投影點。d_i 是連桿偏距。沿 X_i 軸平移 a_i將原點移動到 O_i 點。a_i 是連桿長度即從 Z_{i-1} 軸到 Z_i 軸沿 X_i 軸方向的距離。繞 X_i 軸旋轉(zhuǎn) α_i 角將 Z_{i-1} 軸旋轉(zhuǎn)到與 Z_i 軸平行的方向。α_i 是連桿轉(zhuǎn)角即從 Z_{i-1} 軸到 Z_i 軸繞 X_i 軸旋轉(zhuǎn)的角度。記住這個順序旋轉(zhuǎn)θ → 平移d → 平移a → 旋轉(zhuǎn)α。每一步變換都對應一個齊次變換矩陣連乘起來就得到了從 {i-1} 到 {i} 的總變換矩陣A_i。A_i Rot(z, θ_i) * Trans(z, d_i) * Trans(x, a_i) * Rot(x, α_i)把這個矩陣寫開就是教科書上那個經(jīng)典的DH變換矩陣。在Matlab里我們不需要手動輸入這個矩陣的每一個元素后面會用到現(xiàn)成的函數(shù)來生成它。2.3 “標準DH” vs “改進DH”你必須做的選擇題這是新手最容易栽跟頭的地方。除了上面講的標準DHStandard DH還有一種廣泛使用的改進DHModified DH也叫Craig版本。它們的主要區(qū)別在于坐標系附著在連桿的位置不同標準DH本文主要采用坐標系 {i} 固連在連桿 i 的遠端靠近關(guān)節(jié) i1 的一端。參數(shù)a_i和α_i描述了連桿 i 本身的幾何形狀。改進DH坐標系 {i} 固連在連桿 i 的近端靠近關(guān)節(jié) i 的一端。參數(shù)a_{i-1}和α_{i-1}描述了連桿 i-1 的幾何形狀。為什么會有兩種改進DH在描述樹狀結(jié)構(gòu)或閉鏈機器人時更清晰且其變換矩陣連乘順序從基座到末端更直觀。而標準DH在傳統(tǒng)工業(yè)機器人教材中更常見。怎么選注意絕對不要混用一旦你為某個機器人選擇了其中一種慣例所有的參數(shù)定義、坐標系建立、變換矩陣計算都必須遵循這一種。通常你參考的機器人數(shù)據(jù)手冊或論文會指明它用的是哪種。如果沒指明你可以根據(jù)變換矩陣的連乘順序來判斷或者選擇一種并始終堅持。在Matlab的Robotics System Toolbox中兩種都支持但創(chuàng)建機器人對象時需要明確指定。我個人的經(jīng)驗是對于大多數(shù)教科書上的經(jīng)典六軸串聯(lián)機械臂如PUMA560標準DH資料更多更容易上手。在本文的后續(xù)Matlab實操中我們將使用標準DH。3. 實戰(zhàn)演練以經(jīng)典六軸機械臂為例構(gòu)建DH參數(shù)表理論說再多不如動手算一遍。我們以一個簡化版的經(jīng)典六軸旋轉(zhuǎn)關(guān)節(jié)機械臂為例來推導它的DH參數(shù)表。假設它的結(jié)構(gòu)類似于PUMA560但尺寸簡化以便理解。我們的目標是得到下面這張表連桿 iθ_i (變量)d_ia_iα_i1θ1L10-90°2θ20L203θ30L3-90°4θ4L4090°5θ500-90°6θ6L600注L1, L2, L3, L4, L6為具體的長度值例如可以設為0.5, 0.4, 0.3, 0.2, 0.1 (米)。3.1 步驟一分析機械臂結(jié)構(gòu)草圖首先你需要一張機械臂的示意圖或三維模型。明確以下幾點所有關(guān)節(jié)都是旋轉(zhuǎn)關(guān)節(jié)Revolute Joint。關(guān)節(jié)1基座關(guān)節(jié)繞垂直軸Z0旋轉(zhuǎn)。關(guān)節(jié)2和關(guān)節(jié)3的軸線平行。關(guān)節(jié)4、5、6的軸線相交于一點腕部中心點。3.2 步驟二按標準DH規(guī)則建立坐標系我們從基座{0}開始一步步建立到末端工具坐標系{6}。坐標系 {0}固定在基座上。Z0沿關(guān)節(jié)1的旋轉(zhuǎn)軸垂直向上。通常將原點O0放在基座中心X0方向任意一般向前根據(jù)右手定則確定Y0。坐標系 {1}Z1軸沿關(guān)節(jié)2的旋轉(zhuǎn)軸假設水平向前。原點O1是Z0和Z1公垂線與Z1的交點。因為Z0垂直Z1水平公垂線就是它們之間最短的垂直線段。這個線段的長度就是d1 L1基座高度。X1軸沿Z0到Z1的公垂線方向由Z0指向Z1水平向前。此時從{0}到{1}需要繞Z0轉(zhuǎn)θ1再沿Z0平移d1L1就使Z0與Z1共線但原點還差一截。接著沿X1平移a1但此時Z0和Z1已經(jīng)相交了嗎不它們異面。實際上平移a1是沿著X1軸移動但在這個例子中經(jīng)過旋轉(zhuǎn)和平移d后原點O0已經(jīng)移動到O1在Z0上的投影點而O1在X1軸上。因為Z0和Z1是垂直異面公垂線就是X1本身所以從投影點到O1的距離就是a1 0。最后需要繞X1軸旋轉(zhuǎn)使Z0與Z1同向。Z0原來是垂直的要變成水平的Z1需要繞X1軸旋轉(zhuǎn)α1 -90°(順時針90度)。坐標系 {2}Z2軸沿關(guān)節(jié)3的旋轉(zhuǎn)軸與Z1平行水平向前。原點O2是Z1和Z2公垂線與Z2的交點。因為Z1和Z2平行公垂線是它們之間最短的連線。這段距離就是a2 L2大臂長度。X2軸沿Z1到Z2的公垂線方向。因為兩軸平行方向可以選為從Z1指向Z2水平向前與X1同向或反向這里需要根據(jù)實際幾何判斷通常向前。從{1}到{2}繞Z1轉(zhuǎn)θ2沿Z1平移d20因為原點O1已經(jīng)在公垂線與Z1的交點沿X2平移a2L2繞X2旋轉(zhuǎn)α20因為Z1和Z2平行。坐標系 {3}Z3軸沿關(guān)節(jié)4的旋轉(zhuǎn)軸假設水平與Z2垂直。原點O3是Z2和Z3公垂線與Z3的交點。這段公垂線長度是a3 L3小臂長度。X3軸沿Z2到Z3的公垂線方向。從{2}到{3}繞Z2轉(zhuǎn)θ3沿Z2平移d30沿X3平移a3L3繞X3旋轉(zhuǎn)α3-90°使水平的Z2變?yōu)樗降腪3但方向垂直了所以需要轉(zhuǎn)90度具體符號根據(jù)右手定則判斷。坐標系 {4}, {5}, {6}腕部三個關(guān)節(jié)軸線相交于一點腕部中心。這意味著從坐標系{3}的原點O3到腕部中心點需要沿Z3平移d4 L4。然后因為后續(xù)關(guān)節(jié)軸線相交a4, a5, a6 都為0。α4, α5, α6 則描述腕部軸線之間的夾角通常為90°或-90°。具體參數(shù)如上面表格所示。這個過程需要極強的空間想象力。一個極其重要的技巧是畫圖在紙上或繪圖軟件里把每個坐標系的三根軸清清楚楚地畫出來標上XYZ和原點O。這是確保參數(shù)正確的唯一可靠方法。3.3 步驟三填寫DH參數(shù)表并復核將上面分析得到的參數(shù)整理成表。填寫時務必檢查對于旋轉(zhuǎn)關(guān)節(jié)θ是變量用θ1, θ2...表示d是常數(shù)。對于移動關(guān)節(jié)d是變量θ是常數(shù)。a和α總是常數(shù)描述連桿的固定幾何形狀。符號旋轉(zhuǎn)角α和θ遵循右手定則拇指指向旋轉(zhuǎn)軸正方向四指彎曲方向為正。4. 在Matlab中“復活”你的機器人模型參數(shù)表有了我們就可以在Matlab里把它變成一個可以驅(qū)動、可以計算的模型了。這里主要依賴Robotics System Toolbox它是Matlab中機器人學的“瑞士軍刀”。如果你沒有這個工具箱需要額外安裝。4.1 環(huán)境準備與工具箱核心函數(shù)簡介首先在Matlab命令窗口輸入ver查看是否已安裝‘Robotics System Toolbox’。如果沒有需要通過Matlab的“附加功能”管理器安裝。這個工具箱提供了兩種主要的機器人對象表示方式rigidBodyTree更現(xiàn)代、更靈活的表示支持標準DH和改進DH是官方推薦的方式。SerialLink(通過Robotics Toolbox Peter Corke版本)一個非常流行且強大的第三方工具箱語法更簡潔。但Matlab官方已不再維護其內(nèi)置的類似功能更推薦使用rigidBodyTree。不過Peter Corke的Toolbox仍然被廣泛使用。為了覆蓋更廣我先介紹官方的rigidBodyTree方法。4.2 使用 rigidBodyTree 構(gòu)建機器人對象我們按照前面得到的DH表來創(chuàng)建機器人。% 清除工作區(qū)關(guān)閉所有圖形 clear; close all; clc; % 1. 創(chuàng)建空的剛性體樹對象 robot rigidBodyTree(DataFormat, row); % row 表示使用行向量表示變換更常見 % 2. 定義連桿的幾何參數(shù)單位米 L1 0.5; L2 0.4; L3 0.3; L4 0.2; L6 0.1; % 3. 創(chuàng)建第一個連桿Base to Joint1 % 注意基座‘world’是默認存在的。第一個物體是連接在基座上的。 body1 rigidBody(body1); joint1 rigidBodyJoint(joint1, revolute); % 旋轉(zhuǎn)關(guān)節(jié) % 設置關(guān)節(jié)的DH參數(shù)使用標準DH慣例 % setFixedTransform(joint, dhparams, dh) 其中dhparams [a alpha d theta] % 注意這里的theta對應的是關(guān)節(jié)變量在創(chuàng)建時先設為0后續(xù)通過關(guān)節(jié)位置控制。 dhparams1 [0, -pi/2, L1, 0]; % [a1, alpha1, d1, theta1] setFixedTransform(joint1, dhparams1, dh); body1.Joint joint1; addBody(robot, body1, base); % 將body1添加到基座上 % 4. 創(chuàng)建第二個連桿 (Body1 to Body2) body2 rigidBody(body2); joint2 rigidBodyJoint(joint2, revolute); dhparams2 [L2, 0, 0, 0]; % [a2, alpha2, d2, theta2] setFixedTransform(joint2, dhparams2, dh); body2.Joint joint2; addBody(robot, body2, body1); % 將body2連接到body1上 % 5. 創(chuàng)建第三個連桿 (Body2 to Body3) body3 rigidBody(body3); joint3 rigidBodyJoint(joint3, revolute); dhparams3 [L3, -pi/2, 0, 0]; % [a3, alpha3, d3, theta3] setFixedTransform(joint3, dhparams3, dh); body3.Joint joint3; addBody(robot, body3, body2); % 6. 創(chuàng)建第四、五、六個連桿腕部 body4 rigidBody(body4); joint4 rigidBodyJoint(joint4, revolute); dhparams4 [0, pi/2, L4, 0]; % [a4, alpha4, d4, theta4] setFixedTransform(joint4, dhparams4, dh); body4.Joint joint4; addBody(robot, body4, body3); body5 rigidBody(body5); joint5 rigidBodyJoint(joint5, revolute); dhparams5 [0, -pi/2, 0, 0]; % [a5, alpha5, d5, theta5] setFixedTransform(joint5, dhparams5, dh); body5.Joint joint5; addBody(robot, body5, body4); % 末端執(zhí)行器通常作為一個沒有關(guān)節(jié)的固定連桿 body6 rigidBody(tool); joint6 rigidBodyJoint(fix6, fixed); % 固定關(guān)節(jié)將工具固定到body5 % 從body5的坐標系到工具坐標系還有一個偏移 d6 dhparams6 [0, 0, L6, 0]; % [a6, alpha6, d6, theta6] setFixedTransform(joint6, dhparams6, dh); body6.Joint joint6; addBody(robot, body6, body5); % 7. 顯示機器人詳細信息 showdetails(robot)運行showdetails(robot)你會看到機器人每個關(guān)節(jié)的類型、父物體、子物體以及變換關(guān)系這是驗證模型結(jié)構(gòu)是否正確的重要一步。4.3 可視化與正運動學驗證模型建好了我們讓它動起來看看。% 8. 可視化機器人初始狀態(tài)所有關(guān)節(jié)角為0 figure(Name, Robot Visualization, Position, [100 100 800 600]); show(robot); title(六軸機械臂模型 (初始零位)); xlabel(X (m)); ylabel(Y (m)); zlabel(Z (m)); view(135, 30); % 設置一個較好的觀察視角 grid on; axis equal; % 9. 正運動學計算示例給定一組關(guān)節(jié)角度計算末端位姿 config [pi/6, -pi/4, pi/3, -pi/6, pi/2, 0]; % 六個關(guān)節(jié)的角度 [θ1, θ2, θ3, θ4, θ5, θ6] % 注意config的順序必須和添加body的順序一致即對應關(guān)節(jié)1到關(guān)節(jié)6。 % 設置機器人到這個構(gòu)型 robot.DataFormat row; % 確保數(shù)據(jù)格式 config deg2rad([30, -45, 60, -30, 90, 0]); % 也可以用角度制但記得轉(zhuǎn)換 % 獲取正運動學變換矩陣 tform getTransform(robot, config, tool); % ‘tool’是我們定義的末端執(zhí)行器名稱 disp(末端執(zhí)行器相對于基座的變換矩陣 T_0_tool:); disp(tform); % 從變換矩陣中提取位置和歐拉角 position tform(1:3, 4); % 位置向量 orientation tform(1:3, 1:3); % 旋轉(zhuǎn)矩陣 % 將旋轉(zhuǎn)矩陣轉(zhuǎn)換為ZYX歐拉角更直觀 eulZYX rotm2eul(orientation, ZYX); disp([末端位置: [, num2str(position), ] m]); disp([末端姿態(tài)(ZYX歐拉角): [, num2str(rad2deg(eulZYX)), ] deg]); % 10. 可視化這個特定構(gòu)型 figure; show(robot, config); title([機器人構(gòu)型: θ [, num2str(rad2deg(config)), ] deg]); view(135, 30); grid on; axis equal;如果一切正確你將看到機械臂從一個“折疊”的初始狀態(tài)運動到你指定關(guān)節(jié)角度的姿態(tài)。getTransform函數(shù)計算出的變換矩陣T_0_tool就是通過我們輸入的DH參數(shù)和關(guān)節(jié)角度一步步從基座坐標系{0}變換到工具坐標系{tool}的結(jié)果。這就是正運動學的核心。5. 避坑指南與進階思考從“能用”到“好用”把模型跑通只是第一步。在實際項目中你會遇到更多問題。下面是我總結(jié)的幾個關(guān)鍵點和進階方向。5.1 常見錯誤排查清單如果你的模型報錯或者運動姿態(tài)很奇怪請按以下順序檢查DH參數(shù)表錯誤這是最最常見的問題。反復對照第二節(jié)的規(guī)則檢查每個坐標系的Z軸方向、原點位置、X軸方向。特別是α角的符號很容易搞反。一個快速驗證的方法是令所有關(guān)節(jié)角為0看看機器人的初始姿態(tài)是否符合你的預期比如是否站立、手臂是否向前伸展。如果初始姿態(tài)就歪了肯定是DH參數(shù)錯了。Matlab代碼中的參數(shù)順序setFixedTransform(joint, dhparams, dh)中的dhparams向量順序是[a, alpha, d, theta]。千萬注意這個順序和你教科書上常見的[theta, d, a, alpha]或[d, theta, a, alpha]可能不同一定要看Matlab官方文檔。本文使用的順序是[a, alpha, d, theta]。“標準DH”與“改進DH”混淆在setFixedTransform中第三個參數(shù)指定了慣例。我們用的是dh代表標準DH。如果你參考的模型是改進DH則需要使用mdh并且輸入的參數(shù)意義完全不同。再次強調(diào)不要混用關(guān)節(jié)類型設置錯誤旋轉(zhuǎn)關(guān)節(jié)是revolute移動關(guān)節(jié)是prismatic。如果設錯后續(xù)控制會出問題。單位不一致DH參數(shù)中的長度單位a, d要一致通常用米(m)。角度單位在輸入函數(shù)時Matlab默認使用弧度(rad)。如果你習慣用度(deg)記得用deg2rad()函數(shù)轉(zhuǎn)換。末端執(zhí)行器定義我們通常關(guān)心工具末端點TCP的位姿。在上面的代碼中我們通過一個固定的連桿body6和固定關(guān)節(jié)‘fix6’來定義了一個工具坐標系它距離最后一個運動關(guān)節(jié)body5的關(guān)節(jié)有一個d6L6的偏移。確保這個偏移是你想要的TCP位置。5.2 模型驗證與已知模型或?qū)嵨飳Ρ热绾未_信你的模型是正確的有幾個方法與經(jīng)典模型對比比如PUMA560機器人有公開的、經(jīng)過驗證的DH參數(shù)。你可以用你的代碼實現(xiàn)PUMA560然后讓機器人移動到某個特定姿態(tài)如所有關(guān)節(jié)為0看末端位置是否與文獻中一致。正逆運動學互驗這是最有力的驗證。編寫逆運動學算法或使用工具箱的inverseKinematics函數(shù)對正運動學計算出的一個末端位姿進行逆解得到的關(guān)節(jié)角再代回正運動學看是否能回到原來的位姿允許微小誤差。軌跡驗證讓末端走一個簡單的已知軌跡如直線、圓觀察關(guān)節(jié)角變化是否平滑、合理。5.3 超越基礎將模型用于仿真與控制一個正確的DH模型是你的“數(shù)字孿生”機器人它是后續(xù)所有高級應用的基礎逆運動學求解使用inverseKinematics對象。你可以指定末端位姿的約束位置、方向并設置權(quán)重讓求解器為你計算所需的關(guān)節(jié)角度。這對于軌跡規(guī)劃至關(guān)重要。ik inverseKinematics(RigidBodyTree, robot); weights [0.1, 0.1, 0.1, 1, 1, 1]; % 位置權(quán)重低姿態(tài)權(quán)重高 initialGuess config; % 初始猜測關(guān)節(jié)角 [qSol, solInfo] ik(tool, tform, weights, initialGuess);軌跡規(guī)劃在關(guān)節(jié)空間或笛卡爾空間生成一系列路徑點。例如使用trapveltraj或polynomialtraj生成平滑的關(guān)節(jié)角度軌跡然后用show函數(shù)以動畫形式播放出來檢查是否有奇異點或碰撞。與Simulink集成rigidBodyTree對象可以直接導入Simulink的Simscape Multibody環(huán)境進行物理仿真或者與控制系統(tǒng)模塊結(jié)合實現(xiàn)更真實的帶動力學和控制的仿真。導出與共享你可以將建好的rigidBodyTree機器人模型保存為.mat文件或URDFUnified Robot Description Format文件方便在其他項目或ROS機器人操作系統(tǒng)中使用。5.4 一個關(guān)鍵技巧使用可視化工具輔助建模對于復雜的機器人純靠腦子想坐標系非常困難。我強烈推薦一個流程在SolidWorks、Fusion 360或OnShape等CAD軟件中畫出機器人的簡化模型只需要關(guān)節(jié)軸線和連桿輪廓。在CAD環(huán)境中按照標準DH規(guī)則在每個連桿上創(chuàng)建坐標系。很多CAD軟件可以顯示坐標系的變換矩陣。直接從CAD環(huán)境中讀取相鄰坐標系之間的變換關(guān)系然后反推出DH參數(shù)。這比正向推導更不容易出錯。 具體方法是已知從坐標系{i-1}到{i}的變換矩陣T可以通過公式反解出(θ_i, d_i, a_i, α_i)。Matlab也有函數(shù)可以幫助完成這個計算。建立機器人運動學模型是機器人編程的基石這個過程充滿了對空間幾何的理解和嚴謹?shù)倪壿嬐茖А5谝淮巫隹赡軙X得繁瑣但一旦你成功地把一個物理機器人用一組參數(shù)和矩陣在電腦里“復活”過來并且能精確控制它運動時那種成就感是無與倫比的。希望這篇詳細的指南能幫你避開我當年踩過的那些坑順利搭建起屬于你自己的機器人仿真世界。記住多畫圖多驗證從簡單的二連桿、三連桿開始練習手感自然就來了。