제1부 수학적 기초
1.10 스크루 이론: 트위스트·렌치·수반 표현(adjoint)
1.10.1 이 장에서 배우는 것 / 선수 지식 / 특히 중요한 독자
이 장은 강체의 운동과 힘을 직선(축) 하나와 수 두 개로 표현하는 스크루 이론을 다룬다. 강체의 임의의 변위는 어떤 직선 둘레의 회전과 그 직선을 따른 이동의 합성이고, 임의의 힘 계는 어떤 직선 위의 힘과 그 직선에 평행한 짝힘의 합성이다. 앞 장들(1.6~1.8)이 변환을 행렬과 리군으로 다루었다면, 이 장은 같은 대상을 직선의 기하로 읽고 속도(트위스트)와 힘(렌치)을 6차원 벡터로 묶어 좌표계 사이를 수반 행렬로 변환한다. 다룰 질문은 다섯 가지다. 스크루 운동의 축·피치·회전각은 어떻게 정의되고 변환에서 어떻게 복원되는가, 공간 트위스트와 물체 트위스트는 어떻게 이어지는가, 수반 행렬과 리 괄호는 무엇이며 어떻게 검증하는가, 렌치는 왜 트위스트의 쌍대이고 좌표 변환은 왜 수반의 전치로 이루어지는가, 라이브러리마다 성분 순서가 다를 때 무엇을 확인해야 하는가.
배우는 것:
- 스크루 운동 — 축 $(s,q)$, 피치 $h$, 회전각 $\theta$, 단위 스크루 $S$, 샤슬 정리, 순수 이동의 특이점.
- 트위스트 — 공간 트위스트·물체 트위스트, $V_s=\mathrm{Ad}_TV_b$.
- 수반 표현 — $\mathrm{Ad}_T$, $\mathrm{ad}_V$, $\mathrm{Ad}_{\exp V}=\exp(\mathrm{ad}_V)$, 리 괄호.
- 렌치와 쌍대성 — 일률 $F\cdot V$, 좌표 변환 $\mathrm{Ad}^\top$, 중심축 분해.
- 상호성 — 두 직선의 상호 곱, 구속 렌치 공간, 평면 3R 연쇄의 예.
- 라이브러리 규약 — Modern Robotics·Drake·Pinocchio·ROS 메시지의 성분 순서,
MatrixLog6의 작은 각 한계.
선수 지식: 1.6(동차변환), 1.7(지수·로그 사상), 1.8(수반과 섭동), 1.4(회전 행렬). 표기는 BK-05와 A.2을 따른다: 트위스트 $(\omega,v)$, 렌치 $(m,f)$.
특히 중요한 독자: 기구학·동역학을 구현하는 엔지니어, 힘 제어와 접촉 해석을 다루는 연구자, 공간 벡터 라이브러리의 성분 순서를 옮겨 적는 소프트웨어 개발자.
출처 방침. 서지는 Crossref 응답으로 확인했다(목록은 이 장 끝). 직접 읽은 자료: ① Modern Robotics 코드 라이브러리의
core.py(Adjoint·ScrewToAxis·AxisAng6·MatrixLog3·MatrixLog6·ad), ② Drake의spatial_velocity.h·spatial_force.h(master), ③ Pinocchio의motion-tpl.hxx·force-tpl.hxx·motion-dense.hxx(devel), ④ ROS 2geometry_msgs의Twist.msg·Wrench.msg(rolling). 직접 실행한 것:modern_robotics1.1.1(PyPI, NumPy 2.5.4). 읽지 못한 것: 인용한 교과서·논문의 본문(정리 번호는(확인 필요)), Featherstone의 공간 벡터 표기, Drake·Pinocchio의 문서와 실행. 이 장의 수치는 모두 순수 파이썬 구현으로 계산했으며 1.1의 행렬 곱, 1.6의 동차변환, 1.7의 지수·로그를 불러와 사용했다.
1.10.2 개념 — 직선 위의 운동과 힘
문을 여닫을 때 문의 모든 점은 경첩의 축 둘레로 회전한다. 나사를 조일 때 나사의 점들은 축 둘레로 회전하면서 축 방향으로 전진한다. 두 경우 모두 운동 전체가 직선 하나(축)와 회전량, 그리고 회전 1 rad당 축 방향 전진량(피치 $h$)으로 정해진다. 문은 $h=0$이고 나사는 $h\ne0$이다. 샤슬(Chasles)의 정리는 이 구조가 모든 강체 변위에 성립한다고 말한다(순수 이동은 축이 없는 극한이다). 샤슬 정리의 원 출처와 연도는 (확인 필요)이다.
힘에도 같은 구조가 있다. 강체에 작용하는 힘 계는 어떤 직선 위의 힘 $f$와 그 직선에 평행한 짝힘으로 환원되고, 짝힘의 크기와 $f$의 비가 피치이다. 속도에는 직선과 각속도·이동속도가, 힘에는 직선과 힘·짝힘이 대응하므로 둘은 쌍대이며, 이 장은 둘의 내적이 일률이 되도록 성분을 배열한다.
1.10.3 원리
1.10.3.1 스크루 운동과 지수 사상
결론: 강체 변환 $T=(R,p)$는 단위 스크루 $S$와 스칼라 $\theta$의 지수 $\exp([S]\theta)$로 쓸 수 있고, 축·피치·회전각은 1.7의 로그에서 닫힌 식으로 얻는다. 회전각이 작으면 복원 오차가 $1/\theta$로 커진다.
직선의 방향 $s$($\lVert s\rVert=1$), 직선 위의 한 점 $q$, 피치 $h$에 대해 단위 스크루는 다음과 같다(이 책의 순서 $(\omega,v)$).
$$S=\begin{bmatrix}s\\ -s\times q+hs\end{bmatrix}=\begin{bmatrix}\omega\\ v\end{bmatrix},\qquad T=\exp([S]\theta)=\bigl(R,\ p\bigr),\quad R=\mathrm{Exp}(\theta s),\quad p=(I-R)q+h\theta s$$
점 $x$는 $q$를 지나는 축 둘레로 $\theta$ 회전한 뒤 축 방향으로 $h\theta$ 이동한다. 이 식은 1.7의 $SE(3)$ 지수 $p=V(\theta)\rho$와 같다(이 장이 $10^{-15}$ 안에서 확인). 역으로 $\xi=\theta S=\mathrm{Log}(T)$에서
$$\theta=\lVert\omega\rVert,\qquad s=\frac{\omega}{\theta},\qquad h=\frac{\omega\cdot v}{\lVert\omega\rVert^2},\qquad q=\frac{\omega\times v}{\lVert\omega\rVert^2}$$
이며 $q$는 축 위에서 원점에 가장 가까운 점이다. $\omega=0$이면 순수 이동이고 축이 없으며 피치는 무한대이다. 구현은 이 경우 $\theta=\lVert v\rVert$, 방향 $v/\lVert v\rVert$를 반환한다.
로그의 입력 $T$가 부동소수점으로 계산된 값이면 $\omega$의 절대 오차가 $\varepsilon_{\mathrm{mach}}$ 수준이므로 $\theta$가 작을수록 방향 $s=\omega/\theta$의 상대 오차는 $\varepsilon_{\mathrm{mach}}/\theta$로 커진다. 두 자세의 상대 변환 $T_1^{-1}T_2$에서 스크루 축을 구하는 경우가 이에 해당한다(1.10.5).
1.10.3.2 트위스트: 공간 표현과 물체 표현
결론: 같은 강체 운동에 대해 트위스트는 어느 좌표계로 표현하느냐에 따라 두 가지이며 수반 행렬로 변환된다.
시간에 따라 변하는 변환 $T(t)=(R,p)$에 대해 다음 두 6차원 벡터를 정의한다.
$$[V_s]=\dot TT^{-1}\ \Rightarrow\ V_s=(\omega_s,\ \dot p-\omega_s\times p),\qquad [V_b]=T^{-1}\dot T\ \Rightarrow\ V_b=(\omega_b,\ R^\top\dot p)$$
공간 트위스트 $V_s$의 선속도는 물체에 고정된 점 가운데 지금 공간 좌표 원점에 있는 점의 속도이고, 물체 트위스트 $V_b$의 선속도는 물체 원점의 속도를 물체 좌표로 나타낸 것이다. 두 표현은 수반 행렬로 이어진다.
$$V_s=\mathrm{Ad}_TV_b,\qquad \mathrm{Ad}_T=\begin{bmatrix}R&0\\ [p]_\times R&R\end{bmatrix}$$
이 장은 임의의 운동에서 중심차분으로 구한 $V_s$와 $\mathrm{Ad}_TV_b$가 $10^{-11}$ 안에서 일치함을 확인했다(중심차분의 한계). 임의의 두 변환에서 $\mathrm{Ad}_{T_1T_2}=\mathrm{Ad}_{T_1}\mathrm{Ad}_{T_2}$이다.
1.10.3.3 수반 표현과 리 괄호
수반 행렬은 트위스트를 좌표계 사이로 옮기고(1.8.3.1), 그 무한소 꼴인 $\mathrm{ad}_V$는 두 트위스트의 리 괄호를 만든다.
$$\mathrm{ad}_V=\begin{bmatrix}[\omega]_\times&0\\ [v]_\times&[\omega]_\times\end{bmatrix},\qquad [V_1,V_2]=\mathrm{ad}_{V_1}V_2=\bigl(\omega_1\times\omega_2,\ \omega_1\times v_2-\omega_2\times v_1\bigr)$$
$$\mathrm{Ad}_{\exp V}=\exp(\mathrm{ad}_V),\qquad \frac{d}{dt}\mathrm{Ad}_{\exp tX}Y\Big|_{t=0}=\mathrm{ad}_XY$$
리 괄호는 야코비 항등식 $[X,[Y,Z]]+[Y,[Z,X]]+[Z,[X,Y]]=0$을 만족한다. 이 장은 위의 항등식을 무작위 입력에서 $10^{-15}$(해석 항등식)과 $10^{-11}$(중심차분) 안에서 확인했다. 리 괄호는 자코비안 열의 시간 미분(2.8)과 공간 벡터 대수의 동역학(3.5)에 나타난다고 알려져 있다 (확인 필요: 정리 번호).
1.10.3.4 렌치와 쌍대성
결론: 렌치는 트위스트의 쌍대이며, 두 벡터의 내적이 일률이 되도록 순서를 맞춘 것이 $(m,f)$와 $(\omega,v)$이다. 렌치의 좌표 변환은 수반의 전치(역)로 이루어진다.
렌치 $F=(m,f)$는 한 점(좌표 원점)에 대한 모멘트 $m$과 힘 $f$이다. 점 $r$에 작용하는 힘 $f$의 원점 모멘트는 $m=r\times f$이고 트위스트 $(\omega,v)$인 물체에 하는 일률은 $f\cdot(v+\omega\times r)=m\cdot\omega+f\cdot v$이다. 따라서 일률은 $P=F\cdot V$이다. 좌표계 $\{a\}$에서 $\{b\}$로 옮긴 렌치는 일률이 같도록 정해진다.
$$F_a^\top V_a=F_b^\top V_b\ \Rightarrow\ F_a=\mathrm{Ad}_{T_{ba}}^\top F_b=\mathrm{Ad}_{T_{ab}}^{-\top}F_b$$
이 장은 무작위 입력에서 일률의 불변을 $10^{-15}$ 안에서 확인했다. 공간 좌표 $\{s\}$와 물체 좌표 $\{b\}$에서는 $V_s=\mathrm{Ad}_{T_{sb}}V_b$, $F_b=\mathrm{Ad}_{T_{sb}}^\top F_s$이다.
렌치도 직선 하나와 피치로 정리된다. $f\ne0$이면 중심축은 방향 $f/\lVert f\rVert$이고 원점에 가장 가까운 점이 $q=f\times m/\lVert f\rVert^2$이며 피치 $h=m\cdot f/\lVert f\rVert^2$에 대해 $m=q\times f+hf$이다(1.10.5에서 $10^{-16}$ 안에서 확인). 이 환원은 정역학의 알려진 결과이며 정리 번호는 (확인 필요)이다. 직선의 플뤼커(Plücker) 좌표 $(\text{방향},\text{모멘트})$는 트위스트 $(\omega,v)$에서는 방향이 앞에, 렌치 $(m,f)$에서는 방향($f$)이 뒤에 놓인다. 이 배열은 각 성분끼리($\omega$와 $m$)와 선 성분끼리($v$와 $f$)를 같은 자리에 두어 내적이 곧 일률이 되도록 한 것이다.
1.10.3.5 상호성과 구속
결론: 렌치가 트위스트에 일을 하지 않을 조건(상호성)으로 관절이 전달할 수 있는 구속 렌치의 공간을 구한다.
트위스트 $V=(\omega,v)$와 렌치 $F=(m,f)$가 $F\cdot V=0$이면 상호(reciprocal)이다. 이상 관절(마찰 없음)의 구속 렌치는 그 관절이 허용하는 트위스트와 상호이다. 두 트위스트 $S_1$, $S_2$ 사이의 상호 곱은 $\langle S_1,S_2\rangle=\omega_1\cdot v_2+\omega_2\cdot v_1$이다. 두 직선(피치 0)의 상호 곱의 크기는 두 직선 사이의 거리 $d$와 사잇각 $\alpha$에 대해 $d\sin\alpha$이며, 두 직선이 한 점에서 만나거나 평행이면 0이다. 따라서 회전 관절의 축과 만나거나 평행한 직선을 따른 힘은 그 관절에 일을 하지 않는다. 이 장은 두 직선의 상호 곱을 독립적으로 계산한 거리로 확인했다(1.10.5). 자유도 계산(그뤼블러 공식)은 2.1, 정역학과 강성은 2.12, 손가락의 힘 닫힘(렌치 공간)은 13.2이 다룬다.
1.10.3.6 성분 순서와 라이브러리 규약
같은 6차원 벡터라도 성분 순서에 따라 수반 행렬의 블록이 달라진다. 이 책의 순서 $(\omega,v)$에서 $\mathrm{Ad}_T=\begin{bmatrix}R&0\\ [p]_\times R&R\end{bmatrix}$이고, 선속도를 먼저 두는 $(v,\omega)$에서는 $\begin{bmatrix}R&[p]_\times R\\0&R\end{bmatrix}$이다. 둘은 위·아래 블록을 맞바꾸는 치환 $P$로 이어진다($P\,\mathrm{Ad}\,P$; 이 장이 확인, 오차 0). 소스에서 읽은 성분 순서는 다음과 같다.
| 출처(읽은 파일) | 트위스트(속도) | 렌치(힘) | 읽은 근거 |
|---|---|---|---|
| 이 책(BK-05, Lynch & Park 관례) | $(\omega,v)$ | $(m,f)$ | $\mathrm{Ad}_T$의 블록은 위 식 |
Modern Robotics core.py | $(\omega,v)$ | $(m,f)$ (추정) | Adjoint는 [[R,0],[p×R,R]], ScrewToAxis는 [s, q×s + h s]. 렌치 인자 Ftip의 성분 순서는 문서에 명시되지 않음 |
Drake SpatialVelocity·SpatialForce(master) | $[\omega;\ v]$ | $[\tau;\ f]$ | 헤더 주석: 각속도가 선속도 "위에", 토크가 힘 "위에" |
Pinocchio Motion·Force(devel, LINEAR=0·ANGULAR=3) | $(v,\omega)$ | $(f,\tau)$ | motion-tpl.hxx·force-tpl.hxx의 상수, toActionMatrix의 ad 블록이 선속도 먼저 |
ROS 2 geometry_msgs/Twist·Wrench(rolling) | linear, angular | force, torque | 메시지 정의 파일. 좌표계는 메시지 자체에 없음 |
순서가 같은 라이브러리 사이에서도 변환 $T$의 방향($T_{ab}$ 대 $T_{ba}$)과 수반의 쪽(공간·물체)이 다를 수 있으므로 순서 외에 이 두 가지를 확인한다.
1.10.4 알고리즘
스크루 축 복원과 수반 변환
screw_axis(s, q, h): S ← (s, −s×q + h s) (순서 (ω, v))
twist_exp(V): (R, p) ← exp_se3(V) (1.7)
screw_params(V): θ ← ‖ω‖
θ ≈ 0이면 순수 이동: (‖v‖, v/‖v‖, h=∞, q 없음)
s ← ω/θ ; v_s ← v/θ ; h ← s·v_s ; q ← s×v_s
adjoint(R, p): [[R, 0], [[p]× R, R]]
ad(V): [[[ω]×, 0], [[v]×, [ω]×]]
wrench_in_a(T_ab, F_b): F_a ← Ad_{T_ba}ᵀ F_b (일률 불변)
reciprocal(F, V): F·V = 0이면 상호
구현은 1.10.5의 코드에 있다. 상대 변환에서 스크루 축을 구할 때는 $\theta$가 작을수록 오차가 $\varepsilon_{\mathrm{mach}}/\theta$로 커지므로 축을 쓰기 전에 $\theta$를 확인한다.
1.10.5 풀이 예제 — 스크루 복원·수반 검증·상호 곱과 라이브러리 확인
스크루 축의 지수·로그 왕복, 수반 행렬의 항등식, 렌치 변환과 일률 불변, 두 직선의 상호 곱, 평면 3R 연쇄의 상호 렌치 공간을 계산하고, 작은 회전각에서 스크루 축 복원의 오차를 측정하며, Modern Robotics의 함수를 같은 입력으로 비교한다. 결론부터 적으면 다음과 같다. ① 스크루 운동의 닫힌 식과 지수는 $1.1\times10^{-15}$ 안에서 일치하고 로그에서 $(\theta,s,h,q)$를 $8.9\times10^{-16}$ 안에서 복원한다. ② 수반의 합성·$\mathrm{Ad}_{\exp V}=\exp(\mathrm{ad}_V)$·야코비 항등식·렌치의 일률 불변은 $2.0\times10^{-15}$ 이하에서 성립한다. ③ 두 직선의 상호 곱은 독립 계산한 거리와 $d\sin\alpha$로 $4.4\times10^{-16}$ 안에서 같다. ④ 상대 변환에서 스크루 축 복원 오차는 $\theta$에 반비례해 $\theta=10^{-7}$ rad에서 $s$ 기준 $3.6\times10^{-10}$이다. ⑤ MatrixLog6는 $\theta\le10^{-8}$ rad에서 회전을 0으로 반환한다.
구현. screw_axis·twist_exp·twist_log·screw_params·adjoint·ad·wrench_in_a. 1.1의 행렬 곱, 1.6의 동차변환, 1.7의 exp_se3·log_se3·hat
| 항목 | 값 |
|---|---|
| 입력 1 | 무작위 스크루 1,000개(시드 28): 방향 $s$, 점 $q\in[-1,1]^3$, 피치 $h\in[-1,1]$, $\theta\in[0.05,3]$ |
| 입력 2 | 무작위 포즈·트위스트·렌치 1,000쌍(같은 시드) |
| 입력 3 | 상대 변환 $T_1^{-1}T_2$: $T_2=T_1\exp(\theta S)$, $\theta=10^{-1}$~$10^{-7}$, 피치 0.3(시드 7) |
| 입력 4 | 무작위 직선 쌍 1,000개(시드 5); 평면 3R: 축 방향 $z$, 점 $(0,0,0)$·$(1,0.2,0)$·$(1.7,-0.5,0)$ |
import math
def dot(a, b):
return sum(x * y for x, y in zip(a, b))
def cross(a, b):
return [a[1] * b[2] - a[2] * b[1],
a[2] * b[0] - a[0] * b[2],
a[0] * b[1] - a[1] * b[0]]
def mv(M, x):
return [sum(a * b for a, b in zip(r, x)) for r in M]
def screw_axis(s, q, h):
"""단위 스크루 S = (s, -s x q + h s), 순서 (w, v)"""
sq = cross(s, q)
return list(s) + [h * a - b for a, b in zip(s, sq)]
def twist_exp(V):
"""T = exp([V]) = (R, p), V = (w, v)"""
return exp_se3(V[3:], V[:3])
def twist_log(R, p):
rho, w = log_se3(R, p)
return w + rho
def screw_params(V):
"""V = th*S -> (th, s, h, q); q는 축 위 원점 최근접점"""
th = math.sqrt(dot(V[:3], V[:3]))
if th < 1e-12: # 순수 이동: 피치 무한대
d = math.sqrt(dot(V[3:], V[3:]))
return d, [x / d for x in V[3:]], math.inf, None
s = [x / th for x in V[:3]]
vs = [x / th for x in V[3:]]
return th, s, dot(s, vs), cross(s, vs)
def adjoint(R, p):
"""Ad_T = [[R, 0], [[p]x R, R]]"""
pR = matmul(hat(p), R)
return ([list(R[i]) + [0.0] * 3 for i in range(3)]
+ [pR[i] + list(R[i]) for i in range(3)])
def ad(V):
"""ad_V = [[[w]x, 0], [[v]x, [w]x]]: V의 리 괄호 작용"""
W, X = hat(V[:3]), hat(V[3:])
return ([W[i] + [0.0] * 3 for i in range(3)]
+ [X[i] + W[i] for i in range(3)])
def inv_T(R, p):
Rt = transpose(R)
return Rt, [-x for x in mv(Rt, p)]
def wrench_in_a(R, p, Fb):
"""T_ab = (R, p)일 때 F_a = Ad_{T_ba}^T F_b, F = (m, f)"""
Ri, pi = inv_T(R, p)
return mv(transpose(adjoint(Ri, pi)), Fb)
① 항등식의 검증.
| 항목 | 최대 오차 | 비고 |
|---|---|---|
| 스크루 운동의 닫힌 식 $p=(I-R)q+h\theta s$ 대 지수 | 1.1e-15 | 무작위 1,000개 |
| 축 위 점의 이동 $Tx=x+h\theta s$ | 1.1e-15 | 같은 1,000개 |
| 로그로 $(\theta,s,h,q)$ 복원 | 8.9e-16 | 같은 1,000개, $\theta\in[0.05,3]$ |
| $\mathrm{Ad}_{T_1T_2}-\mathrm{Ad}_{T_1}\mathrm{Ad}_{T_2}$ | 1.3e-15 | 무작위 1,000쌍 |
| $\mathrm{Ad}_{\exp V}-\exp(\mathrm{ad}_V)$ | 1.6e-15 | 6×6 테일러 지수 |
| 야코비 항등식 $[X,[Y,Z]]+[Y,[Z,X]]+[Z,[X,Y]]$ | 5.4e-16 | 무작위 1,000개 |
| 렌치의 중심축 분해 $m=q\times f+hf$ | 3.3e-16 | $h=m\cdot f/\lVert f\rVert^2$, 무작위 1,000개 |
| 일률 불변 $\lvert F_a\cdot V_a-F_b\cdot V_b\rvert$ | 2.0e-15 | $F_a=\mathrm{Ad}_{T_{ba}}^\top F_b$ |
| 공간 트위스트 $V_s$ 대 $\mathrm{Ad}_TV_b$ | 7.5e-12 | 중심차분 $h=10^{-6}$ |
| $\frac{d}{dt}\mathrm{Ad}_{\exp tX}Y$ 대 $\mathrm{ad}_XY$ | 4.6e-11 | 중심차분 $h=10^{-6}$ |
| 성분 순서 교환 $P\,\mathrm{Ad}\,P$ 대 $\begin{bmatrix}R&[p]_\times R\\0&R\end{bmatrix}$ | 0.0e+00 | $P$는 위·아래 블록 교환 |
해석 항등식은 부동소수점 한계($10^{-15}$) 안에서 성립하고 중심차분을 사용한 두 행은 차분 오차($10^{-11}$)이다.
② 스크루 축 복원의 오차와 회전각. 상대 변환의 로그에서 복원한 $(\theta,s,h,q)$의 오차는 다음과 같다.
| $\theta$ (rad) | $\theta$의 상대 오차 | $s$의 오차 | $h$의 오차 | $q$의 오차 |
|---|---|---|---|---|
| $10^{-1}$ | 0.0e+00 | 6.7e-16 | 7.8e-16 | 1.1e-15 |
| $10^{-2}$ | 4.2e-15 | 3.4e-15 | 6.6e-15 | 1.6e-14 |
| $10^{-3}$ | 8.0e-15 | 4.1e-14 | 3.1e-15 | 7.2e-14 |
| $10^{-4}$ | 1.5e-14 | 1.6e-13 | 1.6e-13 | 8.1e-13 |
| $10^{-5}$ | 3.9e-14 | 2.3e-12 | 6.5e-12 | 5.6e-12 |
| $10^{-6}$ | 3.5e-11 | 4.6e-11 | 1.8e-11 | 4.4e-11 |
| $10^{-7}$ | 4.3e-10 | 3.6e-10 | 1.2e-10 | 4.1e-10 |
방향 $s$와 점 $q$의 오차는 $\theta$가 10배 줄 때마다 대략 10배 커져 $\varepsilon_{\mathrm{mach}}/\theta$ 직선(기계 정밀도 $1.1\times10^{-16}$)을 따라간다. 입력 $T$가 부동소수점으로 만들어진 값이므로 이 한계는 로그 사상의 구현과 무관하게 나타난다.
③ 두 직선의 상호 곱과 구속 렌치.
| 사례 | 결과 |
|---|---|
| 꼬인 두 직선: $\lvert\langle S_1,S_2\rangle\rvert-d\sin\alpha$ 최대 차이(1,000쌍) | 4.4e-16 |
| 한 점에서 만나는 두 직선: $\lvert\langle S_1,S_2\rangle\rvert$ 최대(1,000쌍) | 3.3e-16 |
| 평면 3R 연쇄의 상호 렌치 공간 차원(6−3) | 3 |
| 그 기저의 $(m_z,f_x,f_y)$ 성분 최대 | 0.0e+00 |
꼬인 두 직선의 상호 곱은 독립적으로 구한 두 직선 사이의 거리와 사잇각의 $d\sin\alpha$와 일치하고, 한 점에서 만나는 직선은 $10^{-16}$ 수준에서 0이다. 평면 3R 연쇄(세 축이 평행)의 트위스트 공간은 3차원이므로 상호 렌치 공간은 $6-3=3$차원이며, 그 기저는 $m_z$, $f_x$, $f_y$ 성분이 0이어서 면 밖의 힘 $f_z$와 면 안의 축에 대한 모멘트 $m_x$, $m_y$가 구속 렌치이다.
④ Modern Robotics의 함수 비교(실행 2026-11-03). modern_robotics 1.1.1을 같은 입력(500개)으로 호출했다. 스크립트는 robotics/fig-src/1.10-libcheck.py, 출력은 robotics/fig-src/data/1.10-libcheck-output.txt에 있다.
| 함수 | 이 장의 구현과 최대 차이 |
|---|---|
Adjoint | 2.2e-16 |
ScrewToAxis | 0.0e+00 |
MatrixExp6 | 3.3e-16 |
MatrixLog6(복원한 트위스트) | 6.8e-14 |
ad | 0.0e+00 |
AxisAng6(복원한 트위스트) | 4.4e-16 |
작은 회전각에서 상대 변환의 로그를 비교하면 다음과 같다(상대 오차).
| $\theta$ (rad) | 이 장 $\omega$ | MatrixLog6 $\omega$ | MatrixLog6 $v$ |
|---|---|---|---|
| $10^{-1}$ | 6.2e-16 | 5.0e-16 | 1.3e-15 |
| $10^{-3}$ | 5.7e-14 | 5.7e-14 | 7.7e-14 |
| $10^{-5}$ | 3.1e-12 | 3.1e-12 | 7.4e-12 |
| $10^{-6}$ | 5.8e-11 | 5.8e-11 | 8.0e-11 |
| $10^{-7}$ | 6.5e-10 | 6.5e-10 | 8.8e-10 |
| $10^{-8}$ | 1.8e-09 | 1.0e+00 | 2.0e-08 |
| $10^{-9}$ | 5.0e-08 | 1.0e+00 | 8.7e-08 |
$\theta\ge10^{-7}$ rad에서 두 구현의 오차는 같다(입력의 반올림이 지배). $\theta\le10^{-8}$ rad에서는 MatrixLog6의 $\omega$ 상대 오차가 1.0, 곧 회전을 0으로 돌려준다. 소스에서 MatrixLog3가 acosinput = (trace(R) − 1)/2를 계산해 1 이상이면 영행렬을 반환하는 분기를 읽었다. $\cos\theta=1-\theta^2/2$가 $\theta<1.5\times10^{-8}$에서 부동소수점으로 1이 되기 때문이다(1.9의 acos 한계와 같은 원인). 이 저장소의 설명문은 코드가 효율과 강건성에 최적화되지 않았다고 밝힌다. 이 장의 구현은 쿼터니언을 거치는 로그(1.7)여서 영점으로 떨어지지 않는다. 또 AxisAng6는 $\lVert\omega\rVert<10^{-6}$이면 NearZero로 보고 $\lVert v\rVert$로 정규화한다(소스 독해, 실행하지 않음).
⑤ 라이브러리 저장소(GitHub API, 조회 2026-11-03).
| 라이브러리 | 저장소 | 라이선스(GitHub) | 최신 릴리스 | 마지막 푸시 |
|---|---|---|---|---|
| Modern Robotics 코드 라이브러리 | NxRLab/ModernRobotics | MIT | v1.1.1·2023-02-03 | 2026-02-18 |
| Pinocchio | stack-of-tasks/pinocchio | BSD-2-Clause | v4.1.0·2026-07-07 | 2026-11-01 |
| Drake | RobotLocomotion/drake | NOASSERTION | v1.58.0·2026-10-15 | 2026-11-03 |
푸시 날짜는 유지의 대리 지표일 뿐이다(0.18). Pinocchio와 Drake는 헤더 소스만 읽었고 실행하지 않았다.
한계. 수치는 합성 입력(시드 고정)이다. 복원 오차 표는 한 쌍의 포즈($T_1$)와 한 스크루에서 측정했으며 오차의 배율은 입력에 따라 달라진다. 순수 이동에 가까운 경우(피치가 매우 큰 경우)의 거동은 따로 측정하지 않았다. 평면 3R 예제는 세 축이 평행한 경우만 다루며 일반 6자유도 연쇄의 구속 렌치 공간은 다루지 않았다. 중심차분 항목은 차분 간격에 의한 오차 $10^{-11}$이 한계이다.
견해: 이 책은 내부 계산에서 6차원 트위스트·렌치와 수반 행렬을 기본으로 사용하고, 스크루 축·피치는 사람이 읽는 출력이나 시각화에서만 계산하며, 회전각이 작으면 축 대신 트위스트 $\xi$를 그대로 보고하는 것을 기본으로 둔다고 본다. 근거는 위 표에서 축 복원 오차가 $\varepsilon_{\mathrm{mach}}/\theta$로 커지며 $\theta=10^{-7}$ rad에서 $4\times10^{-10}$에 이르고, 라이브러리가 $\theta\le10^{-8}$ rad에서 회전을 잃을 수 있다는 점이다. 허용 오차가 낮은 응용에서는 이 한계가 문제가 되지 않을 수 있다.
1.10.6 설계 트레이드오프 — 운동·힘의 표현
공개 문헌에서 확인되는 선택지는 네 가지다.
- ① 스크루 매개변수 $(\theta,s,q,h)$. 축과 피치로 기하적 의미가 직접 드러난다. 분석·시각화·순간 운동의 해석에 알맞다.
- ② 6차원 트위스트 $\xi=\theta S$. 연속이고 최소 표현이며 합·수반·리 괄호가 선형 연산이다. 축은 분해가 필요하다.
- ③ 4×4 행렬과 6×6 수반. 합성이 곱이고 구현이 단순하다. 수반이 따로 필요하다(1.6).
- ④ 이중 쿼터니언. 스크루 선형 보간 등 보간에 알맞다(1.11).
| 방식 | 장점 | 한계 | 알맞은 경우 |
|---|---|---|---|
| ① 스크루 매개변수 | 기하적 의미, 해석 | $\theta\to0$에서 $\varepsilon/\theta$ 오차, 순수 이동 특이 | 분석·출력·시각화 |
| ② 6차원 트위스트 | 선형 연산, 특이 없음 | 축의 분해 필요 | 내부 계산·최적화·야코비안 |
| ③ 행렬·수반 | 단순 구현 | 6×6 행렬 비용 | 변환 체인·기구학 |
| ④ 이중 쿼터니언 | 보간 | 별도 표기 | 궤적 보간 |
견해: 한 코드베이스 안에서 성분 순서와 $T_{ab}$ 방향 규약을 하나로 정하고 외부(ROS 메시지·Pinocchio)와의 경계에서만 순서를 바꾸는 것이 표현 선택 자체보다 중요하다고 본다. 근거는 이 장이 확인한 Drake·Pinocchio·ROS의 순서 차이가 한 문서에서 읽히는 규약이 아니라 라이브러리마다 다르다는 점이다.
1.10.7 응용 축 비교
| 응용 축 | 스크루·렌치가 맡는 일 | 요구 | 관련 장 |
|---|---|---|---|
| 산업·제조 | 관절의 스크루 축으로 기구학(지수곱)·자코비안 열 구성, 공구 좌표의 렌치 변환, 병렬 기구의 구속 해석 | 정확도, 규약 일관성 | 2.4, 2.8, 2.13 |
| 물류·이동 | 매니퓰레이터 끝의 힘·토크를 베이스 좌표로 변환 | 좌표 변환의 정확성 | 2.12, 6.6 |
| 도로 주행 | 평면 운동의 순간 회전 중심(피치 0, 수직 축) | 해석 | — |
| 서비스 | 접촉 작업의 힘 제어 목표(렌치) 지정 | 안전, 순응 | 12.8, 12.9 |
| 의료·헬스케어 | 도구 끝 힘·토크 센싱의 좌표 변환 | 정밀도 | 6.6 |
| 휴머노이드·범용 | 공간 벡터 대수에 의한 동역학, 접촉 렌치 | 계산 효율 | 3.5, 3.12 |
| 필드 | 해당하는 고유 요구 없음(이동·휴머노이드 행과 같음) | — | — |
| 국방·안보 | 원리 수준에서 해당하는 고유 요구 없음 | — | — |
이 표는 이 책의 정리이며 장별 요구는 다르다.
1.10.8 관련 규격·프로토콜
| 문서 | 발행 | 무엇을 정하나 | 상세 장 |
|---|---|---|---|
geometry_msgs/Twist·Wrench | ROS 2 common_interfaces(rolling) | 트위스트의 linear·angular, 렌치의 force·torque 필드 | 1.3 |
| Modern Robotics 코드 라이브러리 | GitHub NxRLab/ModernRobotics(MIT) | 스크루·수반·지수·로그 함수 | 2.4 |
Drake SpatialVelocity·SpatialForce | GitHub RobotLocomotion/drake | $[\omega;v]$·$[\tau;f]$ 순서의 공간 벡터 | 3.6 |
Pinocchio Motion·Force | GitHub stack-of-tasks/pinocchio(BSD-2-Clause) | $(v,\omega)$·$(f,\tau)$ 순서의 공간 벡터 | 3.6 |
| 수학 표기·기호표 | 이 책 | 트위스트 $(\omega,v)$, 렌치 $(m,f)$ | A.2 |
스크루 이론의 표기에 국제 표준은 없다. 규약은 문헌과 라이브러리가 정하므로 사용하는 쪽의 정의를 읽는 것이 상호운용의 기준이다.
1.10.9 관련 규제·인증 요구와의 연결
직접 적용되는 규제는 없다. 렌치의 좌표 변환 오류(성분 순서·변환 방향)는 협동 운용의 힘 한계 감시와 같은 안전 기능의 입력 오류로 이어질 수 있으므로 검증 항목이 된다. 산업 로봇의 안전 표준은 27.10, 소프트웨어 안전과 품질 표준은 26.20이 다룬다.
1.10.10 한계·유의점·미해결
- 정리의 출처. 샤슬 정리의 원 출처·연도, 힘 계 환원의 정리 번호, 교과서 장 번호(Lynch & Park, Murray 외, Featherstone)는 확인하지 않았다
(확인 필요). - 라이브러리. Drake·Pinocchio는 헤더만 읽고 실행하지 않았으며 Modern Robotics 1.1.1의 함수만 실행했다. Modern Robotics의 렌치 인자 순서는 문서에 명시되지 않아 $(m,f)$로 읽었다
(추정). - 순수 이동 근방. 피치가 매우 큰 경우의 수치 거동은 측정하지 않았다.
- 일반 연쇄. 평면 3R 외 연쇄의 구속 렌치 공간과 병렬 기구는 다루지 않았다(2.13·2.14).
- 동역학. 공간 관성과 뉴턴-오일러 방정식은 3.1이 다룬다.
1.10.11 체크포인트·연구 질문
체크포인트:
- 스크루 축 $(s,q)$, 피치 $h$, 회전각 $\theta$에서 단위 스크루 $S$와 $T=\exp([S]\theta)$를 쓸 수 있는가.
- 로그의 결과 $(\omega,v)$에서 축·피치·원점 최근접점을 복원하고, 순수 이동의 경우를 처리할 수 있는가.
- 공간 트위스트와 물체 트위스트의 정의와 $V_s=\mathrm{Ad}_TV_b$를 설명할 수 있는가.
- $\mathrm{ad}_V$와 리 괄호, $\mathrm{Ad}_{\exp V}=\exp(\mathrm{ad}_V)$를 설명할 수 있는가.
- 일률 불변에서 렌치의 변환 $F_a=\mathrm{Ad}_{T_{ba}}^\top F_b$를 유도할 수 있는가.
- 상호 곱으로 회전 관절의 구속 렌치를 판정하고 평면 3R 연쇄의 상호 렌치 공간을 구할 수 있는가.
- 상대 변환에서 스크루 축을 구할 때 오차가 $\varepsilon_{\mathrm{mach}}/\theta$로 커지는 이유와 라이브러리의 작은 각 한계를 설명할 수 있는가.
- Pinocchio·ROS 메시지처럼 선속도 먼저인 규약과 이 책의 규약 사이에서 수반의 블록을 바꿀 수 있는가.
연구 질문(47.12에 수록한다):
- 로봇 소프트웨어 사이의 6차원 벡터 성분 순서·좌표 변환 방향 불일치는 실제 시스템의 오류 사례로 얼마나 보고되는가.
- 작은 상대 회전각에서 스크루 축을 안정적으로 구하는 방법(예: 이중 쿼터니언 로그, 테일러 급수)은 로그 사상 구현과 비교해 오차를 얼마나 줄이는가.
- 구속 렌치 공간을 이용한 접촉 판정과 자유도 해석은 병렬 기구와 다지(多指) 손에서 어느 정도로 자동화되어 있는가.
1차 출처
- K. M. Lynch, F. C. Park, 『Modern Robotics: Mechanics, Planning, and Control』, Cambridge University Press, 2017(doi:10.1017/9781316661239)
(확인 필요: 장·정리 번호). - R. M. Murray, Z. Li, S. S. Sastry, 『A Mathematical Introduction to Robotic Manipulation』, CRC Press(Crossref 등록 2017, doi:10.1201/9781315136370)
(확인 필요: 장 번호). - R. Featherstone, 『Rigid Body Dynamics Algorithms』, Springer, 2008(doi:10.1007/978-1-4899-7560-7) — 본문 미확인.
- R. S. Ball, 『A Treatise on the Theory of Screws』, Cambridge University Press, 1900(doi:10.5962/bhl.title.18548) — 서지만 확인.
- J. M. Davidson, K. H. Hunt, 『Robots and Screw Theory』, Oxford University Press, 2004(doi:10.1093/oso/9780198562450.001.0001) — 서지만 확인.
- R. W. Brockett, 「Robotic manipulators and the product of exponentials formula」, Lecture Notes in Control and Information Sciences, 120–129, Springer(doi:10.1007/bfb0031048) — 서지만 확인, 연도는 Crossref에 없다
(확인 필요). - GitHub API·소스(조회·실행 2026-11-03):
NxRLab/ModernRobotics(core.py,modern_robotics1.1.1 실행),RobotLocomotion/drake(spatial_velocity.h·spatial_force.h),stack-of-tasks/pinocchio(motion-tpl.hxx·force-tpl.hxx·motion-dense.hxx), ROS 2common_interfaces(Twist.msg·Wrench.msg).
다음 장. 1.11는 회전의 표현 III으로, 단위 이중 쿼터니언과 등각 기하 대수(CGA)를 다룬다. 이 장의 스크루 운동을 쿼터니언의 확장으로 표현해 보간과 합성을 정리하고 DQ Robotics·gafro 라이브러리의 규약을 확인한다.