首页IT科技imu姿态模式(2. IMU原理及姿态融合算法详解)

imu姿态模式(2. IMU原理及姿态融合算法详解)

时间2025-05-01 04:25:19分类IT科技浏览4630
导读:2. IMU原理及姿态融合算法详解 一、组合...

2. IMU原理及姿态融合算法详解

一            、组合

IMU全称是惯性导航系统          ,主要元件有陀螺仪                、加速度计磁力计            。其中                ,陀螺仪可以得到各个轴的加速度      ,而加速度计能够得到

x

x

x    、

y

y

y
         、

z

z

z
方向的加速度        ,而磁力计能获得周围磁场的信息                。

主要的工作便是将三个传感器的数据融合得到较为准确的姿态信息    。

二                 、 原理

a) 陀螺仪

陀螺仪是通过测量科氏力来检测角速度的               ,科氏力在大学物理中提到过         ,如下图:

一个物体以固定的线速度

v

v

v 运动      ,同时受到一个角速度的影响               ,这时候在叉乘方向上会有一个科氏力的作用            ,测量这个力便能直到角速度

w

w

w
的大小         。

在实际的MEME传感器中   ,大致结构如图               ,在一个方向保持左右运动                 。若有旋转的角速度则会在垂直的方向产生科氏力               ,通过电容的变化来反应这个力的大小便能得到旋转速度的大小      。

b) 加速度计

加速度计的原理较为简单,就是通过牛顿第二定律来测量三轴的加速度      。图中的质量块受到加速度的作用会左右运动            ,而两侧的电容能测量质量块的位置                 ,从而计算出加速度的大小                  。

c) 磁力计

磁力计则是通过霍尔效应来测量磁场的强度   ,高中物理中学过霍尔效应也很简单          ,如图         。一端通电                ,在磁场的作用下电子会往垂直的方向上跑      ,从而在侧面产生电场        ,通过测量这个电场的强度及正负则能间接测量出厂强的大小   。

视频介绍如下: https://www.youtube.com/watch?v=eqZgxR6eRjo&feature=youtu.be

三      、 旋转的表达

a) 欧拉角

对姿态的描述               ,最直观的便是欧拉角                  。可以用维基百科上的一张动图直观的表示:

b) 旋转矩阵

线性代数中         ,有讲解过      ,使用

3

×

3

3 \times 3

3×3 的矩阵可以表达物体的旋转               ,如绕

Z

Z

Z

轴的旋转可以表示为:

[

x

y

z

1

]

=

[

cos

θ

sin

θ

sin

t

h

e

t

a

cos

θ

1

1

]

[

x

y

z

1

]

(1)

\begin{bmatrix} x^{} \\ y^{} \\ z^{} \\ 1 \end{bmatrix} = \begin{bmatrix} \cos \theta & -\sin \theta & 0 & 0 \\ \sin theta & \cos \theta & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} \tag {1}

xyz1=cosθsintheta00sinθcosθ0000100001xyz1(1)
其他轴旋转可以自行百度            。

c) 四元数

四元数的运算表达比较难理解            ,但是在数学上却可以优雅而完美的表达三维空间中的旋转。它可以很好的避免欧拉角存在的万向锁问题   ,和轴角存在的不适合插值的缺点               ,同时它所需的参数量较少               ,因此现有的大部分效果较好的解法都是采用四元数解算的               。

这里主要介绍如何通过四元数来更新姿态:

已知当前姿态为四元数

q

1

q_1

q1 ,在

Δ

t

\Delta t

Δt
时间内的角速度为

ω

\omega

ω
            , 求下一刻的四元数               。

一般来说                 ,采用一阶龙格库塔法来更新四元数   ,主要的思路便是 泰勒展开式          ,然后一阶近似  。

具体计算流程如下:

[

q

q

1

q

2

q

3

]

t

+

Δ

t

=

[

q

q

1

q

2

q

3

]

t

+

Δ

t

2

[

ω

x

q

1

ω

y

q

2

ω

z

q

3

ω

x

q

+

ω

z

q

2

ω

y

q

3

ω

y

q

ω

z

q

1

+

ω

x

q

3

ω

z

q

+

ω

y

q

1

ω

x

q

2

]

(2)

