제2부 기구학
2.5 역기구학 I: 해석적 해 — 손목 분리·파이퍼 해법·일반 6R의 16해와 호모토피 연속법·IKFast
2.5.1 이 장에서 배우는 것 / 선수 지식 / 특히 중요한 독자
이 장은 엔드이펙터의 목표 자세에서 관절 변수를 구하는 역기구학의 해석적 해를 다룬다. 해의 개수가 구조에 따라 어떻게 달라지는지, 손목 분리로 6R 팔의 역기구학이 위치 문제와 자세 문제로 나뉘는 이유, UR형 6R 팔(세 축이 평행한 구조)의 해석적 풀이와 8개 해, 일반 6R 팔의 해가 최대 16개이며 소거법·호모토피 연속법·코드 생성기(IKFast)로 푼다는 사실, 해가 합쳐지고 사라지는 경계를 다룬다. 수치적 풀이는 2.6, 솔버 비교는 2.7에서 다룬다.
배우는 것:
- 해의 개수 — 직렬 6R 팔의 구조별 해의 개수(일반 16, 손목 분리형 8)와 3R 위치 문제의 해.
- 손목 분리와 파이퍼 조건 — 구면 손목이 위치와 자세를 분리하는 이유, 세 평행 축 구조.
- UR형 6R의 닫힌 형식 — $\theta_1,\theta_5,\theta_6$, 평면 2R, $\theta_4$ 순서와 특이 형상.
- 일반 6R과 호모토피 연속법 — 총차수 호모토피의 경로 수와 유한 해의 수, 이 장의 3R 계산.
- IKFast — 기구학 사슬에서 닫힌 형식 풀이를 C++ 코드로 생성하는 도구.
선수 지식: 2.2(2R 역기구학), 2.3(DH), 2.4(지수곱). 표기는 BK-05와 A.2을 따른다.
특히 중요한 독자: 산업·협동로봇의 역기구학을 구현하는 엔지니어, 해석적 해를 코드로 생성하려는 소프트웨어 개발자, 해의 개수와 분기를 연구하는 기구학 연구자.
출처 방침. 기준 시점은 2026-11-03이다. 직접 읽은 자료: ① Lynch·Park, Modern Robotics(사전 인쇄본 2017-05-03판) 6.1절(PUMA형 6R 팔을 위치·자세 문제로 분리하는 풀이, 어깨 오프셋이 있으면 위치 문제의 해가 네 개라는 서술, 스탠퍼드 팔), ② IKFast의 소스(
rdiankov/openrave의python/ikfast.py·python/ikfast.h, master)의 문서 문자열·라이선스 머리말·미해결 목록, ③ ur-analytic-ik 0.1.0.post3의 README(조회 2026-11-03)와 실행, ④ Universal Robots의 DH 표(2.3 참고). 서지는 Crossref 응답으로 확인했다(Raghavan·Roth 1993, Manocha·Canny 1994, Tsai·Morgan 1985, Lee·Liang 1988, Villalobos 외 2021). 읽지 못한 것: 위 논문들의 본문, 파이퍼(Pieper)의 1968년 학위 논문, Diankov의 IKFast 학위 논문. 해의 개수에 관한 문헌의 결과(일반 6R 최대 16개)는 서지와 IKFast 소스의 서술("up to 16")로만 확인했다. 수치는 모두 이 장의 순수 파이썬 계산이다.
2.5.2 개념 — 해가 없거나 여럿인 문제
순기구학 $T=f(q)$는 관절 변수마다 하나의 자세를 주지만 역기구학은 하나의 자세에 해가 여럿이거나 없을 수 있다. 목표가 작업공간 밖이면 해가 없고, 안이면 팔꿈치 위·아래, 어깨 좌·우, 손목 뒤집기 같은 서로 다른 관절 배치가 같은 자세를 만든다. 6자유도 직렬 팔이 일반 구조일 때 문헌이 보고하는 해의 최대 개수는 16이다(Raghavan·Roth 1993). 구조가 특별하면(세 축이 한 점에서 만나거나 세 축이 평행하면) 닫힌 형식으로 풀리고 해는 최대 8개이다.
닫힌 형식의 풀이가 있으면 목표를 주는 즉시 모든 해를 얻고 어느 것을 고를지 정책(관절 한계, 현재 형상과의 거리, 충돌)으로 정할 수 있다. 수치 풀이는 초기값에 의존하고 해 하나만 구한다. 결론부터 적으면 다음과 같다. UR형 6R 팔과 구면 손목 팔의 해석적 풀이는 모든 해를 닫힌 형식으로 구하며, 이 장의 계산에서 해 집합이 수치 다중 시작 풀이와 모든 자세에서 일치했다.
2.5.3 원리
2.5.3.1 해의 개수
| 구조 | 해의 최대 개수 | 근거 |
|---|---|---|
| 일반 6R(꼬인 축) | 16 | 문헌(Raghavan·Roth 1993 등)과 IKFast 문서의 "up to 16" (본문은 읽지 못했다) |
| 구면 손목 + 어깨 오프셋 있는 팔(PUMA형) | 8 | 위치 문제 4개(Modern Robotics)와 손목 2개 |
| UR형(세 평행 축 + 오프셋 손목) | 8 | 이 장의 풀이와 계산 |
| 구면 손목 + 오프셋 없는 팔 | 8 | 이 장의 계산 |
| 일반 3R 위치 문제 | 4 | 이 장의 호모토피 계산(한 예) |
일반 6R의 16개는 복소수 해를 포함한 개수의 상한이고, 실수 해(실제 관절 변수)는 그보다 적다. 이 장은 일반 6R의 실수 해를 다중 시작 수치 풀이로 센 값을 2.5.5에 제시한다.
2.5.3.2 손목 분리와 파이퍼 조건
세 개의 연속한 관절 축이 한 점에서 만나는 구면 손목에서는 엔드이펙터 자세가 손목의 세 각만으로 정해지고, 엔드이펙터 위치는 그 교점(손목 중심)의 위치에 공구 길이 $d$를 더한 것이다. 그러므로 엔드이펙터 자세 $R$과 위치 $p$가 주어지면 손목 중심 $c=p-d\,R\,\hat e_z$를 먼저 구해 앞 세 관절로 풀고(위치 문제), 나머지 세 관절은 자세로 푼다(자세 문제). Modern Robotics의 6.1절이 PUMA형 팔에서 이렇게 문제를 분리한다. 세 연속 축이 한 점에서 만나거나(구면 손목) 평행한 구조는 닫힌 형식을 허용하는 조건으로 알려져 있으며 파이퍼(Pieper, 1968)의 연구로 인용되지만 이 장은 원 논문을 읽지 못했다 (확인 필요). 이 장은 두 경우를 모두 계산으로 확인한다. 구면 손목에서 앞 세 관절을 고정하고 뒤 세 관절을 임의로 바꾸어도 손목 중심은 바뀌지 않았다(200개 시험에서 최대 변화 $1.1\times10^{-16}$).
2.5.3.3 UR형 6R의 닫힌 형식
표준 DH의 $a=(0,a_2,a_3,0,0,0)$, $d=(d_1,0,0,d_4,d_5,d_6)$, $\alpha=(\pi/2,0,0,\pi/2,-\pi/2,0)$인 6R 구조에서는 관절 2·3·4의 축이 평행하다(UR 로봇의 구조, 2.3). 목표 $T_{06}=(R,p)$에서 다음 순서로 푼다.
- 손목 중심. $\alpha_6=a_6=0$이므로 공구 $z$축이 관절 6의 축이다. 관절 5의 좌표계 원점은 $c=p-d_6\,z_6$이다.
- $\theta_1$. 관절 2·3·4의 공통 방향은 $n=(\sin\theta_1,-\cos\theta_1,0)$이다. 이 방향에서 $c$의 성분이 오프셋 $d_4$이므로 $c_x\sin\theta_1-c_y\cos\theta_1=d_4$이다. $r=\lVert(c_x,c_y)\rVert$, $\varphi=\operatorname{atan2}(c_y,c_x)$로 두면 $\sin(\theta_1-\varphi)=d_4/r$이고 해는 $\theta_1=\varphi+\arcsin(d_4/r)$과 $\varphi+\pi-\arcsin(d_4/r)$의 두 개이다.
- $\theta_5$. $n\cdot p=d_4+d_6\cos\theta_5$이므로 $\cos\theta_5=(n\cdot p-d_4)/d_6$이고 해는 $\pm\arccos(\cdot)$의 두 개이다.
- $\theta_6$. 좌표계 6에서 본 $n$은 $(\sin\theta_5\cos\theta_6,\,-\sin\theta_5\sin\theta_6,\,\cos\theta_5)$이므로 $\theta_6=\operatorname{atan2}\bigl(-(n\cdot y_6)/\sin\theta_5,\ (n\cdot x_6)/\sin\theta_5\bigr)$이다($x_6,y_6$는 $R$의 열).
- 평면 2R. $T_{14}=T_{01}^{-1}T_{06}T_{46}^{-1}$의 $(x,y)$ 성분을 목표로 길이 $a_2,a_3$의 평면 2R을 풀어 $(\theta_2,\theta_3)$의 두 해(팔꿈치 위·아래)를 얻는다. $T_{14}$의 $z$ 성분은 $d_4$이다.
- $\theta_4$. $\theta_2+\theta_3+\theta_4=\operatorname{atan2}\bigl((T_{14})_{21},(T_{14})_{11}\bigr)$에서 $\theta_4$를 구한다.
해는 $2\times2\times2=8$개이다(그림 1). 해가 없거나 줄어드는 경우가 있다. $r<\lvert d_4\rvert$이면 $\theta_1$이 없고, $\lvert\cos\theta_5\rvert>1$이면 $\theta_5$가 없으며, 평면 2R의 목표가 닿지 않으면 그 분기가 없다. $\sin\theta_5=0$(손목 특이점)에서는 $\theta_6$이 정해지지 않는다.
구면 손목(오프셋 없는 손목, $d_4=d_5=0$)에서는 같은 식이 그대로 성립한다. $c$가 손목의 교점이 되고 $\theta_1$의 두 해는 $\varphi$와 $\varphi+\pi$(앞·뒤)이다.
2.5.3.4 일반 6R과 호모토피 연속법
일반 6R(손목 분리도 평행 축도 없는 구조)의 역기구학은 관절 변수의 반각 접선으로 쓴 다항식 계통이며, 소거로 단변수 16차 다항식에 이른다고 Raghavan·Roth(1993)가 보였다. Manocha·Canny(1994)는 이를 고유값 문제로 효율화한 알고리즘을 제시했다(본문은 읽지 못했다). Lee·Liang(1988)은 일반 7R 기구의 변위 해석에서 16개를 다룬다. Tsai·Morgan(1985)은 일반 6자유도 매니퓰레이터의 운동학을 연속법(continuation)으로 풀었다.
호모토피 연속법은 풀기 쉬운 시작 계통 $G(x)=0$에서 풀려는 계통 $F(x)=0$으로 매개변수 $t$를 0에서 1로 움직이며 해를 추적한다.
$$H(x,t)=(1-t)\,\gamma\,G(x)+t\,F(x),\qquad G_j(x)=x_j^{d_j}-1,$$
여기서 $d_j$는 $F_j$의 차수이고 $\gamma$는 임의의 복소 상수이다. 시작 해는 $d_j$제곱근의 모든 조합으로 $\prod_jd_j$개(총차수, 베주 수)이며 각 경로를 예측-보정 방식으로 $t=1$까지 추적한다. $F$의 유한 해가 시작 해 수보다 적으면 나머지 경로는 무한대로 발산한다. 이 장은 3R 위치 문제(원 조건 3개와 위치 방정식 3개의 6식, 차수 $(2,2,2,3,3,3)$)에서 이 방법을 구현해 경로 216개 가운데 유한 해가 4개임을 확인한다.
2.5.3.5 IKFast
IKFast는 OpenRAVE의 일부로, 기구학 사슬에서 닫힌 형식의 역기구학을 푸는 C++ 코드를 생성한다. 소스의 문서 문자열은 다음을 적는다. 비교차 축을 포함한 임의 관절 구성을 처리하고, 가능한 모든 이산 해를 계산하며(최대 16개), 생성된 C++ 코드는 OpenRAVE나 다른 라이브러리에 의존하지 않고, 두 축 이상이 정렬되어 해가 무한한 퇴화를 자동으로 검출한다고 서술한다. 지원하는 IK 유형은 Transform6D(6차원 자세)·Rotation3D·Translation3D·Direction3D·Ray4D·Lookat3D·TranslationDirection5D 등이다. 기호 계산은 sympy를 사용하고 정수 분수로 선형 독립을 추적한다. "자유 관절(free joints)"은 실행 때 값이 주어지는 관절로, 여유자유도 로봇은 일부 관절을 자유 관절로 두어 나머지를 푼다. 소스의 미해결 목록은 6차원 IK에도 풀지 못하는 기구가 아직 있고, 소수가 긴 입력은 큰 분수를 만들어 느려지며, 축이 정렬된 무한 해 경우의 처리가 더 필요하다고 적는다. 라이선스는 ikfast.py가 LGPL 3(Lesser GPL)이고 생성 코드가 사용하는 헤더 ikfast.h는 Apache 2.0이다. 이 장은 IKFast를 실행하지 않았다.
2.5.3.6 해의 분기와 특이점
목표가 연속적으로 움직이면 해는 연속 분기를 이루다가 두 해가 합쳐져 사라지거나 새로 나타난다. UR형에서 이 사건은 $\lvert\cos\theta_5\rvert=1$, 팔꿈치 완전 신장·접힘, $r=\lvert d_4\rvert$에서 생긴다. 그림 2의 경로에서 해의 개수는 8에서 시작해 6·4·2를 거쳐 0이 된다. $\sin\theta_5=0$이나 $r=0$(어깨 특이점)에서는 해가 연속적으로 무한히 많다. 자코비안의 특이점과 같은 위치에서 생기는 현상이며 2.9에서 다룬다.
2.5.4 알고리즘
UR형 6R의 해석적 역기구학(ik_ur)이다.
- $c=p-d_6z_6$, $r=\lVert(c_x,c_y)\rVert$를 구한다. $r<\lvert d_4\rvert$이면 해가 없다.
- $\theta_1$의 두 해에 대해 $n=(\sin\theta_1,-\cos\theta_1,0)$를 만든다.
- $\cos\theta_5=(n\cdot p-d_4)/d_6$이 $[-1,1]$ 밖이면 그 $\theta_1$을 버린다. 안이면 $\theta_5=\pm\arccos(\cdot)$의 두 해를 만든다. $\lvert\sin\theta_5\rvert$가 허용치보다 작으면 손목 특이점으로 보고 제외한다.
- $\theta_6$을 $n$의 공구 좌표 성분에서 구한다.
- $T_{14}$를 만들고 $z$ 성분이 $d_4$인지 확인한 뒤(불일치하면 버린다) 평면 2R로 $(\theta_2,\theta_3)$의 두 해를, $\theta_{234}$에서 $\theta_4$를 구한다.
- 해 목록을 관절 한계·현재 형상과의 거리 등으로 선택한다.
일반 6R은 이 절차 대신 소거·고유값·호모토피로 푼다.
2.5.5 풀이 예제 — UR형·구면 손목의 해와 해 집합의 완전성, 일반 6R, 3R 호모토피
UR5의 공칭 DH와 구면 손목 구조에서 모든 해를 구하고, 같은 자세에서 다중 시작 수치 풀이로 찾은 해 집합과 비교하며, 일반 6R의 실수 해의 개수를 세고, 3R 위치 문제를 호모토피 연속법으로 푼다. 결론부터 적으면 다음과 같다. ① 해석적 해의 순기구학 왕복 오차는 $9.0\times10^{-15}$ 이하이고 UR5와 구면 손목 모두 40개 자세에서 해 집합이 수치 풀이와 일치했다(수치 풀이에만 있는 해 0, 해석 해 중 놓친 해 0). ② UR5 20개 자세 중 14개가 해 8개, 6개가 8개 미만(4개 4·6개 1·2개 1)이다. ③ 일반 6R 40개 설계에서 찾은 서로 다른 실수 해의 수는 2·4·6이었다(최대 6). ④ 3R 위치 문제의 호모토피는 경로 216개 가운데 4개가 $t=1$까지 추적되어 유한 해 4개(모두 실수)를 주었다. ⑤ ur-analytic-ik 0.1.0.post3과 UR5의 해 집합이 300개 자세에서 모두 일치했다.
구현. two_link·ik_ur. 다중 시작 수치 풀이(ik_num), 일반 6R 표집, 호모토피 추적(F3·track·homotopy3)과 그림은 스크립트에 있다. 2.3의 dh_std·mul·inv와 1.7의 log_so3, 1.1의 solve_lu를 사용했다.
| 항목 | 값 |
|---|---|
| 입력 1 | UR5 공칭 DH $(d_1,a_2,a_3,d_4,d_5,d_6)=(0.089159,-0.425,-0.39225,0.10915,0.09465,0.0823)$. 자세 20개(시드 481): 임의의 관절각 $[-\pi,\pi]^6$, $\lvert\sin\theta_5\rvert>0.1$, 손목 중심의 수평 거리가 $\lvert d_4\rvert+0.05$ 초과 |
| 입력 2 | 구면 손목 $(0.35,0.5,0.45,0,0,0.12)$, 자세 20개(시드 482) |
| 입력 3 | 다중 시작 수치 풀이: 자세마다 시작점 150개(균일), 감쇠 가우스-뉴턴(중심차분 야코비안) 최대 60회, 수렴 판정 $\lVert e\rVert^2<10^{-20}$, 해의 동일성 $10^{-6}$ rad |
| 입력 4 | 일반 6R: 40개 설계($a_i,d_i\in[-0.8,0.8]$, $\alpha_i\in\pm[0.4,1.4]$)와 임의 관절각의 자세, 자세마다 시작점 120개(시드 484) |
| 입력 5 | 3R 위치: $(d,a,\alpha)=(0.3,0.2,1.1),(0.1,0.7,0.5),(0.2,0.6,-0.4)$, 목표 $(0.2083,-0.8818,-0.2526)$(관절각 $q_0=(0.303,-2.313,1.329)$의 순기구학), $\gamma=e^{2\pi i\cdot0.3137}$ |
| 입력 6 | 라이브러리 대조: UR5 공칭 DH, 300개 자세(시드 481) |
from math import sin, cos, atan2, acos, asin, hypot, pi
def two_link(l1, l2, x, y):
"""평면 2R의 역기구학: 팔꿈치 두 해 (a, b)"""
c = (x * x + y * y - l1 * l1 - l2 * l2) / (2 * l1 * l2)
if abs(c) > 1:
return []
out = []
for b in (acos(c), -acos(c)):
a = atan2(y, x) - atan2(l2 * sin(b), l1 + l2 * cos(b))
out.append((a, b))
return out
def ik_ur(T, g, tol=1e-9):
"""표준 DH 6R의 모든 역기구학 해
a=(0, a2, a3, 0, 0, 0), d=(d1, 0, 0, d4, d5, d6)
al=(pi/2, 0, 0, pi/2, -pi/2, 0)"""
d1, a2, a3, d4, d5, d6 = g
R = [r[:3] for r in T[:3]]
p = [T[i][3] for i in range(3)]
c = [p[i] - d6 * R[i][2] for i in range(3)] # 손목 중심
r = hypot(c[0], c[1])
if r < abs(d4):
return []
sols = []
for t1 in (atan2(c[1], c[0]) + asin(d4 / r),
atan2(c[1], c[0]) + pi - asin(d4 / r)):
n = [sin(t1), -cos(t1), 0.0] # 축 2·3·4의 방향 z1
c5 = (n[0] * p[0] + n[1] * p[1] - d4) / d6
if abs(c5) > 1:
continue
for t5 in (acos(c5), -acos(c5)):
s5 = sin(t5)
if abs(s5) < tol: # 손목 특이점
continue
nx = sum(n[i] * R[i][0] for i in range(3))
ny = sum(n[i] * R[i][1] for i in range(3))
t6 = atan2(-ny / s5, nx / s5)
T46 = mul(dh_std(t5, d5, 0.0, -pi / 2),
dh_std(t6, d6, 0.0, 0.0))
T01 = dh_std(t1, d1, 0.0, pi / 2)
T14 = mul(mul(inv(T01), T), inv(T46))
if abs(T14[2][3] - d4) > 1e-6:
continue
q234 = atan2(T14[1][0], T14[0][0])
x, y = T14[0][3], T14[1][3]
for t2, t3 in two_link(a2, a3, x, y):
t4 = q234 - t2 - t3
sols.append([t1, t2, t3, t4, t5, t6])
return sols
① 해 집합의 완전성. 같은 자세에서 해석적 해와 다중 시작 수치 풀이의 해 집합을 비교했다.
| 항목 | UR5(공칭 DH) | 구면 손목($d_4=d_5=0$) |
|---|---|---|
| 해의 개수(20개 자세): 8개인 자세 수 / 그 밖 | 14 / 6 | 20 / 0 |
| 모든 해의 순기구학 왕복 오차 최대 | 9.0e-15 | 3.6e-15 |
| 수치 풀이(자세마다 시작점 150개)와 해 집합이 같은 자세 수 | 20 / 20 | 20 / 20 |
| 수치 풀이에만 있는 해 / 해석 해 가운데 수치 풀이가 놓친 해 | 0 / 0 | 0 / 0 |
해석 해는 모든 자세에서 수치 풀이가 찾은 해 집합과 같다. 수치 풀이가 놓친 해석 해도, 해석 해에 없는 수치 해도 없었다.
② 해의 분기. 한 자세(UR5, 시드 11의 20번째 자세 $q_0=(0.453,-2.315,-0.866,2.456,3.019,0.986)$)에서 엔드이펙터 위치를 $x$ 방향으로 움직이며(자세 고정) 해의 $\theta_3$을 $\theta_1$·$\theta_5$의 부호별로 그렸다.
해는 분기마다 연속이고 $s$가 커지면 쌍으로 합쳐져 사라진다. 이 경로(401개 점으로 확인)에서 해의 개수는 $s=-0.5$ m에서 8이고 $s\approx0.0975$에서 6, $0.1225$에서 4, $0.21$에서 2, $0.2275$ m에서 0이 된다.
③ 일반 6R의 실수 해. 40개 설계에서 다중 시작으로 찾은 서로 다른 실수 해의 수의 분포이다. 다중 시작은 해를 놓칠 수 있으므로 이 수는 하한이다.
| 찾은 서로 다른 실수 해의 수 | 2 | 4 | 6 |
|---|---|---|---|
| 자세 수(40개 중) | 16 | 10 | 14 |
찾은 실수 해는 2, 4, 6개였고 8 이상은 찾지 못했다(문헌의 상한 16은 복소수 해를 포함한 개수이다).
④ 3R 위치 문제의 호모토피. 총차수 호모토피로 216개 경로를 추적했다.
| 항목 | 값 |
|---|---|
| 시작 경로 수(총차수 $2^3\times3^3$) | 216 |
| $t=1$까지 추적에 성공한 경로 | 4 |
| 서로 다른 유한 해 | 4 |
| 그 가운데 실수 해 | 4 |
| 유한 해의 잔차 최댓값 | 2.2e-16 |
| 추적 시간(순수 파이썬, 한 번의 실행) | 30 s |
216개 경로 가운데 4개가 $t=1$까지 유한한 점으로 추적되었고 나머지 212개는 무한대로 발산했다. 유한 해 4개는 모두 실수이고 목표를 만든 관절각 $q_0$를 포함한다(확인: 해의 잔차 $2.2\times10^{-16}$). 일반 3R의 해가 최대 4개라는 문헌의 서술과 일치하나 (문헌은 확인하지 못했다), 이 장은 한 예만 계산했다.
⑤ 라이브러리 대조(실행 2026-11-03). ur-analytic-ik 0.1.0.post3의 ur5.inverse_kinematics와 ur5.forward_kinematics(Python 3.11 격리 가상환경, 라이브러리의 기본 DH 표와 같은 UR5 공칭 값, 파이썬 3.12 휠이 없어 3.11을 사용했다)를 같은 자세에서 비교했다. 스크립트는 robotics/fig-src/2.5-libcheck.py, 출력은 robotics/fig-src/data/2.5-libcheck-output.txt에 있다. 라이브러리의 README는 이 라이브러리가 Villalobos 외(2021)의 UR5 역기구학에 기반한다고 적고, 공칭 DH 값을 쓰면 실제 로봇과 순기구학에서 1~2 mm 어긋날 수 있다고 경고한다.
| 항목 | 값 |
|---|---|
| 비교한 자세 수 | 300 |
| 해의 개수가 같은 자세 | 300 |
| 해 집합이 같은 자세(각도 차 $10^{-6}$ 이내) | 300 |
| 이 장의 해의 개수 분포(8·6·4·2) | 235·10·41·14 |
| 라이브러리 해의 개수 분포(8·6·4·2) | 235·10·41·14 |
| 라이브러리 해의 순기구학 왕복 오차(이 장의 DH 곱) 최대 | 4.0e-15 |
| 라이브러리 순기구학 대 이 장의 DH 곱 최대 차이 | 0.0e+00 |
한계. 수치는 합성 자세와 공칭 DH이다. 해 집합의 완전성은 다중 시작 150개로 확인한 것이어서 수치 풀이가 놓친 해는 보이지 않는다(해석 해가 더 많으면 놓친 해로 드러난다). 일반 6R의 실수 해 수는 하한이고 16개 사례는 찾지 못했다. 호모토피는 한 목표와 한 $\gamma$에서의 결과이며 경로 실패는 추적 허용치(스텝 $10^{-13}$)에 의존한다. IKFast는 실행하지 않았고, 일반 6R의 16차 다항식은 직접 구현하지 않았다.
견해: 구조가 UR형이나 구면 손목이면 해석적 풀이를 구현하고 같은 저장소에 수치 다중 시작 풀이와 해 집합을 비교하는 시험을 두는 것을 기본으로 둔다고 본다. 근거는 이 장에서 해석 해와 수치 해 집합이 40개 자세 모두 일치했다는 점이다. 일반 구조나 여유자유도 로봇에는 해석적 풀이를 직접 유도하기보다 코드 생성기나 수치 풀이(2.6)를 먼저 검토한다. 구조가 자주 바뀌는 연구 환경에서는 이 판단이 달라질 수 있다.
2.5.6 설계 트레이드오프 — 역기구학의 풀이 방식
공개 문헌에서 확인되는 방식은 네 가지이다.
- ① 구조별 해석적 풀이. 손으로 유도한 닫힌 형식(PUMA형, UR형 등).
- ② 코드 생성(IKFast). 사슬을 입력받아 닫힌 형식의 C++를 생성한다. 해결하지 못하는 구조가 남아 있다.
- ③ 일반 6R의 소거·고유값·호모토피. 구조 제한 없이 모든 해를 구한다(Raghavan–Roth, Manocha–Canny, Tsai–Morgan).
- ④ 수치 풀이(2.6). 초기값에서 해 하나를 구한다.
| 방식 | 구조 제한 | 해 | 장점 | 한계 | 알맞은 경우 |
|---|---|---|---|---|---|
| ① 해석적 | 있음(구면 손목·평행 축) | 모두 | 가장 빠르고 해 선택이 쉬움 | 구조마다 유도, 특이 형상 처리 | 상용 산업·협동로봇 |
| ② IKFast | 대부분 | 모두 | 자동 생성, 독립 C++ | 일부 구조 불가, 생성 시간·정밀도 이슈 | 반복 사용하는 고정 구조 |
| ③ 일반 6R | 없음 | 모두 | 일반성 | 구현이 복잡, 계산량 | 연구·검증 |
| ④ 수치 | 없음 | 하나(시작점 의존) | 단순, 여유자유도 가능 | 수렴 보장 없음, 해 하나 | 일반 로봇, 초기값이 있는 추적 |
견해: 해 선택 정책(관절 한계, 연속성, 충돌)이 필요한 응용에서는 가능하면 ①·②로 모든 해를 구한 뒤 정책으로 고르는 것이 낫다고 본다. 근거는 이 장의 계산에서 UR5의 해 개수가 자세에 따라 8·6·4·2로 달라지고, 한 해만 구하는 수치 풀이에서는 이 분기 구조가 보이지 않는다는 점이다.
2.5.7 응용 축 비교
| 응용 축 | 역기구학의 해석적 해가 맡는 일 | 요구 | 관련 장 |
|---|---|---|---|
| 산업·제조 | 6축·협동로봇 제어기의 직교 좌표 지령→관절 지령, 오프라인 프로그래밍의 도달성 점검 | 모든 해 중 선택, 특이점 회피 | 28.2, 2.10 |
| 물류·이동 | 이동 매니퓰레이터 팔의 도달 가능 해 선택 | 속도, 연속성 | 2.15 |
| 도로 주행 | 해당하는 고유 요구 없음 | — | — |
| 서비스 | 가정용 팔의 해 선택(7축은 여유자유도) | 안전, 충돌 | 2.11 |
| 의료·헬스케어 | 도구 끝 위치·자세 지령 | 정밀도, 연속성 | 32.14 |
| 휴머노이드·범용 | 팔·다리의 해석적 해(구조가 맞을 때) | 실시간 | 7.3 |
| 필드 | 해당하는 고유 요구 없음(이동·휴머노이드 행과 같음) | — | — |
| 국방·안보 | 원리 수준에서 해당하는 고유 요구 없음 | — | — |
이 표는 이 책의 정리이며 장별 요구는 다르다.
2.5.8 관련 규격·프로토콜
| 문서 | 발행 | 무엇을 정하나 | 상세 장 |
|---|---|---|---|
| IKFast | rdiankov/openrave(master) | ikfast.py(LGPL 3)가 닫힌 형식 IK의 C++를 생성, ikfast.h(Apache 2.0)가 생성 코드의 공통 인터페이스 | 2.7 |
| ur-analytic-ik | Victorlouisdg/ur-analytic-ik(MIT) | UR 계열의 해석적 FK·IK의 파이썬 바인딩, 기본 DH 값 | 2.7 |
| UR DH 표 | Universal Robots 지원 문서 | UR5 등의 표준 DH 표 | 2.3, 2.17 |
| 수학 표기·기호표 | 이 책 | 관절·자세 표기 | A.2 |
2.5.9 관련 규제·인증 요구와의 연결
역기구학의 풀이 방식 자체를 규정하는 법령·인증 요건은 확인하지 못했다. 다만 해 선택은 안전 기능(관절 한계·속도 제한)과 충돌 회피의 입력이며 산업 로봇의 안전 요건은 27.10이 다룬다. 이 장은 규정의 조항을 확인하지 않았다 (확인 필요).
2.5.10 한계·유의점·미해결
- 공칭 값. 제조사 공칭 DH는 개체별 보정 값과 다르며 해석적 해에 직접 영향을 준다(2.17).
- 특이 형상. $\sin\theta_5=0$·$r=0$·팔꿈치 신장에서는 해가 합쳐지거나 무한하다. 구현은 허용치로 처리해야 한다.
- 해 선택. 모든 해를 구한 뒤의 선택 정책(관절 한계·연속성)은 이 장의 범위 밖이다(2.6·2.11).
- 여유자유도. 7축은 해가 연속 집합이다(2.11).
- 일반 6R의 구현. 16차 소거와 고유값 알고리즘은 이 장이 구현하지 않았다.
- IKFast. 실행하지 않았다. 소스의 미해결 목록에 6차원 IK에서 풀지 못하는 구조가 있다고 적혀 있다.
2.5.11 체크포인트·연구 질문·출처
체크포인트:
- UR형 6R에서 $\theta_1$의 두 해가 나오는 이유를 $\sin(\theta_1-\varphi)=d_4/r$로 설명하라. $d_4=0$이면 무엇이 달라지는가?
- 구면 손목의 손목 분리에서 손목 중심이 $q_4,q_5,q_6$과 무관한 이유를 설명하라.
- 총차수 호모토피의 경로 수가 216인 이유를 $(2,2,2,3,3,3)$에서 설명하고, 유한 해가 4개뿐인 이유를 설명하라.
- 해 8개가 4개·2개·0개로 줄어드는 세 가지 사건을 UR형의 식에서 찾아라.
연구 질문:
- 개체별 보정이 적용된 UR형(공칭 DH와 어긋난 평행 축)에서도 닫힌 형식의 해를 유지할 수 있는가(2.17)?
- 코드 생성기가 풀지 못하는 6차원 IK 구조의 분류는 무엇인가?
1차 출처(조회 2026-11-03).
- K. M. Lynch, F. C. Park, Modern Robotics, Cambridge University Press, 2017(ISBN 9781107156302). 사전 인쇄본 6.1절을 읽었다.
- M. Raghavan, B. Roth, "Inverse kinematics of the general 6R manipulator and related linkages," Journal of Mechanical Design 115(3), 502–508, 1993, doi:10.1115/1.2919218 — 서지만 확인.
- D. Manocha, J. F. Canny, "Efficient inverse kinematics for general 6R manipulators," IEEE Transactions on Robotics and Automation 10(5), 648–657, 1994, doi:10.1109/70.326569 — 서지만 확인.
- L.-W. Tsai, A. P. Morgan, "Solving the kinematics of the most general six- and five-degree-of-freedom manipulators by continuation methods," Journal of Mechanisms, Transmissions, and Automation in Design 107(2), 189–200, 1985, doi:10.1115/1.3258708 — 서지만 확인.
- H. Y. Lee, C. G. Liang, "Displacement analysis of the general spatial 7-link 7R mechanism," Mechanism and Machine Theory 23(3), 219–226, 1988, doi:10.1016/0094-114x(88)90107-3 — 서지만 확인.
- A. Villalobos, E. Sanchez, J. Martell, "Alternative inverse kinematic solution of the UR5 robotic arm," Lecture Notes in Networks and Systems, 200–207, 2021, doi:10.1007/978-3-030-90033-5_22 — 서지만 확인(저자 순서는 Crossref 등록 순).
rdiankov/openrave의python/ikfast.py·python/ikfast.h,Victorlouisdg/ur-analytic-ikREADME, ur-analytic-ik 0.1.0.post3(PyPI, 실행).
다음 장. 2.6는 수치적 역기구학을 다룬다. 뉴턴법·감쇠 최소제곱·SQP·QP 미분 IK가 이 장의 해석 해와 어떻게 다른지, 초기값과 수렴을 이어서 다룬다.