안녕하세요! 지난 글에서는 그룹(Group)이라는 기초 개념을 통해 수학적으로 대칭성을 다루는 방법을 살펴보았습니다. 이제 한 단계 더 나아가, 매니폴드(Manifold)라는 개념을 소개하려 합니다. 이는 앞으로 Lie Group을 이해하고, 실제 로보틱스나 컴퓨터 비전 문제를 다루는 데 필수적인 ‘연속적이고 매끄러운 공간’의 아이디어를 제공하는 중요한 도구입니다.
매니폴드(Manifold)란 무엇인가?
매니폴드는 간단히 말해 “근처(로컬)에서는 평평한 공간처럼 보이는 복잡한 곡면이나 다양체”를 의미합니다. 가령 지구를 생각해볼까요? 지구는 3차원 공간 속에 있는 커다란 구 형태입니다. 전 세계 지도를 펼쳐보면, 실제로 지구는 둥글지만 지도 한 구역만 보면 거의 평면(2차원)으로 보입니다. 이처럼 “국소적으로 유클리드 공간과 닮은” 구조를 가진 것이 매니폴드입니다.
조금 더 수학적으로 표현하자면, 매니폴드는 각 점 근처에서 유클리드 공간(예: \(\mathbb{R}^n\))과 ‘매끄럽게(미분 가능하게)’ 이어붙여 놓은 공간입니다. 여기서 ‘미분 가능하다’는 것은, 이 매니폴드 위에서 부드럽게 변하는 함수들을 정의하고, 그 함수를 미분할 수 있다는 것을 의미합니다.
왜 매니폴드를 배우는가?
Lie Group은 “그룹”이라는 대칭적 구조와 “매니폴드”라는 미분 가능한 구조가 결합한 개념입니다. 앞선 글에서 본 바와 같이 그룹은 대칭 변환의 집합을 구조적으로 파악하는 도구입니다. 여기에 매니폴드 구조를 결합하면, 단지 몇 개의 변환을 나열하는 것이 아니라, 연속적이고 부드럽게 변하는 대칭 변환들의 ‘공간’을 다룰 수 있게 됩니다.
예를 들어, 3차원에서 물체를 회전시키는 모든 가능한 회전을 생각해보면, 이들은 하나의 ‘곡면’ 같은 공간을 이룹니다(실제로 SO(3)라는 Lie Group은 3차원 구의 변형체와 밀접한 관계가 있습니다). 이 변환들의 집합이 단순히 유한한 조작(예: 90도 단위의 회전)만 가능한 것이 아니라, 0도에서 360도까지 아주 미세하게 변화할 수 있으니, 이는 매끄러운 다양체의 개념을 필요로 하게 됩니다.
로컬 파라미터화(Local Parameterization)
매니폴드를 다룰 때 중요한 개념 중 하나는 좌표 패치(coordinate chart) 또는 로컬 파라미터화(local parameterization)입니다. 매니폴드를 직접 손으로 펼칠 순 없지만, 일부 구역은 평면처럼 간단히 표현할 수 있습니다. 예를 들어, 지구 표면의 일부를 지도(좌표)로 나타내듯이, 매니폴드의 일부를 유클리드 공간의 좌표계를 써서 표현할 수 있습니다.
이렇게 하면 매니폴드 상에서 일어나는 복잡한 현상(함수의 변화, 벡터장, 곡률 등)을 유클리드 공간에서 미분 가능한 함수로 표현할 수 있게 됩니다.
로보틱스·컴퓨터 비전과의 연결점
- 로보틱스: 로봇 팔의 관절들을 특정 각도로 움직일 때, 팔 끝단의 위치와 자세를 표현하는 공간은 단순한 직선이나 평면이 아닙니다. 관절각들이 변할 때 로봇의 손끝은 복잡한 3차원 경로를 그리게 되고, 이 경로가 속한 공간은 매니폴드 개념으로 해석할 수 있습니다. 이를 통해 제어나 경로 계획에서 미분, 최적화 등의 개념을 깔끔하게 적용할 수 있습니다.
- 컴퓨터 비전: 카메라 포즈(회전+이동)은 단순히 6개의 숫자로 표현할 수 있지만, 그 변환들의 집합 자체는 복잡한 매니폴드 구조를 이룹니다. 이미지 정합이나 SLAM 문제에서 이러한 변환들을 다룰 때 매니폴드 개념을 사용하면, 로컬 선형화, 미분, 최적화를 효율적으로 수행할 수 있습니다.
파이썬 예제로 매니폴드 맛보기
여기서는 간단한 예제로 구(Sphere)를 매니폴드로 생각해봅시다. 2차원 매니폴드인 구 표면은 3차원 공간 \(\mathbb{R}^3\) 안에 들어있지만, 각 지점에서 보면 2차원 평면처럼 보입니다.
구를 파라미터화하는 대표적인 방법은 위도(latitude)와 경도(longitude)를 사용하는 것입니다. 위도(\(\phi\))와 경도(\(\theta\))를 두 개의 실수 매개변수로 하면, 구 표면 위의 점은 다음과 같이 표현할 수 있습니다.
x=cos(ϕ)cos(θ)
y=cos(ϕ)sin(θ)
z=sin(ϕ)
quad x = cos(ϕ)cos(θ)
quad y = cos(ϕ)sin(θ)
quad z = sin(ϕ)
(여기서 \(\phi\)는 -90°부터 90°, \(\theta\)는 0°부터 360° 사이를 도는 파라미터라고 생각할 수 있습니다.)
아래 파이썬 예제는 이 파라미터화를 이용해 구 표면의 일부 점들을 샘플링하고, 각 점 근처의 접평면(tangent plane)을 근사하는 벡터를 계산해보는 간단한 코드입니다. 비록 이 코드가 매니폴드의 엄밀한 정의를 모두 보여주지는 않지만, “곡면을 파라미터화하고, 그 위에서 미분(접벡터)을 구할 수 있다”는 핵심 아이디어를 전달하고자 합니다.
import numpy as np
def sphere_param(phi, theta):
# phi: 위도(-π/2 ~ π/2), theta: 경도(0 ~ 2π)
x = np.cos(phi)*np.cos(theta)
y = np.cos(phi)*np.sin(theta)
z = np.sin(phi)
return np.array([x, y, z])
# 특정 점 근처의 접벡터 계산
# 접벡터는 파라미터 phi, theta에 대한 편도함수로 구할 수 있음
def sphere_tangent_vectors(phi, theta, d=1e-5):
# phi 방향 편도함수 근사
p_up = sphere_param(phi + d, theta)
p_down = sphere_param(phi - d, theta)
tangent_phi = (p_up - p_down) / (2*d)
# theta 방향 편도함수 근사
p_left = sphere_param(phi, theta + d)
p_right = sphere_param(phi, theta - d)
tangent_theta = (p_left - p_right) / (2*d)
return tangent_phi, tangent_theta
# 예: 적도(phi=0) 근처, theta=0 근방에서 접벡터를 구해보자
phi0 = 0.0
theta0 = 0.0
point = sphere_param(phi0, theta0)
tphi, ttheta = sphere_tangent_vectors(phi0, theta0)
print("구 표면 위 특정 점:", point)
print("phi 방향 접벡터:", tphi)
print("theta 방향 접벡터:", ttheta)
위 코드는 단순한 수치 근사지만, 매니폴드의 중요한 특징인 “미분 가능한 구조”를 구현하는 아이디어를 보여줍니다. 매니폴드 상의 한 점에서 두 매개변수(phi, theta)에 대해 편미분을 구해 접공간(tangent space)을 얻고, 이로부터 매니폴드 위에서의 국소적인 구조를 살펴볼 수 있게 됩니다.
함께 보면 좋은 자료
- 매니폴드 기초 유튜브 강의(영문): Visualizing Manifolds - 3Blue1Brown
- 미분기하학 기초 자료(영문): Ted Shifrin의 Differential Geometry 강의노트
- 로보틱스 응용자료(영문): Modern Robotics - 매니폴드 개념을 로봇의 회전, 위치 표현 등에 활용
'수학' 카테고리의 다른 글
[Lie Group 입문] 4편: 군(Group)과 매니폴드(Manifold)의 만남, Lie Group의 정의 (2) | 2024.12.11 |
---|---|
[Lie Group 입문] 2편: 그룹(Group)의 개념부터 시작하기 (0) | 2024.12.11 |
[Lie Group 입문] 1편: 대체 Lie Group(리 그룹)이 뭘까? (0) | 2024.12.11 |