Hello! 欢迎来到我的博客
今天的内容关于机器人中常用的传感器IMU,我们用它来实现机器人姿态、速度、位置的估计。
今天将会介绍使用低成本IMU进行机器人运动估计的一个常用方法——ESKF。
1 四元数基础
四元数,英文名称为:quaternion。正如一个单位复数可以表示在复平面上的旋转一样,单位四元数也可以用于表示三维空间中的旋转,并且由于其在更新过程中不会发生奇异现象,因此在惯性导航中被广泛使用。一般来说,四元数的表示方式有许多,其中最常用的是两种,一种是Hamilton,另一种是JPL。由于,在机器人领域中,无论是ROS,Eigen,Ceres等等项目中都用到的是Hamilton四元数,因此,这里后续文章中使用以及介绍的也是这种。
以下介绍的都是在IMU运动方程以及ESKF中必要的关于四元数的知识,因此可能会过于简略,读者可暂时先跳转至第二部分阅读,遇到不明的四元数定义时,再回来查阅。
(1)四元数定义
Q
=
a
+
b
i
+
c
j
+
d
k
∈
H
Q=a+b i+c j+d k \in \mathbb{H}
Q=a+bi+cj+dk∈H
其中,
{
a
,
b
,
c
,
d
}
∈
R
\{a, b, c, d\} \in \mathbb{R}
{a,b,c,d}∈R是系数,
{
i
,
j
,
k
}
\{i, j, k\}
{i,j,k}是虚部单位。
一个四元数可以表示为实部和虚部,如下:
Q
=
q
w
+
q
x
i
+
q
y
j
+
q
z
k
⇔
Q
=
q
w
+
q
v
Q=q_{w}+q_{x} i+q_{y} j+q_{z} k \quad \Leftrightarrow \quad Q=q_{w}+\mathbf{q}_{v}
Q=qw+qxi+qyj+qzk⇔Q=qw+qv
记作向量形式则为:
q
≜
[
q
w
q
v
]
=
[
q
w
q
x
q
y
q
z
]
\mathbf{q} \triangleq\left[\begin{array}{l} q_{w} \\ \mathbf{q}_{v} \end{array}\right]=\left[\begin{array}{l} q_{w} \\ q_{x} \\ q_{y} \\ q_{z} \end{array}\right]
q≜[qwqv]=⎣⎢⎢⎡qwqxqyqz⎦⎥⎥⎤
(2)单位四元数
单位四元数可以作为一种旋转的表示方式,它可以转换为欧拉角,也可以转换为旋转矩阵。
单位四元数的定义:
q
=
[
cos
θ
u
sin
θ
]
\mathbf{q}=\left[\begin{array}{c} \cos \theta \\ \mathbf{u} \sin \theta \end{array}\right]
q=[cosθusinθ]
其中,
u
=
u
x
i
+
u
y
j
+
u
z
k
\mathbf{u}=u_{x} i+u_{y} j+u_{z} k
u=uxi+uyj+uzk是单位向量,而
θ
\theta
θ为一个标量。
由此可知,单位四元数的模长为1。
∣
∣
q
∣
∣
=
cos
2
θ
+
sin
2
θ
(
u
x
2
+
u
y
2
+
u
z
2
)
=
1
||\mathbf{q}||=\sqrt{\cos^2\theta+\sin^2\theta(u_x^2+u_y^2+u_z^2)}=1
∣∣q∣∣=cos2θ+sin2θ(ux2+uy2+uz2)=1
(3)乘法
两个四元数乘法的记号为:
⊗
\otimes
⊗,乘法的具体定义为:
p
⊗
q
=
[
p
w
q
w
−
p
x
q
x
−
p
y
q
y
−
p
z
q
z
p
w
q
x
+
p
x
q
w
+
p
y
q
z
−
p
z
q
y
p
w
q
y
−
p
x
q
z
+
p
y
q
w
+
p
z
q
x
p
w
q
z
+
p
x
q
y
−
p
y
q
x
+
p
z
q
w
]
\mathbf{p} \otimes \mathbf{q}=\left[\begin{array}{l} p_{w} q_{w}-p_{x} q_{x}-p_{y} q_{y}-p_{z} q_{z} \\ p_{w} q_{x}+p_{x} q_{w}+p_{y} q_{z}-p_{z} q_{y} \\ p_{w} q_{y}-p_{x} q_{z}+p_{y} q_{w}+p_{z} q_{x} \\ p_{w} q_{z}+p_{x} q_{y}-p_{y} q_{x}+p_{z} q_{w} \end{array}\right]
p⊗q=⎣⎢⎢⎡pwqw−pxqx−pyqy−pzqzpwqx+pxqw+pyqz−pzqypwqy−pxqz+pyqw+pzqxpwqz+pxqy−pyqx+pzqw⎦⎥⎥⎤
值得注意的是,两个单位四元数相乘还是单位四元数。
(4)纯四元数的指数函数
纯四元数的定义为,实部为0的四元数,即: v = [ 0 q v ] \mathbf{v}=\left[\begin{array}{l}0 \\ \mathbf{q}_{v}\end{array}\right] v=[0qv]
定义纯四元数的指数函数如下:
e
v
=
e
u
θ
=
cos
θ
+
u
sin
θ
=
[
cos
θ
u
sin
θ
]
e^{\mathbf{v}}=e^{\mathbf{u} \theta}=\cos \theta+\mathbf{u} \sin \theta=\left[\begin{array}{c} \cos \theta \\ \mathbf{u} \sin \theta \end{array}\right]
ev=euθ=cosθ+usinθ=[cosθusinθ]
其中:
v
=
u
θ
\mathbf{v}=\mathbf{u} \theta
v=uθ,并且
θ
=
∥
v
∥
∈
R
\theta=\|\mathbf{v}\| \in \mathbb{R}
θ=∥v∥∈R,
u
\mathbf{u}
u为单位向量。
(5)单位四元数转旋转矩阵
R
=
R
{
q
}
=
[
q
w
2
+
q
x
2
−
q
y
2
−
q
z
2
2
(
q
x
q
y
−
q
w
q
z
)
2
(
q
x
q
z
+
q
w
q
y
)
2
(
q
x
q
y
+
q
w
q
z
)
q
w
2
−
q
x
2
+
q
y
2
−
q
z
2
2
(
q
y
q
z
−
q
w
q
x
)
2
(
q
x
q
z
−
q
w
q
y
)
2
(
q
y
q
z
+
q
w
q
x
)
q
w
2
−
q
x
2
−
q
y
2
+
q
z
2
]
\mathbf{R}=\mathbf{R}\{\mathbf{q}\}=\left[\begin{array}{ccc} q_{w}^{2}+q_{x}^{2}-q_{y}^{2}-q_{z}^{2} & 2\left(q_{x} q_{y}-q_{w} q_{z}\right) & 2\left(q_{x} q_{z}+q_{w} q_{y}\right) \\ 2\left(q_{x} q_{y}+q_{w} q_{z}\right) & q_{w}^{2}-q_{x}^{2}+q_{y}^{2}-q_{z}^{2} & 2\left(q_{y} q_{z}-q_{w} q_{x}\right) \\ 2\left(q_{x} q_{z}-q_{w} q_{y}\right) & 2\left(q_{y} q_{z}+q_{w} q_{x}\right) & q_{w}^{2}-q_{x}^{2}-q_{y}^{2}+q_{z}^{2} \end{array}\right]
R=R{q}=⎣⎡qw2+qx2−qy2−qz22(qxqy+qwqz)2(qxqz−qwqy)2(qxqy−qwqz)qw2−qx2+qy2−qz22(qyqz+qwqx)2(qxqz+qwqy)2(qyqz−qwqx)qw2−qx2−qy2+qz2⎦⎤
注意,必须是单位四元数!!!
(6)单位四元数转欧拉角
由于欧拉角的定义方式也有很多,这里说明的是依据Z-Y-X定义的欧拉角,其中欧拉角与旋转矩阵的变换关系是:
R
=
[
cos
ψ
cos
θ
cos
ψ
sin
θ
sin
ϕ
−
sin
ψ
cos
ϕ
cos
ψ
sin
θ
cos
ϕ
+
sin
ψ
sin
ϕ
sin
ψ
cos
θ
sin
ψ
sin
θ
sin
ϕ
+
cos
ψ
cos
ϕ
sin
ψ
sin
θ
cos
ϕ
−
cos
ψ
sin
ϕ
−
sin
θ
cos
θ
sin
ϕ
cos
θ
cos
ϕ
]
\mathbf{R}=\left[\begin{array}{ccc}{\cos \psi \cos \theta} & {\cos \psi \sin \theta \sin \phi-\sin \psi \cos \phi} & {\cos \psi \sin \theta \cos \phi+\sin \psi \sin \phi} \\ {\sin \psi \cos \theta} & {\sin \psi \sin \theta \sin \phi+\cos \psi \cos \phi} & {\sin \psi \sin \theta \cos \phi-\cos \psi \sin \phi} \\ {-\sin \theta} & {\cos \theta \sin \phi} & {\cos \theta \cos \phi}\end{array}\right]
R=⎣⎡cosψcosθsinψcosθ−sinθcosψsinθsinϕ−sinψcosϕsinψsinθsinϕ+cosψcosϕcosθsinϕcosψsinθcosϕ+sinψsinϕsinψsinθcosϕ−cosψsinϕcosθcosϕ⎦⎤
其中:
ϕ
,
θ
,
ψ
\phi,\theta,\psi
ϕ,θ,ψ为欧拉角,分别为横滚角(X),俯仰角(Y),偏航角(Z)。
所以,四元数转欧拉角的关系为:
ϕ
=
arctan
2
(
q
y
q
z
+
q
w
q
x
)
q
w
2
−
q
x
2
−
q
y
2
+
q
z
2
θ
=
−
arcsin
[
2
(
q
x
q
z
−
q
w
q
y
)
]
ψ
=
arctan
2
(
q
x
q
y
+
q
w
q
z
)
q
w
2
+
q
x
2
−
q
y
2
−
q
z
2
\begin{aligned} \phi &= \arctan\frac{ 2\left(q_{y} q_{z}+q_{w} q_{x}\right)}{q_{w}^{2}-q_{x}^{2}-q_{y}^{2}+q_{z}^{2}}\\ \theta&=-\arcsin [2\left(q_{x} q_{z}-q_{w} q_{y}\right)]\\ \psi&=\arctan\frac{2\left(q_{x} q_{y}+q_{w} q_{z}\right)}{q_{w}^{2}+q_{x}^{2}-q_{y}^{2}-q_{z}^{2}} \end{aligned}
ϕθψ=arctanqw2−qx2−qy2+qz22(qyqz+qwqx)=−arcsin[2(qxqz−qwqy)]=arctanqw2+qx2−qy2−qz22(qxqy+qwqz)
注意,必须是单位四元数!!!
2 IMU运动方程
2.1 关于IMU测量数据
在聊到IMU测量数据的时候,我们首先需要明白两个坐标系的定义。
一是惯性系,二是IMU坐标系。
这里的惯性系就是指静止或者其速度的改变可以忽略不记的坐标系。通常在机器人的应用中,由于所用的IMU都是低成本IMU,对于地球自转角速度不够敏感,所以可以认为与地面固连的坐标系都是惯性坐标系。然而对于,航空航天应用而言,用到的IMU精度很高,对于惯性导航的要求也很严格,则需要考虑地球自转角速度,这是惯性坐标系为地球惯性坐标系。
IMU测量的实际上就是IMU坐标系相对于惯性系的加速度和角速度。值得注意的是,这里的相对于惯性系的加速度不仅包括载体的运动加速度,还包括重力加速度。
所以,我们需要特别注意,加速度计测量的不是载体的运动加速度,而是载体相对惯性空间的绝对加速度和引力加速度之和,称作“比力”。
通常,IMU的测量模型如下:
a
m
=
R
t
⊤
(
a
t
−
g
t
)
+
a
b
t
+
a
n
ω
m
=
ω
t
+
ω
b
t
+
ω
n
\begin{array}{l} \mathbf{a}_{m}=\mathbf{R}_{t}^{\top}\left(\mathbf{a}_{t}-\mathbf{g}_{t}\right)+\mathbf{a}_{b t}+\mathbf{a}_{n} \\ \bm{\omega}_{m}=\bm\omega_{t}+\bm\omega_{b t}+\bm\omega_{n} \end{array}
am=Rt⊤(at−gt)+abt+anωm=ωt+ωbt+ωn
其中,
R
t
⊤
\mathbf{R}_{t}^{\top}
Rt⊤表示从惯性系到IMU坐标系的旋转矩阵。
a
b
t
,
ω
b
t
\mathbf{a}_{b t},\bm\omega_{b t}
abt,ωbt代表随机游走噪声,可以理解为加速度计和陀螺仪的零漂。
a
n
,
ω
n
\mathbf{a}_{n},\bm\omega_{n}
an,ωn为零均值高斯白噪声。
g
t
\mathbf{g}_{t}
gt代表重力加速度,表示在惯性系下。这里关于
g
t
\mathbf{g}_{t}
gt的符号不用特别在意,这个负号并不是一定的,也可以写成正号,取决于
g
t
\mathbf{g}_{t}
gt的定义。
2.2 IMU运动方程
IMU的运动方程主要描述了物体速度,位置以及姿态在IMU测量数据的激励下产生的变化。除了关于四元数的部分以外,用到的知识就是小学二年级学过的物理知识。比如,位置的导数是速度,速度的导数是加速度。
我们定义我们关心的状态量为:
- p t \mathbf{p}_{t} pt:表示IMU系相对惯性系的位置,在惯性系下表示的,默认是三维的
- v t \mathbf{v}_{t} vt:表示IMU系相对惯性系的速度,同样是在惯性系下表示的,默认是三维的
- q t \mathbf{q}_{t} qt:表示从IMU系到惯性系的四元数,表示从IMU系到惯性系的旋转变换
于是,IMU的运动方程可以表示如下:
p
˙
t
=
v
t
v
˙
t
=
a
t
=
R
t
(
a
m
−
a
b
t
−
a
n
)
+
g
t
q
˙
t
=
1
2
q
t
⊗
ω
t
=
1
2
q
t
⊗
(
ω
m
−
ω
b
t
−
ω
n
)
a
˙
b
t
=
a
w
ω
˙
b
t
=
ω
w
g
˙
t
=
0
\begin{aligned} \dot{\mathbf{p}}_{t} &=\mathbf{v}_{t} \\ \dot{\mathbf{v}}_{t} &=\mathbf{a}_{t}=\mathbf{R}_{t}\left(\mathbf{a}_{m}-\mathbf{a}_{b t}-\mathbf{a}_{n}\right)+\mathbf{g}_{t} \\ \dot{\mathbf{q}}_{t} &=\frac{1}{2} \mathbf{q}_{t} \otimes \bm\omega_{t}=\frac{1}{2} \mathbf{q}_{t} \otimes\left(\bm\omega_{m}-\bm\omega_{b t}-\bm\omega_{n}\right) \\ \dot{\mathbf{a}}_{b t} &=\mathbf{a}_{w} \\ \dot{\bm\omega}_{b t} &=\boldsymbol{\omega}_{w} \\ \dot{\mathbf{g}}_{t} &=0 \end{aligned}
p˙tv˙tq˙ta˙btω˙btg˙t=vt=at=Rt(am−abt−an)+gt=21qt⊗ωt=21qt⊗(ωm−ωbt−ωn)=aw=ωw=0
其中,
R
t
=
R
{
q
t
}
\mathbf{R}_{t}=\mathbf{R}\{\mathbf{q}_{t}\}
Rt=R{qt}为基于
q
t
\mathbf{q}_{t}
qt得到的旋转矩阵,表示了从IMU系到惯性系的旋转变换。
a
w
,
ω
w
\mathbf{a}_{w},\bm\omega_w
aw,ωw为零均值高斯白噪声。
值得注意的是,在这组运动方程中,把 g t \mathbf{g}_{t} gt也视作变化的量,后续基于此运动方程构造的ESKF也会对 g t \mathbf{g}_{t} gt进行更新。这在许多IMU运动方程中是不常见到的,这样做有什么好处呢?
首先,我们要明白 g t \mathbf{g}_{t} gt并不等于 [ 0 , 0 , 9.8 ] T [0,0,9.8]^T [0,0,9.8]T, g t \mathbf{g}_{t} gt的值取决于IMU的初始姿态。这是因为,IMU运动方程是递推的方程,计算出来的位置和速度都是相对于初始状态的,而不是绝对的位置和速度。因此为了方便起见,我们通常都会定义初始时刻的IMU坐标系为惯性系,这样我们后面计算出来的虽然是相对于初始IMU系的位置和速度,但也可以作为绝对的位置和速度了。于是, g t \mathbf{g}_{t} gt既然代表了惯性系下的重力加速度,也就是初始的IMU坐标系下表示的重力加速度,所以当初始IMU坐标系不是水平的时候, g t \mathbf{g}_{t} gt自然也就不等于 [ 0 , 0 , 9.8 ] T [0,0,9.8]^T [0,0,9.8]T了。
进一步地,我们也可以知道,估计 g t \mathbf{g}_{t} gt,也就是估计初始时刻IMU的姿态。既然我们通过可以 g t \mathbf{g}_{t} gt估计了初始IMU的姿态,那么初始时刻的四元数就可以直接定义为 q 0 = ( 1 , 0 , 0 , 0 ) \mathbf{q}_{0}=(1,0,0,0) q0=(1,0,0,0)。这种操作实际上就是,我们先假设初始时刻四元数为 q 0 = ( 1 , 0 , 0 , 0 ) \mathbf{q}_{0}=(1,0,0,0) q0=(1,0,0,0),然后在此基础上估计 g t \mathbf{g}_{t} gt。当然,还有另外一种方法就是,先假设 g t = [ 0 , 0 , 9.8 ] \mathbf{g}_{t}=[0,0,9.8] gt=[0,0,9.8],然后估计初始时刻的IMU相距水平姿态相差多少。这两种方法都可以,然后估计 g t \mathbf{g}_{t} gt的话可以使模型的线性化程度更好。
为了更好的阅读体验,本文分为上下两文,关于ESKF的内容以及MATLAB代码,请移步下一篇文章。