一、前言
1、描述兩個(gè)坐標(biāo)系的變換關(guān)系需要6個(gè)參數(shù)(3個(gè)表示位置變換,3個(gè)表示姿態(tài)變換),為什么DH參數(shù)只需4個(gè)?
空間任意兩個(gè)坐標(biāo)系的變換關(guān)系確實(shí)需要6個(gè)參數(shù)來(lái)表示,然而,在建立各個(gè)連桿的坐標(biāo)系時(shí),我們可以擬定一些規(guī)則,使得坐標(biāo)系滿足某些約束,從而只需4個(gè)參數(shù)則可以表示兩個(gè)坐標(biāo)系的變換關(guān)系。
若坐標(biāo)軸x i 與坐標(biāo)軸z i ? 1 垂直相交(示例如下圖),則只需4個(gè)參數(shù)(桿件長(zhǎng)度a i 桿件扭角α i關(guān)節(jié)距離d i 關(guān)節(jié)轉(zhuǎn)角θ i 就可以表示兩個(gè)坐標(biāo)系的變換關(guān)系。
下面的證明來(lái)于書(shū)籍:Robot Modeling and Control(First Edition),by Mark W. Spong, Seth Hutchinson, and M. Vidyasagar.
若坐標(biāo)系{ x 1 y 1 z 1 }與坐標(biāo)系{ x 0 y 0 z 0 }垂直相交,則坐標(biāo)系{ x 1 y 1 z 1 } 到坐標(biāo)系{ x 0 y 0 z 0 }的齊次變換矩陣為:
?
綜上,坐標(biāo)系{ x 1 y 1 z 1 } 到坐標(biāo)系{ x 0 y 0 z 0 } 的齊次變換關(guān)系用桿件長(zhǎng)度a ,桿件扭角α ,關(guān)節(jié)距離d ,關(guān)節(jié)轉(zhuǎn)角θ這4個(gè)參數(shù)就夠了。
2、利用DH參數(shù)建模時(shí),各個(gè)連桿坐標(biāo)系的建立是唯一的嗎?
利用DH參數(shù)建模時(shí),各個(gè)連桿坐標(biāo)系的建立不是唯一的。只要在建立坐標(biāo)系時(shí),坐標(biāo)軸x i與坐標(biāo)軸z i -1垂直相交即可。
3、DH參數(shù)表是唯一的嗎?
DH參數(shù)表不是唯一的。因?yàn)楦鱾€(gè)連桿坐標(biāo)系的建立不是唯一的,導(dǎo)致DH參數(shù)不同,但是最終計(jì)算得到末端工具坐標(biāo)系到機(jī)器人基坐標(biāo)系下的齊次變換矩陣是唯一的。(前提是機(jī)器人基坐標(biāo)系與末端工具坐標(biāo)系的建立保持不變)
4、標(biāo)準(zhǔn)DH參數(shù)與修正DH參數(shù)有何異同?
祥見(jiàn)參考資料2,3。
(1)標(biāo)準(zhǔn)DH參數(shù)坐標(biāo)系建立在傳動(dòng)軸上,而修正DH參數(shù)坐標(biāo)系建立在驅(qū)動(dòng)軸上
(2)由于坐標(biāo)系建立位置發(fā)生了變化,連桿之間的坐標(biāo)系變換關(guān)系自然也發(fā)生變化。
標(biāo)準(zhǔn)DH相鄰連桿之間坐標(biāo)系的變換關(guān)系為:
修正DH相鄰連桿之間坐標(biāo)系的變換關(guān)系為:
(3)修正DH參數(shù)中各個(gè)參數(shù)的物理意義與標(biāo)準(zhǔn)DH參數(shù)是一樣的。
(4)對(duì)于傳統(tǒng)的串聯(lián)機(jī)器人而言,兩者的表現(xiàn)能力是一樣的,沒(méi)有優(yōu)劣之分,我們可以選擇其中一種方法進(jìn)行建模。然而,由于修正DH參數(shù)坐標(biāo)系建立在驅(qū)動(dòng)軸上,對(duì)于樹(shù)狀結(jié)構(gòu)的機(jī)器人,其表現(xiàn)能力更強(qiáng),可以簡(jiǎn)化問(wèn)題。
(5)對(duì)于標(biāo)準(zhǔn)DH參數(shù),根據(jù)DH參數(shù)表,并對(duì)式(9) 連乘得到的是末端工具坐標(biāo)系到機(jī)器人基坐標(biāo)系的齊次變換矩陣;對(duì)于修正DH參數(shù),根據(jù)DH參數(shù)表,并對(duì)式(10) 連乘得到的是最后一個(gè)驅(qū)動(dòng)關(guān)節(jié)上的坐標(biāo)系到機(jī)器人基坐標(biāo)系的齊次變換矩陣,變換到末端工具坐標(biāo)系還需增加一個(gè)變換(通常為平移變換)。
二、標(biāo)準(zhǔn)DH參數(shù)
1、DH四個(gè)參數(shù)的定義
(1)d i :坐標(biāo)軸x i -1與坐標(biāo)軸x i 沿著坐標(biāo)軸z i ? 1 的有向距離。
(2)a i :坐標(biāo)軸z i ? 1與坐標(biāo)軸z i 沿著坐標(biāo)軸x i ?的有向距離。
(3)α i :坐標(biāo)軸z i ? 1 與坐標(biāo)軸z i 的夾角,方向定義如下:
(4) θ i:坐標(biāo)軸x i ? 1 與坐標(biāo)軸x i 的夾角,方向定義如下:
2、DH連桿坐標(biāo)系的約定
(1)坐標(biāo)軸x i 與坐標(biāo)軸z i ? 1垂直。
(2)坐標(biāo)軸x i 與坐標(biāo)軸z i ? 1 相交。
3、根據(jù)DH連桿坐標(biāo)系約定,建立各個(gè)連桿坐標(biāo)系
4、根據(jù)DH四個(gè)參數(shù)的定義,創(chuàng)建DH參數(shù)表
三、六軸機(jī)器人實(shí)例(standard DH)
這里以六軸機(jī)器人為例,通過(guò)建立3種不同的連桿坐標(biāo)系,創(chuàng)建對(duì)應(yīng)的DH表,比較最終運(yùn)動(dòng)學(xué)正解最終結(jié)果是否一致。
其中,d 1 = 0.3991 , a 2 = 0.448 , a 3 = 0.042 , d 4 = 0.451 , d 6 = 0.082以米為單位。兩種不同的連桿坐標(biāo)系的建立方法得到不同的DH參數(shù)表,但最終的機(jī)器人運(yùn)動(dòng)學(xué)正解完全一樣!
1、第一種連桿坐標(biāo)系建立方法
連桿坐標(biāo)系建立如下:
DH參數(shù)表如下:
2、第二種連桿坐標(biāo)系建立方法
連桿坐標(biāo)系建立如下:
DH參數(shù)表如下:
四、MATLAB代碼
?
?
clc; clear; syms d1 d2 d3 d4 d5 d6 a1 a2 a3 a4 a5 a6 real syms alpha1 alpha2 alpha3 alpha4 alpha5 alpha6 real syms theta1 theta2 theta3 theta4 theta5 theta6 real; %% (1) a1 = sym(0); alpha1 = sym(-pi/2); A1 = simplify([cos(theta1), -sin(theta1)*cos(alpha1), sin(theta1)*sin(alpha1), a1*cos(theta1) ? ?sin(theta1), cos(theta1)*cos(alpha1), -cos(theta1)*sin(alpha1), a1*sin(theta1) ? ?0, sin(alpha1), cos(alpha1), d1 ? ?0, 0, 0, 1]); d2 = sym(0); alpha2 = sym(0); A2 = simplify([cos(theta2 - pi/2), -sin(theta2 - pi/2)*cos(alpha2), sin(theta2 - pi/2)*sin(alpha2), a2*cos(theta2 - pi/2) ? ?sin(theta2 - pi/2), cos(theta2 - pi/2)*cos(alpha2), -cos(theta2 - pi/2)*sin(alpha2), a2*sin(theta2 - pi/2) ? ?0, sin(alpha2), cos(alpha2), d2 ? ?0, 0, 0, 1]); d3 = sym(0); alpha3 = sym(-pi/2); A3 = simplify([cos(theta3), -sin(theta3)*cos(alpha3), sin(theta3)*sin(alpha3), a3*cos(theta3) ? ?sin(theta3), cos(theta3)*cos(alpha3), -cos(theta3)*sin(alpha3), a3*sin(theta3) ? ?0, sin(alpha3), cos(alpha3), d3 ? ?0, 0, 0, 1]); a4 = sym(0); alpha4 = sym(pi/2); A4 = simplify([cos(theta4), -sin(theta4)*cos(alpha4), sin(theta4)*sin(alpha4), a4*cos(theta4) ? ?sin(theta4), cos(theta4)*cos(alpha4), -cos(theta4)*sin(alpha4), a4*sin(theta4) ? ?0, sin(alpha4), cos(alpha4), d4 ? ?0, 0, 0, 1]); a5 = sym(0); d5 = sym(0); alpha5 = sym(-pi/2); A5 = simplify([cos(theta5), -sin(theta5)*cos(alpha5), sin(theta5)*sin(alpha5), a5*cos(theta5) ? ?sin(theta5), cos(theta5)*cos(alpha5), -cos(theta5)*sin(alpha5), a5*sin(theta5) ? ?0, sin(alpha5), cos(alpha5), d5 ? ?0, 0, 0, 1]); a6 = sym(0); alpha6 = sym(0); A6 = simplify([cos(theta6+pi), -sin(theta6+pi)*cos(alpha6), sin(theta6+pi)*sin(alpha6), a6*cos(theta6+pi) ? ?sin(theta6+pi), cos(theta6+pi)*cos(alpha6), -cos(theta6+pi)*sin(alpha6), a6*sin(theta6+pi) ? ?0, sin(alpha6), cos(alpha6), d6 ? ?0, 0, 0, 1]); T1 = simplify(A1*A2*A3*A4*A5*A6); %% (2) a1 = sym(0); alpha1 = sym(-pi/2); A1 = simplify([cos(theta1), -sin(theta1)*cos(alpha1), sin(theta1)*sin(alpha1), a1*cos(theta1) ? ?sin(theta1), cos(theta1)*cos(alpha1), -cos(theta1)*sin(alpha1), a1*sin(theta1) ? ?0, sin(alpha1), cos(alpha1), d1 ? ?0, 0, 0, 1]); d2 = sym(0); alpha2 = sym(0); A2 = simplify([cos(theta2 + pi/2), -sin(theta2 + pi/2)*cos(alpha2), sin(theta2 + pi/2)*sin(alpha2), (-a2)*cos(theta2 + pi/2) ? ?sin(theta2 + pi/2), cos(theta2 + pi/2)*cos(alpha2), -cos(theta2 + pi/2)*sin(alpha2), (-a2)*sin(theta2 + pi/2) ? ?0, sin(alpha2), cos(alpha2), d2 ? ?0, 0, 0, 1]); d3 = sym(0); alpha3 = sym(pi/2); A3 = simplify([cos(theta3), -sin(theta3)*cos(alpha3), sin(theta3)*sin(alpha3), (-a3)*cos(theta3) ? ?sin(theta3), cos(theta3)*cos(alpha3), -cos(theta3)*sin(alpha3), (-a3)*sin(theta3) ? ?0, sin(alpha3), cos(alpha3), d3 ? ?0, 0, 0, 1]); a4 = sym(0); alpha4 = sym(-pi/2); A4 = simplify([cos(theta4), -sin(theta4)*cos(alpha4), sin(theta4)*sin(alpha4), a4*cos(theta4) ? ?sin(theta4), cos(theta4)*cos(alpha4), -cos(theta4)*sin(alpha4), a4*sin(theta4) ? ?0, sin(alpha4), cos(alpha4), d4 ? ?0, 0, 0, 1]); a5 = sym(0); d5 = sym(0); alpha5 = sym(pi/2); A5 = simplify([cos(theta5), -sin(theta5)*cos(alpha5), sin(theta5)*sin(alpha5), a5*cos(theta5) ? ?sin(theta5), cos(theta5)*cos(alpha5), -cos(theta5)*sin(alpha5), a5*sin(theta5) ? ?0, sin(alpha5), cos(alpha5), d5 ? ?0, 0, 0, 1]); a6 = sym(0); alpha6 = sym(0); A6 = simplify([cos(theta6), -sin(theta6)*cos(alpha6), sin(theta6)*sin(alpha6), a6*cos(theta6) ? ?sin(theta6), cos(theta6)*cos(alpha6), -cos(theta6)*sin(alpha6), a6*sin(theta6) ? ?0, sin(alpha6), cos(alpha6), d6 ? ?0, 0, 0, 1]); ? ? T2 = simplify(A1*A2*A3*A4*A5*A6); err = simplify(T1 - T2)
?
?
五、參考資料
1.Robot Modeling and Control(First Edition),by Mark W. Spong, Seth Hutchinson, and M. Vidyasagar
2.https://blog.csdn.net/hitgavin/article/details/105018983
3.https://blog.csdn.net/jldemanman/article/details/80508683
編輯:黃飛
?
評(píng)論