一、刚体旋转的表示
1.1 欧拉角与旋转矩阵
设一个旋转的欧拉角为
α
,
β
,
γ
\alpha, \beta, \gamma
α,β,γ (即绕
x
,
y
,
z
x, y, z
x,y,z 轴的旋转角度分别为
α
,
β
,
γ
\alpha, \beta, \gamma
α,β,γ)
那么向量绕
x
,
y
,
z
x, y, z
x,y,z 轴的旋转矩阵可以分别表示为:
R x = ( 1 c α − s α s α c α ) R y = ( c β s β 1 − s β c β ) R z = ( c γ − s γ s γ c γ 1 ) \boldsymbol R_x= \begin{pmatrix} 1 & & \\ & c_\alpha & -s_\alpha \\ & s_\alpha & c_\alpha \end{pmatrix} \\~\\ \boldsymbol R_y= \begin{pmatrix} c_\beta & & s_\beta \\ & 1 & \\ -s_\beta & & c_\beta \end{pmatrix} \\~\\ \boldsymbol R_z= \begin{pmatrix} c_\gamma & -s_\gamma & \\ s_\gamma & c_\gamma & \\ & & 1 \end{pmatrix} Rx=⎝⎛1cαsα−sαcα⎠⎞ Ry=⎝⎛cβ−sβ1sβcβ⎠⎞ Rz=⎝⎛cγsγ−sγcγ1⎠⎞
(这里 s α , c α s_\alpha, c_\alpha sα,cα 分别表示 sin α , cos α \sin\alpha, \cos\alpha sinα,cosα)
所以一个向量 v \boldsymbol v v 经过绕 X-Y-Z 的顺序旋转过后到达 v ′ \boldsymbol v' v′ 的位置就可以表示为:
v ′ = R z R y R x v = R v \boldsymbol v' = \boldsymbol R_z\boldsymbol R_y\boldsymbol R_x\boldsymbol v = \boldsymbol R\boldsymbol v v′=RzRyRxv=Rv
1.2 轴角
表示刚体变换的除了欧拉角与旋转矩阵,还可以使用轴角
ϕ
\boldsymbol \phi
ϕ 来表示:
ϕ
=
θ
n
\boldsymbol \phi = \theta\boldsymbol n
ϕ=θn
ϕ
\boldsymbol \phi
ϕ 的方向 (即单位向量
n
\boldsymbol n
n) 表示旋转的转轴,
ϕ
\boldsymbol \phi
ϕ 的模长 (即
θ
\theta
θ) 表示旋转的角度。
二、小角度近似
结论:
在理论研究时,我们经常会假设前后两帧之间的旋转角度非常小,也就是:
α
,
β
,
γ
→
0
\alpha, \beta, \gamma \rightarrow 0
α,β,γ→0
此时旋转矩阵可以近似为:
R
=
(
1
−
γ
β
γ
1
−
α
−
β
α
1
)
\boldsymbol R = \begin{pmatrix} 1 & -\gamma & \beta \\ \gamma & 1 & -\alpha \\ -\beta & \alpha & 1 \end{pmatrix}
R=⎝⎛1γ−β−γ1αβ−α1⎠⎞
2.1 欧拉角解释
α
→
0
⟹
sin
α
→
α
cos
α
→
1
\alpha \rightarrow 0\\ \Longrightarrow\sin\alpha \rightarrow \alpha ~~~~~~ \cos\alpha \rightarrow 1
α→0⟹sinα→α cosα→1
那么:
R
x
≈
(
1
1
−
α
α
1
)
=
d
e
f
I
+
A
R
y
≈
(
1
β
1
−
β
1
)
=
d
e
f
I
+
B
R
z
≈
(
1
−
γ
γ
1
1
)
=
d
e
f
I
+
C
\boldsymbol R_x≈ \begin{pmatrix} 1 & & \\ & 1 & -\alpha \\ & \alpha & 1 \end{pmatrix}\overset{\mathrm{def}}{=} \boldsymbol I+\boldsymbol A \\~\\ \boldsymbol R_y≈ \begin{pmatrix} 1 & & \beta \\ & 1 & \\ -\beta & & 1 \end{pmatrix}\overset{\mathrm{def}}{=} \boldsymbol I+\boldsymbol B \\~\\ \boldsymbol R_z≈ \begin{pmatrix} 1 & -\gamma & \\ \gamma & 1 & \\ & & 1 \end{pmatrix}\overset{\mathrm{def}}{=} \boldsymbol I+\boldsymbol C
Rx≈⎝⎛11α−α1⎠⎞=defI+A Ry≈⎝⎛1−β1β1⎠⎞=defI+B Rz≈⎝⎛1γ−γ11⎠⎞=defI+C
所以
R
z
R
y
R
x
≈
I
+
A
+
B
+
C
=
(
1
−
γ
β
γ
1
−
α
−
β
α
1
)
\begin{aligned} \boldsymbol Rz\boldsymbol R_y\boldsymbol R_x&≈\boldsymbol I + \boldsymbol A + \boldsymbol B + \boldsymbol C \\ &= \begin{pmatrix} 1 & -\gamma & \beta \\ \gamma & 1 & -\alpha \\ -\beta & \alpha & 1 \end{pmatrix} \end{aligned}
RzRyRx≈I+A+B+C=⎝⎛1γ−β−γ1αβ−α1⎠⎞
可以发现,小角度近似时,欧拉角旋转与旋转轴的顺序无关。
2.2 轴角解释
由罗德里格斯公式:
R
=
cos
θ
I
+
(
1
−
cos
θ
)
n
n
T
+
sin
θ
n
∧
≈
I
+
θ
n
∧
=
I
+
ϕ
∧
=
(
1
−
ϕ
3
ϕ
2
ϕ
3
1
−
ϕ
1
−
ϕ
2
ϕ
1
1
)
\begin{aligned} \boldsymbol R&=\cos\theta\boldsymbol I+(1-\cos\theta)\boldsymbol n\boldsymbol n^{\mathrm T}+\sin\theta\boldsymbol n^{\land} \\ &≈\boldsymbol I + \theta\boldsymbol n^{\land} = \boldsymbol I +\boldsymbol \phi^{\land} \\ &= \begin{pmatrix} 1 & -\phi_3 & \phi_2 \\ \phi_3 & 1 & -\phi_1 \\ -\phi_2 & \phi_1 & 1 \end{pmatrix} \end{aligned}
R=cosθI+(1−cosθ)nnT+sinθn∧≈I+θn∧=I+ϕ∧=⎝⎛1ϕ3−ϕ2−ϕ31ϕ1ϕ2−ϕ11⎠⎞
可以看出 在小角度近似的前提下, 欧拉角和轴角基本是同一个东西。
三、注意
顺便提一句,
对于旋转矩阵需要注意的是,要清楚这个旋转矩阵是对向量旋转,还是对坐标系进行旋转。
以二维为例,
如果一个旋转将向量从坐标
v
1
\boldsymbol v_1
v1 移动到了坐标
v
2
\boldsymbol v_2
v2
对向量的旋转矩阵可以写为:
R
=
(
c
α
−
s
α
s
α
c
α
)
\boldsymbol R= \begin{pmatrix} c_\alpha & -s_\alpha \\ s_\alpha & c_\alpha \end{pmatrix}
R=(cαsα−sαcα)
但此时如果我们是对坐标系转换,那么他的旋转矩阵是:
R
−
1
=
R
T
=
(
c
α
s
α
−
s
α
c
α
)
\boldsymbol R^{-1}=\boldsymbol R^{\mathrm T}= \begin{pmatrix} c_\alpha & s_\alpha \\ -s_\alpha & c_\alpha \end{pmatrix}
R−1=RT=(cα−sαsαcα)
在计算过程中要注意自己是用哪种转换,负号不要弄错位置了。