Rotation Representation

고영민·2022년 2월 21일
0

앞에서 우리는 회전 및 변환 행렬을 곱하여 어떤 점이나 좌표계를 transform하였다. 하지만 회전 행렬을 보면, RSO(3)\mathbf{R} \sub SO(3)이므로 직교행렬(RTR=I\mathbf{R}^T\mathbf{R}=\mathbf{I}) 및 det(R)=1det(\mathbf{R})=1이라는 제약조건이 붙는다. 이러한 제약조건은 회전 행렬에 대한 어떤 함수(error 등)을 최적화하기 어렵게 만든다. 또한 회전은 3개의 각도에 의해 정의되지만 회전행렬은 9개의 수가 사용되는 등의 중복성 문제 또한 가지고 있다. 따라서 이번 글에서는 회전 및 변환에 대한 여러가지 표현식과 최적화에 유용하게 사용할 수 있는 Lie Group 및 Lie Algebra에 대해 알아본다.

1. Euler Angle

이전 글에서 회전을 R3D(Ψ,ϕ,θ)=Rz(Ψ)Ry(ϕ)Rx(θ)\mathbf{R}^{3D}(\Psi, \phi, \theta) = \mathbf{R}_z(\Psi)\mathbf{R}_y(\phi)\mathbf{R}_x(\theta)와 같이 나타내었으며, 이는 순서대로 x축, y축, z축을 중심으로 회전변환을 수행했다는 의미이다. Euler angle은 단순하게 해당 각도를 (θ,ϕ,Ψ)(\theta, \phi, \Psi)와 같이 표현한 것이며, 각 각도를 roll-pitch-yaw라는 이름으로 부르기도 한다. 하지만 Euler angle은 짐벌락 등의 문제가 발생하기도 하여, 큰 시스템을 구축할 경우에는 잘 사용되지 않지만 각 모듈의 검증 시에 간단하게 적용해볼 수 있는 장점이 있다.

2. Rodrigues' Rotation Formula

