Xiang Gao, Tao Zhang 저자의 'Introduction to Visual SLAM from Theory to Practice' 책을 통해 SLAM에 대해 공부한 내용을 기록하고자 한다.
책의 내용은 주로 'SLAM의 기초 이론', 'system architecture', 'mainstream module'을 다룬다.
포스팅에는 기초 이론만 다룰 것이며, 실습을 해보고 싶다면 다음 github를 참조하자.
https://github.com/gaoxiang12/slambook2
GitHub - gaoxiang12/slambook2: edition 2 of the slambook
edition 2 of the slambook. Contribute to gaoxiang12/slambook2 development by creating an account on GitHub.
github.com
목차
우리가 다루게 될 카메라, 로봇 몸체 등은 모두 Rigid body이고, 이것은 position과 orientation을 갖는다.
이번 포스팅에서는 Rigid Body의 중요한 특성인 position과 orientation을 어떻게 수학적으로 표현할 수 있는지 알아볼 것이다.
그 전에, 기본적인 개념을 어떻게 표현할지 알아보자. 표현은 책마다 조금씩 다를 수 있다.
먼저, 벡터는 bold체로
여기서
또한 두 벡터의 Inner Product는 다음과 같이 표현한다.
여기서
두 벡터의 Outer Product는 다음과 같이 표현한다.
여기서
Rotation Matrix, Translation Vector, Transformation Matrix
로보틱스 분야에서는 각 link와 joint마다 coordinate system을 정의한다.
움직이는 로봇을 떠올려보자. 보통 움직이지 않는 inertial coordinate system(world coordinate system)을
이때 어떤 vector
따라서 수학적으로 이러한 좌표계의 transformation을 정의해주어야 하는데, 이때 transform matrix
직관적으로, 두 좌표계 간의 변화는 회전(rotation)과 병진(translation)의 합으로 나타낼 수 있다. 이를 Rigid Body Motion이라 한다.
Rigid Body Motion (좌표계 변환) 도중에는 어떤 벡터의 크기나 각이 변하지 않으므로, 이러한 rigid body의 motion은 Euclidean이라 말할 수 있다.
따라서 Euclidean Transform은 Rotation과 Translation을 포함한다. 먼저 Rotation부터 알아보자.
Rotation Matrix
크기가 1인 orthogonal base
또한, 어떤 벡터
벡터
base component 스스로의 내적 값은 1, 나머지 component와의 내적 값은 0(직교하므로)이므로, 양변에
위 식에서 matrix
또한 base vector의 크기는 1이기 때문에, 두 coordinate system의 base의 내적은 두 base vector의 사이각의 코사인 값이다. 따라서 이를 direction cosine matrix라고 부르기도 한다.
Rotation Matrix는 determinant가 1이고, orthogonal matrix라는 특성을 갖는다. (역도 성립한다.) 따라서 이후에 배울 "Group"의 개념을 사용하여 special orthogonal group으로 다음과 같이 나타낼 수 있다.
여기서
Rotation Matrix는 orthogonal이기 때문에, inverse(=transpose)로 반대 방향 회전을 정의할 수 있다.
Translation Vector
Euclidean transformation에서는 rotation이외에 translation이 존재한다고 했다. 이는 간단히 translation vector
여기서
실제로는 coordinate system 1, 2에 대해 vector
표현은 책마다 다를 수 있는데, 여기서는 coordinate 2에서 1로 rotation 또는 translation할 경우 아래첨자에 '12'로 표시하였다.
한 가지 유의할 점은, rotation matrix의 경우 여러 번의 coordinate 변화가 일어났을 때 단순히 곱하여서 회전을 정의할 수 있으나, translation vector의 경우에는 coordinate 변화가 여러 번 일어날 때 회전도 함께 고려해주어야 한다는 점이다. (자세한 증명은 다루지 않겠다.)
Transform Matrix and Homogeneous Coordinates
동차 좌표계(Homogeneous Coordinates)란, n차원 공간을 n+1개의 좌표로 나타내는 좌표계이다.
'2)'에서의 수식은 여러 번의 transformation을 표현하기에는 (곱과 합이 함께 있기 때문에) 깔끔하지 않다.
따라서 동차 좌표계를 활용하여 transformation matrix를 다음과 같이 정의해줄 수 있다.
여기서
동차좌표계를 사용하여 3D vector에 차원 하나를 추가함으로써 4D vector 및 matrix를 만들었고, 3차원 상의 rotation과 translation을 하나의 4차원 matrix를 사용하여 나타냈다.
또한, 왼쪽의
그리고 여러 번의 transform은 transform matrix들의 곱을 통해 나타낸다.
tilde(~)로 매번 동차좌표계 벡터를 표현하는 것이 번거로우므로, 앞으로 해당 기호는 생략하고 간단하게
즉, transformation matrix를 나타낼 때(
Transformation matrix
- upper left corner (3 by 3) : Rotation matrix
- right side (3 by 1) : Translation vector
- lower left corner (1 by 3) :
vector (행벡터이므로 위에서 transpose를 붙여주었다.) - lower right corner (scalar) : 1
또한, Transform matrix의 집합은 다음과 같이 special Euclidean group으로 나타낼 수 있다.
SO(3) group의 특성과 같이, transformation matrix의 inverse는 inverse transformation(역변환)을 나타낸다.
(앞서 translation vector를 역변환에서 나타낼 때에는 회전도 고려해주어야 한다고 했는데, 아래와 같은 term으로 바뀐다.)
그리고
Rotation Vectors and the Euler Angles
Rotation Vector
그럼 4 × 4 transformation matrix로 6 DoF(Degree of Freedom)의 3D rigid body motion을 완벽하게 표현할 수 있을까?
안타깝게도 그건 아니다. 행렬 표현은 다음과 같은 단점을 갖고 있다.
- Not compact
- SO(3)에서의 rotation matrix는 9개 elements(quantities)를 갖지만, 3D rotation은 3개의 DoF만 있으면 된다. 마찬가지로 transformation matrix는 6DoF 변환을 설명하기 위해 16개의 elements를 갖는다. 따라서 행렬을 활용한 표현은 redundant하다. (불필요한 요소를 추가로 갖게 된다.)
- Constraints of rotation(transformation) matrix
- 회전 변환 행렬은 determinant가 1인 orthogonal matrix여야 한다는 constraint가 있다. 이는 transformation matrix에서도 마찬가지이다. 이로 인해 estimate 또는 optimize 과정이 힘들어진다.
그러므로 좀 더 compact한 rotation 표현 방법을 찾아보자.
사실 회전은 rotation axis와 rotation angle로 나타낼 수 있다. 이에 따라 direction은 회전축과 평행하고, length는 회전 각도인 rotation vector를 고안해볼 수 있을 것이다.
이렇게 하면 3D vector로 3D 회전을 compact하게 표현할 수 있으며, rotation vector와 translation vector로 더 간단한 transformation matrix를 만들 수 있다.
회전축은
이렇게 정의한 회전은 rotation matrix
앞서 언급했듯,
양변에 trace를 취하면 회전각을 구할 수 있고, 회전축은 회전 후에도 변하지 않으므로 다음과 같이 행렬로부터 rotation vector를 구할 수도 있다.
회전축을 구하는 식을 보면, 회전축인 unit vector
Euler Angle
Rotation matrix나 rotation vector는 사람이 그 표현을 보고 직관적으로 어떤 회전인지 판단하기가 힘들다.
하지만 Euler angle은 3D 회전을 분해하여 세 개의 primal axes와 각각에 대한 회전 각도를 사용하여 회전을 직관적으로 묘사한다.
회전을 분해하는 여러 방법이 있는데, 각 축의 회전 순서에 따라 다른 회전을 나타낼 수 있으므로 구분이 필요하다. (표현도 매우 다양하다.)
가장 많이 사용되는 Euler Angle은 yaw-pitch-roll angles이다. 이는 Z축 기준 회전 각도를 yaw, 이후의 Y축 기준 회전 각도를 pitch, 이후의 X축 기준 회전 각도를 roll로 정한다.
축은 정하기 나름인데, 예를 들어 rigid body의 앞쪽 방향을 X축, 오른쪽 방향을 Y축, 위쪽 방향을 Z축으로 둘 수 있다.
이러한 방법으로 3차원 벡터
같은 회전을 나타내더라도 축의 순서에 따라 값이 달라질 수 있다.
하지만 이러한 Euler anlge도 'Gimbal Lock 현상'이라는 단점을 갖는다.

ypr의 경우, pitch가
이는 singularity problem이라 불리며, 모든 Euler angle 형태에서 발생하는 문제이다.
따라서 Euler angle로 나타내는 것은 human-computer interaction 분야에서 많이 사용되는 interpolation이나 iteration 시에는 적절하지 않다. 즉, SLAM에서 pose를 표현할 때나 filtering 혹은 optimization 시에는 Euler angle은 잘 사용되지 않는다.
하지만 앞서 말했듯이 사람이 회전을 직관적으로 파악할 때 유리하므로, 작성한 알고리즘이 맞는지 확인할 때 회전을 Euler angle 표현으로 변환한 후에 검증해보는 등의 과정에서 많이 사용한다.
Quaternions
위에서 알아본 Rotation matrix는 redundancy의 문제, Euler angle은 singularity의 문제를 갖고있다.
Quaternion은 복소수 (complex number)를 확장한 개념이다.
좀 더 자세히 알아보면, Complex number은 수직선으로 표현되는 real number를 2차원 복소 평면으로 확장한 것이고,
Quaternion은 이러한 복소 평면을 3차원으로 확장하여 표현하는 개념이다. (3D Vision에서 매우 중요한 의미를 갖는 개념이다!)
깊게 들어가면 4차원 공간의 이해가 필요한데, 여기서는 굳이 그까지는 다루지 않고, quaternion을 어떻게 회전에서 다루는지 정도까지만 살펴볼 것이다.

복소수를 간단히 복습해보자.
복소수는 complex set
쉽게 말해, 앞서 언급했듯 모든 실수는 수직선으로 표현될 수 있는데, 거기에 (y축을 더한다는 개념으로
또한, 2D plane의 회전을 표현할 때 단위 복소수의 곱을 사용한다. (예를 들어, complex
이를 3차원 공간으로 확장시킨 것이 바로 Quaternion이다.
Quaternioin은 compact하면서 singularity 문제도 없다. 단점이라면 직관적이지 않고, 연산이 복잡한 정도이다.
Quaternion을 쉽게 이해하기 위해 복소수와 비교해보자.
복소평면 상의 벡터를
이는 그유명한 Euler equation으로도 표현될 수 있다.
이것은 단위길이를 갖는 복소수이다. 따라서 2차원에서의 회전은 단위 복소수로 표현된다.
이와 비슷하게, 3차원에서의 회전은 unit quaternion으로 표현된다.
Representations of Quaternion
Quaternion
이 책에서는 real part를 앞에, imaginary part를 뒤에 써서 다음과 같이 표현한다.
두 번째 줄부터 네 번째 줄은 마치 x축, y축, z축의 단위벡터(
실제로
또한, scalar와 vector를 사용하여 quaternion을 표현할 수 있다.
또한
앞서 unit quaternion을 통해 3D rotation을 표현할 수 있다고 했는데, 이러한 표현은 복소수(2D)에서와는 조금 다르다.
복소수에서는
대신, quaternion에서
또한,
너무 깊은 내용에 머리아플 필요 없이, '3차원 공간의 회전을 Quaternion을 통해 compact하면서도 어떤 문제 없이 명확히 표현이 가능하다' 정도로 알아두자.
Quaternion Operations
더하고, 빼고, 곱하는 등의 연산은 Quaternion에 대한 완벽한 이해가 없이도 수치적으로 충분히 할 수 있다.
연산 방식은 complex number에서와 같기 때문이다.
두 quaternion '
Addition and Subtraciton
덧셈과 뺄셈은 아주 간단히, scalar(실수부)는 scalar끼리, vector(허수부)는 vector끼리 더하면 된다.
Multiplication
Quaternion의 곱은
스칼라로 나타냈을 때는 매우 복잡해 보이지만, vector form은 더 간결하게 표현할 수 있다.
이러한 결과에 따라, quaternion 곱 결과의 실수부는 여전히 실수부이고, 허수부는 여전히 허수부로 남는다는 것을 알 수 있다.
그리고 허수부의 outer product 때문에 quaternion 곱은 교환법칙이 성립하지 않는다. (
만약 두 허수부 벡터가 서로 평행하다면 outer product 값이 0이므로 교환법칙이 성립한다.
Length
Quaternion의 길이 또한 Complex number에서와 비슷하다.
이에 따라 두 quaternion의 product 결과의 길이는 각 길이의 prodcut와 같다는 사실을 쉽게 알 수 있다.
그러므로 unit quaternion은 다른 unit quaternion과 곱해져도 unit-length를 유지한다.
Conjugate
Quaternion의 conjugate(켤레)는 허수부의 부호를 반대로 하는 것과 같다. (마찬가지로 Complex Number와 동일한 개념이다.)
따라서 quaternion과 그것의 켤레를 곱하면 real quaternion을 얻고, 그 real part의 길이는 제곱이 된다.
Inverse
Quaternion의 inverse는 다음과 같이 정의된다.
이에 따라 quaternion과 그 inverse의 product는 real quaternion
또한, unit quaternion은 inverse와 conjugate가 같다. 이에 따라 두 unit quaternion의 product의 inverse는 각 inverse의 product와 같다.
Scalar Multiplication
Quaternion에 scalar(실수)를 곱할 경우, 간단히 다음과 같은 결과를 보인다.
Quaternion to Represent a Rotation
이제 3D Rotation을 quaternion으로 나타내는 방법을 알아보자.
spatial 3D point
먼저 Quaternion을 통해 회전을 나타낼 때에는 3D point를 quaternion으로 확장해주어야 한다.
간단히 imaginary part에 세 개의 coordinate를 두고 real part는 0으로 두었다.
이때 회전 결과는 다음과 같이 quaternion의 product로 나타낸다.
곱셈은 quaternion multiplication이며, 결과 또한 (pure imaginary) quaternion이다. Quaternion인
Conversion of Quaternions to Other Rotation Representations
Quaternion을 사용한 회전을 다른 표현(특히 rotation matrix와 rotation vector)으로 바꿀 수 있다.
여기서 각각의 과정을 자세히 다루지는 않고, 결과만 살펴보자.
Quaternion
quaternion에서 rotation matrix로 바꾼 결과는 다음과 같다.
이러한 rotation matrix를 rotation vector로 바꾸면 다음을 얻는다.
Affine and Projective Transformation
앞서 살펴본 변환은 Euclidean transformation이었다. 이는 3차원 공간에서 가능한 변환 중 가장 간단한 형태로, 벡터의 길이와 각도를 유지, 즉 rigid body의 외형을 변화시키지 않으며, transform matrix는 다음 형태를 가진다고 하였다.
이외에도 affine transform, projective transform 등 camera geometry와 관련된 다른 변환이 많이 존재한다. 이들 변환 또한 비슷한 similar matrix representation을 갖는데, 자세한 내용은 추후에 다루고 간단한 내용만 살펴보자.
Similarity Transformation
번역하면 '닮음 변환'으로, rigid body (object)가 균일하게 scale되는 경우를 말한다. Euclidean transformation보다 DoF가 하나 더 크며, 다음과 같은 transformation matrix를 갖는다.
Rotation matrix 앞에 scaling factor
이로 인해 similarity transformation은 volume을 유지하지 못한다.
cube에 similarity transform을 적용하면, 부피는 바뀔 수 있어도 여전히 cube이다.
이러한 3차원 similarity transform의 집합을 similarity transform group이라 하고,
Affine Transformation
Affine transformation matrix는 다음과 같다.
여기서는 rotation matrix
이에 따라 affine transformation은 orthogonal projection이라고도 하며, cube에 적용될 시 정사각형이었던 면이 평행사변형이 된다.
Perspective Transformation
Perspective transform은 가장 일반적인 변환이다. 변환 행렬은 다음과 같다.
여기서는 왼쪽 위 corner 부분이 invertable matrix
하지만
이러한 perspective transformation은 real world에서 camera photo로의 변환을 나타낸다.
예를 들어, 실제 세계에서의 정사각형은 사진에서 (원근법의 영향으로) 직사각형도, 평행사변형도 아닌 사다리꼴 모양을 띄게 될 것이다.
여러 변환을 표로 정리하면 다음과 같다.

추후에 각각에 대해 좀 더 자세히 다뤄볼 것이다.
최근댓글