[Lie Group 입문] 4편: 군(Group)과 매니폴드(Manifold)의 만남, Lie Group의 정의

안녕하세요! 지난 글들에서 그룹(Group)매니폴드(Manifold)의 개념을 살펴보았습니다. 이제 본격적으로 이 두 개념을 융합한 Lie Group(리 군)을 이해할 때가 왔습니다. Lie Group은 “연속적이고 미분 가능한 대칭 변환”을 다루는 가장 핵심적인 구조입니다. 로보틱스나 컴퓨터 비전에서 자주 등장하는 회전(Rotation), 위치 이동(Translation) 등의 연속적인 변환을 수학적으로 간결하고 강력하게 표현하는 도구라고 볼 수 있습니다.

Lie Group이란 무엇인가?

한 줄로 말하면, Lie Group은 ‘매끄러운(미분 가능한) 매니폴드이면서 동시에 군 구조를 갖는 수학적 대상’입니다.

이를 만족하기 위해서는 다음과 같은 조건이 필요합니다.

  1. 군 구조: 어떤 집합 \(G\)가 있고, 그 위에 이항연산(예: \(\cdot\))이 정의되어 결합법칙, 항등원, 역원 등 군의 조건을 충족해야 합니다.
  2. 매니폴드 구조: \(G\)는 매끄러운(\(C^\infty\), 즉 무한히 미분 가능한) 다양체여야 합니다. 즉, 국소적으로 유클리드 공간과 닮아 있으며 미분 가능해야 합니다.
  3. 호환성(Smooth Compatibility): 군 연산(\(G \times G \to G\) 형태의 곱)과 역원 맵(\(G \to G\))이 모두 매끄러운 함수여야 합니다. 단순히 매니폴드이고 군인 것만으로는 부족하고, 그 군의 연산 자체가 미분 가능하게 정의되어야 Lie Group이라 부를 수 있습니다.

이렇게 되면, Lie Group 위에서는 미적분학적 도구(접공간, 미분, 벡터장 등)를 사용할 수 있고, 동시에 군 이론의 대칭성 개념을 활용할 수 있습니다. 이는 로봇의 회전, 이동 변환, 카메라 자세 변환과 같은 연속적인 기하 변환을 수학적으로 다루는 데 매우 유용합니다.

예시: SO(2), 2차원 회전군