\begin{bmatrix} q_0 \\ q_1 \\ q_2 \\ q_3 \end{bmatrix}_{t + \Delta t} = \begin{bmatrix} q_0 \\ q_1 \\ q_2 \\ q_3 \end{bmatrix}_{t} + \frac{\Delta t}{2} \begin{bmatrix} -\omega _x q_1 - \omega_y q_2 - \omega_z q_3 \\ \omega_x q_0 + \omega_z q_2 - \omega_y q_3 \\ \omega_y q_0 - \omega_z q_1 + \omega_x q_3 \\ \omega_z q_0 + \omega_y q_1 - \omega_x q_2 \end{bmatrix} \tag {2}

q0q1q2q3t+Δt=q0q1q2q3t+2Δtωxq1ωyq2ωzq3ωxq0+ωzq2ωyq3ωyq0ωzq1+ωxq3ωzq0+ωyq1ωxq2(2)

d) 李群

SO

(

3

)

\text{SO}(3)

SO(3)
及 李代数

so

(

3

)

\text{so}(3)

so(3)

对于这两种表达方法在主流陀螺仪的姿态解算中并不常见                ,但是在某些算法中需要对姿态进行求导时      ,便需要采用李群的方法去表达姿态            。

比如对旋转的求导如下:

Rp

φ

=

lim

φ

exp

(

φ

)

exp

(

ϕ

)

p

exp

(

ϕ

)

p

φ

=

lim

φ

I

+

φ

exp

(

φ

)

p

exp

(

φ

)

p

φ

=

lim

φ

φ

Rp

φ

=

lim

φ

(

Rp

)

φ

φ

=

(

Rp

)

(3)

\begin{aligned} \frac{\partial \textbf{Rp}}{\partial \varphi } &= \lim_{\varphi \to 0} \frac{\exp(\varphi^{\wedge}) \exp (\phi^{\wedge})\textbf{p} -\exp(\phi^{\wedge})\textbf{p}}{\varphi } \\ &= \lim_{\varphi \to 0} \frac{\textbf{I} + \varphi^{\wedge}\exp (\varphi^{\wedge})\textbf{p} -\exp (\varphi^{\wedge})\textbf{p}}{\varphi } \\ &= \lim_{\varphi \to 0} \frac{\varphi^{\wedge } \textbf{Rp}}{\varphi} \\ &= \lim_{\varphi \to 0}\frac{-(\textbf{Rp})^{\wedge} \varphi }{\varphi} \\ &= -(\textbf{Rp})^{\wedge} \end{aligned} \tag{3}

φRp=φ0limφexp(φ)exp(ϕ)pexp(ϕ)p=φ0limφI+φexp(φ)pexp(φ)p=φ0limφφRp=φ0limφ(Rp)φ=(Rp)(3)

具体可参考高翔博士的《视觉SLAM 14讲》

博客:https://www.cnblogs.com/gaoxiang12/p/5137454.html

视频:https://www.bilibili.com/video/BV16t411g7FR?p=3&vd_source=484659340e491a658a0140936c410c09

个人笔记:https://blog.csdn.net/weixin_43662553/article/details/128161000?spm=1001.2014.3001.5502

四      、 传感器的噪声及去除

传感器噪声        ,一般分为两种:

随机噪声:一般认为随机噪声是符合高斯分布的 固定误差:固定误差是由于传感器的测量原理导致的               ,这部分通常是去噪的重点                。实际上         ,由于制造和安装误差      ,会有许许多多的固定误差    。但是由于使用要求不高               ,且大部分校准需要高精度转台            ,只能做较为简单的校准工作         。

a) 陀螺仪

陀螺仪直接测量的是角速度而非角度   ,所以需要通过一次积分才能得到角度值                 。

在积分过程中               ,若有固定的                  、某一个方向的数据               ,则会在积分的过程中,不断加大影响导致角度偏差      。

通常来说            ,陀螺仪的温漂是比较严重的                 ,基本上温漂正比于芯片的价格   ,越贵的芯片漂的越少      。温漂的数据既与温度相关          ,又与时间相关                  。也就是说                ,不同温度下不一样      ,不同上电时间下也不一样         。

通常简单的做法是:在上电的时候静止一段时间计算出此时的零偏        ,然后每次减去零偏   。

