| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- 보안
- 인공지능
- MySQL
- 리버싱 워게임
- 웹해킹
- php
- 리눅스
- 넘파이
- writeup
- 자바스크립트
- 백준
- 리버싱
- html
- webhacking.kr
- abex crackme
- 워게임
- webhacking
- 컴퓨터 구조
- 리액트
- 백준 알고리즘
- 리버싱 문제
- 머신러닝
- 회귀 수식
- sql injection
- 해킹
- 알고리즘
- 어셈블리어
- 웹
- CodeEngn
- C언어
- Today
- Total
로보틱스 연구일지
[Robotics] SO(2)/SO(3) 회전행렬, 왜 이렇게 생겼을까? — 기저 벡터 하나로 전부 유도하기 본문
들어가기에 앞서, 회전의 양은 각도 θ 하나로 표현할 수 있는데 왜 굳이 회전행렬을 쓸까?
그 이유는 θ는 "얼마나 돌렸는지"만 알려줄 뿐, 벡터를 실제로 회전시키는 연산 자체를 담고 있지 않기 때문이다.
벡터 v를 θ만큼 회전시킨 결과 v'을 구하려면, θ만으로는 매번 원래 각도를 구하고 삼각함수를 다시 풀어야 한다.
하지만 회전행렬이 있으면 \(v' = R \cdot v\), 행렬곱 한 번이면 끝이다. 더 중요한 강점은 합성(composition)이다. 회전 A를 한 다음 회전 B를 하고 싶으면 \(B \cdot A\)로 합성된다. 역변환은 \(R^T\)이다. 이 연산 규칙이 2D든 3D든, 심지어 더 높은 차원이든 동일한 문법으로 동작한다.
반면 각도(θ) 기반 표현은 차원이 올라가면 합성 연산이 깨진다. SO(2)에서는 \(\theta_1 + \theta_2\)로 두 회전의 합성이 되지만, SO(3)에서는 Euler angle 세 개끼리 단순 덧셈으로 합성할 수가 없다. Euler angle 합성 공식 자체가 매우 복잡해지고, gimbal lock이라는 특이점 문제까지 발생하기 때문이다.
하지만 행렬 표현은 차원에 무관하게 동일하게 적용이 가능하기 때문에 이런 문제가 없다.
회전행렬이란?
회전행렬(Rotation Matrix)은 3차원 공간에서 물체나 좌표계의 회전을 표현하는 데 사용되는 직교행렬이다.
회전행렬 R은 기준 좌표계에서 회전된 좌표계로의 벡터 변환 역할을 하며, 행렬의 행과 열은 이 두 좌표계의 축들이 서로 어떻게 정렬되어 있는지를 나타낸다.
1. 행과 열의 의미
- 열(column)의 의미: 회전행렬의 각 열은 "새로운 좌표계의 단위 축 벡터가 기준 좌표계에서 어떻게 보이는지"를 나타낸다. 즉, 각 기저 벡터가 회전 후 어디로 가는지를 직접 보여준다.
- 행(row)의 의미: 회전행렬의 각 행은 "기준 좌표계의 단위 축벡터가 새로운 좌표계에서 어떻게 보이는지"를 나타낸다. 즉, 출력의 각 성분이 입력 좌표의 어떤 선형결합으로 만들어지는지를 보여준다.
실무에서는 열로 읽는 것이 훨씬 직관적이다. "이 회전이 각 축을 어디로 보내는가"가 바로 보이기 때문이다.
Special Orthogonal Group — SO(2)
1. 정의
SO(2)는 2D 평면에서 원점을 중심으로 한 모든 회전의 집합으로, 자유도(DOF) = 1. 각도 θ 하나로 완전히 결정된다.
$$SO(2) = \{ R \in \mathbb{R}^{2 \times 2} \mid R^T R = I, \; \det(R) = 1 \}$$
2. 기하학적 유도
회전행렬의 각 원소를 외울 필요 없이, 하나의 원리로 전부 유도할 수 있다:
> 행렬의 각 열 = 해당 기저 벡터가 회전 후 도착하는 위치
첫째 열 — \(e_1 = [1, 0]\)을 θ만큼 반시계 회전하면, \(e_1\)은 단위원 위의 0° 위치에 있다. θ만큼 반시계로 회전하면 단위원 위에서 θ 위치로 이동한다. 삼각함수의 정의에 의해, 그 좌표는 다음과 같다: 이것이 행렬의 첫째 열이 된다.
$$e_1 \rightarrow (\cos\theta, \; \sin\theta)$$
둘째 열 — \(e_2 = [0, 1]\)을 θ만큼 반시계 회전하면, \(e_2\)는 단위원 위의 90° 위치에 있다. θ만큼 더 회전하면 (90° + θ) 위치로 이동하며, 그 좌표는 다음과 같다: 이것이 행렬의 둘째 열이 된다.
$$e_2 \rightarrow (\cos(90°+\theta), \; \sin(90°+\theta)) = (-\sin\theta, \; \cos\theta)$$
그래서 결과적으로, 두 열벡터를 나란히 세우면 SO(2) 회전행렬이 완성된다: 각 원소는 단위원 위에서 기저 벡터를 θ만큼 돌렸을 때의 좌표, 즉 삼각함수의 정의 그 자체에서 나온 것이다.
$$R(\theta) = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix}$$

