你第一次把无人机放飞,切到定高模式,却发现它在空中缓慢地漂移画圈,GPS显示的位置和实际位置差了三四米。你的第一反应是GPS坏了,换一个模块,问题依旧。这时候你就该明白,问题不一定出在某个传感器身上,而是出在飞控内部的状态估计环节——它没能把一堆传感器的数据融合成可靠的“当前位置”。
状态估计(State Estimation)在无人机领域,本质上回答一个问题:“我现在到底在哪里,朝向哪,飞得有多快?”这个问题的答案,就是飞控做自主悬停、航线飞行、一键返航时赖以决策的基础。你手里飞控的每一个控制指令,都是基于这个估计出的状态算出来的,不是基于某个传感器的原始读数直接算的。所以如果状态估计做不好,换再贵的电调、再好的电机都救不回来。
这篇内容我很早就想写。网上关于卡尔曼滤波的教程遍地都是,但大多停留在公式推导,很少有人把“无人机是怎么一步一步知道自己在哪的”这个完整链路讲清楚。这篇文章我会从状态估计的基本概念讲起,拆解IMU、GPS、气压计、磁力计这些传感器各自的问题,再讲卡尔曼滤波为什么是主流方案,最后结合PX4这类开源飞控架构说说工程上到底怎么跑,以及我自己调试过程中踩过的坑。
1. “自己是哪”这件事,远比想象中复杂——状态估计到底在估算什么
1.1 无人机需要知道的“状态”是哪些量
大学里学自动控制原理时,讲到“状态空间”总是先列一大堆状态方程。放到无人机上,状态估计要输出的量其实可以分成三组:
- 位置:机体在地球坐标系下的三维坐标,常用NED(北东地)坐标系表示,也就是X轴指向北、Y轴指向东、Z轴指向下。
- 姿态:机头朝向、俯仰、横滚。有的用欧拉角(roll/pitch/yaw),内部计算一般用四元数,避免万向节死锁。
- 速度:三维线速度,尤其是垂直速度。悬停和定高控制里,垂直速度的精度直接决定高度会不会来回震荡。
除了这些基本量,状态向量里通常还包含IMU的零偏(bias),这是另一个重要原因——在估计状态的同时,还要估计传感器本身的误差参数,否则IMU的陀螺和加速度计会一直给系统引入漂移。
1.2 为什么叫“估计”而不是“测量”
很多刚接触无人机的人会以为“飞控知道位置”是因为GPS告诉它了。实际上不是这样。GPS在开阔环境下能给你5米内甚至更好的定位,但在城市峡谷、树荫、桥梁底下信号会跳变。飞控并不会直接采信GPS的读数,而是把GPS当成一个“带噪声的观测来源”,结合IMU等传感器,去估算出最可能的位置。
一个更贴近生活的比喻是:你在漆黑的房间里拿着手机导航步行。手机惯性传感器(相当于IMU)告诉你“刚才往前走了三步”,但每一步的长度都有误差(相当于漂移)。GPS偶尔定位一下,告诉你“你应该在这个楼层电梯口附近”,但定位本身可能偏几米(相当于噪声)。状态估计要做的,就是把这两类都有瑕疵的信息融合起来,得出你最有可能在哪里的结论。
核心要点:状态估计输出的,永远是一个“置信度最高的猜测”,而不是某个传感器测出来的原始数值。这个猜测的质量,决定了无人机自主飞行时的稳定性和安全性。
2. 为什么GPS、IMU、气压计单拿出来都不顶用——常用传感器的精度底牌
2.1 IMU:短时准、长时飘的“直觉器官”
先说IMU(惯性测量单元),它内部主要是三轴加速度计和三轴陀螺仪。陀螺仪测角速度,加速度计测比力。IMU的更新频率很高,在PX4上常见的是250Hz到1000Hz,这是它的最大优势——可以在极短时间内把姿态变化感知得一清二楚。
但IMU有个致命问题:加速度计无法区分重力加速度和机体的运动加速度。无人机平飞时,加速度计测到的向量会偏离真正的重力方向,如果直接把加速度计用于姿态计算,会出现“假倾斜”问题。陀螺仪则有零偏漂移,它是一个积分过程,角速度上一丁点微小偏差,积分个几十秒就会变成几度的姿态误差。而姿态误差又会通过姿态解算进一步污染加速度分解,最终让位置估计越飘越远。
所以IMU适合做短时间内的“直觉支撑”,不适合长期单独作为位置信息来源。
2.2 GPS:长期稳定、短期迟钝的“路标”
GPS在开阔室外环境下能提供绝对位置参考,长期来看不会像IMU那样无限漂移。但它有几个固有短板:
- 更新率低:常见GPS模块输出频率是5Hz~10Hz,远低于飞控控制回路的250Hz以上。两个GPS数据之间,位置怎么变化?只能靠IMU去“补”。
- 精度有限:普通消费级GPS水平定位误差在1.5米到3米是常态,垂直方向误差更大,还可能达到5米以上。
- 信号易受干扰:楼宇遮挡、螺旋桨遮挡天线、桥洞下信号跳变,都会出现位置解算的离群值。
- 延迟:GPS数据从卫星接收、模块解算到串口输出,本身有几十到几百毫秒延迟。如果飞控不处理这个延迟,悬停时会出现持续振荡。
GPS的价值在于提供低频但有界的绝对修正,你需要把它和IMU的高频短时可靠性结合起来,才能得到又稳又准的位姿。这也是多传感器融合的根本动机。
2.3 磁力计、气压计的“坏脾气”
- 磁力计(电子罗盘):用来修正偏航角,但特别容易被机载电机、电池线路的磁场干扰。很多飞控要求“校磁”,就是让算法估计出机体的硬磁和软磁干扰参数。即便校准完,磁力计在钢筋混凝土结构附近也可能产生很大偏差,所以很多高级算法里磁力计在室内场景会被直接降权甚至禁用。
- 气压计:用来测量高度,原理是气压随高度变化。但它对气流、螺旋桨下洗气流、环境气压变化极为敏感。无人机桨叶转动时,气压计附近气压会明显波动,如果气压计的安装位置不好或者飞控内部减震海绵被破坏,高度估计就会抖动甚至跳变。
这些传感器的共同特征是:每个都有用,每个都不完美。把任何一个单独拿出来当权威,都会在某些场景下翻车。所以飞控需要一个能综合各方意见、并根据当前环境动态调整信任度的“决策大脑”。
3. 卡尔曼滤波:让一堆“半准”的数据算出“全准”的位姿
3.1 从贝叶斯视角理解:先验、预测、更新
卡尔曼滤波(Kalman Filter, KF)是所有现代无人机状态估计的核心。虽然现在工程上更多用扩展卡尔曼滤波(EKF)、无迹卡尔曼滤波(UKF),甚至基于因子图的优化方法,但它们的底层逻辑都来源于经典卡尔曼滤波的两个步骤:预测(Predict)和更新(Update)。
预测步,就是利用IMU测量的角速度和加速度,根据上一时刻的状态,推算出当前时刻状态的“先验估计”。这个推算过程是纯粹的积分,所以你当然知道它会有误差,这个误差可以用协方差矩阵表示,也就是“对先验估计的自信程度”。
更新步,就是用GPS、气压计、磁力计等外部观测去“修正”先验估计。外部观测并不完美,所以每个观测都同样带有一个噪声协方差矩阵,表示“该观测值到底有多可信”。
卡尔曼滤波做的事,本质上是在两个均有不确定性的信息来源之间做一个最优的加权平均。权重不是拍脑袋定的,而是根据两个协方差矩阵计算出来的。如果IMU预测的置信度高(比如刚校准完),而GPS观测噪声比较大(比如城市高楼旁边),滤波器的更新增益就会变小,GPS对状态的修正作用也变小。反之,如果观测质量好,增益就大,状态估计就会更偏向观测值。
3.2 一个直觉例子:开车导航时的“融合”
想象你在高速上开着车用导航。导航软件知道你的车速(从轮速传感器得到)和方向盘转角(陀螺仪的类比),它能预测你接下来几秒钟的位置。GPS每隔几秒给出一个位置“固定点”,但这些固定点可能因为隧道、高楼反射而偏移几百米。导航软件会怎么处理?它不会在GPS跳变时马上把导航线挪过去,而是综合“我依据车速和转向推算出你正在主路直行”和“GPS显示你在路边坡上”这两个信息,最终把车辆位置画在“最可能”的主路上。这就是最简单的预测-更新融合。
无人机上的融合也一样,只不过维度从二维地图扩展到了三维空间加姿态,传感器数量也不止GPS一个。
3.3 为什么飞控里用的是EKF而不是经典KF
经典卡尔曼滤波只适用于线性系统。但无人机的姿态变化、旋转矩阵运算、IMU测量方程都是强非线性的,没法直接用。扩展卡尔曼滤波的思路很直接:在每一个时刻,把非线性系统在当前估计点附近做一阶泰勒展开,近似成线性系统,再套用标准卡尔曼更新的公式。
PX4的EKF2、ArduPilot的EKF3,本质都是这一类思想在工程上的落地。它们维护一个包含位置、速度、姿态四元数、IMU零偏等状态组成的大状态向量,并动态接收IMU、GPS、气压计、磁力计、空速管、光学流、视觉里程计等传感器的观测,在后台同时运行多组观测更新逻辑。EKF3还会维护一组不同模型假设的滤波器组合,通过机制检测当前的传感器暴露情况,自动选择最优的那一组结果。
当然EKF也有局限,比如一阶线性化在姿态变化很快时会引入较大误差,所以现在机器人领域越来越多的方案转向了基于因子图优化的方法(比如MSCKF、VINS-Fusion),在大曲率机动和弱GNSS环境下效果更好。但飞控上EKF依然是绝对主流,因为它计算量可控、成熟稳定、调试工具链完善。
3.4 千万别迷信“滤波能治好一切”
这里必须说句大实话:滤波器的效果高度依赖于输入的传感器质量。如果你的IMU没校准好、GPS天线位置装得歪、气压计被桨下洗气流直吹,EKF调的再精细也救不回来。这也是为什么相同一个飞控,在甲手里稳如老狗,在乙手里画龙。先保证传感器数据干净,再去谈滤波参数的调整,这个顺序永远不能反。
4. 飞控里的融合架构:松耦合、紧耦合与PX4/ArduPilot的实际实现
4.1 PX4 EKF2模块在做什么
在PX4开源飞控里,EKF2是最核心的状态估计模块。它的输入源包括:
- IMU数据(陀螺仪、加速度计),频率可达800Hz以上
- GPS数据(位置、速度),通常5Hz~10Hz
- 气压计高度,通常50Hz~100Hz
- 磁力计航向,低速
- 外部视觉里程计、光学流传感器(可选)
EKF2内部维护一个25维甚至更大规模的状态向量,并按照仔细观察过的调度表,在每次IMU数据到来时执行预测步,在GPS等其他传感器数据到来时触发对应的更新步。为此它需要知道每个传感器的时间戳和延迟补偿参数,否则融合出来的位置就会存在潜在的“时间错位”。
如果你打开PX4地面站QGroundControl的参数界面,会看到EK2_xxx开头的一大堆参数,包括GPS噪声抑制、气压计噪声抑制、传感器延迟等。这些参数的意义就是告诉滤波器“哪个观测更可信”。每个飞控安装环境不同,这些参数往往需要微调。
4.2 松耦合和紧耦合的取舍
状态估计系统的架构设计上,分松耦合和紧耦合两大类。
- 松耦合:把GPS等定位模块看作一个“黑盒”,直接输入它给出的位置和速度解算结果(PVT),再和IMU融合。好处是实现简单、便于调试、兼容性强;坏处是无法利用GPS的原始观测量(载波相位、多普勒频移)来提升鲁棒性,在信号遮挡严重时性能下降明显。
- 紧耦合:直接处理GPS原始星历和伪距观测值,把定位解算和惯性导航放在同一个优化/滤波过程里。精度和鲁棒性明显更高,尤其在城市场景能更好地处理多径效应,但计算量和实现复杂度也高得多。
PX4默认使用的是松耦合思路,将GPS接收机输出的位置、速度作为观测值输入EKF。ArduPilot EKF3也类似,但最近几个版本已经开始逐步支持原始GNSS观测的紧耦合集成。
除此之外,视觉的加入也分松紧:
- 把视觉SLAM输出的位姿作为外部观测输入滤波器的,属于松耦合VIO。
- 把特征点坐标和IMU数据在同一个优化问题里联合求解的,属于紧耦合VIO。
从工程选型角度,松耦合更容易跑通,紧耦合上限更高。我自己调机的经验是:先跑松耦合,把整个链路磨顺之后,再去考虑要不要上紧耦合方案。直接上紧耦合,出了问题你都不知道该查视觉后端还是飞控融合模块。
4.3 视觉与RTK加入后,融合策略怎么变
这几年的无人机越来越依赖视觉和RTK。RTK(载波相位差分定位)能把GPS定位精度提升到厘米级,但它的输出频率依然不高,也依然存在信号遮挡问题。视觉里程计能提供相对位姿变化,短时间精度不错,但长时间运行会有累积漂移。
在融合策略上,高频的IMU仍然是“主干道”,RTK和视觉的作用是提供低频绝对/相对修正。具体来说:
- 在开阔室外、RTK信号好的区域,滤波器的GPS观测权重可以适当调高,位置状态会更干净。
- 在室内或者GPS弱的环境中,滤波器的位置观测会降权甚至被剔除,视觉里程计和光学流成为主要的位置来源。
- 视觉和RTK同时可用时,两者的修正方向应该一致或互补。如果出现持续的矛盾,多半是时间同步没做对,或者其中一路传感器有硬件问题。
时间同步是这里最容易出问题的地方。一张图像的时间戳如果和IMU时间戳相差几十毫秒,在快速飞行时,视觉观测就会被当成“过去或未来”的数据,融合结果会很差。PX4的EKF2支持对传感器延迟进行参数估计,但前提是你得给它准确的时间戳基础数据。
5. 我调无人机状态估计时踩过的坑与排查手段
5.1 现象一:悬停漂移,GPS显示也在缓慢移动
这个现象非常常见。先从可能的根因排查,而不是直接调EKF参数。
我第一次遇到时,先检查了飞控的减震泡棉。结果发现泡棉老化变形,震动直接传到了IMU,加速度计输出的信噪比被破坏。EKF的IMU噪声参数是按正常震动水平设置的,遇到异常震动,预测步就会被污染。更换减震泡棉之后,悬停漂移问题当场减轻大半。
如果减震没有问题,再排查电机和桨的动平衡。IMU对高频震动极其敏感,单轴震动值超过正常范围时,EKF内部的加速度计权重会被动降低,位置修正能力随之下降。用QGroundControl看震动曲线,正常应该在±50以内,超过±150就要先处理机臂、桨叶、电机座的问题,再回来看悬停。
5.2 现象二:定高飞行时高度上下震荡
高度估计用到气压计和加速度计垂直分量融合。气压计如果被桨下洗气流直吹,气压值会出现周期性波动,融合后的高度自然跟着上下晃。
排查步骤:
- 检查气压计的安装位置。很多飞控都有专用的海绵罩,不能拆掉,也不能贴死。海绵罩的作用是给气压计营造一个“相对稳定的小环境”,让桨下洗气流的脉动被缓冲掉。如果海绵罩丢失、破损,或者被油污堵住,高度肯定飘。
- 观察气压计原始数据曲线。正常情况应该是平滑的慢变曲线,如果看到高频跳变,基本可以断定是气流直吹或环境风突变。
- 检查程序里是否有气压计低通滤波或者EKF的气压计噪声参数是否设置过低。PX4里有个气压计和IMU融合时的噪声权重参数,调太小,滤波器会非常信任气压计,气流扰动时高度就会剧烈波动;调太大,又会过于依赖IMU积分,高度缓慢漂移。这个参数需要你针对自己的机架反复试。
5.3 现象三:偏航角在起飞后逐渐偏移
偏航角主要靠磁力计和陀螺仪积分。磁力计如果受到电机磁场干扰,测出来的航向就和真实航向有不可预测的偏差。EKF如果是低速收敛模式,可能很难发现这种偏差,只有在无人机打转时才会暴露。
我的经验是先做完整的磁力计校准,水平旋转和各个姿态翻转都要做。然后再检查机架的电流线路布局。很多DIY机架把电源线和磁力计靠得很近,大电流通过时产生的磁场会直接压过环境磁场。如果发现电流越大航向越偏,那基本可以肯定是磁干扰问题,需要调整电调安装位置或加装屏蔽。
另外要注意磁力计校准后,如果换过机臂、电调、电池位置,都需要重新校准。校准环境里不要有金属桌椅、手机、铁质工具,这些都会成为干扰源。
5.4 现象四:日志里EKF故障标志乱闪
EKF2的输出里有一堆“innovation test”的标志,代表某些观测值与滤波器预测相差过大,被判定为“异常观测”而丢弃或降权。如果在日志里看到GPS位置创新差异出现频繁,别急着认为是EKF参数问题,先看GPS模块本身:
- 确认GPS模块天线朝向天空,没有被碳纤维机架遮挡。
- 确认GPS模块和飞控之间没有严重的电磁干扰。
- 确认GPS固定解状态(fix type)稳定,大范围跳动时EKF自然会丢弃它的位置修正。
这些排查做完,才会去对比不同EKF参数下,GPS位置创新的收敛速度和稳定程度。
5.5 调参顺序的经验总结
我自己的习惯是,花大力气把传感器原始数据校准干净,再进EKF调参。顺序是:
- 加速度计校平,确保水平面初始姿态正确。
- 磁力计全姿态校准,检查航向与真北的偏差。
- 陀螺仪零偏确认,静止时曲线应该贴近零值。
- 检查IMU震动曲线和气压计原始输出,判断机械和安装问题。
- 去开阔地用模式飞一下,看悬停、定高、自动返航三条曲线的平滑度。
- 最后再针对EKF的参数做小幅调整,一次只调一个,来回飞行验证。
曾经有一个项目,团队为了追求“最高精度”,把所有EKF噪声参数往小调,结果GPS跳一个点,位置估计就直接跟着弹一跳,控制回路也跟着剧烈反应。这只是噪声参数调得过激进的问题,一直调了一个多礼拜。最后把参数恢复到接近默认值,再配合良好的传感器校准,飞行效果反而更好。
这件事给我的教训是:状态估计的调参,要追求“稳”和“准”的平衡,不是噪声调得越小越好。滤波器需要保留必要的“怀疑能力”,才能应对真实世界的不确定性。
6. 状态估计学习的下一步方向
如果你已经熟悉了EKF的基本原理和PX4上的参数结构,接下来可以往这些方向深入:
- 看EKF2源码,理解状态向量扩展、观测方程里每个雅可比矩阵的具体含义。代码虽然枯燥,但对理解融合机制的帮助是无价的。
- 研究因子图优化、增量式平滑和图优化在无人机定位中的应用,这是现代视觉惯性导航的主流思路。
- 动手搭一套带光学流+激光测距的小型室内无人机,在无GPS环境下推状态估计方案。这能逼你把视觉、惯性、测距的融合问题彻底吃透。
- 学习系统辨识方法,结合实验数据给IMU噪声、GPS噪声建立更准确的统计模型,能直接提升滤波器初始参数的可靠度。
个人体会是,状态估计不是“填参数”的工作,而是一种“用数据重构物理世界”的思维方式。你越理解传感器误差的来源和特性,越能在工程问题中做出正确的取舍。真正能判断一个飞控工程师水平的,不是他能背多少公式,而是他面对一个“为什么飞机会往左飘”的问题时,能不能通过日志和原理找到真正的原因。