更高级的方法需要标定温度与零偏的关系               ,然后线性插补;另一方面使用艾伦方差分析法得到零偏和时间的关系(艾伦方差法见博客https://blog.csdn.net/yandld/article/details/81101984)                  。

对于其他的误差         ,比如三轴不相互垂直      ,以及尺度因子不一致等误差               ,都可以忽略            。

当然            ,更好的情况是在电路上做一个温度控制   ,维持在温度

50

°

50°

50° 左右(必须要在常温以上)。

b) 加速度计

对于加速度计               ,同样会有零漂和尺度因子的误差               ,但是加速度计在静止时可直接得到角度而不需要积分,所以零漂的影响很小            ,但是尺度因子的影响较大               。

同样是重力加速度                 ,各个面朝下时检测到的数值是不一样的               。一般来说   ,校准的方法有六面校准  。 就是各个面朝下          ,然后记录重力的数值                ,计算得到尺度因子            。目前MEMS传感器的精度已经很高了      ,很多情况下只用正面朝上校准一次即可(仅适用于无人机)                。

若要求不高        ,可以不去校准加速度计               ,而对于云台有其他的校准思路    。

c) 磁力计

磁力计的数据误差较大         ,校准便显得很重要         。

一般可以导出数据到MATLAB中      ,然后采用 椭球校准的方法                  。但是这样比较麻烦               ,主要用于写论文…

而大多数飞控的做法            ,都是直接在单片机上处理的   ,步骤如下:

先头朝上               ,水平旋转一周 然后头朝下               ,再水平旋转一周      。 若计算能力有限,可直接求最大最小数据的中值            ,得到偏差                 ,然后计算幅值   , save.mag_offset[i] = 0.5f *(max_t[i] + min_t[i]);//中值校准 save.mag_gain[i] = safe_div(200.0f ,(0.5f *(max_t[i] - min_t[i])),0);//幅值校准 若计算能力较充裕          ,采用LM算法可计算出三维的偏差和三维的尺度因子                ,具体参考天穹飞控代码      。

五         、姿态解算原理

IMU的算法紧紧地围绕着如何利用这三个元器件      ,获得准确的姿态        ,基本要求有几点:

滞后效应不明显 角度准确 静止时角度不漂

但很多时候               ,都无法满足所有的要求         ,需要根据实际情况的需求来有所取舍                  。

a) 陀螺仪

陀螺仪获得角度的方法很简单      ,直接积分就好了         。但是直接积分会带来巨大的误差!!

第一个原因如图所示:

解决方法如下               ,采用中值积分

另一个方面            ,陀螺仪得到的旋转数据是基于机体坐标系的   ,而我们要求的是世界坐标系下的姿态               ,这中间必然有一个坐标变换的关系:

[

ω

x

ω

y

ω

z

]

=

[

cos

γ

cos

θ

sin

γ

1

sin

θ

sin

γ

cos

cos

γ

]

[

θ

˙

γ

˙

ψ

˙

]

θ

,

γ

较小

[

θ

˙

γ

˙

ψ

˙

]

=

[

]

[

θ

γ

ψ

]

+

[

ω

x

ω

y

ω

z

]

\begin{bmatrix} \omega _x \\ \omega_y \\ \omega_z \end{bmatrix} = \begin{bmatrix} \cos \gamma & 0 & -\cos \theta \sin \gamma \\ 0 & 1 & \sin \theta \\ \sin \gamma & 0 & \cos \cos \gamma \end{bmatrix}\begin{bmatrix} \dot{\theta} \\ \dot{\gamma } \\ \dot{\psi} \end{bmatrix}\stackrel{\theta,\space \gamma \text{较小}}{\longrightarrow} \begin{bmatrix} \dot{\theta} \\ \dot{\gamma } \\ \dot{\psi} \end{bmatrix}=\begin{bmatrix} 0 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & 0 \end{bmatrix} \cdot \begin{bmatrix} \theta \\ \gamma \\ \psi \end{bmatrix} + \begin{bmatrix} \omega _x \\ \omega_y \\ \omega_z \end{bmatrix}

ωxωyωz=cosγ0sinγ010cosθsinγsinθcoscosγθ˙

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
python调用js文件中导出的模块(python如何调用js代码?) 论坛自动采集发帖软件(Discuz采集内容)