3. 주요 성질
- 합성: \(R(\alpha) \cdot R(\beta) = R(\alpha + \beta)\). 두 회전의 합성은 행렬곱이다.
- 역변환: \(R(\theta)^{-1} = R(-\theta) = R(\theta)^T\). 직교행렬이므로 전치가 곧 역행렬이다.
- 교환법칙 성립: \(R(\alpha) \cdot R(\beta) = R(\beta) \cdot R(\alpha)\). SO(2)는 commutative하다 — 이는 SO(3)와의 중요한 차이다.
Special Orthogonal Group — SO(3)
1. 정의
SO(3)는 3D 공간에서 원점을 중심으로 한 모든 회전의 집합으로, 3×3 행렬의 파라미터 9개에서 \(R^T R = I\) 조건이 6개의 독립 제약을 주므로, DOF = 9 − 6 = **3**이다.
$$SO(3) = \{ R \in \mathbb{R}^{3 \times 3} \mid R^T R = I, \; \det(R) = 1 \}$$
2. SO(2)와의 핵심 차이
SO(2)는 θ 하나로 유일하게 결정되는 단일 표준형이 존재했다. 그러나 SO(3)는 DOF = 3이기 때문에, "어떤 축을 중심으로 얼마나 회전하느냐"를 지정해야 한다. 따라서 **단일 θ 하나로 쓸 수 있는 보편적인 3×3 행렬 형태가 존재하지 않으며**, 대신 세 가지 기본 축 회전(\(R_x, R_y, R_z\))이 빌딩 블록이 된다.
또한 SO(3)는 **non-commutative(비가환)**이다. x축 90° 회전 후 z축 90° 회전 ≠ z축 90° 회전 후 x축 90° 회전이다. 이는 로봇 제어에서 회전 순서가 결과를 바꾼다는 실질적 의미를 가진다.
3. 기본 축 회전행렬 유도
SO(2)와 동일한 원리를 적용한다: 각 열 = 해당 기저 벡터가 회전 후 도착하는 위치.
- \(R_z(\theta)\) — z축 회전: xy 평면에서 회전, z축이 고정되고, x축과 y축이 xy 평면에서 회전한다. 양의 회전 방향은 x → y이다.
$$R_z(\theta) = \begin{bmatrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix}$$
- \(R_x(\theta)\) — x축 회전: yz 평면에서 회전, x축이 고정되고, y축과 z축이 yz 평면에서 회전한다. 양의 회전 방향은 y → z이다.
$$R_x(\theta) = \begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos\theta & -\sin\theta \\ 0 & \sin\theta & \cos\theta \end{bmatrix}$$
- \(R_y(\theta)\) — y축 회전: xz 평면에서 회전, y축이 고정되고, x축과 z축이 xz 평면에서 회전한다. 양의 회전 방향은 z → x이다.
$$R_y(\theta) = \begin{bmatrix} \cos\theta & 0 & \sin\theta \\ 0 & 1 & 0 \\ -\sin\theta & 0 & \cos\theta \end{bmatrix}$$
