本项目硬件平台为RoboMaster C型开发板,Toolchain包含MDK5与Makefile,可使用Ozone进行调试(std.jdebug)。
本算法利用四元数描述载体姿态,通过扩展卡尔曼滤波(Extended Kalman Filter, EKF)融合IMU数据,即利用加速度计修正姿态并估计陀螺仪
四元数定义:
$$
\mathbf q=q_{0}^{}+q_{1}^{} i+q_{2}^{} j+q_{3}^{} k \quad(q_{0}^{}, q_{1}^{}, q_{2}^{}, q_{3}^{} \in \mathbb{R})
$$
向量形式表示:
$$
\mathbf q=\left[\begin{array}{l}
{q_{0}^{}} \
{q_{1}^{}} \
{q_{2}^{}} \
{q_{3}^{}}
\end{array}\right]
$$
坐标变换矩阵$\boldsymbol C_b^n$:
$$
\boldsymbol C_{b}^{n}=\left[\begin{array}{lll}
{1-2\left(q_{2}^{2}+q_{3}^{2}\right)} & {2\left(q_{1} q_{2}-q_{0} q_{3}\right)} & {2\left(q_{1} q_{3}+q_{0} q_{2}\right)} \
{2\left(q_{1} q_{2}+q_{0} q_{3}\right)} & {1-2\left(q_{1}^{2}+q_{3}^{2}\right)} & {2\left(q_{2} q_{3}-q_{0} q_{1}\right)} \
{2\left(q_{1} q_{3}-q_{0} q_{2}\right)} & {2\left(q_{2} q_{3}+q_{0} q_{1}\right)} & {1-2\left(q_{1}^{2}+q_{2}^{2}\right)}
\end{array}\right]
$$
四元数关于时间的微分方程为:
$$
\dot{ \mathbf q} = \frac{1}{2}\boldsymbol \Omega\mathbf q
$$
其中:
$$
\boldsymbol \Omega=\left[\begin{array}{cccc}
{0} & {-\omega_{x}} & {-\omega_{y}} & {-\omega_{z}} \
{\omega_{x}} & {0} & {\omega_{z}} & {-\omega_{y}} \
{\omega_{y}} & {-\omega_{z}} & {0} & {\omega_{x}} \
{\omega_{z}} & {\omega_{y}} & {-\omega_{x}} & {0}
\end{array}\right]
$$
其中
定义状态向量为:
$$
\boldsymbol x = \left[\begin{array}{c}
\mathbf q \
\boldsymbol \omega^{bias}
\end{array}\right]
$$
其中
根据陀螺仪误差模型,存在:
$$
\boldsymbol \omega^{real} = \boldsymbol \omega^{measure} - \boldsymbol \omega^{bias}
$$
则过程模型为:
$$
\begin{aligned}
\boldsymbol x_{k+1} &= f(\boldsymbol x_k) + \boldsymbol {w}{k} \
&= \left[\begin{array}{c}
\mathbf q_k +\frac{1}{2}\left(\boldsymbol \Omega_k - \boldsymbol \Omega_k^{bias} \right)\Delta t \mathbf q_k \
\boldsymbol \omega^{bias} k
\end{array}\right] + \boldsymbol {w}{k}
\end{aligned}
$$
其中白噪声 $\boldsymbol {w}{k} \sim N\left(\boldsymbol 0_{6 \times 1}, \boldsymbol {Q}\right)$,$\boldsymbol \Omega_k^{bias}$ 为陀螺仪零飘组成的矩阵。对非线性函数
\end{array}\right]
\end{aligned}
$$
其中矩阵
\end{array}\right]
\end{array}
$$
根据 $\boldsymbol g=\boldsymbol C_{n}^{b}\left[\begin{array}{ccc}0&0&1\end{array}\right]^T$,在无运动加速度情况下有:
$$
\begin{equation}
\left[\begin{array}{lll}
{2\left(q_{1} q_{3}-q_{0} q_{2}\right)} \
{2\left(q_{2} q_{3}+q_{0} q_{1}\right)} \
{1-2\left(q_{1}^{2}+q_{2}^{2}\right)}
\end{array}\right]=
\left[\begin{array}{c}
a_x \
a_y \
a_z
\end{array}\right]
\end{equation}
$$
其中
另外,为避免状态
量测模型的无偏性仅在不存在运动加速度的情况下成立,运动加速度的存在会导致量测更新出现误差。现实中机器人无运动加速度的稳态情况极少出现,为减小跳跃、撞击等情况下过大的运动加速度影响估计精度甚至稳定性,本算法通过卡方检验对加速度计量测信息进行检验。
定义残差:
$$
\begin{equation}
\boldsymbol e_k =\boldsymbol z_k-h(\boldsymbol {x}{k}^-)
\end{equation}
$$
正常情况下,残差 $\boldsymbol e_k$ 符合期望为 $\boldsymbol 0$ 的正态分布,其方差为:
$$
\begin{equation}
\boldsymbol D_k = E[\boldsymbol e_k\boldsymbol e_k^T]=\boldsymbol H_k\boldsymbol P{k}^-\boldsymbol H_k^T + \boldsymbol R_k
\end{equation}
$$
当突然产生较大运动加速度时,残差的值会显著大于一般情况,定义检测函数:
$$
\begin{equation}
r_k = \boldsymbol e_k^T\boldsymbol D_k^{-1}\boldsymbol e_k
\end{equation}
$$
若
若工作环境过于恶劣或卡方检验阈值设置过低会导致滤波器长时间不进行量测更新,进而导致协方差矩阵过大导致载体静止状态下残差仍无法通过卡方检验,这种情况需强制进行量测更新。
针对上述问题,本算法通过加速度与角速度测量值大小判断机体是否处于静止状态,若机体处于静止状态且无法通过卡方检验超过50次则设置ConvergeFlag为0,意味滤波器发散,要求暂时跳过卡方检验强制进行量测更新,直到检测函数值小于一定阈值时ConvergeFlag置1,意味滤波器收敛。
若检查函数值较大,但仍能通过卡方检验,可根据检测函数值与卡方检验阈值的大小关系确定一个小于1的比例,作用于卡尔曼增益,以实现估计器增益的自适应。
为避免特殊情况下零偏估计协方差过大导致量测更新中零篇修正值过大产生突变,本算法对量测更新中零偏修正值进行限幅。
考虑到陀螺仪零偏过程模型不完全精确,为避免随时间推移陀螺仪零偏估计协方差过度收敛,导致估计器对陀螺仪零偏无法适应由温度等因素引起的缓慢变化,进而无法得到无偏估计。为解决上述问题,可通过设置估计协方差矩阵对角线元素下限避免过度收敛,或通过渐消因子对协方差阵进行调整。
本算法采用渐消因子避免协方差矩阵过度收敛,定义渐消因子 $\lambda $ 为常数。考虑到仅需对陀螺仪零偏估计进行记忆渐消,故渐消因子 $\lambda $ 并不作用于整个协方差矩阵,定义矩阵
算法更新流程如下图所示:
静止状态下开机
静止状态下对比无额外零偏补偿的Mahony算法对俯仰角与横滚角的估计情况如图所示:
其中两条红色曲线为本文算法估计结果,两条噪声较小绿色曲线为无额外零偏补偿的Mahony算法估计结果,蓝色与噪声较大绿色的绿色曲线为加速度计正交分解得到的俯仰角与横滚角。
综上,陀螺仪零偏会使无零偏补偿的Mahony算法估计结果产生偏差,本文算法在静止状态下开机后可有效估计
由于笔者没有姿态参考设备,故通过手持IMU并频繁甩动的方式施加运动加速度,甩动一段时间后使IMU保持静止,观察甩动结束后姿态角收敛情况,若静止后姿态角缓慢变化并最终收敛至与静止瞬间不同的结果,那么收敛值与静止瞬间值的差可以一定程度反应静止前姿态估计误差。
本文算法对比Mahony算法对俯仰角与横滚角的估计情况如图所示:
局部放大如图所示:
其中两条红色曲线为本文算法估计结果,两条噪声较小绿色曲线为无额外零偏补偿的Mahony算法估计结果,蓝色与噪声较大绿色的绿色曲线为加速度计正交分解得到的俯仰角与横滚角(经过一定低通滤波)。
综上,得益于卡方检验,本算法对运动加速度对姿态估计的不良影响具有一定程度的抑制作用。