제1부 수학적 기초
1.9 리만 기하 기초: 다양체·접공간·측지선·평행 이동·SPD 다양체
1.9.1 이 장에서 배우는 것 / 선수 지식 / 특히 중요한 독자
이 장은 곡면 위에서 거리·방향·평균을 정의하는 수학, 곧 리만 기하의 기초를 다룬다. 앞 장(1.7·1.8)은 회전군의 구조를 군 연산과 접공간으로 다루었다. 이 장은 같은 접공간에 내적(리만 계량)을 더해 측지선·평행 이동·평균을 정의하고, 군 구조가 없는 공간, 특히 공분산·질량행렬이 속하는 대칭 양정부호(symmetric positive definite, SPD) 행렬의 원뿔에 같은 도구를 적용한다. 로봇공학에서 이 도구는 자세 평균(회전 평균), 공분산의 보간·평균, 다양체 위 최적화(리만 최적화)에 사용된다. 다룰 질문은 다섯 가지다. 다양체·접공간·리만 계량은 무엇이며 로봇공학의 어떤 공간이 이에 해당하는가, 지수·로그 사상과 측지선은 어떻게 계산하며 수치적으로 어디서 틀리는가, 평행 이동은 왜 경로에 의존하는가, SPD 행렬에는 어떤 계량이 있고 그 차이가 무엇인가, 자세의 평균을 여러 방법으로 구하면 얼마나 달라지는가.
배우는 것:
- 다양체·접공간·리만 계량 — 정의와 로봇공학의 예($S^2$, $SO(3)$, $SE(3)$, $\mathrm{Sym}^+(n)$).
- 지수·로그 사상과 측지선 — 단위 구와 $SO(3)$의 식, 단절 궤적(cut locus), 거리 계산의 수치 정확도.
- 평행 이동과 곡률 — 구 위의 평행 이동, 닫힌 경로의 홀로노미(holonomy).
- SPD 다양체 — 유클리드 계량·아핀 불변 계량·로그-유클리드 계량, 측지선·거리·불변성.
- 카르허 평균 — 정의, 고정점 반복, 회전 평균 방법(현 평균·쿼터니언 평균·마클리 평균)과의 차이.
- 라이브러리 — pymanopt·Manopt·Geomstats의 소스 독해와 실행 확인.
선수 지식: 1.7(지수·로그 사상), 1.5(쿼터니언), 1.4(회전 행렬), 1.1(고유분해·SVD). 표기는 BK-05와 A.2을 따른다.
특히 중요한 독자: 추정·최적화 연구자(회전 평균, 다양체 위 최적화), 공분산·관성 행렬을 다루는 엔지니어, 기하 라이브러리를 선택·검증하는 소프트웨어 개발자.
출처 방침. 서지는 Crossref 응답으로 확인했다(목록은 이 장 끝). 직접 읽은 자료: ① pymanopt의
sphere.py·positive_definite.py(master, 조회 2026-11-03)와 PyPI 2.2.1에 설치된 같은 파일, ② Manopt의spherefactory.m, ③ Geomstats의hypersphere.py(main). 직접 실행한 것: pymanopt 2.2.1(PyPI)과 master 소스(커밋8bae754, 2026-10-30)의 구면·SPD 거리 함수(NumPy 2.5.4, SciPy 1.18.1). 읽지 못한 것: 인용한 논문·교과서의 본문(정리 번호와 정확한 조건은(확인 필요)), Geomstats의 SPD 구현, 각 라이브러리의 문서. 이 장의 수치는 모두 순수 파이썬 구현으로 계산했으며 1.1의 행렬 곱·SVD, 1.4의 최근접 회전, 1.5의 쿼터니언, 1.7의 지수·로그를 불러와 사용했다.
1.9.2 개념 — 곡면 위의 거리·방향·평균
지구 표면에서 두 도시 사이의 최단 경로는 지도의 직선이 아니라 대원의 호이다. 두 점을 잇는 직선은 곡면 밖을 지나므로 거리가 될 수 없고, 점 $p$에서 점 $q$로 향하는 방향도 $p$에서 곡면에 접하는 평면(접평면) 안의 벡터로 정해야 한다. 이 구조가 리만 기하의 출발점이다. 점마다 접공간이 있고, 접공간에 내적이 주어지며, 내적으로 곡선의 길이와 최단 곡선(측지선)이 정해진다.
두 가지 어려움이 따른다. 첫째, 서로 다른 점의 접공간은 같은 공간이 아니므로 $p$에서의 벡터를 $q$에서의 벡터와 비교하려면 옮겨야 하며, 옮기는 방법이 경로에 의존한다(평행 이동과 곡률). 둘째, 점의 평균은 좌표 평균으로 정의할 수 없어 측지 거리의 제곱합을 최소화하는 점으로 정의한다(카르허 평균). 이 장의 풀이 예제는 구와 $SO(3)$, SPD 행렬에서 이 두 가지를 수치로 확인한다.
1.9.3 원리
1.9.3.1 다양체·접공간·리만 계량
결론: 로봇공학에서 다루는 연속 상태 공간 대부분은 유클리드 공간이 아닌 다양체이며, 계량을 정하면 거리와 평균이 정해진다. 계량의 선택에 따라 결과가 달라지므로 계량은 설계 결정이다.
다양체 $\mathcal M$은 각 점 근방이 $\mathbb R^n$과 같은 좌표를 갖는 공간이다. 점 $p$에서의 접공간 $T_p\mathcal M$은 $p$를 지나는 곡선의 속도 벡터가 이루는 선형 공간이다. 리만 계량은 접공간마다 내적 $\langle u,v\rangle_p$를 부드럽게 부여한다. 곡선 $\gamma$의 길이는 $\int\sqrt{\langle\dot\gamma,\dot\gamma\rangle_\gamma}\,dt$이고, 거리 $d(p,q)$는 두 점을 잇는 곡선 길이의 최솟값이다. 거리를 국소적으로 최소화하는 곡선이 측지선(geodesic)이다.
| 다양체 | 차원 | 접공간 | 계량 | 로봇공학의 쓰임 |
|---|---|---|---|---|
| 단위 구 $S^2$ | 2 | $\{v:\ v\cdot p=0\}$ | 유클리드 내적의 제한 | 방향 벡터, 시선 방향 |
| $SO(3)$ | 3 | $\{R\hat\omega\}$ | 양측 불변: $\langle\omega_1,\omega_2\rangle=\omega_1\cdot\omega_2$ | 자세 |
| $SE(3)$ | 6 | $\{T\hat\xi\}$ | 양측 불변 계량 없음 (확인 필요: 출처) | 포즈 |
| 대칭 양정부호 $\mathrm{Sym}^+(n)$ | $n(n+1)/2$ | 대칭 행렬 $\mathrm{Sym}(n)$ | 유클리드·아핀 불변·로그-유클리드 | 공분산, 질량행렬, 관성 |
$SO(3)$에는 양측 불변 계량이 있어 $d(R_1,R_2)=\lVert\mathrm{Log}(R_1^\top R_2)\rVert$이다(1.7의 로그 사상). 단위 쿼터니언은 3-구 $S^3$를 이루며 $R_1$, $R_2$의 상대 회전각은 $S^3$ 위의 각도의 두 배이다. 이 관계를 무작위 1,000쌍에서 확인했다(1.9.5).
1.9.3.2 지수·로그 사상과 측지선
점 $p$와 접벡터 $v\in T_p\mathcal M$에 대해 $\mathrm{Exp}_p(v)$는 $p$에서 출발해 속도 $v$로 단위 시간 동안 측지선을 따라간 점이고, $\mathrm{Log}_p(q)$는 그 역이다. 단위 구에서는 다음과 같다.
$$\mathrm{Exp}_p(v)=\cos\lVert v\rVert\,p+\sin\lVert v\rVert\,\frac{v}{\lVert v\rVert},\qquad \mathrm{Log}_p(q)=\theta\,\frac{q-\langle p,q\rangle p}{\lVert q-\langle p,q\rangle p\rVert},\quad \theta=\operatorname{atan2}\bigl(\lVert p\times q\rVert,\ \langle p,q\rangle\bigr)$$
$\theta$를 $\arccos\langle p,q\rangle$로 계산하면 $\theta\approx0$과 $\theta\approx\pi$ 부근에서 정밀도가 떨어진다. $\cos\theta$가 $\pm1$ 부근에서 $\theta$에 둔감하기 때문이며($\cos\theta\approx1-\theta^2/2$), 배정밀도에서 $\theta\lesssim10^{-8}$은 구별되지 않는다. 외적의 노름과 내적의 atan2는 두 경우 모두 정확하다(1.9.5).
단절 궤적. 대척점($\theta=\pi$)에는 최단 측지선이 무수히 많아 $\mathrm{Log}_p(q)$가 정해지지 않는다. 구의 단사 반지름(injectivity radius)은 $\pi$이고 $SO(3)$에서는 회전각 $\pi$이다. 라이브러리는 이 경계를 오류로 처리하기도 한다(1.9.5-⑤).
1.9.3.3 평행 이동과 곡률
결론: 곡면에서 벡터를 접공간 사이로 옮기는 방법은 경로에 의존하며, 닫힌 경로를 일주하면 벡터가 출발할 때와 다르다. 이 차이(홀로노미)가 곡률의 척도이다.
곡선을 따라 벡터의 접선 방향 변화가 0이 되도록 옮기는 것이 평행 이동(Levi-Civita)이다. 단위 구에서 측지선 $p\to q$를 따른 평행 이동은
$$P_{p\to q}(v)=v-\frac{\langle u,v\rangle}{\langle u,u\rangle}\bigl(u+w\bigr),\qquad u=\mathrm{Log}_p(q),\ w=\mathrm{Log}_q(p)$$
이다. 이동은 노름을 보존하며 이 장의 구현은 노름 변화 0, 접평면 위반 $4\times10^{-17}$이다. 곡률이 있으면 닫힌 경로에서 벡터가 되돌아오지 않는다. 단위 구의 측지 삼각형을 일주하면 벡터가 면적 $A$(곡률 1)만큼 회전한다는 결과가 알려져 있다(가우스-보네 정리의 귀결; 정리 번호 (확인 필요)). 세 직각을 가진 팔분구($A=4\pi/8=\pi/2$)에서 이 장의 계산값은 $90.0000^\circ$이며 예측과 같다.
로봇공학의 함의는 두 가지다. 접공간의 양(속도·오차·공분산)을 다른 점으로 옮길 때 경로를 정해야 하고, 리군에서는 군 연산에 의한 이동(좌·우 이동과 수반, 1.8)이 따로 정의되어 리만 평행 이동과 다를 수 있다 (확인 필요: 정확한 관계).
1.9.3.4 SPD 다양체와 세 가지 계량
결론: 대칭 양정부호 행렬의 집합은 대칭 행렬 공간 안의 열린 원뿔이며, 여기에 유클리드 계량을 사용하면 보간과 평균에서 행렬식이 팽창한다. 아핀 불변 계량은 이 문제가 없고 좌표 변환에 대해 불변이다.
$\mathrm{Sym}^+(n)$에는 대표적으로 세 계량이 사용된다.
① 유클리드(프로베니우스) — $d(A,B)=\lVert A-B\rVert_F$, 측지선은 직선 $(1-t)A+tB$.
② 아핀 불변 리만 계량(AIRM) — 점 $P$의 접벡터 $U$, $V$에 대해
$$\langle U,V\rangle_P=\mathrm{tr}\bigl(P^{-1}UP^{-1}V\bigr),\qquad d(A,B)=\bigl\lVert\log(A^{-1/2}BA^{-1/2})\bigr\rVert_F=\sqrt{\sum_i\log^2\lambda_i(A^{-1}B)}$$
이고 지수·로그 사상과 측지선은 다음과 같다.
$$\mathrm{Exp}_P(V)=P^{1/2}\exp\bigl(P^{-1/2}VP^{-1/2}\bigr)P^{1/2},\qquad \gamma(t)=A^{1/2}\bigl(A^{-1/2}BA^{-1/2}\bigr)^{t}A^{1/2}$$
측지선 위에서 $\det\gamma(t)=(\det A)^{1-t}(\det B)^t$이다. 가역 행렬 $X$에 대해 $(XAX^\top)^{-1}XBX^\top=X^{-\top}(A^{-1}B)X^\top$는 $A^{-1}B$와 닮은 행렬이므로 고유값이 같고 $d(XAX^\top,XBX^\top)=d(A,B)$이다. 계량의 정의와 이 성질은 Pennec 외(2006)와 Bhatia의 교과서가 다룬다 (확인 필요: 정리 번호).
③ 로그-유클리드 — $d(A,B)=\lVert\log A-\log B\rVert_F$, 측지선 $\exp\bigl((1-t)\log A+t\log B\bigr)$(Arsigny 외, 2006). 닫힌 형식이어서 계산이 빠르나 일반 가역 변환에 대해 불변이 아니다(1.9.5에서 확인).
AIRM의 거리 식에서 $\lVert\cdot\rVert_F$는 대칭 행렬 $\log(A^{-1/2}BA^{-1/2})$에 적용된다. $\log(A^{-1}B)$는 일반적으로 대칭이 아니며 그 프로베니우스 노름은 $\sqrt{\sum\log^2\lambda_i}$보다 크거나 같다. 두 값은 $A$와 $B$가 가환일 때만 같다($A^{-1}B$가 대칭). 대각 행렬만으로 만든 시험은 이 차이를 검출하지 못한다(1.9.5-⑥).
1.9.3.5 카르허 평균과 회전 평균
점 $x_1,\dots,x_N$의 카르허 평균(프레셰 평균, Karcher 1977)은 측지 거리 제곱의 합 $\sum_i d^2(\mu,x_i)$을 줄이는 점이다. 임계점의 조건은 $\sum_i\mathrm{Log}_\mu(x_i)=0$이며, 다음 고정점 반복으로 구한다.
$$\mu\leftarrow\mathrm{Exp}_\mu\Bigl(\frac1N\sum_i\mathrm{Log}_\mu(x_i)\Bigr)$$
존재와 유일성은 점들이 충분히 작은 측지 볼 안에 있을 때 보장되며(Karcher 1977, Afsari 2011) 정확한 반지름 조건은 (확인 필요)이다. 유클리드 공간에서 이 반복은 산술 평균을 한 번에 낸다.
회전의 평균에는 방법이 여럿 있다(Hartley 외, 2013).
| 방법 | 최소화하는 것 | 계산 |
|---|---|---|
| 측지 $L_2$ 평균(카르허) | $\sum d^2(R,R_i)$, $d=\lVert\mathrm{Log}(R^\top R_i)\rVert$ | 고정점 반복 |
| 현(chordal) $L_2$ 평균 | $\sum\lVert R-R_i\rVert_F^2$ | 산술 평균 $\sum R_i$의 최근접 회전(SVD) |
| 쿼터니언 평균(마클리) | $\sum(q^\top q_i)^2$의 최대화 | $\sum q_iq_i^\top$의 최대 고유벡터 |
| 쿼터니언 산술 평균 | 없음(휴리스틱) | 부호를 정렬한 $q_i$의 평균을 정규화 |
현 평균은 최근접 회전의 성질(Moakher 2002; 정리 번호 (확인 필요))로, 마클리 평균은 $\lVert A(q)-A(q_i)\rVert_F^2=\text{상수}-2\bigl(4(q^\top q_i)^2-1\bigr)$이므로 같은 비용함수의 다른 계산법이다(Markley 외, 2007). 이 장은 두 결과가 $10^{-13}$도 안에서 일치함을 확인했다.
1.9.3.6 리만 최적화로의 연결
다양체 위의 최적화는 접공간에서 방향을 정하고 그 결과를 다양체 위의 점으로 사상한다. 지수 사상은 정확한 사상이나 비용이 크므로 리트랙션(retraction)이 사용된다. pymanopt의 구는 $\mathrm{retr}_p(v)=(p+v)/\lVert p+v\rVert$이고 SPD는 $P+V+\tfrac12VP^{-1}V$(지수 사상의 2차 근사, 대칭화)로 읽힌다(소스 독해). 다양체 위 비선형 최소제곱의 갱신 $R\leftarrow R\,\mathrm{Exp}(\delta)$(1.8, 1.12)와 자세 그래프 최적화(9.8·9.9)가 이 구조이다. 이 장은 최적화 알고리즘(리만 경사 하강·신뢰 영역)을 구현하지 않으며 Absil 외(2008)와 Boumal(2023)을 가리킨다.
1.9.4 알고리즘
구의 로그·지수·평행 이동, 아핀 불변 측지선, 카르허 평균
sph_log(p, q): θ ← atan2(‖p×q‖, ⟨p,q⟩) (acos 사용 금지)
u ← q − ⟨p,q⟩p ; return θ·u/‖u‖ (‖u‖=0이면 0)
sph_exp(p, v): n ← ‖v‖ ; return cos n·p + sin n·v/n
transport(p→q, v): u ← sph_log(p,q), w ← sph_log(q,p)
return v − (⟨u,v⟩/⟨u,u⟩)(u + w)
airm_geo(A, B, t): A^{1/2}(A^{-1/2} B A^{-1/2})^t A^{1/2}
karcher(M₁…M_N): μ ← 초기값(산술 평균 또는 M₁)
반복: Δ ← (1/N) Σ Log_μ(M_i)
μ ← Exp_μ(Δ) ; max|Δ| < 10⁻¹⁴이면 종료
SPD: Log_μ(M) = μ^{1/2} log(μ^{-1/2} M μ^{-1/2}) μ^{1/2}
SO(3): Log_R(R_i) = R·log(Rᵀ R_i), Exp_R(RΔ̂) = R·exp(Δ̂)
구현은 1.9.5의 코드에 있다. 대칭 행렬의 함수는 고유분해 $f(A)=Vf(\Lambda)V^\top$로 계산하며, 고유분해는 순환 야코비 방법을 사용했다.
1.9.5 풀이 예제 — 구·SPD·회전 평균과 라이브러리 확인
구의 지수·로그·평행 이동을 검증하고, SPD 행렬의 두 계량을 비교하며, 회전 평균 방법의 차이를 계산하고, 라이브러리의 구면·SPD 거리 함수를 소스 독해와 실행으로 확인한다. 결론부터 적으면 다음과 같다. ① 구의 $\mathrm{Exp}\circ\mathrm{Log}$ 오차는 $2.2\times10^{-16}$이고 평행 이동은 노름과 접평면 조건을 유지하며 팔분구의 홀로노미는 $90.0000^\circ$로 곡률 예측과 일치한다. ② 구의 호 길이는 acos 방식이 $\theta$가 $0$과 $\pi$ 부근에서 $10^{-8}$까지 틀리고 atan2 방식은 $10^{-15}$ 안에서 정확하다. ③ 두 SPD 행렬의 유클리드 보간은 행렬식이 4에서 6.25로 팽창하고 아핀 불변 측지선은 4를 유지하며, 아핀 불변 거리는 가역 변환 후 $2.6\times10^{-15}$ 안에서 같으나 프로베니우스 거리는 129% 변한다. ④ 회전 30개의 평균에서 카르허 평균과 현 평균의 차이는 $\sigma=0.1$ rad에서 $0.008^\circ$, $\sigma=1$ rad에서 $14.8^\circ$이다. ⑤ pymanopt 2.2.1의 SPD 거리는 고유값 식과 일치하나 master 소스는 비가환 쌍에서 1.8~8.8% 크다.
구현. sph_log·sph_exp·sph_transport·eigsym·mfun·airm_dist·airm_geo·karcher_spd·karcher_so3·markley. 1.1의 행렬 곱, 1.4의 최근접 회전, 1.5의 쿼터니언, 1.7의 exp_so3·log_so3
| 항목 | 값 |
|---|---|
| 입력 1 | 무작위 단위 구 점 $p$, $q$(시드 3); 팔분구 꼭짓점 $e_1,e_2,e_3$, 접벡터 $(0,0.5,0)$ |
| 입력 2 | $SO(3)$ 무작위 1,000쌍(시드 5, 회전 벡터 성분 $\mathcal N(0,1.5^2)$) |
| 입력 3 | $A=\mathrm{diag}(4,1)$, $B=\mathrm{diag}(1,4)$ |
| 입력 4 | 무작위 SPD 3×3 두 개(고유값 0.5~3, 시드 6), 가역 행렬 $X$(회전 행렬의 대각을 1.5배로 키우고 성분마다 $0.2(i+j)$를 더함), 별도 SPD 3개 |
| 입력 5 | 기준 자세 $\mathrm{Exp}(0.4,-0.2,0.7)$ 둘레의 회전 30개, 회전 벡터 성분 $\mathcal N(0,\sigma^2)$, $\sigma=0.05$~1.2 rad(시드 12) |
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 sph_log(p, q):
"""단위 구의 로그 사상: p에서 q로 가는 접벡터"""
c = cross(p, q)
th = math.atan2(math.sqrt(dot(c, c)), dot(p, q))
u = [b - dot(p, q) * a for a, b in zip(p, q)]
n = math.sqrt(dot(u, u))
if n == 0:
return [0.0, 0.0, 0.0]
return [th * x / n for x in u]
def sph_exp(p, v):
n = math.sqrt(dot(v, v))
if n == 0:
return list(p)
return [math.cos(n) * a + math.sin(n) * x / n
for a, x in zip(p, v)]
def sph_transport(p, q, v):
"""측지선 p→q를 따른 평행 이동"""
u, w = sph_log(p, q), sph_log(q, p)
k = dot(u, v) / dot(u, u)
return [x - k * (a + b) for x, a, b in zip(v, u, w)]
def eigsym(A):
"""대칭 행렬의 야코비 고유분해: (고유값, 고유벡터 열)"""
n = len(A)
A = [r[:] for r in A]
V = [[float(i == j) for j in range(n)] for i in range(n)]
for _ in range(60):
for p in range(n - 1):
for q in range(p + 1, n):
if abs(A[p][q]) < 1e-300:
continue
th = (A[q][q] - A[p][p]) / (2 * A[p][q])
w = abs(th) + math.hypot(th, 1)
t = math.copysign(1, th) / w
c = 1 / math.hypot(t, 1)
G = [[float(i == j) for j in range(n)]
for i in range(n)]
G[p][p] = G[q][q] = c
G[p][q], G[q][p] = t * c, -t * c
A = matmul(matmul(transpose(G), A), G)
V = matmul(V, G)
return [A[i][i] for i in range(n)], V
def mfun(A, f):
"""대칭 행렬 함수 f(A) = V f(Λ) V^T"""
lam, V = eigsym(A)
n = len(A)
return [[sum(V[i][k] * f(lam[k]) * V[j][k]
for k in range(n)) for j in range(n)]
for i in range(n)]
def msub(x):
return lambda v: v ** x
def airm_dist(A, B):
"""아핀 불변 계량의 거리 ‖log(A^-1/2 B A^-1/2)‖_F"""
Ai = mfun(A, msub(-0.5))
L = mfun(matmul(matmul(Ai, B), Ai), math.log)
return math.sqrt(sum(x * x for r in L for x in r))
def airm_geo(A, B, t):
"""측지선 A^1/2 (A^-1/2 B A^-1/2)^t A^1/2"""
As, Ai = mfun(A, msub(0.5)), mfun(A, msub(-0.5))
M = mfun(matmul(matmul(Ai, B), Ai), msub(t))
return matmul(matmul(As, M), As)
def mean_of(Ms):
n, m = len(Ms[0]), len(Ms)
return [[sum(x[i][j] for x in Ms) / m for j in range(n)]
for i in range(n)]
def karcher_spd(Ms, it=50):
"""SPD 카르허 평균: M ← M^1/2 Exp(평균 Log) M^1/2"""
M = mean_of(Ms)
for k in range(it):
S, Si = mfun(M, msub(0.5)), mfun(M, msub(-0.5))
T = mean_of([mfun(matmul(matmul(Si, m), Si), math.log)
for m in Ms])
M = matmul(matmul(S, mfun(T, math.exp)), S)
if max(abs(x) for r in T for x in r) < 1e-14:
break
return M, k + 1
def karcher_so3(Rs, it=50):
"""회전의 카르허 평균: R ← R Exp(평균 Log(R^T R_i))"""
R = Rs[0]
for k in range(it):
d = [log_so3(matmul(transpose(R), r)) for r in Rs]
m = [sum(x[i] for x in d) / len(d) for i in range(3)]
R = matmul(R, exp_so3(m))
if max(abs(x) for x in m) < 1e-14:
break
return R, k + 1
def markley(qs):
"""마클리 평균: sum q q^T의 최대 고유벡터(부호 불변)"""
M = [[sum(q[i] * q[j] for q in qs) for j in range(4)]
for i in range(4)]
lam, V = eigsym(M)
k = lam.index(max(lam))
return tuple(V[i][k] for i in range(4))
① 구의 지수·로그·평행 이동·홀로노미.
| 항목 | 결과 |
|---|---|
| $\mathrm{Exp}_p(\mathrm{Log}_p q)-q$ 최대 오차 | 2.2e-16 |
| 평행 이동 후 노름 변화 $\lVert Pw\rVert-\lVert w\rVert$ | +0.0e+00 |
| 평행 이동 후 접평면 위반 $\langle Pw,q\rangle$ | +4.2e-17 |
| 팔분구(직각 세 개를 가진 구면 삼각형) 둘레의 평행 이동 후 벡터의 회전각(바깥 법선 기준) | 90.0000° |
| 가우스-보네의 예측: 면적/반지름² $=4\pi/8$ rad | 90.0000° |
| $SO(3)$ 측지 거리 대 $2\arccos\lvert\langle q_1,q_2\rangle\rvert$ 최대 차이(무작위 1,000쌍) | 1.8e-15 |
② 호 길이 공식의 정확도. 점 $a=(1,0,0)$과 $b=(\cos\theta,\sin\theta,0)$ 사이의 호 길이 $\theta$를 세 공식으로 계산한 오차는 다음과 같다.
| 호 $\theta$ | acos 방식 | asin 방식(현 길이) | atan2 방식 |
|---|---|---|---|
| $10^{-8}$ | 1.0e-08 | 0.0e+00 | 0.0e+00 |
| $10^{-6}$ | 4.4e-11 | 0.0e+00 | 0.0e+00 |
| $10^{-3}$ | 7.8e-15 | 0.0e+00 | 0.0e+00 |
| $\pi-10^{-3}$ | 8.0e-15 | 1.7e-13 | 0.0e+00 |
| $\pi-10^{-6}$ | 4.4e-11 | 4.4e-11 | 0.0e+00 |
| $\pi-10^{-8}$ | 1.0e-08 | 1.0e-08 | 4.4e-16 |
acos 방식은 $\theta=10^{-8}$에서 $1.0\times10^{-8}$, asin 방식(현 길이 $2\arcsin(\lVert a-b\rVert/2)$)은 $0$ 부근에서 정확하나 $\theta=\pi-10^{-8}$에서 acos와 같은 $1.0\times10^{-8}$까지 틀린다. atan2 방식은 양쪽 끝에서 $10^{-15}$ 안이다. acos의 한계는 $\sqrt{2\varepsilon_{\mathrm{mach}}}\approx1.5\times10^{-8}$ rad이므로 거리 기반 수렴 판정의 허용오차를 $10^{-8}$ rad보다 작게 두면 판정이 의미를 잃는다. 쿼터니언에서 회전각을 $2\arccos\lvert w\rvert$로 구하는 식도 같은 한계가 있다(1.5).
③ SPD 행렬의 보간. $A=\mathrm{diag}(4,1)$과 $B=\mathrm{diag}(1,4)$ 사이를 두 방식으로 보간한 행렬의 행렬식을 비교한다. 두 행렬의 행렬식은 모두 4이다.
| 중점 | 행렬식 | 비고 |
|---|---|---|
| 유클리드 평균 $(A+B)/2$ | 6.2500 | 양 끝의 행렬식 4보다 큼(팽창) |
| 아핀 불변 측지선의 중점 | 4.0000 | $\sqrt{\det A\,\det B}=4$ |
| 로그-유클리드 평균 | 4.0000 | 이 쌍은 가환이어서 아핀 불변 중점과 같다 |
유클리드 보간의 중점 행렬식은 6.25로, 양 끝(4)과 기하 평균(4)을 넘는다. 이는 공분산을 보간할 때 불확실성의 부피가 팽창하는 효과(swelling effect)이다. 아핀 불변 측지선은 구간 전체에서 4를 유지한다. 이 쌍은 대각 행렬이어서 가환이므로 로그-유클리드 중점이 아핀 불변 중점과 같다.
④ 가역 변환에 대한 불변성. 무작위 SPD 행렬 $A$, $B$와 가역 행렬 $X$에 대해 $d(A,B)$와 $d(XAX^\top,XBX^\top)$를 비교한다.
| 거리 | $d(A,B)$ | $d(XAX^\top,XBX^\top)$ | 변화율 |
|---|---|---|---|
| 프로베니우스(유클리드) | 1.8119 | 4.1522 | 129.2% |
| 아핀 불변 계량 | 1.4480 | 1.4480 | 2.6e-15 |
| 로그-유클리드 | 1.4353 | 1.4002 | 2.4% |
아핀 불변 거리의 변환 전후 상대 변화는 $2.6\times10^{-15}$이다. 프로베니우스 거리는 129.2% 변하고 로그-유클리드 거리는 2.4% 변한다. 좌표계(단위·스케일)를 바꾸는 가역 변환에서 거리가 달라지면 같은 공분산 쌍이 좌표계에 따라 가깝거나 멀어지므로 단위가 섞인 공분산(위치·각도)에서는 아핀 불변 계량이 유리하다.
⑤ 카르허 평균. 별도의 SPD 3×3 세 개의 평균이다.
| 평균 | 행렬식 | 비고 |
|---|---|---|
| 산술(유클리드) 평균 | 4.5387 | |
| 카르허 평균(아핀 불변) | 3.7983 | 9회 반복, 행렬식의 기하 평균 3.7983과 4자리까지 일치 |
산술 평균의 행렬식은 4.5387이고 카르허 평균은 3.7983이다. 카르허 평균의 행렬식은 세 행렬식의 기하 평균과 4자리까지 일치한다(이 표본에서의 관찰이며 성질로서의 출처는 (확인 필요)).
회전 30개의 평균에서 카르허 평균과 근사 평균의 각도 차이는 다음과 같다. 현 평균과 마클리 평균의 차이는 부동소수점 수준($10^{-14}$도)이어서 같은 평균의 두 계산법이다.
| 산포 $\sigma$ (rad) | 카르허 반복 수 | 카르허–현(chordal) 차이 (°) | 카르허–쿼터니언 산술 평균 차이 (°) | 현–마클리 차이 (°) |
|---|---|---|---|---|
| 0.1 | 6 | 0.0080 | 0.0020 | 1.7e-14 |
| 0.3 | 9 | 0.2274 | 0.0554 | 1.4e-14 |
| 0.6 | 13 | 2.1413 | 0.4805 | 5.1e-14 |
| 1 | 21 | 14.7741 | 30.7232 | 1.2e-14 |
표본이 기준 자세 근방에 모인 $\sigma\le0.3$ rad에서 현 평균은 카르허 평균과 $0.23^\circ$ 안에서 같고, 부호 정렬 쿼터니언 평균은 더 작게 다르다. 차이는 $\sigma$가 작을 때 $\sigma^3$에 가깝게 커진다($\sigma=0.1\to0.3$에서 현 평균 차이가 28배, $3^3=27$). 이 관찰은 이 표본 집합(고정 시드)에서의 값이다. $\sigma\ge0.8$ rad에서는 표본 일부가 기준 자세에서 $120^\circ$ 넘게 떨어지고 쿼터니언 산술 평균의 차이가 $1.3^\circ$($\sigma=0.81$)에서 $14.1^\circ$($\sigma=0.92$)로 급증한다. 급증의 원인(부호 정렬의 기준 표본 선택 등)은 분석하지 않았다 (추정).
⑥ 라이브러리 소스 독해와 실행(조회·실행 2026-11-03). 저장소 정보는 GitHub API로 확인했다.
| 라이브러리 | 저장소 | 라이선스(GitHub) | 최신 릴리스 | 마지막 푸시 | GitHub 설명 |
|---|---|---|---|---|---|
| pymanopt | pymanopt/pymanopt | BSD-3-Clause | 2.2.1·2024-09-20 | 2026-10-30 | "Python toolbox for optimization on Riemannian manifolds with support for automatic differentiation" |
| Manopt | NicolasBoumal/manopt | NOASSERTION | 릴리스 없음 | 2026-03-03 | "Manopt, a Matlab toolbox for optimization on manifolds" |
| Geomstats | geomstats/geomstats | MIT | 2.8.0·2024-09-09 | 2026-10-31 | "Computations and statistics on manifolds with geometric structures." |
| Manifolds.jl | JuliaManifolds/Manifolds.jl | MIT | v0.11.37·2026-10-31 | 2026-10-31 | "Manifolds.jl provides a library of manifolds aiming for an easy-to-use and fast implementation." |
푸시 날짜는 유지의 대리 지표일 뿐이다(0.18). Manifolds.jl은 저장소 정보만 확인했고 소스를 읽지 않았다.
구면 호 길이를 계산하는 식을 소스에서 읽었다.
| 읽은 파일 | 호 길이 계산 | 비고 |
|---|---|---|
pymanopt sphere.py(2.2.1·master) | arccos(clip(⟨a,b⟩, -1, 1)) | log는 접성분에 (거리+ε)/(‖접성분‖+ε)를 곱해 크기를 맞춘다 |
Geomstats hypersphere.py(main) | arccos(clip(cos)) | log의 각도도 arccos에서 얻고 영점 근방은 테일러 전개 계수를 사용한다. 내적이 −1에 가까우면(isclose) ValueError를 낸다 |
Manopt spherefactory.m(master) | $2\arcsin(\tfrac12\lVert x-y\rVert)$ | 소스 주석은 가까운 두 점에서 acos보다 훨씬 정확하다고 적고, 대척점 근방은 더 개선할 수 있으나 단순한 코드를 택했다고 적는다 |
pymanopt의 구 거리를 직접 호출한 오차는 $\theta=10^{-8}$, $10^{-6}$, $10^{-3}$, $\pi-10^{-3}$, $\pi-10^{-6}$, $\pi-10^{-8}$에서 $1.0\times10^{-8}$, $4.4\times10^{-11}$, $7.8\times10^{-15}$, $8.0\times10^{-15}$, $4.4\times10^{-11}$, $1.0\times10^{-8}$로, ②표의 acos 열과 같다(2.2.1과 master 모두). 이 장은 Geomstats를 실행하지 않았으며 Geomstats의 소스는 같은 형태의 arccos를 사용하는 것으로 읽힌다.
pymanopt의 SPD 거리를 고유값 식 $\sqrt{\sum\log^2\lambda_i(A^{-1}B)}$와 비교했다. 입력은 $A=\begin{bmatrix}2&1\\1&1\end{bmatrix}$, $B=\mathrm{diag}(1,3)$과 무작위 SPD 3×3 쌍 3개(NumPy default_rng(0))이다. 스크립트는 robotics/fig-src/1.9-libcheck.py, 출력은 robotics/fig-src/data/1.9-libcheck-output.txt에 있다.
| 입력 | 고유값 식 | pymanopt 2.2.1 dist | pymanopt master dist | master의 차이 |
|---|---|---|---|---|
| 2×2 비가환 쌍 | 2.033499 | 2.033499 | 2.213304 | +8.8% |
| 3×3 무작위 #0 | 3.019050 | 3.019050 | 3.072376 | +1.8% |
| 3×3 무작위 #1 | 2.328696 | 2.328696 | 2.445764 | +5.0% |
| 3×3 무작위 #2 | 2.992730 | 2.992730 | 3.216067 | +7.5% |
PyPI 2.2.1은 촐레스키 분해로 대칭 행렬 $L^{-1}BL^{-\top}$의 로그를 구해 고유값 식과 일치했다. master 소스는 dist가 ‖logm(solve(A, B))‖(프로베니우스)로 읽히며 비가환 쌍에서 고유값 식과 다른 값을 낸다. 같은 입력에서 norm(A, log(A, B))도 2.213304로 dist와 같았다(2.2.1은 2.033499). 대각 행렬 쌍은 가환이어서 두 식이 일치하므로 대각 입력만으로 만든 시험은 이 차이를 검출하지 못한다. master는 backend 인자와 빌드 때 생성되는 _version.py(이 장은 스텁을 추가)가 필요해 일반 설치와 같은 경로가 아니다. 이 불일치가 의도된 변경인지는 확인하지 못했고 저장소 관리자에게 알리지 않았다 (확인 필요).
한계. 수치는 모두 합성 입력(시드 고정)이며 실제 센서 자료가 아니다. 회전 평균의 표본은 한 집합(30개)이고 $\sigma\ge0.6$ rad에서는 표본 일부가 기준 자세에서 $90^\circ$ 넘게 떨어져 카르허 평균의 유일성이 보장되는 범위를 벗어날 수 있다(반복은 수렴했다). SO(3)의 현 평균·카르허 평균의 일치와 SPD의 행렬식 일치는 정리 대신 수치 관찰이다. 순수 파이썬의 야코비 고유분해는 $n\le4$의 작은 행렬 용도이다. 라이브러리 실행은 NumPy 2.5.4·SciPy 1.18.1 한 환경이다.
견해: 이 책은 공분산·질량행렬 같은 SPD 행렬의 보간·평균·거리에는 아핀 불변 계량을, 자세 평균에는 현 평균(또는 같은 값을 내는 마클리 평균)으로 초기값을 구한 뒤 표본이 넓게 퍼질 때 카르허 반복으로 갱신하는 순서를 기본으로 둔다고 본다. 근거는 위 예제에서 아핀 불변 거리가 가역 변환 후 변하지 않고 행렬식이 팽창하지 않으며, 현 평균이 $\sigma\le0.3$ rad에서 카르허 평균과 $0.23^\circ$ 안이고 닫힌 형식이라는 점이다. 이 근거는 합성 표본이며 응용별 허용오차에 따라 달라진다.
1.9.6 설계 트레이드오프 — 평균과 거리를 어떻게 정의하나
공개 문헌에서 확인되는 선택지는 세 가지다.
- ① 외재(extrinsic) 계산 후 사영. 산술 평균을 구하고 다양체로 사영한다(회전의 현 평균·마클리 평균). 닫힌 형식이고 빠르다.
- ② 내재(intrinsic) 계산. 측지 거리의 제곱합을 최소화한다(카르허 평균, AIRM). 계량에 충실하나 반복이 필요하고 데이터가 퍼지면 유일성이 보장되지 않는다.
- ③ 로그 좌표 계산. 로그 사상으로 선형 공간에 옮겨 계산한다(SPD의 로그-유클리드). 닫힌 형식이고 아핀 불변은 아니다.
| 방식 | 장점 | 한계 | 알맞은 경우 |
|---|---|---|---|
| ① 외재 후 사영 | 닫힌 형식, 빠름 | 측지 거리 최소화 아님(위 표의 차이) | 초기값, 좁게 모인 표본, 실시간 |
| ② 내재(카르허·AIRM) | 계량 불변성(AIRM), 거리와 일관 | 반복, 퍼진 표본에서 유일성 | 정확도 요구, 공분산 연산 |
| ③ 로그 좌표 | 계산이 간단, 행렬식 팽창 없음 | 아핀 불변 아님(2.4% 변화) | 많은 행렬의 빠른 평균 |
견해: 한 시스템 안에서 어떤 계량으로 평균·거리를 정의했는지 한 곳에 적어 두는 것이 방식 선택보다 중요하다고 본다. 근거는 이 장이 확인한 불일치(구 거리의
acos한계, SPD 거리의 비가환 쌍 불일치)가 모두 식 하나의 선택에서 비롯되어 출력만으로는 검출되지 않았다는 점이다.
1.9.7 응용 축 비교
| 응용 축 | 리만 기하가 맡는 일 | 요구 | 관련 장 |
|---|---|---|---|
| 산업·제조 | 관성·질량행렬(SPD)의 보간·식별, 보정 파라미터의 다양체 위 갱신 | 수치 안정, 물리적 타당성(양정부호 유지) | 3.1, 3.4 |
| 물류·이동 | 자세 그래프 초기화(회전 평균), 루프 클로징 | 규모, 강건성 | 9.39, 9.8 |
| 도로 주행 | 센서 공분산의 보간·융합, 필터의 오차 | 일관성 | 9.14 |
| 서비스 | 자세 추정의 경량 평균 | 연산량 | 9.7 |
| 의료·헬스케어 | 텐서·영상 정합과 내비게이션 | 정밀도, 검증 | 32.7 |
| 휴머노이드·범용 | 전신 질량행렬·접촉 모델의 다양체 위 최적화 | 수치 안정 | 3.4, 9.9 |
| 필드 | 다중 센서 자세 융합 | 장시간 표류 평가 | 9.7 |
| 국방·안보 | 항법 오차 공분산의 전파·융합 | 결정성, 검증 | 9.14 |
이 표는 이 책의 정리이며 장별 요구는 다르다. 리만 계량을 가진 작업공간 위의 반응형 정책은 11.14이 다룬다.
1.9.8 관련 규격·프로토콜
| 문서 | 발행 | 무엇을 정하나 | 상세 장 |
|---|---|---|---|
| 「Riemannian center of mass and mollifier smoothing」 | Karcher, CPAM 30(5), 1977 | 리만 질량 중심(카르허 평균)의 정의와 조건 | — |
| 「A Riemannian Framework for Tensor Computing」 | Pennec·Fillard·Ayache, IJCV 66(1), 2006 | SPD 텐서의 아핀 불변 계량·지수·로그·평균 | — |
| 「Log-Euclidean metrics …」 | Arsigny 외, MRM 56(2), 2006 | 로그-유클리드 계량 | — |
| 「Rotation Averaging」 | Hartley 외, IJCV 103(3), 2013 | 회전 평균(현·측지·쿼터니언)의 정리 | — |
| 「Averaging Quaternions」 | Markley 외, JGCD 30(4), 2007 | 쿼터니언 평균(최대 고유벡터) | 1.5 |
| 수학 표기·기호표 | 이 책 | 지수·로그·평행 이동 표기 | A.2 |
리만 기하에는 이 책의 장이 따르는 국제 표준이 없다. 계량과 평균의 정의는 문헌이 정하므로 문헌의 정의를 적는 것이 상호운용의 기준이다.
1.9.9 관련 규제·인증 요구와의 연결
직접 적용되는 규제는 없다. 자세·공분산의 수치 오차(구 거리의 정밀도, 계량 불일치)는 안전 기능의 입력 신뢰도로 이어지며 안전 관련 소프트웨어의 검증 항목이 될 수 있다. 산업 로봇의 안전 표준은 27.10, 소프트웨어 안전과 품질 표준은 26.20이 다룬다.
1.9.10 한계·유의점·미해결
- 정리의 출처. 카르허 평균의 존재·유일 조건, 현 평균의 최근접 회전 성질, 가우스-보네의 귀결, AIRM의 성질의 정리 번호는 확인하지 않았다
(확인 필요). - $SE(3)$. 양측 불변 계량의 부재와 $SE(3)$ 위 평균·거리의 선택은 다루지 않았다
(확인 필요: 출처). - 유일성. $\sigma\ge0.6$ rad의 회전 표본에서는 카르허 평균의 유일성 조건을 확인하지 않았다.
- 라이브러리. Geomstats는 소스만 읽었고 실행하지 않았다. pymanopt master의 SPD 거리 불일치는 한 환경의 관찰이며 의도 여부를 확인하지 못했다. 라이브러리 버전이 바뀌면 결과가 달라질 수 있다.
- 리만 최적화. 경사 하강·신뢰 영역·벡터 이동의 구현과 수렴 분석은 다루지 않았다.
1.9.11 체크포인트·연구 질문
체크포인트:
- 다양체·접공간·리만 계량·측지선의 정의를 말하고 로봇공학의 예 세 가지를 들 수 있는가.
- 단위 구의 지수·로그 사상을 적고
acos대신atan2를 사용하는 이유를 수치로 설명할 수 있는가. - 평행 이동이 경로에 의존하는 이유와 홀로노미가 곡률과 갖는 관계를 설명할 수 있는가.
- SPD 행렬의 유클리드·아핀 불변·로그-유클리드 계량의 차이와 불변성을 설명할 수 있는가.
- 카르허 평균의 정의와 고정점 반복을 쓸 수 있고 회전 평균 방법 네 가지의 차이를 말할 수 있는가.
- 현 평균과 마클리 평균이 같은 비용함수의 두 계산법임을 설명할 수 있는가.
- 계량의 정의가 같은 두 라이브러리 함수의 출력이 비가환 입력에서만 다를 수 있음을 시험 설계에 반영할 수 있는가.
연구 질문(47.12에 수록한다):
- 로봇 응용(자세 그래프 초기화, 공분산 융합)에서 현 평균과 카르허 평균의 차이가 최종 추정 오차에 영향을 주는 표본 퍼짐은 얼마인가.
- 리만 최적화 라이브러리의 거리·로그 사상은 대척점과 영점 부근에서 어떤 수치 처리를 하며, 이 차이가 수렴 판정에 영향을 주는가.
- pymanopt master의 SPD 거리와 같은 계량 불일치를 자동 시험으로 발견하는 방법(비가환 무작위 입력, 불변성 시험)은 라이브러리마다 갖추어져 있는가.
1차 출처
- H. Karcher, 「Riemannian center of mass and mollifier smoothing」, Communications on Pure and Applied Mathematics 30(5), 509–541, 1977(doi:10.1002/cpa.3160300502).
- B. Afsari, 「Riemannian $L^p$ center of mass: Existence, uniqueness, and convexity」, Proceedings of the AMS 139(2), 655–673, 2011(doi:10.1090/s0002-9939-2010-10541-5).
- X. Pennec, P. Fillard, N. Ayache, 「A Riemannian Framework for Tensor Computing」, IJCV 66(1), 41–66, 2006(doi:10.1007/s11263-005-3222-z).
- V. Arsigny, P. Fillard, X. Pennec, N. Ayache, 「Log-Euclidean metrics for fast and simple calculus on diffusion tensors」, Magnetic Resonance in Medicine 56(2), 411–421, 2006(doi:10.1002/mrm.20965).
- M. Moakher, 「Means and Averaging in the Group of Rotations」, SIAM J. Matrix Analysis and Applications 24(1), 1–16, 2002(doi:10.1137/s0895479801383877); 「A Differential Geometric Approach to the Geometric Mean of Symmetric Positive-Definite Matrices」, 26(3), 735–747, 2005(doi:10.1137/s0895479803436937).
- R. Hartley, J. Trumpf, Y. Dai, H. Li, 「Rotation Averaging」, IJCV 103(3), 267–305, 2013(doi:10.1007/s11263-012-0601-0).
- F. L. Markley, Y. Cheng, J. L. Crassidis, Y. Oshman, 「Averaging Quaternions」, Journal of Guidance, Control, and Dynamics 30(4), 1193–1197, 2007(doi:10.2514/1.28949).
- P.-A. Absil, R. Mahony, R. Sepulchre, 『Optimization Algorithms on Matrix Manifolds』, Princeton University Press, 2008(doi:10.1515/9781400830244)
(확인 필요: 장 번호). - N. Boumal, 『An Introduction to Optimization on Smooth Manifolds』, Cambridge University Press, 2023(doi:10.1017/9781009166164)
(확인 필요: 장 번호). - R. Bhatia, 『Positive Definite Matrices』, Princeton University Press, 2007(Crossref 등록 연도 2009)
(확인 필요: 판·장 번호). - J. M. Lee, 『Introduction to Riemannian Manifolds』, Springer, 2018
(확인 필요: 판·장 번호). - N. Guigui, N. Miolane, X. Pennec, 「Introduction to Riemannian Geometry and Geometric Statistics」, Foundations and Trends in Machine Learning 16(3), 329–493, 2023(doi:10.1561/2200000098) — 서지만 확인, 본문 미확인.
- GitHub API·소스:
pymanopt/pymanopt(BSD-3-Clause; PyPI 2.2.1·2024-09-20, master8bae754·2026-10-30),NicolasBoumal/manopt,geomstats/geomstats(MIT),JuliaManifolds/Manifolds.jl(MIT), 조회 2026-11-03.
다음 장. 1.10은 스크루 이론으로, 트위스트·렌치·수반 표현을 다룬다. 이 장까지의 회전·변환·리군의 도구를 강체의 속도와 힘을 한 쌍의 6차원 벡터로 표현하는 틀로 묶고, 좌표계를 바꿀 때의 수반 변환을 정리한다.