가장 간단한 Lie Group 중 하나는 SO(2), 즉 2차원 회전군입니다. 이는 단위 원판 위에서 원점을 중심으로 하는 모든 회전을 모아놓은 집합입니다.

  • 집합 \(SO(2)\)는 다음과 같이 표현할 수 있습니다. 각 원소는R(θ)=(cos⁡θ−sin⁡θsin⁡θcos⁡θ) R(\theta) = \begin{pmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{pmatrix}여기서 \(\theta \in [0, 2\pi)\)입니다.
  • 군 구조: 회전을 연달아 적용하면 다시 회전이 됩니다(폐쇄성), 0도 회전이 항등원, \(\theta\)에 대해 -\(\theta\) 회전이 역원이 됩니다. 결합법칙도 행렬 곱셈을 통해 확실하게 보장됩니다.
  • 매니폴드 구조: \(\theta\)를 축으로 한 원 \(S^1\)과 유사한 1차원 매니폴드 형태를 가집니다. 연속적으로 \(\theta\)가 변하면서 매끄러운 변환을 이룹니다.
  • 연산의 매끄러움: 두 회전 \(R(\theta_1), R(\theta_2)\)를 곱하는 것은 단순히 각도들의 덧셈으로 이어지며, 이 연산은 매끄럽게 정의됩니다.

이렇게 SO(2)는 Lie Group의 교과서적인 예가 됩니다.

로보틱스·컴퓨터 비전과의 연결점

  • 로보틱스: 로봇 관절의 회전을 표현할 때 SO(2)나 SO(3)라는 Lie Group이 핵심입니다. SO(3)는 3차원 회전을 표현하는 Lie Group으로, 로봇 팔의 관절 움직임, 드론의 자세 제어, 로봇 방향 전환 등을 정교하게 처리하는 수학적 틀을 제공합니다. 나아가 평행이동까지 포함한 SE(3)는 위치·자세를 한꺼번에 다룰 수 있는 필수 개념입니다.
  • 컴퓨터 비전: 카메라의 위치와 방향(포즈)은 이미지 해석, SLAM, 3D 재구성 문제에서 매우 중요합니다. 이 포즈 변환 역시 SE(3)라는 Lie Group으로 모델링할 수 있어, 복잡한 최적화 문제, 이미지 매칭, 3D 물체 추정 등을 매끄럽고 체계적으로 다룰 수 있게 합니다.

파이썬 예제로 보는 SO(2) Lie Group의 성질

아래는 SO(2)의 원소를 파이썬으로 다루는 간단한 예제입니다. 이 예제에서는 각도를 매개변수로 SO(2)의 원소(회전 행렬)를 만들고, 두 회전을 합성(행렬 곱)하는 연산이 실제로 군의 성질을 만족하는지, 그리고 이를 통해 연속적이고 부드러운 변환을 다룰 수 있음을 확인해봅니다.

import numpy as np

def SO2(theta):
    """각도 theta(라디안)에 대한 2D 회전 행렬 반환"""
    return np.array([[np.cos(theta), -np.sin(theta)],
                     [np.sin(theta),  np.cos(theta)]])

def compose(R1, R2):
    """SO(2)에서 두 회전 행렬을 합성하는 함수"""
    return R1 @ R2  # 행렬 곱

# 몇 개의 각도를 정해 SO(2) 원소 생성
angles = [0, np.pi/4, np.pi/2, np.pi]
rotations = [SO2(a) for a in angles]

# 군 성질 확인
# 1. 항등원 존재: theta=0 회전 행렬이 항등원인지 확인
I = SO2(0)
identity_check = all(np.allclose(compose(I, R), R) and np.allclose(compose(R, I), R) for R in rotations)

# 2. 역원 존재: theta에 대해 -theta 회전이 역원인가?
inverse_check = True
for a in angles:
    R = SO2(a)
    R_inv = SO2(-a)  # 역원 예상
    if not (np.allclose(compose(R, R_inv), I) and np.allclose(compose(R_inv, R), I)):
        inverse_check = False
        break

# 3. 결합법칙: (R(a)R(b))R(c) = R(a)(R(b)R(c))인지 확인
a, b, c = np.pi/4, np.pi/6, np.pi/3
LHS = compose(compose(SO2(a), SO2(b)), SO2(c))
RHS = compose(SO2(a), compose(SO2(b), SO2(c)))
associativity_check = np.allclose(LHS, RHS)

print("항등원 존재:", identity_check)
print("역원 존재:", inverse_check)
print("결합법칙:", associativity_check)

# 이 코드를 실행하면 모두 True를 얻을 수 있습니다.
# 또한 SO(2)는 theta라는 연속변수로 파라미터화되므로 매끄러운(미분 가능한) 구조를 가집니다.

위 예제에서는 SO(2)의 간단한 성질을 확인해볼 수 있습니다. 더 나아가면, 이 SO(2)를 미분하여 작은 각 변화를 접공간으로 해석하는 등, 미적분 도구를 적용할 수 있습니다.

함께 보면 좋은 자료

  • SO(3), SE(3)와 로보틱스: Modern Robotics (Kevin Lynch & Frank Park) - 특히 초반부에서 회전군과 유클리드 변환군에 대한 설명이 나옵니다.
  • 추가 참고서적: “Lie Groups, Lie Algebras, and Representations” (Brian Hall), “Foundations of Robotics” (Tsakiris, Choset 등)에서 더욱 심도 있는 내용을 다루고 있습니다.
반응형