二、惯性导航解算的方法
前面一节主要是在讲解旋转的数学表达形式,而这一节主要讲解的是怎么通过原始的角速度和加速度得到我们想要的位置、速度、姿态,而具体点就是“角速度->姿态”、“加速度->速度”、“速度->位置”,而这三种情况就很明显是一个积分问题。
1. 姿态更新
1.1 基于旋转矩阵的姿态更新
1)连续时间处理
旋转矩阵的微分方程为
R
˙
w
b
=
R
w
b
[
ω
]
×
\dot{\boldsymbol{R}}_{w b}=\boldsymbol{R}_{w b}[\boldsymbol{\omega}]_{\times}\\
R˙wb=Rwb[ω]×
其中$ \boldsymbol{\omega}$ 为IMU三个轴测量得到的角速度。
根据微分方程可以很容易写出它的积分形式为(此处用到的是高数中讲的求一阶微分方程通解的方法,基础知识不展开介绍了)
R
w
b
k
=
R
w
b
k
−
1
e
∫
t
k
−
1
t
k
[
ω
]
×
d
τ
\boldsymbol{R}_{w b_{k}}=\boldsymbol{R}_{w b_{k-1}} e^{\int_{t_{k-1}}^{t_{k}}[\boldsymbol{\omega}]_{\times} d \tau}\\
Rwbk=Rwbk−1e∫tk−1tk[ω]×dτ
这里给出的是由 k-1 时刻的姿态积分得到 k 时刻姿态的积分形式。仔细观察指数部分,它表示的是角速度矢量的积分,而角速度矢量的积分其实不就是 k-1 时刻到 k 时刻对应的旋转向量嘛(这里也可以这样理解,即两个旋转矩阵之间的变化可以由一个旋转向量来表示),因此,我们可以直接写成
R
w
b
k
=
R
w
b
k
−
1
e
ϕ
×
\boldsymbol{R}_{w b_{k}}=\boldsymbol{R}_{w b_{k-1}} e^{\phi \times}\\
Rwbk=Rwbk−1eϕ×
由于反对称矩阵的指数函数前面已经推导完毕(罗德里格斯公式),因此上式又可以写为
R
w
b
k
=
R
w
b
k
−
1
R
b
k
−
1
b
k
\boldsymbol{R}_{w b_{k}}=\boldsymbol{R}_{w b_{k-1}} \boldsymbol{R}_{b_{k-1} b_{k}}\\
Rwbk=Rwbk−1Rbk−1bk
其中
R
b
k
−
1
b
k
=
I
+
sin
ϕ
ϕ
(
ϕ
×
)
+
1
−
cos
ϕ
ϕ
2
(
ϕ
×
)
2
\boldsymbol{R}_{b_{k-1} b_{k}}=I+\frac{\sin \phi}{\phi}(\boldsymbol{\phi} \times)+\frac{1-\cos \phi}{\phi^{2}}(\boldsymbol{\phi} \times)^{2}\\
Rbk−1bk=I+ϕsinϕ(ϕ×)+ϕ21−cosϕ(ϕ×)2
可见,求旋转矩阵的问题,最终转化成了旋转向量的问题。咋求?接着用微分方程求呗。旋转向量的微分方程为
ϕ
˙
≈
ω
+
1
2
ϕ
×
ω
\dot{\phi} \approx \omega+\frac{1}{2} \phi \times \omega\\
ϕ˙≈ω+21ϕ×ω
这个方程看起来还是比较复杂的,可以也应当化简。在方程右边第二项,可以看到是两个矢量的叉乘,根据叉乘的定义,当两个矢量方向重合时,叉乘的结果为0。一般 imu 的采样频率不会低于 100hz,即 k-1 时刻到 k 时刻的时间间隔不会大于10ms,而载体一般自动驾驶车或者机器人也不会发生过于高频的运动,因此可以近似认为满足叉乘为0的条件,因此可以直接把上式简化为
ϕ
˙
≈
ω
\dot{\phi} \approx \omega\\
ϕ˙≈ω
它对应的积分形式就很简单了
ϕ
≈
∫
t
k
−
1
t
k
ω
(
τ
)
d
τ
\phi \approx \int_{t_{k-1}}^{t_{k}} \boldsymbol{\omega}(\tau) d \tau\\
ϕ≈∫tk−1tkω(τ)dτ
有了旋转向量的积分形式,那么该旋转矩阵的形式就了然了,直接带进去就行。
但是,到这里会遇到一个问题,我们一直讨论的都是连续时间的,即 k-1 时刻到 k 时刻之间的所有值都是连续可测的,而实际数据都是离散的,只能得到 k-1 和 k 这两个时刻的值,那么必须把上面的连续时间形式高程离散形式,才能继续走下去了。
2)离散时间处理
这就牵扯到常见的三种方法:欧拉法、中值法、龙哥库塔法,三者按复杂程度逐渐递增,按精度也是逐渐递增。我们先从简单的开始说。
a.欧拉法
欧拉法很好理解,虽然我不知道 k-1 到 k 时刻的所有值,但是如果我假设 imu 在这个时间段内是匀速旋转的,那不就解决了吗,此时,对应的旋转向量为
ϕ
=
ω
k
−
1
(
t
k
−
t
k
−
1
)
\boldsymbol{\phi}=\boldsymbol{\omega}_{k-1}\left(t_{k}-t_{k-1}\right)\\
ϕ=ωk−1(tk−tk−1)
b.中值法
欧拉法固然简单,但是匀速的假设还是有些太强了,实际使用中会发现精度不够,于是就有了中值法。中值法假设 imu 是匀加速运动的,这就比匀速更高级了一些,此时离散时间形式为
ϕ
=
ω
k
−
1
+
ω
k
2
(
t
k
−
t
k
−
1
)
\boldsymbol{\phi}=\frac{\boldsymbol{\omega}_{k-1}+\boldsymbol{\omega}_{k}}{2}\left(t_{k}-t_{k-1}\right)\\
ϕ=2ωk−1+ωk(tk−tk−1)
c.龙哥库塔法
中值法假设的匀加速运动,在imu运动更加剧烈的情况下仍然不够,那就继续把模型复杂化呗,龙哥库塔法就是这种,把运动模型搞成一个高阶曲线。由于这部分略显复杂,而且实际使用中,中值法多数情况下已经够用,因此在此处就不对这种方法做过多介绍了。
1.2 基于四元数的姿态更新
1)连续时间处理
四元数的微分方程为
q
˙
w
b
=
q
w
b
⊗
1
2
[
0
ω
]
\dot{\boldsymbol{q}}_{w b}=\boldsymbol{q}_{w b} \otimes \frac{1}{2}\left[\begin{array}{l} 0 \\ \boldsymbol{\omega} \end{array}\right]\\
q˙wb=qwb⊗21[0ω]
其矩阵形式为(可回顾四元数乘法那一小节的推导)
q
˙
w
b
=
1
2
[
0
ω
]
R
q
w
b
\dot{\boldsymbol{q}}_{w b}=\frac{1}{2}\left[\begin{array}{l} 0 \\ \boldsymbol{\omega} \end{array}\right]_{R} \boldsymbol{q}_{w b}\\
q˙wb=21[0ω]Rqwb
同样按照微分方程的解法,得到其积分形式为
q
˙
w
b
=
e
1
2
Θ
q
w
b
\dot{\boldsymbol{q}}_{w b}=\mathrm{e}^{\frac{1}{2} \boldsymbol{\Theta}} \boldsymbol{q}_{w b}\\
q˙wb=e21Θqwb
其中
Θ
=
[
0
−
ϕ
x
−
ϕ
y
−
ϕ
z
ϕ
x
0
ϕ
z
−
ϕ
y
ϕ
y
−
ϕ
z
0
ϕ
x
ϕ
z
ϕ
y
−
ϕ
x
0
]
\boldsymbol{\Theta}=\left[\begin{array}{cccc} 0 & -\phi_{x} & -\phi_{y} & -\phi_{z} \\ \phi_{x} & 0 & \phi_{z} & -\phi_{y} \\ \phi_{y} & -\phi_{z} & 0 & \phi_{x} \\ \phi_{z} & \phi_{y} & -\phi_{x} & 0 \end{array}\right]\\
Θ=⎣
⎡0ϕxϕyϕz−ϕx0−ϕzϕy−ϕyϕz0−ϕx−ϕz−ϕyϕx0⎦
⎤
为了求解该方程,要对指数函数进行泰勒展开,同样包含高次幂,展开方法与前面旋转向量指数形式展开的方法类似,可以自行推导,此处直接给出结论
e
1
2
Θ
(
T
)
=
I
cos
ϕ
2
+
Θ
ϕ
sin
ϕ
2
\mathrm{e}^{\frac{1}{2} \Theta(T)}=I \cos \frac{\phi}{2}+\frac{\Theta}{\phi} \sin \frac{\phi}{2}\\
e21Θ(T)=Icos2ϕ+ϕΘsin2ϕ
因此有
q
w
b
k
=
[
I
cos
ϕ
2
+
Θ
ϕ
sin
ϕ
2
]
q
w
b
k
−
1
\boldsymbol{q}_{w b_{k}}=\left[I \cos \frac{\phi}{2}+\frac{\boldsymbol{\Theta}}{\phi} \sin \frac{\phi}{2}\right] \boldsymbol{q}_{w b_{k-1}}\\
qwbk=[Icos2ϕ+ϕΘsin2ϕ]qwbk−1
由于
[
cos
ϕ
2
ϕ
ϕ
sin
ϕ
2
]
R
=
[
I
cos
ϕ
2
+
Θ
ϕ
sin
ϕ
2
]
\left[\begin{array}{c} \cos \frac{\phi}{2} \\ \frac{\phi}{\phi} \sin \frac{\phi}{2} \end{array}\right]_{R}=\left[I \cos \frac{\phi}{2}+\frac{\Theta}{\phi} \sin \frac{\phi}{2}\right]\\
[cos2ϕϕϕsin2ϕ]R=[Icos2ϕ+ϕΘsin2ϕ]
另
q
b
k
−
1
b
k
=
[
cos
ϕ
2
ϕ
ϕ
sin
ϕ
2
]
\boldsymbol{q}_{b_{k-1} b_{k}}=\left[\begin{array}{c} \cos \frac{\phi}{2} \\ \frac{\phi}{\phi} \sin \frac{\phi}{2} \end{array}\right]\\
qbk−1bk=[cos2ϕϕϕsin2ϕ]
则
q
w
b
k
=
q
w
b
k
−
1
⊗
q
b
k
−
1
b
k
\boldsymbol{q}_{w b_{k}}=\boldsymbol{q}_{w b_{k-1}} \otimes \boldsymbol{q}_{b_{k-1} b_{k}}\\
qwbk=qwbk−1⊗qbk−1bk
2) 离散时间处理
此处也是同样用中值法算出旋转矢量即可得到 q b k − 1 b k \boldsymbol{q}_{b_{k-1} b_{k}} qbk−1bk ,从而得到更新后的四元数 q w b k \boldsymbol{q}_{w b_{k}} qwbk ,与前述方法相同,不再重复。
1.3 总结
-
通过旋转矩阵去更新姿态需要去求一个增量选装矩阵 R b k − 1 b k \boldsymbol{R}_{b_{k-1} b_{k}} Rbk−1bk,而 R b k − 1 b k \boldsymbol{R}_{b_{k-1} b_{k}} Rbk−1bk则需要去求旋转向量,如果器件直接输出的是角增量(角速度在时间上的积分)那就皆大欢喜,如果是输出的角速度则需要通过中值积分求得选装向量。通过四元数更新也是类似的。
-
角增量和旋转向量的区别
如果是在匀速模型下,也就是前后两个时刻的旋转方向没有发生改变,那么认为角增量和旋转向量是相等的,如果是在线性或在高阶情况下,则不相等。
2. 速度更新
相比来讲,速度更新就显得很简单,速度的微分方程为
v
˙
=
R
w
b
a
−
g
\dot{\boldsymbol{v}}=\boldsymbol{R}_{w b} \boldsymbol{a}-\boldsymbol{g}\\
v˙=Rwba−g
其中
a
=
[
a
x
a
y
a
z
]
\boldsymbol{a}=\left[\begin{array}{lll} a_{x} & a_{y} & a_{z} \end{array}\right]
a=[axayaz] 为测量加速度,
g
=
[
0
0
g
0
]
\boldsymbol{g}=\left[\begin{array}{lll} 0 & 0 & g_{0} \end{array}\right]
g=[00g0]为重力加速度。
该微分方程的通解形式为
Δ
v
=
(
R
w
b
a
−
g
)
Δ
t
\Delta \boldsymbol{v}=\left(\boldsymbol{R}_{w b} \boldsymbol{a}-\boldsymbol{g}\right) \Delta t\\
Δv=(Rwba−g)Δt
对应的基于中值法的速度更新形式为
v
k
=
v
k
−
1
+
(
R
w
b
k
a
k
+
R
w
b
k
a
k
−
1
2
−
g
)
(
t
k
−
t
k
−
1
)
\boldsymbol{v}_{k}=\boldsymbol{v}_{k-1}+\left(\frac{\boldsymbol{R}_{w b_{k}} \boldsymbol{a}_{k}+\boldsymbol{R}_{w b_{k}} \boldsymbol{a}_{k-1}}{2}-\boldsymbol{g}\right)\left(t_{k}-t_{k-1}\right)\\
vk=vk−1+(2Rwbkak+Rwbkak−1−g)(tk−tk−1)
3. 位置更新
位置更新就更加简单,微分形式为
p
˙
=
v
\dot{\boldsymbol{p}}=\boldsymbol{v}\\
p˙=v
其通解形式为
Δ
p
=
v
Δ
t
\Delta \boldsymbol{p}=\boldsymbol{v} \Delta t\\
Δp=vΔt
基于中值法的离散形式为
p
k
=
p
k
−
1
+
v
k
+
v
k
−
1
2
(
t
k
−
t
k
−
1
)
\boldsymbol{p}_{k}=\boldsymbol{p}_{k-1}+\frac{\boldsymbol{v}_{k}+\boldsymbol{v}_{k-1}}{2}\left(t_{k}-t_{k-1}\right)\\
pk=pk−1+2vk+vk−1(tk−tk−1)
另外,如果把速度的通解代入,则位置的通解形式也可以写为
Δ
p
=
v
Δ
t
+
1
2
a
Δ
t
2
\Delta \boldsymbol{p}=\boldsymbol{v} \Delta t+\frac{1}{2} \boldsymbol{a} \Delta t^{2}\\
Δp=vΔt+21aΔt2
相应的基于中值法的离散形式为
p
k
=
p
k
−
1
+
v
k
−
1
(
t
k
−
t
k
−
1
)
+
1
2
(
R
w
b
k
a
k
+
R
w
b
k
−
1
a
k
−
1
2
−
g
)
(
t
k
−
t
k
−
1
)
2
\begin{aligned} \boldsymbol{p}_{k}= \boldsymbol{p}_{k-1}+\boldsymbol{v}_{k-1}\left(t_{k}-t_{k-1}\right) +\frac{1}{2}\left(\frac{\boldsymbol{R}_{w b_{k}} \boldsymbol{a}_{k}+\boldsymbol{R}_{w b_{k-1}} \boldsymbol{a}_{k-1}}{2}-\boldsymbol{g}\right)\left(t_{k}-t_{k-1}\right)^{2} \end{aligned}\\
pk=pk−1+vk−1(tk−tk−1)+21(2Rwbkak+Rwbk−1ak−1−g)(tk−tk−1)2
4. 补充知识
4.1 导航系与惯性系
在实际导航模型中,不动系(i系)是地心惯性系,而我们要的导航结果是相对于导航系(n系)的,这两
个坐标系之间有相对旋转,他们之间的旋转角速度可以表示为
ω
i
n
n
=
ω
i
e
n
+
ω
e
n
n
\boldsymbol{\omega}^{n}_{i n} = \boldsymbol{\omega}^{n}_{i e}+\boldsymbol{\omega}^{n}_{e n}
ωinn=ωien+ωenn
其中
ω
i
e
n
\boldsymbol{\omega}^{n}_{i e}
ωien表示地球自转引起的角速度;
ω
e
n
n
\boldsymbol{\omega}^{n}_{e n}
ωenn表示载体在地球表面运动时,绕地球旋转形成的角速度。其表达式如下:
ω
i
e
n
=
[
0
ω
i
e
n
cos
L
ω
i
e
n
sin
L
]
T
ω
e
n
n
=
[
−
v
N
r
M
+
h
v
E
r
N
+
h
v
E
r
N
+
h
tan
L
]
T
\boldsymbol{\omega}^{n}_{i e} = \left[\begin{array}{c} 0 & \boldsymbol{\omega}^{n}_{i e}\cos{L} & \boldsymbol{\omega}^{n}_{i e}\sin{L} \end{array}\right]^T\\ \boldsymbol{\omega}^{n}_{e n} = \left[\begin{array}{c} -\frac{v_N}{r_M+h} & \frac{v_E}{r_N+h}& \frac{v_E}{r_N+h}\tan{L} \end{array}\right]^T
ωien=[0ωiencosLωiensinL]Tωenn=[−rM+hvNrN+hvErN+hvEtanL]T
后者的理解需要借助地球模型,此处不引入地球模型的推导,其推导过程同样可参考《捷联惯导算法与组合导航
原理》(严恭敏等编著)。
原文链接:多传感器融合定位理论基础(五):惯性导航解算