一文带你完全掌握机器人DH参数建模(详细步骤+实例+代码)
文章目錄
- 一、前言
- 1、描述兩個坐標系的變換關(guān)系需要6個參數(shù)(3個表示位置變換,3個表示姿態(tài)變換),為什么DH參數(shù)只需4個?
- 2、利用DH參數(shù)建模時,各個連桿坐標系的建立是唯一的嗎?
- 3、DH參數(shù)表是唯一的嗎?
- 4、標準DH參數(shù)與修正DH參數(shù)有何異同?
- 二、標準DH參數(shù)
- 1、DH四個參數(shù)的定義
- 2、DH連桿坐標系的約定
- 3、根據(jù)DH連桿坐標系約定,建立各個連桿坐標系
- 4、根據(jù)DH四個參數(shù)的定義,創(chuàng)建DH參數(shù)表
- 三、六軸機器人實例(standard DH)
- 1、第一種連桿坐標系建立方法
- 2、第二種連桿坐標系建立方法
- 四、MATLAB代碼
- 五、參考資料
一、前言
1、描述兩個坐標系的變換關(guān)系需要6個參數(shù)(3個表示位置變換,3個表示姿態(tài)變換),為什么DH參數(shù)只需4個?
??空間任意兩個坐標系的變換關(guān)系確實需要6個參數(shù)來表示,然而,在建立各個連桿的坐標系時,我們可以擬定一些規(guī)則,使得坐標系滿足某些約束,從而只需4個參數(shù)則可以表示兩個坐標系的變換關(guān)系。
??若坐標軸xix_ixi?與坐標軸zi?1z_{i-1}zi?1?垂直相交(示例如下圖),則只需4個參數(shù)(桿件長度aia_iai?,桿件扭角αi\alpha_iαi?,關(guān)節(jié)距離did_idi?,關(guān)節(jié)轉(zhuǎn)角θi\theta_iθi?)就可以表示兩個坐標系的變換關(guān)系。下面的證明來于書籍:Robot Modeling and Control(First Edition),by Mark W. Spong, Seth Hutchinson, and M. Vidyasagar.
??若坐標系{x1y1z1}\{x_1y_1z_1\}{x1?y1?z1?}與坐標系{x0y0z0}\{x_0y_0z_0\}{x0?y0?z0?}垂直相交,則坐標系{x1y1z1}\{x_1y_1z_1\}{x1?y1?z1?}到坐標系{x0y0z0}\{x_0y_0z_0\}{x0?y0?z0?}的齊次變換矩陣為:
A=Rotz,θTransz,dTransx,aRotx,α(1)A=Rot_{z,\theta} Trans_{z,d}Trans_{x,a}Rot_{x,\alpha}\tag{1} A=Rotz,θ?Transz,d?Transx,a?Rotx,α?(1)
??(1)式可以寫成:
A=[R10O1001](2)A=\left[ \begin{matrix} R_1^0 & O_1^0\\ 0 & 1 \\ \end{matrix} \right] \tag{2} A=[R10?0?O10?1?](2)
??因為x1x_1x1?垂直于z0z_0z0?,故有:
0=x10?z00=[r11r21r31][001]=r31(3)0=x_1^0 \cdot z_0^0=\left[ \begin{matrix} r_{11} & r_{21} & r_{31}\\ \end{matrix} \right] \left[ \begin{matrix} 0 \\ 0 \\ 1 \\ \end{matrix} \right] =r_{31} \tag{3} 0=x10??z00?=[r11??r21??r31??]???001????=r31?(3)
??由于r31=0r_{31}=0r31?=0,只要證明存在唯一的桿件扭角α\alphaα,關(guān)節(jié)轉(zhuǎn)角θ\thetaθ,使得:
R10=Rotz,θRotx,α=[cθ?sθcαsθsαsθcθcα?cθsα0sαcα](4)R_1^0=Rot_{z,\theta}Rot_{x,\alpha}= \left[ \begin{matrix} c_\theta & -s_\theta c_\alpha & s_\theta s_\alpha \\ s_\theta & c_\theta c_\alpha & -c_\theta s_\alpha \\ 0 & s_\alpha & c_\alpha \end{matrix} \right] \tag{4} R10?=Rotz,θ?Rotx,α?=???cθ?sθ?0??sθ?cα?cθ?cα?sα??sθ?sα??cθ?sα?cα?????(4)
??因此,存在唯一的θ,α\theta,\alphaθ,α滿足:
{(r11,r21)=(cθ,sθ)(r32,r33)=(cα,sα)(5)\left \{ \begin{array}{c} (r_{11},r_{21})=(c_\theta,s_\theta) \\ (r_{32},r_{33})=(c_\alpha,s_\alpha) \end{array}\right. \tag 5 {(r11?,r21?)=(cθ?,sθ?)(r32?,r33?)=(cα?,sα?)?(5)
??易得:
{θ=atan2(r21,r11)α=atan2(r32,r33)(6)\left \{ \begin{array}{c} \theta=atan2(r_{21},r_{11}) \\ \alpha=atan2(r_{32},r_{33}) \end{array}\right. \tag 6 {θ=atan2(r21?,r11?)α=atan2(r32?,r33?)?(6)
??根據(jù)旋轉(zhuǎn)矩陣的性質(zhì),可以推導得到:
{?sθcα=r12sθsα=r13cθcα=r22?cθsα=r23(7)\left \{ \begin{array}{c} -s_\theta c_\alpha=r_{12} \\ s_\theta s_\alpha=r_{13} \\ c_\theta c_\alpha=r_{22} \\ -c_\theta s_\alpha=r_{23} \\ \end{array}\right. \tag 7 ?????????sθ?cα?=r12?sθ?sα?=r13?cθ?cα?=r22??cθ?sα?=r23??(7)
??可見,坐標系{x1y1z1}\{x_1y_1z_1\}{x1?y1?z1?}到坐標系{x0y0z0}\{x_0y_0z_0\}{x0?y0?z0?}的旋轉(zhuǎn)變換關(guān)系用θ,α\theta,\alphaθ,α來表達就足夠了。
??若x1x_1x1?與z0z_0z0?相交,坐標系{x1y1z1}\{x_1y_1z_1\}{x1?y1?z1?}的原點在坐標系{x0y0z0}\{x_0y_0z_0\}{x0?y0?z0?}下的坐標(或平移向量)為:
O10=O00+dz00+ax10=[000]+d[001]+a[cθsθ0]=[acθasθd](8)O_1^0=O_0^0+dz_0^0+ax_1^0= \left[ \begin{matrix} 0 \\ 0 \\ 0 \\ \end{matrix} \right] +d\left[ \begin{matrix} 0 \\ 0 \\ 1 \\ \end{matrix} \right] +a\left[ \begin{matrix} c_{\theta} \\ s_{\theta} \\ 0 \\ \end{matrix} \right] = \left[ \begin{matrix} ac_{\theta} \\ as_{\theta} \\ d \\ \end{matrix} \right] \tag{8} O10?=O00?+dz00?+ax10?=???000????+d???001????+a???cθ?sθ?0????=???acθ?asθ?d????(8)
??綜上,坐標系{x1y1z1}\{x_1y_1z_1\}{x1?y1?z1?}到坐標系{x0y0z0}\{x_0y_0z_0\}{x0?y0?z0?}的齊次變換關(guān)系用桿件長度aaa,桿件扭角α\alphaα,關(guān)節(jié)距離ddd,關(guān)節(jié)轉(zhuǎn)角θ\thetaθ 這4個參數(shù)就夠了。
2、利用DH參數(shù)建模時,各個連桿坐標系的建立是唯一的嗎?
??利用DH參數(shù)建模時,各個連桿坐標系的建立不是唯一的。只要在建立坐標系時,坐標軸xix_ixi?與坐標軸zi?1z_{i-1}zi?1?垂直相交即可。
3、DH參數(shù)表是唯一的嗎?
??DH參數(shù)表不是唯一的。因為各個連桿坐標系的建立不是唯一的,導致DH參數(shù)不同,但是最終計算得到末端工具坐標系到機器人基坐標系下的齊次變換矩陣是唯一的。(前提是機器人基坐標系與末端工具坐標系的建立保持不變)
4、標準DH參數(shù)與修正DH參數(shù)有何異同?
??祥見參考資料2,3。
??(1)標準DH參數(shù)坐標系建立在傳動軸上,而修正DH參數(shù)坐標系建立在驅(qū)動軸上。
??(2)由于坐標系建立位置發(fā)生了變化,連桿之間的坐標系變換關(guān)系自然也發(fā)生變化。
??標準DH相鄰連桿之間坐標系的變換關(guān)系為:
i?1Ai=Rotz,θiTransz,diTransx,aiRotx,αi(9)^{i-1}A_i=Rot_{z,\theta_i} Trans_{z,d_i}Trans_{x,a_i}Rot_{x,\alpha_i}\tag{9} i?1Ai?=Rotz,θi??Transz,di??Transx,ai??Rotx,αi??(9)
??修正DH相鄰連桿之間坐標系的變換關(guān)系為:
i?1Ai=Rotx,αi?1Transx,ai?1Rotz,θiTransz,di(10)^{i-1}A_i=Rot_{x,\alpha_{i-1}}Trans_{x,a_{i-1}}Rot_{z,\theta_i}Trans_{z,d_i} \tag{10} i?1Ai?=Rotx,αi?1??Transx,ai?1??Rotz,θi??Transz,di??(10)
??(3)修正DH參數(shù)中各個參數(shù)的物理意義與標準DH參數(shù)是一樣的。
??(4)對于傳統(tǒng)的串聯(lián)機器人而言,兩者的表現(xiàn)能力是一樣的,沒有優(yōu)劣之分,我們可以選擇其中一種方法進行建模。然而,由于修正DH參數(shù)坐標系建立在驅(qū)動軸上,對于樹狀結(jié)構(gòu)的機器人,其表現(xiàn)能力更強,可以簡化問題。
??(5)對于標準DH參數(shù),根據(jù)DH參數(shù)表,并對式(9) 連乘得到的是末端工具坐標系到機器人基坐標系的齊次變換矩陣;對于修正DH參數(shù),根據(jù)DH參數(shù)表,并對式(10) 連乘得到的是最后一個驅(qū)動關(guān)節(jié)上的坐標系到機器人基坐標系的齊次變換矩陣,變換到末端工具坐標系還需增加一個變換(通常為平移變換)。
二、標準DH參數(shù)
1、DH四個參數(shù)的定義
??(1)did_idi? :坐標軸xi?1x_{i-1}xi?1?與坐標軸xix_{i}xi?沿著坐標軸zi?1z_{i-1}zi?1?的有向距離。
??(2)aia_iai?:坐標軸zi?1z_{i-1}zi?1?與坐標軸ziz_{i}zi?沿著坐標軸xix_{i}xi?的有向距離。
??(3)αi\alpha_iαi?:坐標軸zi?1z_{i-1}zi?1?與坐標軸ziz_{i}zi?的夾角,方向定義如下:
??(4) θi\theta_iθi?:坐標軸xi?1x_{i-1}xi?1?與坐標軸xix_{i}xi?的夾角,方向定義如下:
2、DH連桿坐標系的約定
??(1)坐標軸xix_{i}xi?與坐標軸zi?1z_{i-1}zi?1?垂直。
??(2)坐標軸xix_{i}xi?與坐標軸zi?1z_{i-1}zi?1?相交。
3、根據(jù)DH連桿坐標系約定,建立各個連桿坐標系
4、根據(jù)DH四個參數(shù)的定義,創(chuàng)建DH參數(shù)表
三、六軸機器人實例(standard DH)
??這里以六軸機器人為例,通過建立3種不同的連桿坐標系,創(chuàng)建對應(yīng)的DH表,比較最終運動學正解最終結(jié)果是否一致。其中,d1=0.3991,a2=0.448,a3=0.042,d4=0.451,d6=0.082d_1 = 0.3991,a_2 = 0.448,a_3 = 0.042, d_4 = 0.451, d_6 = 0.082d1?=0.3991,a2?=0.448,a3?=0.042,d4?=0.451,d6?=0.082,以米為單位。兩種不同的連桿坐標系的建立方法得到不同的DH參數(shù)表,但最終的機器人運動學正解完全一樣!
1、第一種連桿坐標系建立方法
??連桿坐標系建立如下:
??DH參數(shù)表如下:
| 1 | d1d_1d1? | 0 | ?π/2-\pi/2?π/2 | θ1\theta_1θ1? |
| 2 | 0 | a2a_2a2? | 0 | θ2?π/2\theta_2-\pi/2θ2??π/2 |
| 3 | 0 | a3a_3a3? | ?π/2-\pi/2?π/2 | θ3\theta_3θ3? |
| 4 | d4d_4d4? | 0 | π/2\pi/2π/2 | θ4\theta_4θ4? |
| 5 | 0 | 0 | ?π/2-\pi/2?π/2 | θ5\theta_5θ5? |
| 6 | d6d_6d6? | 0 | 0 | θ6+π\(zhòng)theta_6+\piθ6?+π |
2、第二種連桿坐標系建立方法
??連桿坐標系建立如下:
??DH參數(shù)表如下:
| 1 | d1d_1d1? | 0 | ?π/2-\pi/2?π/2 | θ1\theta_1θ1? |
| 2 | 0 | ?a2-a_2?a2? | 0 | θ2+π/2\theta_2+\pi/2θ2?+π/2 |
| 3 | 0 | ?a3-a_3?a3? | π/2\pi/2π/2 | θ3\theta_3θ3? |
| 4 | d4d_4d4? | 0 | ?π/2-\pi/2?π/2 | θ4\theta_4θ4? |
| 5 | 0 | 0 | π/2\pi/2π/2 | θ5\theta_5θ5? |
| 6 | d6d_6d6? | 0 | 0 | θ6\theta_6θ6? |
四、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), d10, 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), d20, 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), d30, 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), d40, 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), d50, 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), d60, 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), d10, 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), d20, 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), d30, 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), d40, 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), d50, 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), d60, 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
總結(jié)
以上是生活随笔為你收集整理的一文带你完全掌握机器人DH参数建模(详细步骤+实例+代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hybrid Astar 算法剖析和实现
- 下一篇: J2EE学习笔记(四)之Servlet原