机械臂的DH连杆参数不止一种,这里仅记录一种改进后的DH参数。在改进的DH参数中, f r a m e i frame_i framei对应 j o i n t i joint_i jointi( l i n k i link_i linki的起始端关节,所有关节默认为 r e v o l u t e revolute revolute型)。
连杆 l i n k i link_i linki的始端和末端关节分别对应 f r a m e i 、 f r a m e i + 1 frame_i、frame_{i+1} framei、framei+1,各坐标系的 z i z_i zi轴与对应关节的旋转轴重合。从 f r a m e i − 1 → f r a i m e i frame_{i-1} \rightarrow fraime_i framei−1→fraimei的DH参数分别记为 a i 、 α i 、 d i 、 θ i a_i、\alpha_i、d_i、\theta_i ai、αi、di、θi。
在
I
n
t
r
o
d
u
c
t
i
o
n
t
o
R
o
b
o
t
i
c
s
M
e
c
h
a
n
i
c
s
a
n
d
C
o
n
t
r
o
l
(
J
o
h
n
J
.
C
r
a
i
g
)
Introduction \ to \ Robotics \ Mechanics \ and \ Control(John\ J.Craig)
Introduction to Robotics Mechanics and Control(John J.Craig)一书中使用了这样一张图介绍DH参数(P68):
注意图中描述的DH参数实际上是
a
i
−
1
、
α
i
−
1
、
d
i
、
θ
i
a_{i-1}、\alpha_{i-1}、d_i、\theta_i
ai−1、αi−1、di、θi,下标不统一有点不太方便后续的计算。在
S
p
r
i
n
g
e
r
H
a
n
d
b
o
o
k
o
f
R
o
b
o
t
i
c
s
Springer \ Handbook \ of \ Robotics
Springer Handbook of Robotics这本书中给出了我认为更合理的DH参数确定规则(P27):
需要改动的地方在上上幅图中有标记。在确定了
f
r
a
m
e
i
−
1
→
f
r
a
i
m
e
i
frame_{i-1} \rightarrow fraime_i
framei−1→fraimei的DH参数后,可以将对应的齐次变换矩阵计算出来,对照上上幅图可以得到
f
r
a
m
e
i
−
1
→
f
r
a
i
m
e
i
frame_{i-1} \rightarrow fraime_i
framei−1→fraimei这一过程中涉及的4个旋转和平移变换
R
x
i
(
α
i
)
T
x
i
(
a
i
)
R
z
i
+
1
(
θ
i
)
T
z
i
+
1
(
d
i
)
R_{x_{i}}(\alpha_i)T_{x_{i}}(a_i)R_{z_{i+1}}(\theta_i)T_{z_{i+1}}(d_i)
Rxi(αi)Txi(ai)Rzi+1(θi)Tzi+1(di),这里使用两个齐次变换矩阵表示:
A
i
i
′
=
[
1
0
0
a
i
0
cos
α
i
−
sin
α
i
0
0
sin
α
i
cos
α
i
0
0
0
0
1
]
A
i
′
i
+
1
=
[
cos
θ
i
−
sin
θ
i
0
0
sin
θ
i
cos
θ
i
0
0
0
0
1
d
i
0
0
0
1
]
A_i^{i'} = \begin{bmatrix} 1 & 0 & 0 & a_i \\ 0 & \cos\alpha_i & -\sin\alpha_i & 0 \\ 0 & \sin\alpha_i & \cos\alpha_i & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \\ A_{i'}^{i+1} = \begin{bmatrix} \cos\theta_i & -\sin\theta_i & 0 & 0 \\ \sin\theta_i & \cos\theta_i & 0 & 0 \\ 0 & 0 & 1 & d_i \\ 0 & 0 & 0 & 1 \end{bmatrix}
Aii′=
10000cosαisinαi00−sinαicosαi0ai001
Ai′i+1=
cosθisinθi00−sinθicosθi00001000di1
于是得到最终的齐次变换矩阵:
A
i
i
+
1
=
A
i
i
′
⋅
A
i
′
i
+
1
=
[
cos
θ
i
−
sin
θ
i
0
a
i
sin
θ
i
cos
α
i
cos
θ
i
cos
α
i
−
sin
α
i
−
d
i
sin
α
i
sin
θ
i
sin
α
i
cos
θ
i
sin
α
i
cos
α
i
d
i
cos
α
i
0
0
0
1
]
\begin{aligned} A_i^{i+1} &= A_i^{i'} \cdot A_{i'}^{i+1} \\ &= \begin{bmatrix} \cos\theta_i & -\sin\theta_i & 0 & a_i \\ \sin\theta_i\cos\alpha_i & \cos\theta_i\cos\alpha_i & -\sin\alpha_i & -d_i\sin\alpha_i \\ \sin\theta_i\sin\alpha_i & \cos\theta_i\sin\alpha_i & \cos\alpha_i & d_i\cos\alpha_i \\ 0 & 0 & 0 & 1 \end{bmatrix} \end{aligned}
Aii+1=Aii′⋅Ai′i+1=
cosθisinθicosαisinθisinαi0−sinθicosθicosαicosθisinαi00−sinαicosαi0ai−disinαidicosαi1
在针对具体的机械臂建立坐标系确定DH参数时,其结果并不是唯一的。每个关节的坐标系的方向存在一定的选择自由,并且不同姿态的机械臂得到的DH参数也往往不同(通常体现在 θ \theta θ参数中)。在已知机械臂官方DH参数(通常会把 θ \theta θ全部设置为0)的情况下,可以先参照除 θ \theta θ以外的其他三个参数建立坐标系,然后确定 θ \theta θ的值(不一定全为零)。将每个关节的旋转角度设置为 θ \theta θ中对应角度的相反数即可得到官方DH参数对应的机械臂初始姿态。