1. 传感器融合概述:什么是传感器融合、为什么需要融合、PDA中的典型传感器
大家好,欢迎来到《嵌入式PDA传感器融合算法实战》的第一章。
说实话,每次带新人入门,我都要先问一个问题:你手里拿的PDA,凭什么知道自己是横着还是竖着? 答案就是——传感器融合。
1.1 什么是传感器融合?
传感器融合,说白了就是把多个传感器的数据揉在一起,得出一个比单个传感器更靠谱的结果。
举个例子。你一个人走路,闭上一只眼,还能走直线吗?大概率会歪。但如果你睁着两只眼,再听听周围的声音,甚至用手摸一摸墙——嗯,你就能走得很稳。这就是融合。
在PDA里,我们通常有加速度计、陀螺仪、磁力计、气压计。每个传感器都有自己的脾气。加速度计怕振动,陀螺仪怕漂移,磁力计怕干扰。但把它们的数据融合起来,就能互相弥补短板。
核心定义:传感器融合 = 多源数据 + 估计算法 + 状态输出
我个人习惯把传感器融合比作「开会讨论」。每个传感器都是一个专家,各说各的。融合算法就是那个主持会议的人,把大家的意见综合起来,给出一个最终结论。
1.2 为什么需要融合?
你可能会问:一个传感器不够用吗?
不够。真的不够。
我在项目中遇到过这样一个坑:只用加速度计做姿态检测。结果PDA放在桌上不动,数据倒是挺稳。但只要一走路,加速度计的输出就开始「跳舞」——因为走路时的振动全被它当成姿态变化了。
为什么会这样?因为加速度计测量的是比力,它分不清重力加速度和运动加速度。你走路时,它把脚步的振动也当成了倾斜。
那陀螺仪呢?陀螺仪测角速度,积分后能得到角度。但陀螺仪有零偏,时间一长,积分误差就越来越大。我记得有一次调试,PDA明明放在桌上,陀螺仪积分出来的角度却慢慢漂到了30度——这要是用在导航上,早撞墙了。
所以,我们需要融合。用加速度计来修正陀螺仪的漂移,用陀螺仪来弥补加速度计的动态响应慢。两者互补,才能得到稳定、准确的姿态。
避坑指南:我曾经以为磁力计可以随便用,结果在室内钢筋结构附近,磁力计的数据完全乱套。后来我才明白,磁力计只能做辅助参考,不能完全依赖。
1.3 PDA中的典型传感器
PDA里常见的传感器,我列个表给你看:
| 传感器 | 测量什么 | 优点 | 缺点 |
|---|---|---|---|
| 加速度计 | 三轴加速度(含重力) | 静态时很准,能测倾角 | 怕振动,动态响应差 |
| 陀螺仪 | 三轴角速度 | 动态响应快,短时精度高 | 有零偏,长时间积分会漂 |
| 磁力计 | 地磁场强度 | 能提供绝对航向 | 易受铁磁干扰,室内不准 |
| 气压计 | 大气压强 | 能测高度变化,精度可达0.1米 | 受温度、天气影响大 |
加速度计
加速度计测量的是三个轴上的加速度。静止时,它只能感受到重力。所以,通过重力在三个轴上的分量,我们可以算出PDA的俯仰角和横滚角。
但注意,它算不出偏航角。因为偏航角旋转时,重力方向不变。你想想看,你原地转圈,重力还是向下——加速度计根本不知道你转了。
陀螺仪
陀螺仪测量角速度。把角速度对时间积分,就能得到角度变化。它的优点是响应快,你一转它就能感知到。
但缺点也很明显:积分会累积误差。我做过一个实验,让陀螺仪静止10分钟,积分出来的角度漂了将近50度。所以,陀螺仪必须配合其他传感器做修正。
磁力计
磁力计测量地磁场。地磁场的方向大致指向地理北极(有磁偏角)。所以,磁力计能给出绝对航向。
但磁力计很娇气。靠近金属、电线、电机,数据就会乱。我在一个项目中,把磁力计放在扬声器旁边,结果航向直接偏了90度。嗯,这里要注意:磁力计一定要做硬铁和软铁校准。
气压计
气压计测量大气压。海拔越高,气压越低。所以,通过气压变化可以推算高度变化。
气压计的精度其实不错,好的传感器能分辨0.1米的高度变化。但它怕风、怕温度突变。你从空调房走到室外,气压计的数据会跳一下。
警告:不要指望气压计给出绝对海拔。因为天气变化会导致气压波动,同一地点早晚可能差好几米。气压计更适合做相对高度变化的测量。
1.4 融合的基本思路
好了,现在你知道了每个传感器的脾气。那怎么融合呢?
最简单的思路是互补滤波。加速度计和磁力计提供低频的姿态信息,陀螺仪提供高频的姿态变化。把它们通过一个滤波器结合起来,低频相信加速度计,高频相信陀螺仪。
更高级的,就是卡尔曼滤波。卡尔曼滤波能根据传感器的噪声特性,动态调整每个传感器的权重。我个人的经验是:卡尔曼滤波虽然效果好,但调参很费时间。新手可以先从互补滤波入手。
后面几章,我会带大家一步步实现这些算法。从最基础的互补滤波,到扩展卡尔曼滤波,再到无迹卡尔曼滤波。每一步我都会给出完整的代码和调试经验。
本章小结:
- 传感器融合 = 多传感器数据 + 估计算法
- 融合的目的是弥补单个传感器的短板
- 加速度计、陀螺仪、磁力计、气压计各有优缺点
- 互补滤波和卡尔曼滤波是两种主流融合方法
下一章,我会详细讲坐标系与姿态表示。这是所有融合算法的基础,搞不懂坐标系,后面代码写出来也是错的。咱们下章见。