坐标系中,一个刚体的状态可用位置和姿态来描述,位置即为该刚体在坐标系中的空间位置,用一个坐标向量即可表达。而要描述刚体的姿态,有很多种表示方法,以下列出常用的:
1 旋转矩阵(Rotation matrix)
旋转矩阵是在乘以一个向量的时候有改变向量的方向但不改变大小的效果的矩阵,旋转矩阵可以直接运算,它是用9个量来表达一个旋转,但实际上一次旋转只有3个自由度。因此旋转矩阵表达式是冗余的。同时,对于旋转矩阵自身也有约束,它必须是正交矩阵,且行列式为1,这些约束会使求解变得困难。
旋转矩阵比较好理解,这里不多说,可见:坐标变换及旋转矩阵
2 欧拉角(Euler angles)
2.1 欧拉角
欧拉角是描述刚体姿态的一组3个角值的参量,同时需要指定三个角度转动时分别围绕的坐标轴,以及旋转的顺序,一旦确定了这些,那么这个欧拉角的描述就可以分解为三个基本的旋转,三个基本旋转的旋转矩阵为:
绕X轴旋转θ的旋转矩阵:
R
X
(
θ
)
=
[
1
0
0
0
c
o
s
θ
−
s
i
n
θ
0
s
i
n
θ
c
o
s
θ
]
R_X(θ)=\left[\begin{matrix} 1&0&0\\ 0&cosθ&-sinθ\\ 0&sinθ&cosθ\\ \end{matrix}\right]
RX(θ)=⎣⎡1000cosθsinθ0−sinθcosθ⎦⎤
绕Y轴旋转θ的旋转矩阵:
R
Y
(
θ
)
=
[
c
o
s
θ
0
s
i
n
θ
0
1
0
−
s
i
n
θ
0
c
o
s
θ
]
R_Y(θ)=\left[\begin{matrix} cosθ&0&sinθ\\ 0&1&0\\ -sinθ&0&cosθ\\ \end{matrix}\right]
RY(θ)=⎣⎡cosθ0−sinθ010sinθ0cosθ⎦⎤
绕Z轴旋转θ的旋转矩阵:
R
Z
(
θ
)
=
[
c
o
s
θ
−
s
i
n
θ
0
s
i
n
θ
c
o
s
θ
0
0
0
1
]
R_Z(θ)=\left[\begin{matrix} cosθ&-sinθ&0\\ sinθ&cosθ&0\\ 0&0&1\\ \end{matrix}\right]
RZ(θ)=⎣⎡cosθsinθ0−sinθcosθ0001⎦⎤
欧拉角的个人理解
2.1 欧拉角与旋转矩阵
任何关于刚体旋转的旋转矩阵均可以由三个基本旋转矩阵复合而成。但要考虑到欧拉角分为内旋和外旋,内旋和外旋的三个基本旋转组合顺序是有区别的,内旋时三个基本旋转矩阵需右乘,外旋时三个基本旋转矩阵需左乘。
外旋欧拉角计算
设三个轴x,y,z的欧拉角分别为α,β,γ,外旋,那么旋转矩阵为(为了简洁,以下sin和cos分别用s和c表达)
R
(
α
,
β
,
γ
)
=
R
z
(
γ
)
R
y
(
β
)
R
x
(
α
)
=
[
c
β
c
γ
c
γ
s
α
s
β
−
c
α
s
γ
s
α
s
γ
+
c
α
c
γ
s
β
c
β
s
γ
c
α
c
γ
+
s
α
s
β
s
γ
c
α
s
β
s
γ
−
c
γ
s
γ
−
s
β
c
β
s
α
c
α
c
β
]
R(α,β,γ)=R_z(γ)R_y(β)R_x(α)=\left[\begin{matrix} cβcγ&cγsαsβ-cαsγ&sαsγ+cαcγsβ\\ cβsγ&cαcγ+sαsβsγ&cαsβsγ-cγsγ\\ -sβ&cβsα&cαcβ \end{matrix}\right]
R(α,β,γ)=Rz(γ)Ry(β)Rx(α)=⎣⎡cβcγcβsγ−sβcγsαsβ−cαsγcαcγ+sαsβsγcβsαsαsγ+cαcγsβcαsβsγ−cγsγcαcβ⎦⎤
反之,对应这个旋转,已知旋转矩阵
[
r
11
r
12
r
13
r
21
r
22
r
23
r
31
r
32
r
33
]
\left[\begin{matrix} r_{11}&r_{12}&r_{13} \\ r_{21}&r_{22}&r_{23} \\ r_{31}&r_{32}&r_{33} \end{matrix}\right]
⎣⎡r11r21r31r12r22r32r13r23r33⎦⎤,欧拉角可解得
α
=
a
r
c
t
g
(
r
32
r
33
)
β
=
a
r
c
t
g
(
−
r
31
r
32
2
+
r
33
2
)
γ
=
a
r
c
t
g
(
r
21
r
11
)
α=arctg(\frac{r_{32}}{r_{33}})\\ β=arctg(\frac{-r_{31}}{\sqrt{r_{32}^2+r_{33}^2}})\\ γ=arctg(\frac{r_{21}}{r_{11}})
α=arctg(r33r32)β=arctg(r322+r332−r31)γ=arctg(r11r21)
内旋欧拉角计算
设内旋顺序为Z-X-Y(Z轴向上,Y轴向前),旋转角分别为yaw、pitch、roll,则旋转矩阵为
R
(
y
a
w
,
p
i
t
c
h
,
r
o
l
l
)
=
R
z
(
y
a
w
)
R
x
(
p
i
t
c
h
)
R
y
(
r
o
l
l
)
R(yaw,pitch,roll)=R_z(yaw)R_x(pitch)R_y(roll)
R(yaw,pitch,roll)=Rz(yaw)Rx(pitch)Ry(roll)
反之,对应这个旋转,已知旋转矩阵
[
r
11
r
12
r
13
r
21
r
22
r
23
r
31
r
32
r
33
]
\left[\begin{matrix} r_{11}&r_{12}&r_{13} \\ r_{21}&r_{22}&r_{23} \\ r_{31}&r_{32}&r_{33} \end{matrix}\right]
⎣⎡r11r21r31r12r22r32r13r23r33⎦⎤,内旋欧拉角可解得
y
a
w
=
−
a
r
c
t
g
(
r
12
r
22
)
p
i
t
c
h
=
a
r
c
s
i
n
(
r
32
)
r
o
l
l
=
−
a
r
c
t
g
(
r
31
r
33
)
yaw=-arctg(\frac{r_{12}}{r_{22}})\\ pitch=arcsin(r_{32})\\ roll=-arctg(\frac{r_{31}}{r_{33}})
yaw=−arctg(r22r12)pitch=arcsin(r32)roll=−arctg(r33r31)
3 轴角(Axial angle)
3.1 轴角
轴角是用两个参数表示旋转: 一个轴或直线,和绕这个轴的旋转的角度。它也叫做旋转的指数坐标。
给定一个向量
K
^
=
(
k
x
,
k
y
,
k
z
)
\hat K=(k_x,k_y,k_z)
K^=(kx,ky,kz),以这个向量
K
^
\hat K
K^为旋转轴,旋转
θ
θ
θ角,这样我们用一个四维向量
(
k
x
,
k
y
,
k
z
,
θ
)
(k_x,k_y,k_z,θ)
(kx,ky,kz,θ)就可以来表示这个旋转。
3.2 旋转向量
轴角有时候也用旋转向量表示,以上说轴角是用一个四维向量来表达一个旋转,而更紧凑的表示方式是用一个单位向量来表示轴,而用该三维向量的长度来表示角度值θ。这样一来,就可以简化到用一个三维向量来表示这个旋转,这就是旋转向量。
即:将以上的轴向量
K
^
=
(
k
x
,
k
y
,
k
z
)
\hat K=(k_x,k_y,k_z)
K^=(kx,ky,kz)取为单位向量
K
^
0
=
(
k
x
0
,
k
y
0
,
k
z
0
)
\hat K_0=(k_{x0},k_{y0},k_{z0})
K^0=(kx0,ky0,kz0),得到旋转向量即为:
R
=
[
R
x
R
y
R
z
]
=
[
θ
⋅
k
x
0
θ
⋅
k
y
0
θ
⋅
k
z
0
]
\mathbf R=\left[\begin{matrix}R_x\\R_y\\R_z\end{matrix}\right]=\left[\begin{matrix}θ\cdot k_{x0}\\θ\cdot k_{y0}\\θ\cdot k_{z0}\end{matrix}\right]
R=⎣⎡RxRyRz⎦⎤=⎣⎡θ⋅kx0θ⋅ky0θ⋅kz0⎦⎤
同样,通过旋转向量也可得到轴角参数
θ
=
R
x
2
+
R
y
2
+
R
z
2
k
x
0
=
R
x
/
θ
,
k
y
0
=
R
y
/
θ
,
k
z
0
=
R
z
/
θ
θ=\sqrt{R_x^2+R_y^2+R_z^2}\\ k_{x0}=R_x/θ, k_{y0}=R_y/θ, k_{z0}=R_z/θ
θ=Rx2+Ry2+Rz2kx0=Rx/θ,ky0=Ry/θ,kz0=Rz/θ
3.3 轴角与旋转矩阵
已知轴角矢量
(
k
x
,
k
y
,
k
z
,
θ
)
(k_x,k_y,k_z,θ)
(kx,ky,kz,θ),根据Rodrigues旋转公式,可求得旋转矩阵为
R
K
^
(
θ
)
=
c
θ
I
+
(
1
−
c
θ
)
r
r
T
+
s
θ
[
0
−
k
z
k
y
k
z
0
−
k
x
−
k
y
k
x
0
]
R_{\hat K}(θ)=cθI+(1-cθ)rr^T+sθ\left[\begin{matrix} 0&-k_z&k_y\\ k_z&0&-k_x\\ -k_y&k_x&0 \end{matrix}\right]
RK^(θ)=cθI+(1−cθ)rrT+sθ⎣⎡0kz−ky−kz0kxky−kx0⎦⎤
其中
r
=
(
k
x
,
k
y
,
k
z
)
T
r=(k_x,k_y,k_z)^T
r=(kx,ky,kz)T,即:
R
K
^
(
θ
)
=
[
c
θ
+
k
x
2
(
1
−
c
θ
)
k
x
k
y
(
1
−
c
θ
)
−
k
z
s
θ
k
x
k
z
(
1
−
c
θ
)
+
k
y
s
θ
k
y
k
x
(
1
−
c
θ
)
+
k
z
s
θ
c
θ
+
k
y
2
(
1
−
c
θ
)
k
y
k
z
(
1
−
c
θ
)
−
k
x
s
θ
k
z
k
x
(
1
−
c
θ
)
−
k
y
s
θ
k
z
k
y
(
1
−
c
θ
)
+
k
x
s
θ
c
θ
+
k
z
2
(
1
−
c
θ
)
]
R_{\hat K}(θ)=\left[\begin{matrix} cθ+k_x^2(1-cθ)&k_xk_y(1-cθ)-k_zsθ&k_xk_z(1-cθ)+k_ysθ\\ k_yk_x(1-cθ)+k_zsθ&cθ+k_y^2(1-cθ)&k_yk_z(1-cθ)-k_xsθ\\ k_zk_x(1-cθ)-k_ysθ&k_zk_y(1-cθ)+k_xsθ&cθ+k_z^2(1-cθ)\\ \end{matrix}\right]
RK^(θ)=⎣⎡cθ+kx2(1−cθ)kykx(1−cθ)+kzsθkzkx(1−cθ)−kysθkxky(1−cθ)−kzsθcθ+ky2(1−cθ)kzky(1−cθ)+kxsθkxkz(1−cθ)+kysθkykz(1−cθ)−kxsθcθ+kz2(1−cθ)⎦⎤
以上转换公式在Opencv中有相关的实现函数:Rodrigues2()。
反之,已知旋转矩阵
R
=
[
r
11
r
12
r
13
r
21
r
22
r
23
r
31
r
32
r
33
]
R=\left[\begin{matrix} r_{11}&r_{12}&r_{13} \\ r_{21}&r_{22}&r_{23} \\ r_{31}&r_{32}&r_{33} \\ \end{matrix}\right]
R=⎣⎡r11r21r31r12r22r32r13r23r33⎦⎤,也可以求出轴角参数
s
θ
[
0
−
k
z
k
y
k
z
0
−
k
x
−
k
y
k
x
0
]
=
R
−
R
T
2
sθ\left[\begin{matrix} 0&-k_z&k_y\\ k_z&0&-k_x\\ -k_y&k_x&0 \end{matrix}\right]=\frac{R-R^T}{2}
sθ⎣⎡0kz−ky−kz0kxky−kx0⎦⎤=2R−RT
即
θ
=
a
r
c
c
o
s
(
r
11
+
r
22
+
r
33
−
1
2
)
K
^
=
[
k
x
k
y
k
z
]
=
1
2
s
i
n
θ
[
r
32
−
r
23
r
13
−
r
31
r
21
−
r
12
]
θ=arccos(\frac{r_{11}+r_{22}+r_{33}-1}{2})\\ \hat K=\left[\begin{matrix}k_x\\k_y\\k_z\end{matrix}\right]= \frac{1}{2sinθ}\left[\begin{matrix}r_{32}-r_{23}\\r_{13}-r_{31}\\r_{21}-r_{12}\end{matrix}\right]
θ=arccos(2r11+r22+r33−1)K^=⎣⎡kxkykz⎦⎤=2sinθ1⎣⎡r32−r23r13−r31r21−r12⎦⎤
可以看到,当
θ
θ
θ为0或
2
Π
2Π
2Π时,旋转轴不能确定,是奇异的。
4 四元数(Quaternions)
4.1 四元数
引入四元数以解决欧拉角、轴角、旋转矩阵等的不足:
- 欧拉角的万向节锁问题;
- 轴角的奇异问题;
- 旋转矩阵的9个数值不相互独立。
四元数是简单的超复数。 复数是由实数加上虚数单位
i
i
i 组成,其中
i
2
=
−
1
i^2 = -1
i2=−1。 相似地,四元数是由实数加上三个虚数单位
i
i
i、
j
j
j、
k
k
k组成,而且它们有如下的关系:
i
2
=
j
2
=
k
2
=
−
1
,
i
0
=
j
0
=
k
0
=
1
i^2 = j^2 = k^2 = -1, i^0 = j^0 = k^0 = 1
i2=j2=k2=−1,i0=j0=k0=1,每个四元数都是1、
i
i
i、
j
j
j和
k
k
k 的线性组合,即是四元数一般可表示为
a
+
b
i
+
c
j
+
d
k
a + bi+ cj + dk
a+bi+cj+dk,其中
a
a
a、
b
b
b、
c
c
c、
d
d
d是实数。
设单位四元数
q
=
(
q
0
,
q
1
,
q
2
,
q
3
)
\mathbf q=(q_0,q_1,q_2,q_3)
q=(q0,q1,q2,q3),有
q
0
2
+
q
1
2
+
q
2
2
+
q
3
2
=
1
q_0^2+q_1^2+q_2^2+q_3^2=1
q02+q12+q22+q32=1,如有单位向量
(
x
,
y
,
z
)
(x,y,z)
(x,y,z)为旋转轴,旋转角度
θ
θ
θ,则对应的四元数为:
q
=
(
c
o
s
θ
2
,
x
s
i
n
θ
2
,
y
s
i
n
θ
2
,
z
s
i
n
θ
2
)
\mathbf q=(cos\frac{θ}{2},xsin\frac{θ}{2},ysin\frac{θ}{2},zsin\frac{θ}{2})
q=(cos2θ,xsin2θ,ysin2θ,zsin2θ)
设有一个点
P
1
=
(
p
x
,
p
y
,
p
z
)
\mathbf P_1=(p_x,p_y,p_z)
P1=(px,py,pz),我们要用以上这个旋转四元数将其旋转变换到
P
1
′
=
(
p
x
′
,
p
y
′
,
p
z
′
)
\mathbf P_1'=(p_x',p_y',p_z')
P1′=(px′,py′,pz′),计算过程如下:
- 1 定义纯四元数: q p = ( 0 , p x , p y , p z ) = 0 + p x ∗ i + p y ∗ j + p z ∗ k \mathbf q_p=(0,p_x,p_y,p_z)=0+p_x*i+p_y*j+p_z*k qp=(0,px,py,pz)=0+px∗i+py∗j+pz∗k
- 2 进行四元数运算: q p ′ = q q p q − 1 \mathbf q_p'=\mathbf q\mathbf q_p\mathbf q^{-1} qp′=qqpq−1,其中 q − 1 \mathbf q^{-1} q−1为 q \mathbf q q的共轭: q − 1 = ( c o s θ 2 , − x s i n θ 2 , − y s i n θ 2 , − z s i n θ 2 ) \mathbf q^{-1}=(cos\frac{θ}{2},-xsin\frac{θ}{2},-ysin\frac{θ}{2},-zsin\frac{θ}{2}) q−1=(cos2θ,−xsin2θ,−ysin2θ,−zsin2θ)
- 3 产生的
q
p
′
\mathbf q_p'
qp′一定是纯四元数,也就是说它的第一项为0,有如下形式:
q
p
′
=
(
0
,
p
x
′
,
p
y
′
,
p
z
′
)
=
0
+
p
x
′
∗
i
+
p
y
′
∗
j
+
p
z
′
∗
k
\mathbf q_p'=(0,p_x',p_y',p_z')=0+p_x'*i+p_y'*j+p_z'*k
qp′=(0,px′,py′,pz′)=0+px′∗i+py′∗j+pz′∗k
后三项 ( p x ′ , p y ′ , p z ′ ) (p_x',p_y',p_z') (px′,py′,pz′)就是旋转变换后的坐标向量。
因此,引入四元数后,对于三维坐标的旋转,可以通过四元数乘法直接操作,与旋转矩阵操作可以等价,没有轴角计算的奇点现象,表示方式更加紧凑,计算量也可以小一些。
同理,如果你有一个四元数:
q
=
(
q
0
,
q
1
,
q
2
,
q
3
)
=
(
c
o
s
θ
2
,
x
s
i
n
θ
2
,
y
s
i
n
θ
2
,
z
s
i
n
θ
2
)
\mathbf q=(q_0,q_1,q_2,q_3)=(cos\frac{θ}{2},xsin\frac{θ}{2},ysin\frac{θ}{2},zsin\frac{θ}{2})
q=(q0,q1,q2,q3)=(cos2θ,xsin2θ,ysin2θ,zsin2θ),那么,它对应一个以向量
(
x
,
y
,
z
)
(x,y,z)
(x,y,z)为轴旋转θ角度的旋转操作。
4.2 四元数与旋转矩阵
已知四元数
q
=
(
q
0
,
q
1
,
q
2
,
q
3
)
\mathbf q=(q_0,q_1,q_2,q_3)
q=(q0,q1,q2,q3),可求得旋转矩阵
R
=
[
2
q
0
2
+
2
q
1
2
−
1
2
q
1
q
2
+
2
q
0
q
3
2
q
1
q
3
−
2
q
0
q
2
2
q
1
q
2
−
2
q
0
q
3
2
q
0
2
+
2
q
2
2
−
1
2
q
2
q
3
+
2
q
0
q
1
2
q
1
q
3
+
2
q
0
q
2
2
q
2
q
3
−
2
q
0
q
1
2
q
0
2
+
2
q
3
2
−
1
]
R=\left[\begin{matrix} 2q_0^2+2q_1^2-1&2q_1q_2+2q_0q_3&2q_1q_3-2q_0q_2\\ 2q_1q_2-2q_0q_3&2q_0^2+2q_2^2-1&2q_2q_3+2q_0q_1\\ 2q_1q_3+2q_0q_2&2q_2q_3-2q_0q_1&2q_0^2+2q_3^2-1\\ \end{matrix}\right]
R=⎣⎡2q02+2q12−12q1q2−2q0q32q1q3+2q0q22q1q2+2q0q32q02+2q22−12q2q3−2q0q12q1q3−2q0q22q2q3+2q0q12q02+2q32−1⎦⎤
反之,已知旋转矩阵
[
r
11
r
12
r
13
r
21
r
22
r
23
r
31
r
32
r
33
]
\left[\begin{matrix} r_{11}&r_{12}&r_{13} \\ r_{21}&r_{22}&r_{23} \\ r_{31}&r_{32}&r_{33} \end{matrix}\right]
⎣⎡r11r21r31r12r22r32r13r23r33⎦⎤,求四元数,分为两种情况:
情况1:
q
0
=
1
+
r
11
+
r
22
+
r
33
2
q
1
=
r
32
−
r
23
4
q
0
,
q
2
=
r
13
−
r
31
4
q
0
,
q
3
=
r
21
−
r
12
4
q
0
,
q_0=\frac{\sqrt{1+r_{11}+r_{22}+r_{33}}}{2}\\ q_1=\frac{r_{32}-r_{23}}{4q_0},q_2=\frac{r_{13}-r_{31}}{4q_0},q_3=\frac{r_{21}-r_{12}}{4q_0},
q0=21+r11+r22+r33q1=4q0r32−r23,q2=4q0r13−r31,q3=4q0r21−r12,
情况2:如果
q
0
q_0
q0趋近于0,则求解四元数过程为:
2.1 如果
m
a
x
(
r
11
,
r
22
,
r
33
)
=
r
11
max(r_{11},r_{22},r_{33})=r_{11}
max(r11,r22,r33)=r11,
t
=
1
+
r
11
−
r
22
−
r
33
q
0
=
r
32
−
r
23
t
,
q
1
=
t
/
4
,
q
2
=
r
13
+
r
31
t
,
q
3
=
r
12
+
r
21
t
t=\sqrt{1+r_{11}-r_{22}-r_{33}}\\ q_0=\frac{r_{32}-r_{23}}{t},q_1=t/4,q_2=\frac{r_{13}+r_{31}}{t},q_3=\frac{r_{12}+r_{21}}{t}
t=1+r11−r22−r33q0=tr32−r23,q1=t/4,q2=tr13+r31,q3=tr12+r21
2.2 如果
m
a
x
(
r
11
,
r
22
,
r
33
)
=
r
22
max(r_{11},r_{22},r_{33})=r_{22}
max(r11,r22,r33)=r22,
t
=
1
−
r
11
+
r
22
−
r
33
q
0
=
r
13
−
r
31
t
,
q
1
=
r
12
+
r
21
t
,
q
2
=
t
/
4
,
q
3
=
r
32
+
r
23
t
t=\sqrt{1-r_{11}+r_{22}-r_{33}}\\ q_0=\frac{r_{13}-r_{31}}{t},q_1=\frac{r_{12}+r_{21}}{t},q_2=t/4,q_3=\frac{r_{32}+r_{23}}{t}
t=1−r11+r22−r33q0=tr13−r31,q1=tr12+r21,q2=t/4,q3=tr32+r23
2.3 如果
m
a
x
(
r
11
,
r
22
,
r
33
)
=
r
33
max(r_{11},r_{22},r_{33})=r_{33}
max(r11,r22,r33)=r33,
t
=
1
−
r
11
−
r
22
+
r
33
q
0
=
r
21
−
r
12
t
,
q
1
=
r
13
+
r
31
t
,
q
2
=
r
23
−
r
32
t
,
q
3
=
t
/
4
t=\sqrt{1-r_{11}-r_{22}+r_{33}}\\ q_0=\frac{r_{21}-r_{12}}{t},q_1=\frac{r_{13}+r_{31}}{t},q_2=\frac{r_{23}-r_{32}}{t},q_3=t/4
t=1−r11−r22+r33q0=tr21−r12,q1=tr13+r31,q2=tr23−r32,q3=t/4
参考
简书:姿态描述—四元数,旋转矩阵以欧拉角
知乎:如何形象地理解四元数?
旋转矩阵、欧拉角、四元数理论及其转换关系
三维重建学习(1):基础知识:旋转矩阵与旋转向量