로드리게스 식(Rodrigues' rotation formula)은 회전축이 되는 어떤 단위 벡터 nr{}^{n}\mathbf{r}과 회전 각도 θ\theta가 주어졌을 때, 점 p\mathbf{p}에 대한 회전행렬을 구하는 식이다.

먼저 점 p\mathbf{p}를 회전축 nr{}^{n}\mathbf{r}에 평행한 성분과 수직한 성분으로 나눈다.

p=(nrp)nrp=pp=p(nrp)nr\mathbf{p}_{\parallel} = ( {}^{n}\mathbf{r} \cdot \mathbf{p} ) {}^{n}\mathbf{r} \\ \mathbf{p}_{\perp} = \mathbf{p} - \mathbf{p}_{\parallel} = \mathbf{p} - ( {}^{n}\mathbf{r} \cdot \mathbf{p} ) {}^{n}\mathbf{r}

w=nr×p=nr×p\mathbf{w}={}^{n}\mathbf{r} \times \mathbf{p}={}^{n}\mathbf{r} \times \mathbf{p}_{\perp}으로 nr,p{}^{n}\mathbf{r}, \mathbf{p}_{\perp}에 수직이며, nr,p{}^{n}\mathbf{r}, \mathbf{p} 사이의 각도를 Ψ\Psi라고 하면 다음과 같다.

p=psinΨ=w|\mathbf{p}_{\perp}| = |\mathbf{p}|\sin\Psi=|\mathbf{w}|

이제 p\mathbf{p}를 회전 시킨 prot\mathbf{p}_{rot}를 구해보자. 먼저, p\mathbf{p}_{\parallel}의 경우 회전축 nr{}^{n}\mathbf{r}을 기준으로 θ\theta만큼 회전시켜도 그대로이므로, p,rot=p\mathbf{p}_{\parallel, rot}=\mathbf{p}_{\parallel}이다. p,rot\mathbf{p}_{\perp, rot}는 회전하더라도 p,rot=p|\mathbf{p}_{\perp, rot}|=|\mathbf{p}_{\perp}|와 같이 크기 변화는 없지만 방향 변화가 있는데, 이를 우리가 알고있는 값인 p,nr\mathbf{p}, {}^{n}\mathbf{r}등으로 나타내기 위하여 w,p\mathbf{w}, \mathbf{p}_{\perp}의 성분으로 다시 분해한다.

먼저, p,rot\mathbf{p}_{\perp, rot}p\mathbf{p}_{\perp}방향 성분의 크기는 p,rotcosθ|\mathbf{p}_{\perp, rot}|\cos\theta이지만, p,rot=p|\mathbf{p}_{\perp, rot}|=|\mathbf{p}_{\perp}|이므로 p,rotcosθ=pcosθ|\mathbf{p}_{\perp, rot}|\cos\theta=|\mathbf{p}_{\perp}|\cos\theta이며, 여기에 p\mathbf{p}_{\perp}방향의 단위벡터 np{}^{n}\mathbf{p}_{\perp}를 곱하여 p\mathbf{p}_{\perp}방향 성분을 구하면 pcosθnp=pcosθ|\mathbf{p}_{\perp}|\cos\theta \cdot {}^{n}\mathbf{p}_{\perp}=\mathbf{p}_{\perp}\cos\theta이다.

마찬가지로 w\mathbf{w}방향 성분을 구하면 p,rotsinθ=psinθ=wsinθ        wsinθnw=wsinθ|\mathbf{p}_{\perp, rot}|\sin\theta=|\mathbf{p}_{\perp}|\sin\theta=|\mathbf{w}|\sin\theta \;\; \rightarrow \;\; |\mathbf{w}|\sin\theta \cdot {}^{n}\mathbf{w}=\mathbf{w}\sin\theta 이다.

이 두 결과를 결합하여 p,rot\mathbf{p}_{\perp, rot}를 구하고, 최종적으로 prot\mathbf{p}_{rot}를 구하면 다음과 같다.

p,rot=pcosθ+wsinθ=(p(nrp)nr)cosθ+(nr×p)sinθ\mathbf{p}_{\perp, rot} = \mathbf{p}_{\perp}\cos\theta + \mathbf{w}\sin\theta = (\mathbf{p} - ( {}^{n}\mathbf{r} \cdot \mathbf{p} ) {}^{n}\mathbf{r})\cos\theta + ({}^{n}\mathbf{r} \times \mathbf{p})\sin\theta
prot=p,rot+p,rot=p+(p(nrp)nr)cosθ+(nr×p)sinθ=(nrp)nr+(p(nrp)nr)cosθ+(nr×p)sinθ=pcosθ+(nr×p)sinθ+nr(nrp)(1cosθ)\begin{aligned} \mathbf{p}_{rot} = \mathbf{p}_{\parallel, rot} + \mathbf{p}_{\perp, rot} & = \mathbf{p}_{\parallel} + (\mathbf{p} - ( {}^{n}\mathbf{r} \cdot \mathbf{p} ) {}^{n}\mathbf{r})\cos\theta + ({}^{n}\mathbf{r} \times \mathbf{p})\sin\theta \\ & = ( {}^{n}\mathbf{r} \cdot \mathbf{p} ) {}^{n}\mathbf{r} + (\mathbf{p} - ( {}^{n}\mathbf{r} \cdot \mathbf{p} ) {}^{n}\mathbf{r})\cos\theta + ({}^{n}\mathbf{r} \times \mathbf{p})\sin\theta \\ & = \mathbf{p}\cos\theta + ({}^{n}\mathbf{r} \times \mathbf{p})\sin\theta + {}^{n}\mathbf{r}( {}^{n}\mathbf{r} \cdot \mathbf{p} )(1-\cos\theta) \end{aligned}

어떤 벡터들 a,b,c\mathbf{a}, \mathbf{b}, \mathbf{c} 에 대해서 a×(b×c)=(ac)b+(ab)c\mathbf{a} \times (\mathbf{b} \times \mathbf{c})=(\mathbf{a} \cdot \mathbf{c})\mathbf{b} + (\mathbf{a} \cdot \mathbf{b})\mathbf{c}가 성립하는데(벡터의 삼중곱, (a×b)×c=c×(a×b)(\mathbf{a} \times \mathbf{b}) \times \mathbf{c}=-\mathbf{c} \times (\mathbf{a} \times \mathbf{b})), 이를 위에 적용하면 nr(nrp)=nr×(nr×p)+p{}^{n}\mathbf{r}( {}^{n}\mathbf{r} \cdot \mathbf{p} )={}^{n}\mathbf{r} \times ({}^{n}\mathbf{r} \times \mathbf{p})+\mathbf{p}이다. 이를 prot\mathbf{p}_{rot}의 식에 적용하여 외적을 skew-symmetric 행렬을 통해 나타내면 다음과 같다.

prot=pcosθ+nr^psinθ+(nr^2p+p)(1cosθ)=p+nr^psinθ+nr^2p(1cosθ)      (=p+(nr×p)sinθ+(nr×(nr×p))(1cosθ))=[I+nr^sinθ+nr^2(1cosθ)]p=Rp\begin{aligned} \mathbf{p}_{rot} & = \mathbf{p}\cos\theta + \hat{{}^{n}\mathbf{r}}\mathbf{p}\sin\theta + (\hat{{}^{n}\mathbf{r}}^2 \mathbf{p}+\mathbf{p})(1-\cos\theta) \\ & = \mathbf{p} + \hat{{}^{n}\mathbf{r}}\mathbf{p}\sin\theta + \hat{{}^{n}\mathbf{r}}^2 \mathbf{p}(1-\cos\theta) \;\;\;(= \mathbf{p} + ({}^{n}\mathbf{r} \times \mathbf{p})\sin\theta + ({}^{n}\mathbf{r} \times ({}^{n}\mathbf{r} \times \mathbf{p}))(1-\cos\theta))\\ & = [\mathbf{I} + \hat{{}^{n}\mathbf{r}}\sin\theta + \hat{{}^{n}\mathbf{r}}^2(1-\cos\theta)]\mathbf{p} \\ & = \mathbf{R}\mathbf{p} \end{aligned}

위의 과정을 통해 점 p\mathbf{p}가 회전 변환된 점 prot\mathbf{p}_{rot}을 구할 수 있었으며, 이는 회전 행렬을 곱한 Rp\mathbf{R}\mathbf{p}와 같다. 따라서 위의 식을 회전 행렬 R\mathbf{R}에 대해 정리하면, 회전 행렬을 구하기 위한 로드리게스 식이 완성된다.

R=I+nr^sinθ+nr^2(1cosθ)=Icosθ+nr^sinθ+(1cosθ)  nr  nrT\begin{aligned} \mathbf{R} & = \mathbf{I} + \hat{{}^{n}\mathbf{r}}\sin\theta + \hat{{}^{n}\mathbf{r}}^2(1-\cos\theta) \\ & = \mathbf{I}\cos\theta + \hat{{}^{n}\mathbf{r}}\sin\theta + (1-\cos\theta)\;{}^{n}\mathbf{r}\;{}^{n}\mathbf{r}^T \end{aligned}

마지막 단계에서는 nr=1|{}^{n}\mathbf{r}|=1임을 기억하고 행렬을 직접 성분별로 곱해보면 알 수 있다.

특별히 a2+b2+c2+d2=1a^2+b^2+c^2+d^2=1이고, a=cos(θ/2),r=(b,c,d)=sin(θ/2)nra=\cos(\theta/2), \mathbf{r}=(b,c,d)=\sin(\theta/2){}^{n}\mathbf{r}이라고 한다면, prot\mathbf{p}_{rot}를 다음과 같이 쓸 수 있고(직접 대입해보면 유도할 수 있음), 이를 Euler-Rodrigues' rotation formula라고 한다 (가정에 θ/2\theta/2가 나오지만 아래의 식은 θ\theta만큼 회전한 점을 찾는 식이라는 것에 주의).

prot=p+(nr×p)sinθ+(nr×(nr×p))(1cosθ)p+2a(r×p)+2(r×(r×p))\begin{aligned} \mathbf{p}_{rot} & = \mathbf{p} + ({}^{n}\mathbf{r} \times \mathbf{p})\sin\theta + ({}^{n}\mathbf{r} \times ({}^{n}\mathbf{r} \times \mathbf{p}))(1-\cos\theta) \\ & \rightarrow \mathbf{p} + 2a(\mathbf{r} \times \mathbf{p})+2(\mathbf{r} \times (\mathbf{r} \times \mathbf{p})) \end{aligned}

추가적으로 회전행렬을 R\mathbf{R}라고 할 때, 회전축이 단위벡터 r\mathbf{r}이라면 Rr=r\mathbf{R}\mathbf{r}=\mathbf{r}를 만족하며(물체가 회전해도 회전축에는 변화가 없음), r\mathbf{r}R\mathbf{R}의 고유값 1에 대응하는 고유벡터임을 알 수 있다. 그리고 trace를 이용하면 다음과 같이 회전행렬에서 회전 각도를 구할 수 있다.

tr(R)=tr(cosθI+(1cosθ)rrT+sinθr)=cosθ  tr(I)+(1cosθ)tr(rrT)+sinθ  tr(r)=cosθ3+(1cosθ)1+sinθ0=2cosθ+1\begin{aligned} tr(\mathbf{R}) & = tr(\cos\mathbf{\theta} \mathbf{I} + (1-\cos\mathbf{\theta})\mathbf{r}\mathbf{r}^T + \sin\mathbf{\theta}\mathbf{r}^{\wedge}) \\ & = \cos\mathbf{\theta} \;tr(\mathbf{I}) + (1-\cos\mathbf{\theta})tr(\mathbf{r}\mathbf{r}^T) + \sin\mathbf{\theta}\;tr(\mathbf{r}^{\wedge}) \\ & = \cos\mathbf{\theta} \cdot 3 + (1-\cos\mathbf{\theta}) \cdot 1 + \sin\mathbf{\theta} \cdot 0 \\ & = 2\cos\mathbf{\theta} +1 \end{aligned}
θ=cos1(tr(R)12)+2πm\mathbf{\theta} = \cos^{-1}{\left( \frac{tr(\mathbf{R})-1}{2} \right)} + 2 \pi m

3. Quaternion

쿼터니온(Quaternion)은 회전의 또 다른 표현 방법이며, 다음과 같이 확장된 복소수 표현을 사용한다.

q=q0+q1i+q2j+q3k\mathbf{q}=q_0+q_1i+q_2j+q_3k

여기서 i2=j2=k2=ijk=1i^2=j^2=k^2=ijk=1이며, i,j,ki,j,k사이의 곱에서 교환법칙은 성립하지 않는다. 따라서 추가적으로 k=ij=jik=ij=-ji등의 성질을 유추할 수 있다. 보통 쿼터니온을 표현할 경우 위의 식처럼 복소수 부분까지 모두 표현하지는 않고, q=(s,v),  s=q0,  v=(q1,q2,q3)3q=(s, \mathbf{v}), \; s=q_0\in \Re, \; v=(q_1,q_2,q_3) \in \Re^3와 같이 실수부와 허수부를 나열한 형태로 표현한다.

이제 쿼터니온 기본 연산의 특성을 알아보자. 여기서는 두 쿼터니온 qa=(sa,va)=sa+xai+yaj+zak\mathbf{q}_a=(s_a, \mathbf{v}_a)=s_a+x_ai+y_aj+z_ak, qb=(sb,vb)=sb+xbi+ybj+zbk\mathbf{q}_b=(s_b, \mathbf{v}_b)=s_b+x_bi+y_bj+z_bk가 주어졌다고 가정한다.

  • 합 또는 차: qa±qb=(sa±sb,va±vb)\mathbf{q}_a \pm \mathbf{q}_b = (s_a \pm s_b, \mathbf{v}_a \pm \mathbf{v}_b)
  • 곱: qaqb=(sasbvaTvb,savb+sbva+va×vb)\mathbf{q}_a \mathbf{q}_b = (s_a s_b - \mathbf{v}_a^T\mathbf{v}_b, s_a\mathbf{v}_b + s_b\mathbf{v}_a+\mathbf{v}_a \times \mathbf{v}_b), 각 성분 별로 모두 전개해보면 해당 식이 성립함을 알 수 있으며, 마지막 term의 외적에서 곱에 대한 교환법칙이 성립하지 않음을 볼 수 있다.
  • 켤래: q=(s,v)\mathbf{q}^*=(s, -\mathbf{v}), qq=qq=(s2+vTv,0)\mathbf{q}^*\mathbf{q}=\mathbf{q}\mathbf{q}^*=(s^2+\mathbf{v}^T\mathbf{v}, 0)
  • 크기(norm): q=s2+x2+y2+z2|\mathbf{q}|=\sqrt{s^2+x^2+y^2+z^2}, qaqb=qaqb|\mathbf{q}_a\mathbf{q}_b|=|\mathbf{q}_a||\mathbf{q}_b|
  • 역(inverse): q1=q/q2,(qaqb)1=qb1qa1\mathbf{q}^{-1}=\mathbf{q}^*/|\mathbf{q}|^2, (\mathbf{q}_a\mathbf{q}_b)^{-1}=\mathbf{q}_b^{-1}\mathbf{q}_a^{-1}
  • 스칼라곱: kq=(ks,kv)k\mathbf{q}=(ks, k\mathbf{v})
  • 내적: qaqb=sasb+xaxbi+yaybj+zazbk\mathbf{q}_a \cdot \mathbf{q}_b=s_as_b+x_ax_bi+y_ay_bj+z_az_bk

일반적으로 쿼터니온에서 3차원 점을 나타내기 위하여 허수부에 해당하는 3개의 원소를 사용한다. 즉 p=(x,y,z)\mathbf{p}=(x,y,z)라는 점은 쿼터니온에서 pq=(0,p)=xi+yj+zk\mathbf{p_q}=(0, \mathbf{p})=xi+yj+zk로 나타난다(이러면 실수부가 필요없는게 아닌가 하는 의문이 들 수 있지만 회전 변환 등에 사용됨).

이제 쿼터니온을 사용하여 회전 변환을 수행해보자. 우선 복소수에서의 회전은 다음과 같은 오일러 공식을 통해 표현할 수 있다.

eiθ=cosθ+sinθie^{i\theta}=\cos\theta+\sin\theta i

이때, 실수부가 0이고, 허수부(v\mathbf{v})의 크기가 1인 쿼터니온을 단위 쿼터니온 nr{}^{n}\mathbf{r}이라고 할 때, 위의 곱셈 공식에서 nr2=1{}^{n}\mathbf{r}^2=-1이 됨을 확인할 수 있다. 따라서 단위 쿼터니온은 복소수 ii와 같은 특성을 보이고, 오일러 공식에도 적용이 가능하다.

enrθ=cosθ+sinθ  nr=cosθ+sinθv=(cosθ,sinθv)\begin{aligned} e^{{}^{n}\mathbf{r}\theta} & = \cos\theta+\sin\theta {\;}^{n}\mathbf{r}\\ & = \cos\theta+\sin\theta \mathbf{v} \\ & = (\cos\theta, \sin\theta \mathbf{v}) \end{aligned}

여기서 회전을 나타내는 오일러 공식의 결과가 (cosθ,sinθv)(\cos\theta, \sin\theta \mathbf{v})라는 쿼터니온으로 나타나는 것을 볼 수 있으며, 이를 점 pq\mathbf{p_q}에 적용하여 회전시키게 된다. 다만, 회전 변환 쿼터니온을 q\mathbf{q}라고 할 때, 축 v\mathbf{v}를 중심으로 θ\theta만큼 회전시키기 위하여 q=(cos(θ/2),sin(θ/2)v)\mathbf{q}=(\cos(\theta/2), \sin(\theta/2) \mathbf{v})로 두며, 다음과 같이 곱한다.

qpqq1=(0,p+2a(v×p)+2(v×(v×p)))\mathbf{q}\mathbf{p_q}\mathbf{q}^{-1}=(0, \mathbf{p} + 2a(\mathbf{v} \times \mathbf{p})+2(\mathbf{v} \times (\mathbf{v} \times \mathbf{p})))

여기서 a=cos(θ/2)a=\cos(\theta/2)이며, 이 식은 앞에서 보았던 Euler-Rodrigues' rotation formula와 일치한다. 즉, qpqq1\mathbf{q}\mathbf{p_q}\mathbf{q}^{-1}이 쿼터니온을 이용한 회전변환임을 의미하며, 추가적으로 q1=q\mathbf{q}^{-1}=\mathbf{q}^{*}이다. 또한 회전 쿼터니온의 형태에서 norm이 1이 되어야 함을 알 수 있다.

또한 Euler-Rodrigues' rotation formula에 쿼터니온을 대입하여 점 p\mathbf{p}에 대해 정리하면 회전 행렬 R\mathbf{R}을 구할 수 있으며, 이를 통해 쿼터니온에서 회전 행렬을 구하는 방법을 다음과 같이 알 수 있다 (q=q0+q1i+q2j+q3k\mathbf{q}=q_0+q_1i+q_2j+q_3k).

R=[12q222z22q1q22q0q32q1q3+2q0q202q1q2+2q0q312q122q322q2q32q0q102q1q32q0q22q2q3+2q0q112q122q2200001]\mathbf{R} =\begin{bmatrix} 1 -2q_2^2 - 2z^2 & 2q_1q_2-2q_0q_3 & 2q_1q_3 + 2q_0q_2 & 0 \\ 2q_1q_2 + 2q_0q_3 & 1 - 2q_1^2 -2q_3^2 & 2q_2q_3 - 2q_0q_1 & 0 \\ 2q_1q_3 - 2q_0q_2 & 2q_2q_3 + 2q_0q_1 & 1 -2q_1^2-2q_2^2 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}

반대로 회전 행렬 R\mathbf{R}에서 쿼터니온을 구하는 방법은 다음과 같다(mijm_{ij}R\mathbf{R}의 성분들).

q0=tr(R)+12,q1=m23m324q0,q2=m31m134q0,q3=m12m214q0q_0=\frac{\sqrt{tr(\mathbf{R})+1}}{2}, q_1=\frac{m_{23}-m_{32}}{4q_0}, q_2=\frac{m_{31}-m_{13}}{4q_0}, q_3=\frac{m_{12}-m_{21}}{4q_0}

0개의 댓글

관련 채용 정보