제2부 기구학
2.3 순기구학 I: DH 관례(표준·수정)
2.3.1 이 장에서 배우는 것 / 선수 지식 / 특히 중요한 독자
이 장은 개방 사슬의 순기구학을 데나비트-하르텐베르크(Denavit–Hartenberg, DH) 매개변수로 나타내는 방법을 다룬다. 관절마다 링크 좌표계를 정하는 규칙, 관절 하나를 매개변수 네 개로 적는 방법, 표준 DH와 수정 DH의 두 관례, 두 관례의 정확한 관계, 공개된 DH 표(UR5)를 지수곱(PoE) 공식과 URDF 관절 원점으로 옮기는 방법, 인접한 두 축이 평행에 가까울 때 DH 매개변수가 불안정해지는 이유를 다룬다. 같은 DH 표가 관례에 따라 서로 다른 로봇을 뜻하므로 표를 읽는 쪽이 관례를 알아야 한다. 지수곱 공식 자체는 2.4, 해석적 역기구학은 2.5에서 다룬다.
배우는 것:
- 링크 좌표계의 배정 — 관절 축 직선에서 공통 법선과 좌표계를 정하는 규칙, 교차·평행 축, 직동 관절, 기저·말단 좌표계의 선택.
- 표준 DH와 수정 DH — 변환 행렬 $T_{\mathrm{std}}=R_z(\theta)T_z(d)T_x(a)R_x(\alpha)$와 $T_{\mathrm{mod}}=R_x(\alpha)T_x(a)T_z(d)R_z(\theta)$, 매개변수의 첨자 규약.
- 두 관례의 관계 — 같은 인자의 곱을 다르게 묶은 것이며, 한 행씩 밀어 옮기면 정확히 변환된다.
- 다른 표현으로의 변환 — DH 행에서 스크루 축과 홈 자세, URDF 관절 원점으로, 그리고 관절 축에서 DH 행으로.
- 한계 — 매개변수가 네 개로 충분한 이유와 대가, 평행에 가까운 축에서의 불안정.
선수 지식: 1.6(동차변환), 1.10(스크루 축), 2.1(관절의 종류). 표기는 BK-05와 A.2을 따른다.
특히 중요한 독자: 제조사가 공개한 DH 표로 기구학을 구현하는 엔지니어, 로봇 모델(URDF)을 DH 표에서 만들거나 반대로 DH를 추출하는 소프트웨어 개발자, 기구 보정을 공부하는 연구자.
출처 방침. 기준 시점은 2026-11-03이다. 직접 읽은 자료: ① Lynch·Park, Modern Robotics(Cambridge University Press, 2017; 사전 인쇄본 2017-05-03판)의 부록 C(링크 좌표계의 배정 규칙, 매개변수 정의, 변환 행렬 식 (C.2), 교차·평행·직동 관절의 특수 경우, 네 매개변수로 충분한 이유, 다른 관례가 있다는 단서)와 4장 서두(DH는 구조에 $3n$개, PoE는 $6n$개의 수), ② Universal Robots의 지원 문서 "DH Parameters for calculations of kinematics and dynamics"(문서의 최종 수정일 2018-10-04)의 UR5 표, ③
UniversalRobots/Universal_Robots_ROS2_Description(rolling 브랜치)의config/ur5/default_kinematics.yaml과urdf/ur_macro.xacro, ④ Robotics Toolbox for Python 1.5.0의DHLink.py(소스_to_ets)와 실행. 서지는 Crossref 응답으로 확인했다(Denavit·Hartenberg 1955, Khalil·Kleinfinger 1986, Hayati·Mirmirani 1985). 읽지 못한 것: 위 논문 세 편의 본문, Craig의 교재(Crossref에는 서평만 있다), ISO 9787의 본문. 수치는 모두 이 장의 순수 파이썬 계산이다.
2.3.2 개념 — 링크 좌표계와 네 개의 수
순기구학은 관절 변수 $q$에서 엔드이펙터의 위치와 자세를 구하는 사상이다. 개방 사슬에서는 각 링크에 좌표계를 붙이고 이웃한 좌표계 사이의 변환을 차례로 곱한다. 한 변환을 일반적으로 나타내려면 매개변수가 여섯 개(회전 셋, 이동 셋) 필요하지만, 좌표계를 약속된 규칙으로 정하면 네 개로 충분하다. 규칙의 핵심은 두 가지이다. 한 좌표계의 $z$축을 관절 축과 맞추고, 이웃한 두 관절 축의 공통 법선 방향을 $x$축으로 삼는다. 그러면 이웃한 두 좌표계는 $x$축 둘레의 회전과 이동, $z$축 둘레의 회전과 이동만으로 연결된다. 이 네 변환의 크기가 DH 매개변수 $(\theta,d,a,\alpha)$이다.
DH 표 한 장은 관례 없이는 읽을 수 없다. 같은 숫자 표를 표준 DH 변환으로 곱하면 한 로봇이 되고 수정 DH 변환으로 곱하면 다른 로봇이 된다. 이 장의 계산에서 UR5의 표준 DH 표를 수정 DH 관례로 잘못 읽으면 관절 변수 1,000개 가운데 손끝 위치가 최대 1.76 m 어긋났다. Modern Robotics의 부록 C도 좌표계 배정 방식이 저자마다 다르므로 매개변수 값과 함께 좌표계에 대한 설명을 반드시 적으라고 권한다.
결론부터 적으면 다음과 같다. 표준 DH와 수정 DH는 표현력이 같고 매개변수 $a$, $\alpha$를 한 행 밀어 적는 차이만 있으며, 규칙 기반 배정은 인접한 두 축이 평행에 가까울 때 매개변수가 불안정해지는 대가를 치른다. 지수곱 공식은 좌표계를 정하지 않고 축 직선만 쓰므로 이 불안정이 없다(2.4).
2.3.3 원리
2.3.3.1 표준 DH
표준 DH(고전적 관례이며, 원 논문은 Denavit·Hartenberg 1955, Journal of Applied Mechanics 22(2)이다 — 본문은 읽지 못했다)에서는 관절 $i$의 축이 좌표계 $\{i-1\}$의 $z$축이다. 좌표계 $\{i\}$는 링크 $i$의 먼 쪽 끝(다음 관절 쪽)에 붙는다.
- $z_{i-1}$은 관절 $i$의 축, $x_i$는 축 $z_{i-1}$에서 축 $z_i$로 향하는 공통 법선, 원점 $O_i$는 $x_i$와 $z_i$의 교점이다.
- $\theta_i$: $x_{i-1}$에서 $x_i$까지의 각($z_{i-1}$ 둘레), $d_i$: $z_{i-1}$을 따라 $O_{i-1}$에서 $x_i$와의 교점까지의 거리, $a_i$: $x_i$를 따라 $z_{i-1}$에서 $z_i$까지의 거리, $\alpha_i$: $z_{i-1}$에서 $z_i$까지의 각($x_i$ 둘레).
$$T_{i-1,i}=R_z(\theta_i)\,T_z(d_i)\,T_x(a_i)\,R_x(\alpha_i)=\begin{bmatrix}c\theta_i&-s\theta_i c\alpha_i&s\theta_i s\alpha_i&a_ic\theta_i\\ s\theta_i&c\theta_i c\alpha_i&-c\theta_i s\alpha_i&a_is\theta_i\\ 0&s\alpha_i&c\alpha_i&d_i\\ 0&0&0&1\end{bmatrix}.$$
여기서 $c$, $s$는 코사인과 사인이다. 회전 관절에서는 $\theta_i$가, 직동 관절에서는 $d_i$가 관절 변수이다.
2.3.3.2 수정 DH
수정 DH(Craig의 교재에서 널리 알려진 형태이며 이 장은 교재를 읽지 못했다 (확인 필요))에서는 관절 $i$의 축이 좌표계 $\{i\}$의 $z$축이다. 좌표계 $\{i\}$는 관절 $i$의 축 위에 붙는다. Modern Robotics의 부록 C가 이 형태로 DH를 설명한다.
- $z_i$는 관절 $i$의 축, $x_{i-1}$은 축 $i-1$에서 축 $i$로 향하는 공통 법선이다.
- $a_{i-1}$: 공통 법선의 길이, $\alpha_{i-1}$: $z_{i-1}$에서 $z_i$까지의 각($x_{i-1}$ 둘레), $d_i$: 공통 법선과 $z_i$의 교점에서 $O_i$까지의 거리($z_i$ 방향), $\theta_i$: $x_{i-1}$에서 $x_i$까지의 각($z_i$ 둘레).
$$T_{i-1,i}=R_x(\alpha_{i-1})\,T_x(a_{i-1})\,T_z(d_i)\,R_z(\theta_i)=\begin{bmatrix}c\theta_i&-s\theta_i&0&a_{i-1}\\ s\theta_i c\alpha_{i-1}&c\theta_i c\alpha_{i-1}&-s\alpha_{i-1}&-d_is\alpha_{i-1}\\ s\theta_i s\alpha_{i-1}&c\theta_i s\alpha_{i-1}&c\alpha_{i-1}&d_ic\alpha_{i-1}\\ 0&0&0&1\end{bmatrix}.$$
이 행렬은 Modern Robotics의 식 (C.2)와 같다. 첫 두 변환의 순서와 뒤 두 변환의 순서는 서로 바꾸어도 결과가 같다(같은 축 위의 변환이므로 가환).
2.3.3.3 두 관례의 관계
표준 DH의 한 행은 $A_iB_i$이고 수정 DH의 한 행은 $B_{i-1}A_i$이다. 여기서 $A_i=R_z(\theta_i)T_z(d_i)$, $B_i=T_x(a_i)R_x(\alpha_i)$이다. 같은 인자를 곱한 것이므로 사슬 전체의 곱은 인자를 다르게 묶은 것일 뿐이다.
$$T_{\mathrm{std}}=A_1B_1A_2B_2\cdots A_nB_n,\qquad T_{\mathrm{mod}}=B_0A_1B_1A_2B_2\cdots A_n=B_0\,T_{\mathrm{std}}B_n^{-1}.$$
수정 DH의 매개변수 $(a_{i-1},\alpha_{i-1})$는 표준 DH의 $(a_{i-1},\alpha_{i-1})$와 같은 숫자이다. 따라서 표준 DH 표를 수정 DH 표로 옮기려면 $a$와 $\alpha$ 열만 한 행 아래로 밀면 된다. 기저 쪽 $a_0=\alpha_0=0$이고 말단 쪽 $a_n=\alpha_n=0$이면 두 곱은 정확히 같다. 아니면 $B_0$와 $B_n$이 기저와 말단의 고정 변환으로 남는다. 그림 2는 이 묶음의 차이이다.
2.3.3.4 특수한 경우와 한계
Modern Robotics의 부록 C에 따른 규칙이다.
- 인접한 두 회전축이 교차한다. 공통 법선이 없으므로 $a=0$으로 두고 $x$축을 두 축이 이루는 평면의 법선으로 잡는다. 방향의 부호가 둘이며 $\alpha$의 부호가 달라질 뿐 둘 다 허용된다.
- 인접한 두 회전축이 평행하다. 공통 법선이 하나가 아니라 직선 족이다. 물리적으로 직관적이고 0인 매개변수가 많아지는 법선을 고른다.
- 직동 관절. $z$축은 이동 방향이고 $d$가 관절 변수이며 $\theta$는 상수이다.
- 기저·말단 좌표계. 규칙은 두 좌표계를 정하지 않는다. 기저를 첫 링크 좌표계의 영(0) 자세와 일치시키면 $a_0=\alpha_0=d_1=0$이 된다. 임의의 기저·말단 좌표계는 DH로 나타낼 수 없는 경우가 있다.
DH가 관절당 매개변수 네 개로 충분한 것은 좌표계 배정 규칙이 가능한 변환을 $x$·$z$ 축 둘레의 회전과 이동으로 제한하기 때문이다. Modern Robotics는 이 때문에 구조를 나타내는 수가 $n$개 관절에 $3n$개(관절 변수 $n$개 별도)이고, 지수곱 공식은 $6n$개의 수를 사용한다고 적는다. DH가 최소 표현이라는 장점의 대가가 위 규칙과 특수한 경우의 처리이다.
2.3.3.5 지수곱 공식·URDF로의 변환
DH 표는 지수곱 공식의 입력으로 옮길 수 있다. $\theta=\theta_0$(관절 변수 0)의 형상에서 표준 DH는 관절 $i$의 축을 $z_{i-1}$로, 수정 DH는 $z_i$로 읽고, 축 위의 한 점 $o$(좌표계의 원점)와 방향 $\omega$에서 스크루 $S=(\omega,\ o\times\omega)$를 만든다. 홈 자세 $M$은 모든 관절 변수가 0일 때의 $T_{0n}$이다(2.4).
URDF의 관절은 부모 좌표계에서 관절 원점 origin(xyz, rpy)을 거친 뒤 자식 좌표계의 $z$축 둘레로 회전한다. 수정 DH 행 하나는 정확히 이 구조이다. $\theta_0=0$이면 다음과 같다.
$$\texttt{xyz}=(a_{i-1},\ -d_i\sin\alpha_{i-1},\ d_i\cos\alpha_{i-1}),\qquad \texttt{rpy}=(\alpha_{i-1},\,0,\,0),\qquad \texttt{axis}=(0,0,1).$$
이 식은 변환 행렬 (C.2)의 이동 열과 회전 부분을 그대로 옮긴 것이다. Universal Robots의 ROS 2 설명 패키지는 UR5의 여섯 관절을 모두 axis xyz="0 0 1"과 위 형태의 원점으로 적는다(ur_macro.xacro). 이 장은 UR의 DH 표에서 환산한 원점이 그 패키지의 기구학 파일과 $2.1\times10^{-10}$ 안에서 같음을 2.3.5에서 확인한다. 패키지의 주석은 기본 기구학 매개변수가 특정 로봇에 대응하지 않는 기본값이며, 개별 로봇의 정확한 변환을 위해서는 그 로봇의 보정 파일을 지정해야 한다고 적는다(2.17).
2.3.3.6 평행에 가까운 축에서의 불안정
인접한 두 축이 평행하면 공통 법선이 하나로 정해지지 않으므로 $d$는 선택의 문제이다. 평행에 가까운 축에서는 선택이 아니라 계산이므로 오히려 불안정하다. 축 $i-1$이 $z$축이고 축 $i$가 점 $(0.5,0.3,0.2)$를 지나며 방향이 $(\sin\varepsilon,0,\cos\varepsilon)$인 직선일 때, 축 $i-1$ 위의 공통 법선의 발의 높이 $d$는 $\lvert d\rvert\approx0.5/\varepsilon$으로 발산하고 $\varepsilon$의 부호가 바뀌면 $d$의 부호가 바뀐다. $\varepsilon=10^{-4}$ rad에서 $\lvert d\rvert\approx5.0\times10^{3}$ m이다. 기구의 실제 형상은 $\varepsilon$에 연속인데 매개변수는 발산한다. 이 때문에 기구 보정에서 평행에 가까운 축은 매개변수를 추가하는 방식으로 다룬다(Hayati·Mirmirani 1985가 이 문제를 다룬 문헌으로 알려져 있으나 이 장은 본문을 읽지 못했다 (확인 필요); 2.17).
2.3.4 알고리즘
관절 축 직선에서 수정 DH 표를 구하는 절차이다(회전 관절만 다룬다).
- 홈 자세에서 관절 축마다 축 위의 점 $p_i$와 단위 방향 $s_i$를 구한다.
- 이웃한 두 축 $(i,i+1)$마다 공통 법선의 발 $f_i$(축 $i$ 위)와 $g_{i+1}$(축 $i+1$ 위)을 구한다. 꼬인 축은 $s_i\times s_{i+1}$ 방향의 법선으로 연립방정식을 풀고, 교차하는 축은 교점을, 평행한 축은 $p_i$와 그 수선의 발을 사용한다.
- 좌표계 $\{i\}$를 $z_i=s_i$, $x_i=g_{i+1}-f_i$의 방향(길이가 0이면 $s_i\times s_{i+1}$), 원점 $O_i=f_i$로 정한다. 마지막 좌표계는 $O_n=g_n$, $x_n$을 $x_{n-1}$의 $z_n$에 수직한 성분으로 정한다. 기저 좌표계는 $\{1\}$의 영 자세와 같게 둔다.
- 이웃한 좌표계의 상대 변환 $T_{i-1,i}=F_{i-1}^{-1}F_i$를 $R_x(\alpha)T_x(a)T_z(d)R_z(\theta)$로 분해한다. $\alpha=\operatorname{atan2}(-R_{23},R_{33})$, $\theta=\operatorname{atan2}(-R_{12},R_{11})$, $a=p_x$, $d=-p_y/\sin\alpha$ 또는 $p_z/\cos\alpha$(조건수가 좋은 쪽)이다.
- 분해한 행으로 변환을 다시 만들어 원래와 같은지 확인한다.
2.3.5 풀이 예제 — 두 관례의 관계·UR5·축에서 DH 추출·평행 축의 불안정
표준 DH와 수정 DH의 관계, UR5의 공개 DH 표를 지수곱 공식과 URDF 관절 원점으로 옮긴 결과, 관절 축에서 DH를 추출하는 알고리즘의 정확도, 평행에 가까운 축의 매개변수 발산을 계산한다. 결론부터 적으면 다음과 같다. ① 임의의 6행 표에서 $T_{\mathrm{mod}}$와 $T_{\mathrm{std}}B_n^{-1}$의 차이는 $8.9\times10^{-16}$이다. ② UR5의 표준 DH, 수정 DH, 지수곱 공식은 $5.0\times10^{-16}$ 안에서 같고, ROS 2 기구학 파일의 관절 사슬과는 $6.0\times10^{-10}$ 안에서 같다(파일의 각도가 소수 9자리로 반올림되어 있다). ③ 관절 축에서 추출한 DH는 세 종류의 축 쌍에서 $1.8\times10^{-12}$ 안에서 원래 변환을 복원한다. ④ 평행에 가까운 축에서 $\lvert d\rvert$는 $0.5/\varepsilon$으로 발산한다.
구현. dh_std·dh_mod·chain·std_to_mod·axis_screw·screws·urdf_origin. 관절 축에서 DH를 추출하는 axes_to_dh_mod와 도해는 스크립트에 있다. 지수곱 공식 계산은 2.4의 방식으로 직접 구현했다.
| 항목 | 값 |
|---|---|
| 입력 1 | UR5의 표준 DH 표(UR 문서): $a=(0,-0.425,-0.39225,0,0,0)$, $d=(0.089159,0,0,0.10915,0.09465,0.0823)$, $\alpha=(\pi/2,0,0,\pi/2,-\pi/2,0)$ |
| 입력 2 | ROS 2 기구학 파일의 관절 원점 xyz·rpy(UR5, rolling 브랜치, 조회 2026-11-03) |
| 입력 3 | 임의의 6행 DH 표 1,000개(시드 46): $\theta\in[-3,3]$, $d,a\in[-1,1]$, $\alpha\in[-3,3]$, 관절 변수 임의 |
| 입력 4 | 관절 축 6개의 임의 사슬 300개씩(꼬인 축, 첫 쌍 평행, 첫 쌍 교차): 점 $[-1,1]^3$, 방향 임의 |
| 입력 5 | 축 $i-1$이 $z$축, 축 $i$는 점 $(0.5,0.3,0.2)$를 지나고 방향 $(\sin\varepsilon,0,\cos\varepsilon)$, $\varepsilon=10^{-4}\sim1$ |
from math import sin, cos, atan2, pi
def mul(A, B):
return [[sum(A[i][k] * B[k][j] for k in range(4))
for j in range(4)] for i in range(4)]
def dh_std(th, d, a, al):
"""표준 DH: Rz(th) Tz(d) Tx(a) Rx(al)"""
ct, st, ca, sa = cos(th), sin(th), cos(al), sin(al)
return [[ct, -st * ca, st * sa, a * ct],
[st, ct * ca, -ct * sa, a * st],
[0, sa, ca, d], [0, 0, 0, 1]]
def dh_mod(th, d, a, al):
"""수정 DH: Rx(al) Tx(a) Tz(d) Rz(th)"""
ct, st, ca, sa = cos(th), sin(th), cos(al), sin(al)
return [[ct, -st, 0, a],
[st * ca, ct * ca, -sa, -d * sa],
[st * sa, ct * sa, ca, d * ca], [0, 0, 0, 1]]
def chain(f, rows, q):
"""rows = [(th0, d, a, al)], 회전 관절: th = th0 + q"""
T = [[float(i == j) for j in range(4)] for i in range(4)]
for (t0, d, a, al), v in zip(rows, q):
T = mul(T, f(t0 + v, d, a, al))
return T
def std_to_mod(rows):
"""표준 행의 (a_i, al_i)를 한 행 뒤로 밀어 수정 행을
만든다. 반환: (수정 행, 표준 말단의 (a_n, al_n))"""
out, pa, pal = [], 0.0, 0.0
for t0, d, a, al in rows:
out.append((t0, d, pa, pal))
pa, pal = a, al
return out, (pa, pal)
def axis_screw(p, o):
"""축 위의 점 p, 방향 o -> 스크루 (w, v) = (o, p x o)"""
return list(o) + [p[1] * o[2] - p[2] * o[1],
p[2] * o[0] - p[0] * o[2],
p[0] * o[1] - p[1] * o[0]]
def screws(rows, conv):
"""th = th0 에서 관절 스크루 (w, v)와 홈 자세 M"""
f = dh_std if conv == 'std' else dh_mod
T, S = chain(f, [], []), []
for t0, d, a, al in rows:
if conv == 'mod':
T = mul(T, f(t0, d, a, al))
S.append(axis_screw([T[i][3] for i in range(3)],
[T[i][2] for i in range(3)]))
if conv == 'std':
T = mul(T, f(t0, d, a, al))
return S, T
def urdf_origin(row):
"""th0 = 0인 수정 DH 행 -> URDF 관절 origin
xyz = (a, -d sin al, d cos al), rpy = (al, 0, 0)
(관절 축은 자식 좌표의 z)"""
t0, d, a, al = row
return [a, -d * sin(al), d * cos(al)], [al, 0.0, 0.0]
① UR5의 변환. 표준 DH 행과 한 행씩 민 수정 DH 행, 수정 DH 행에서 환산한 URDF xyz, 기구학 파일의 xyz이다. 마지막 열은 xyz·rpy로 만든 4×4 변환(원점 변환) 전체의 최대 차이이다.
| 관절 $i$ | 표준 DH $(a_i,\ d_i,\ \alpha_i)$ | 수정 DH $(\alpha_{i-1},\ a_{i-1},\ d_i)$ | 환산한 URDF xyz | 기구학 파일 xyz | 원점 변환의 최대 차이 |
|---|---|---|---|---|---|
| 1 | (0, 0.089159, 1.5708) | (0, 0, 0.089159) | (0, 0, 0.089159) | (0, 0, 0.089159) | 0.0e+00 |
| 2 | (-0.425, 0, 0) | (1.5708, 0, 0) | (0, 0, 0) | (0, 0, 0) | 2.1e-10 |
| 3 | (-0.39225, 0, 0) | (0, -0.425, 0) | (-0.425, 0, 0) | (-0.425, 0, 0) | 0.0e+00 |
| 4 | (0, 0.10915, 1.5708) | (0, -0.39225, 0.10915) | (-0.39225, 0, 0.10915) | (-0.39225, 0, 0.10915) | 0.0e+00 |
| 5 | (0, 0.09465, -1.5708) | (1.5708, 0, 0.09465) | (0, -0.09465, 5.7956e-18) | (0, -0.09465, -1.9413e-11) | 2.1e-10 |
| 6 | (0, 0.0823, 0) | (-1.5708, 0, 0.0823) | (0, 0.0823, 5.0394e-18) | (0, 0.0823, -1.688e-11) | 2.1e-10 |
표준 DH의 $(a_i,d_i,\alpha_i)$를 수정 DH의 $(\alpha_{i-1},a_{i-1},d_i)$로 옮기면 6개 관절의 원점이 기구학 파일과 $2.1\times10^{-10}$ 이하에서 같다. 이 차이는 파일의 roll 값이 1.570796327로 반올림된 것($\pi/2$와의 차이 $4\times10^{-10}$)과 관절 5·6의 z 성분(약 $10^{-11}$)에서 나온다. 같은 UR5의 두 공개 출처(DH 표와 ROS 2 설명)가 같은 기구를 서술한다.
② 관례와 표현의 일치.
| 비교 | 최대 차이 |
|---|---|
| 임의의 6행 표: $T_{\mathrm{mod}}$ 대 $T_{\mathrm{std}}B_n^{-1}$(1,000개) | 8.9e-16 |
| 같은 표에서 $a_n=\alpha_n=0$일 때 $T_{\mathrm{mod}}$ 대 $T_{\mathrm{std}}$ | 8.9e-16 |
| UR5: 표준 DH 대 수정 DH(관절 변수 1,000개) | 2.2e-16 |
| UR5: 표준 DH 대 지수곱 공식(표준 DH에서 환산한 스크루) | 5.0e-16 |
| UR5: 표준 DH 대 지수곱 공식(수정 DH에서 환산한 스크루) | 5.0e-16 |
| UR5: 표준 DH 대 ROS 2 기구학 파일의 관절 사슬 | 6.0e-10 |
| UR5 표준 DH 표를 수정 DH로 잘못 읽었을 때 손끝 위치의 최대 차이 | 1.76 m |
수정 DH의 곱은 $T_{\mathrm{std}}B_n^{-1}$과 일치하고($8.9\times10^{-16}$), $a_n=\alpha_n=0$이면 표준 DH의 곱과 일치한다. UR5에서는 표준 DH, 수정 DH, 두 방식으로 환산한 지수곱 공식이 $5.0\times10^{-16}$ 안에서 같다. 표준 DH 표를 수정 DH로 잘못 읽으면 손끝이 최대 1.76 m 어긋난다.
③ 관절 축에서 DH 추출. 관절 축 6개의 임의 사슬에서 axes_to_dh_mod로 DH 행을 구한 뒤 $F_1^{-1}\,\mathrm{PoE}(q)\,F_n$과 DH 사슬의 곱을 비교했다. 판정한 쌍의 수는 알고리즘이 쌍의 종류(꼬임·평행·교차)를 구분한 횟수이다.
| 축 쌍의 종류 | 사슬 수 | 판정한 쌍의 수 | DH에서 복원한 변환의 최대 차이 |
|---|---|---|---|
| 일반(꼬인 축) | 300 | 1500 | 1.1e-13 |
| 첫 쌍을 평행으로 | 300 | 300 | 8.7e-13 |
| 첫 쌍을 교차로 | 300 | 300 | 2.7e-12 |
세 종류의 축 쌍 모두 $1.8\times10^{-12}$ 이하에서 원래 변환을 복원한다. 평행·교차에서 오차가 조금 큰 것은 공통 법선의 발을 연립방정식으로 구하는 과정에서 조건수가 나빠지기 때문으로 보이나 (추정), 원인은 분리하지 않았다.
④ 평행에 가까운 축. 입력 5에서 $d$는 $\varepsilon=10^{-4}$에서 $-5.0\times10^{3}$ m, $\varepsilon=-10^{-4}$에서 $+5.0\times10^{3}$ m이며 $\lvert d\rvert\approx0.5/\varepsilon$을 따랐다(그림 3). 공통 법선의 길이 $a$는 0.3 m 부근에서 연속이다.
⑤ 라이브러리 대조(실행 2026-11-03). Robotics Toolbox for Python 1.5.0(spatialmath-python 1.1.18)의 DHRobot과 modern_robotics 1.1.1의 FKinSpace로 같은 입력에서 500개 관절 변수의 순기구학을 비교했다. 스크립트는 robotics/fig-src/2.3-libcheck.py, 출력은 robotics/fig-src/data/2.3-libcheck-output.txt에 있다. RTB는 RevoluteDH(표준)와 RevoluteMDH(수정; mdh 속성의 설명이 "modified Denavit-Hartenberg notation (eg. Craig's textbook)"이라고 적는다)를 제공하며, 소스(DHLink._to_ets)에서 표준은 $R_z$→$T_z$→$T_x$→$R_x$, 수정은 $T_x$→$R_x$→$R_z$→$T_z$ 순서로 곱한다는 것을 읽었다.
| 입력 | RevoluteDH와 표준 DH | RevoluteMDH와 수정 DH | FKinSpace와 표준 DH |
|---|---|---|---|
| UR5(UR 문서의 표준 DH 표) | 3.3e-16 | 3.3e-16 | 5.3e-16 |
| 임의의 6행 표($a_6=\alpha_6=0$, $\theta$ 오프셋 있음) | 8.9e-16 | 1.3e-15 | 3.9e-15 |
한계. 수치는 합성 입력이고 UR5는 공칭 값이다(개별 로봇은 보정 값이 다르다). 축에서 DH 추출은 회전 관절만 구현했고 직동 관절과 동일 직선 위의 축(공통 법선이 정의되지 않는 퇴화)은 다루지 않았다. 평행 축의 발산은 한 배치에서 확인했다. ROS 2 파일 대조는 로봇 사슬의 기구학만 보며 UR 제어기의 내부 규약(각도 부호·영점)은 확인하지 않았다.
견해: 제조사의 DH 표를 구현할 때에는 표가 표준 DH인지 수정 DH인지를 문서에서 확인하고, 표의 첫 행과 마지막 행의 $a$·$\alpha$가 어느 관례의 경계 조건인지 점검한 뒤, UR5의 경우처럼 두 공개 출처를 대조하는 시험을 코드 저장소에 두는 것을 기본으로 둔다고 본다. 근거는 같은 표가 관례에 따라 손끝 위치를 1.76 m까지 다르게 만든다는 위 계산이다. 제조사가 관례를 명시한 경우에는 이 판단이 달라질 수 있다.
2.3.6 설계 트레이드오프 — 기구학 모델의 표기
공개 문헌에서 확인되는 표기는 네 가지이다.
- ① 표준 DH. 관절당 네 개의 수이며 오래된 문헌·제조사 문서에서 흔하다.
- ② 수정 DH. 같은 수이며 좌표계가 관절 축 위에 있어 URDF·지수곱 공식과 대응이 쉽다. Modern Robotics의 부록 C가 이 형태를 사용한다.
- ③ 지수곱(PoE) 공식. 좌표계 없이 축 직선과 홈 자세만 사용하며 관절당 여섯 개의 수이다(2.4).
- ④ URDF 관절 원점.
xyz·rpy·axis로 관절을 직접 적는다. ROS 생태계의 기본 표기이다(4.15·15.8).
| 표기 | 입력 | 장점 | 한계 | 알맞은 경우 |
|---|---|---|---|---|
| ① 표준 DH | 표(4수/관절) | 최소 표현, 제조사 문서 | 좌표계 규칙, 평행 축 불안정 | 제조사 표의 구현 |
| ② 수정 DH | 표(4수/관절) | URDF·PoE와 대응 | 같은 한계, 관례 혼동 | 모델 변환, 교재 |
| ③ PoE | 스크루 축·$M$ | 좌표계 불필요, 특이 없음 | 6수/관절 | 알고리즘·미분·보정 |
| ④ URDF | origin·axis | 도구 생태계 | 일반 6수, 폐루프 표현 제한 (확인 필요) | 시뮬레이션·ROS |
견해: 새 코드 베이스에서는 내부 기구학을 ③ 지수곱 공식으로 두고 DH·URDF는 입출력 변환 계층에 두는 것이 낫다고 본다. 근거는 DH의 좌표계 규칙과 평행 축 불안정이 변환 계층에 국한되고, 이 장의 계산에서 DH·PoE·URDF 사이의 변환이 $10^{-15}\sim10^{-10}$ 수준으로 정확히 왕복한다는 점이다.
2.3.7 응용 축 비교
| 응용 축 | DH가 맡는 일 | 요구 | 관련 장 |
|---|---|---|---|
| 산업·제조 | 제조사 DH 표로 순기구학 구현, 오프라인 프로그래밍의 로봇 모델 | 관례 일치, 개체별 보정값 | 2.17, 28.2 |
| 물류·이동 | 이동 매니퓰레이터 팔의 기구학 | 기저 프레임 정의 | 2.15 |
| 도로 주행 | 해당하는 고유 요구 없음 | — | — |
| 서비스 | 가정용 팔의 URDF·DH 모델 | 모델 정확도 | 7.3 |
| 의료·헬스케어 | 수술 로봇의 도구 끝 기구학 | 정밀도, 보정 | 2.17, 32.14 |
| 휴머노이드·범용 | 다자유도 링크 사슬의 URDF 모델 | 모델 일관성 | 7.18 |
| 필드 | 해당하는 고유 요구 없음(이동·휴머노이드 행과 같음) | — | — |
| 국방·안보 | 원리 수준에서 해당하는 고유 요구 없음 | — | — |
이 표는 이 책의 정리이며 장별 요구는 다르다.
2.3.8 관련 규격·프로토콜
| 문서 | 발행 | 무엇을 정하나 | 상세 장 |
|---|---|---|---|
| DH 표(UR5 등) | Universal Robots 지원 문서(최종 수정 2018-10-04) | UR 로봇의 표준 DH 표($a$·$d$·$\alpha$) | 2.17 |
ur_macro.xacro·default_kinematics.yaml | UniversalRobots/Universal_Robots_ROS2_Description(rolling) | 관절 origin(xyz·rpy)과 axis, 기본값과 개별 보정 파일의 구분 | 15.8, 27.9 |
DHRobot·RevoluteDH·RevoluteMDH | Robotics Toolbox for Python 1.5.0 | 표준·수정 DH 링크 변환 | 2.7 |
| ISO 9787 | ISO | 로봇의 좌표계와 운동 명칭(이 장은 본문을 읽지 못했다 (확인 필요)) | 27.5 |
| 수학 표기·기호표 | 이 책 | 변환·스크루 표기 | A.2 |
2.3.9 관련 규제·인증 요구와의 연결
DH 표기 자체를 규정하는 법령·인증 요건은 확인하지 못했다. 안전 기능의 위치·속도 제한은 로봇의 기구학 모델에 의존하므로 모델 오류(관례 혼동, 개체별 매개변수 차이)는 안전 성능에도 영향을 준다. 산업 로봇의 안전 요건은 27.10이 다룬다. 이 장은 규정의 조항을 확인하지 않았다 (확인 필요).
2.3.10 한계·유의점·미해결
- 관례 혼동. DH 표는 관례 없이 해석할 수 없다. 표의 출처가 관례를 밝혔는지 확인한다.
- 경계 조건. $a_0=\alpha_0=0$(수정)·$a_n=\alpha_n=0$(표준)이 아니면 기저·말단에 고정 변환이 남는다.
- 평행·교차 축. 공통 법선의 선택이 임의이며, 평행에 가까운 축에서는 매개변수가 발산한다.
- 개체별 값. 공개된 표는 공칭 값이다. 실제 로봇의 보정 값은 다르다(2.17).
- 직동 관절과 퇴화. 이 장의 추출 알고리즘은 회전 관절과 일반 축만 다룬다.
- 작동기 영점. DH의 $\theta_0$ 오프셋과 작동기의 영점은 별개이다(2.4에서 지수곱 공식의 영 자세).
2.3.11 체크포인트·연구 질문·출처
체크포인트:
- 표준 DH 표 $(\theta_i,d_i,a_i,\alpha_i)_{i=1}^n$을 수정 DH 표로 옮길 때 어느 열을 어떻게 바꾸며, 기저와 말단에 어떤 조건이 필요한가?
- 인접한 두 회전 축이 교차하는 경우 $a$와 $x$축은 어떻게 정하며 $\alpha$의 부호는 왜 둘 다 허용되는가?
- 수정 DH 행을 URDF 관절로 옮길 때
xyz·rpy·axis는 각각 무엇인가? $\theta_0\ne0$이면rpy는 어떻게 되는가? - 두 축이 거의 평행할 때 $d$가 $1/\varepsilon$으로 발산하는 이유를 공통 법선의 발의 위치로 설명하라.
연구 질문:
- 평행에 가까운 축을 포함한 기구의 보정에서 DH 매개변수 대신 어떤 표현이 가장 조건이 좋은가(2.17)?
- 제조사가 공개한 DH 표와 URDF를 자동으로 대조하는 시험의 표준 형식은 무엇이어야 하는가?
1차 출처(조회 2026-11-03).
- K. M. Lynch, F. C. Park, Modern Robotics, Cambridge University Press, 2017(ISBN 9781107156302). 사전 인쇄본 2017-05-03판의 부록 C와 4장 서두를 읽었다.
- J. Denavit, R. S. Hartenberg, "A kinematic notation for lower-pair mechanisms based on matrices," Journal of Applied Mechanics 22(2), 215–221, 1955, doi:10.1115/1.4011045 — 서지만 확인.
- W. Khalil, J. Kleinfinger, "A new geometric notation for open and closed-loop robots," Proc. IEEE ICRA, 1174–1179, 1986, doi:10.1109/robot.1986.1087552 — 서지만 확인.
- S. Hayati, M. Mirmirani, "Improving the absolute positioning accuracy of robot manipulators," Journal of Robotic Systems 2(4), 397–413, 1985, doi:10.1002/rob.4620020406 — 서지만 확인.
- J. J. Craig, Introduction to Robotics: Mechanics and Control, Addison-Wesley, 1986 — Crossref의 서평(Robotica 6(2), 1988 등)으로 실재만 확인.
- Universal Robots, "DH Parameters for calculations of kinematics and dynamics"(지원 문서),
UniversalRobots/Universal_Robots_ROS2_Description(rolling), Robotics Toolbox for Python 1.5.0 소스(DHLink.py),modern_robotics1.1.1.
다음 장. 2.4은 지수곱 공식으로 순기구학을 정식화한다. 이 장에서 DH 행에서 환산한 스크루 축과 홈 자세가 지수곱 공식의 입력이며, 좌표계를 정하지 않는 표현의 장점을 이어서 다룬다.