不管是卡尔曼滤波或者BA优化形式的SLAM或者VIO系统中,都需要用到单位四元数(Quaternion)来表示旋转,主要是单位四元数表示旋转相对于其他旋转表示方式如旋转矩阵、欧拉角或者旋转向量等具有优势,它既是紧凑(自由度3)同时还没有奇异性。本系列主要是介绍在SLAM&VIO系统中涉及到的公式(ESKF,IMU预积分等)所涉及的四元数的一些基础性质的推导和整理,关于四元数的更基础的定义建议参考引用【1】到【4】。该系列主要包括:
注:除了[SLAM四元数基础系列一] 四元数定义 Hamilton vs JPL中,后面的介绍中都采用Hamilton形式表示四元数。
简介
根据四元数实部虚部顺序、乘法定义、旋转操作定义以及旋转方向定义等四种概念的不同组合有将近12种不同的四元数表示方式,其中最常用的是Hamilton(引用1)和JPL(引用2)方式。本文就上面的四种不同概念以及常用的两种四元数表示方式详细介绍。
首先定义四元数为:
q
=
q
w
+
q
x
i
+
q
y
j
+
q
z
k
\mathbf{q} = q_w + q_xi + q_yj+q_zk
q=qw+qxi+qyj+qzk
这里
i
,
j
,
k
i,j,k
i,j,k为三个虚单位数,其中
i
2
=
j
2
=
k
2
=
i
j
k
=
−
1
i^2 = j^2 = k^2 = ijk = −1
i2=j2=k2=ijk=−1
四种区分方式
简介中提到可以根据四元数实部虚部顺序、乘法定义、旋转操作定义以及旋转方向定义对四元数进行分类,下面详细介绍下:
-
实部虚部顺序
主要是根据实部在前或者虚部在前予以区分,如下
q
=
[
q
w
q
v
]
v
s
.
q
=
[
q
v
q
w
]
\mathbf{q} = \left[ \begin{matrix} q_w \\ \mathbf{q}_v \end{matrix} \right] \qquad vs. \qquad \mathbf{q} = \left[ \begin{matrix} \mathbf{q}_v \\ q_w \end{matrix} \right]
q=[qwqv]vs.q=[qvqw]
-
乘法定义
主要根据四元数代数的乘法公式定义予以区分,如下
i
j
=
−
j
i
=
k
,
j
k
=
−
k
j
=
i
,
k
i
=
−
i
k
=
j
v
s
.
−
i
j
=
j
i
=
k
,
−
j
k
=
k
j
=
i
,
−
k
i
=
i
k
=
j
\begin{matrix} ij = −ji = k, &jk = −kj = i, &ki = −ik = j \\ & vs. \\ -ij = ji = k, &-jk = kj = i, &-ki = ik = j \end{matrix}
ij=−ji=k,−ij=ji=k,jk=−kj=i,vs.−jk=kj=i,ki=−ik=j−ki=ik=j
上面两种乘法定义分别对应两种不同的旋转方式
r
i
g
h
t
−
h
a
n
d
e
d
v
s
.
l
e
f
t
−
h
a
n
d
e
d
right-handed \qquad vs. \qquad left-handed
right−handedvs.left−handed
这里表示给定单位旋转轴
u
\mathbf{u}
u和旋转角度
θ
\theta
θ,第一种方式对应的四元数
q
r
i
g
h
t
{
u
θ
}
\mathbf{q}_{right}\{\mathbf{u}\theta\}
qright{uθ}按照右手规则绕着旋转轴
u
\mathbf{u}
u旋转角度
θ
\theta
θ,而另一种方式对应的四元数
q
l
e
f
t
{
u
θ
}
\mathbf{q}_{left}\{\mathbf{u}\theta\}
qleft{uθ}则是按照左手规则进行旋转。
-
旋转操作定义
主要根据该旋转是旋转坐标系还是旋转向量予以区分,如下
P
a
s
s
i
v
e
v
s
.
A
c
t
i
v
e
Passive \qquad vs. \qquad Active
Passivevs.Active
被动旋转还是主动旋转,这两个是相反的操作,对于坐标系的向量来说,固定坐标系旋转向量等价于逆向的旋转坐标系,在实际中常用的是被动旋转。
-
旋转方向定义
在被动旋转中(主动旋转无坐标系定义,不存在这个问题),可以根据旋转方向从local坐标系到global坐标系或global坐标系到local坐标系予以区分,如下
x
g
l
o
b
a
l
=
q
⊗
x
l
o
c
a
l
⊗
q
∗
v
s
.
x
l
o
c
a
l
=
q
⊗
x
g
l
o
b
a
l
⊗
q
∗
\mathbf{x}_{global} = \mathbf{q} \otimes \mathbf{x}_{local} \otimes \mathbf{q}^{*} \qquad vs. \qquad \mathbf{x}_{local} = \mathbf{q} \otimes \mathbf{x}_{global} \otimes \mathbf{q}^{*}
xglobal=q⊗xlocal⊗q∗vs.xlocal=q⊗xglobal⊗q∗
其中
-
⊗
\otimes
⊗符号表示四元数乘法运算;
-
x
g
l
o
b
a
l
\mathbf{x}_{global}
xglobal和
x
l
o
c
a
l
\mathbf{x}_{local}
xlocal分别表示向量在global坐标系和local坐标系下的表示(四元数形式,实部补0);
-
q
∗
\mathbf{q}^{*}
q∗表示四元
q
\mathbf{q}
q的共轭四元数;
-
x
′
=
q
⊗
x
⊗
q
∗
\mathbf{x}^{\prime} = \mathbf{q} \otimes \mathbf{x} \otimes \mathbf{q}^{*}
x′=q⊗x⊗q∗ 表示使用四元数进行旋转;
Hamilton vs JPL
根据上面的几种区分方式按照排列组合可知有12中四元数的表示方式,其中最常用的两种是Hamilton和JPL,它们关于上诉的区分方式具体对比如下:
|
Hamilton |
JPL |
实部虚部顺序 |
(
q
w
,
q
v
)
(q_w, \mathbf{q}_v)
(qw,qv) |
(
q
v
,
q
w
)
(\mathbf{q}_v, q_w)
(qv,qw) |
乘法定义 Handedness |
i
j
=
−
j
i
=
k
ij = −ji = k
ij=−ji=k right-handed |
−
i
j
=
j
i
=
k
-ij = ji = k
−ij=ji=k left-handed |
旋转操作 |
Passive |
Passive |
旋转方向 |
x
g
l
o
b
a
l
=
q
⊗
x
l
o
c
a
l
⊗
q
∗
\mathbf{x}_{global} = \mathbf{q} \otimes \mathbf{x}_{local} \otimes \mathbf{q}^{*}
xglobal=q⊗xlocal⊗q∗ |
x
l
o
c
a
l
=
q
⊗
x
g
l
o
b
a
l
⊗
q
∗
\mathbf{x}_{local} = \mathbf{q} \otimes \mathbf{x}_{global} \otimes \mathbf{q}^{*}
xlocal=q⊗xglobal⊗q∗ |
Hamilton方式是使用的较广的,像很多的开源库,如Eigen, ROS, Google Ceres以及使用IMU的卡尔曼滤波的很多论文也都是使用的该方式。
引用
【1】Quaternion kinematics for the error-state Kalman filter
【2】Indirect Kalman Filter for 3D Attitude Estimation-A Tutorial for Quaternion Algebra
【3】四元数与三维旋转
【4】视觉SLAM十四讲-从理论到实践(第二版)