四轴飞行器定高PID调参实战:如何用加速度计补偿气压计波动(RoboFly代码解析)

在四轴飞行器的自主飞行控制中,维持一个稳定的悬停高度是基础,也是难点。许多开发者最初接触定高,往往从单一传感器开始,比如直接读取气压计数据作为高度反馈。然而,一旦飞行器进入室内,或者遭遇门窗开关、空调气流,甚至仅仅是电机产生的下洗气流,气压计的读数就会像风中的烛火一样飘忽不定。这时,一个单纯的PID控制器会变得无所适从,疯狂地输出修正指令,导致飞行器剧烈地“点头”或“呼吸”,体验极差。

问题的核心在于传感器各有优劣。气压计能提供绝对高度信息,但对气流扰动和温度变化极其敏感,动态响应慢。加速度计则恰恰相反,它能敏锐地感知垂直方向的加速度变化,通过二次积分可以推算出位移变化,动态响应快,但存在致命的积分漂移问题——任何微小的零偏误差,经过积分都会被无限放大,导致高度估计“飞”掉。因此,一个鲁棒的定高方案,绝非简单的“二选一”,而是如何让这两位性格迥异的“伙伴”协同工作,取长补短。

本文将深入探讨一种基于惯性滤波的多传感器融合框架,并以RoboFly项目的部分代码为引,解析其如何动态地融合气压计与加速度计数据,为PID控制器提供一个稳定、可靠的高度估计。我们不仅会拆解算法逻辑,更会聚焦于PID参数在此融合框架下的调参策略,让你理解每一个系数背后的物理意义,从而在面对真实世界的干扰时,能够胸有成竹地进行调整。

1. 理解传感器融合的核心:互补滤波思想

在深入代码之前,我们必须建立起对传感器融合的直觉理解。想象一下你在一个完全黑暗、崎岖不平的房间里蒙眼走路。你手里有两样工具:一个精度很高但反应迟钝的声呐测距仪(类似气压计),和一个反应极快但读数会慢慢漂移的陀螺仪(类似加速度积分)。单独使用任何一个,你都会撞墙。

互补滤波 的精妙之处就在于,它用一种非常直观的方式结合了两者。其核心思想是:用高频特性好的传感器(加速度计)去捕捉快速变化,用低频特性好的传感器(气压计)去修正长期漂移。在频域上,这相当于设计了一个滤波器,让加速度计数据通过高通滤波器,气压计数据通过低通滤波器,然后将两者相加。

注意:这里提到的“高通”和“低通”是概念上的。在实际的嵌入式代码实现中,更常见的是采用一种称为“惯性导航”或“预测-校正”的时域方法,其数学本质与互补滤波是相通的。

在RoboFly的框架中,这种思想被具体化为一个状态估计器。它维护着一个关于高度、垂直速度和垂直加速度的状态向量 z_est[3]。这个状态每时每刻都在做两件事:

  1. 预测:根据上一时刻的状态和当前测量的加速度,推算出当前时刻的“预测状态”。
  2. 校正:用气压计测量的高度与预测高度之间的误差,以及加速度计测量的加速度与预测加速度之间的误差,来“拉回”预测值,使其逼近真实值。

两个校正过程的“力度”,由权重系数 w_z_barow_z_acc 控制。调参的核心,很大程度上就是在调整这两个权重,以及它们与PID控制器参数的配合关系。

2. 拆解RoboFly融合算法:从数据流到状态更新

让我们聚焦到 Altitude_Combine 这个核心函数。虽然原始代码注释有限,但我们可以通过变量名和运算逻辑还原其设计意图。理解这个数据流,是进行有效调参的前提。

首先,系统以固定的周期(例如 dt = 0.005s,即200Hz)运行此函数。每一帧,它处理两类传感器更新事件:

  • 加速度计更新 (AccbUpdate):将机体坐标系下的原始加速度 accb[ ],减去估计的零偏 acc_bias[ ],再通过方向余弦矩阵 DCMgb 旋转到地理坐标系(NED),得到 accel_NED[2](垂直方向)。关键的一步是计算加速度校正量:

    corr_acc[2] = accel_NED[2] + G - z_est[2];
    

    这里 G 是重力加速度。z_est[2] 是状态估计中预测的垂直加速度。因此,corr_acc[2] 实质上是 “测量的垂直加速度”与“预测的垂直加速度”之间的偏差。这个偏差将用于后续校正状态估计器。

  • 气压计更新 (ALT_Updated):计算气压计校正量:

    corr_baro = 0 - FBM.AltitudeFilter - z_est[0];
    

    假设飞行器目标高度为0(悬停模式),FBM.AltitudeFilter 是经过滤波的气压计高度测量值(通常为负值,因为NED坐标系下向下为正)。z_est[0] 是状态估计的当前高度。所以,corr_baro“目标高度与气压计测量值之差”再减去“估计高度”,本质上反映了气压计测量与整体状态估计的高度偏差。

接下来是融合与状态更新的精华部分:

accel_bias_corr[2] -= corr_baro * w_z_baro * w_z_baro;

这行代码非常关键。它利用气压计的高度偏差 corr_baro,来推算并修正加速度计的零偏 acc_bias[ ]w_z_baro 的平方项决定了这个修正的强度。这相当于用低频可靠的气压信号,去缓慢地校准高频但会漂移的加速度计零偏,是抑制积分漂移的核心机制。

随后,系统进行标准的 预测-校正 循环:

  1. 预测inertial_filter_predict(dt, z_est, z_est[2]); 基于当前估计的加速度 z_est[2],用运动学公式更新高度和速度。

    // 位移 S = V*t + A*t*t/2
    z_est[0] += z_est[1] * dt + z_est[2] * dt * dt / 2.0f;
    // 速度 V = A*t
    z_est[1] += z_est[2] * dt;
    
  2. 校正:先后用气压计误差和加速度计误差进行校正。

    inertial_filter_correct(corr_baro, dt, z_est, 0, w_z_baro);
    inertial_filter_correct(corr_acc[2], dt, z_est, 2, w_z_acc);
    

    inertial_filter_correct 函数根据误差 e、权重 w 和索引 i,以一种类似比例-积分的方式更新状态向量 z_est。当 i=0(校正高度)时,会连带影响速度和加速度的估计;当 i=2(校正加速度)时,主要影响加速度估计。

最终,融合后的最优估计 nav.z, nav.vz, nav.az 被输出,供给外层的PID控制器使用。

我们可以用一个表格来总结这个数据融合流程中,各关键变量的作用:

变量名 类型 物理意义 在融合中的作用
z_est[0] 状态量 估计高度 (m) 融合输出的核心,PID的反馈值
z_est[1] 状态量 估计垂直速度 (m/s) 提供微分项信息,增强系统阻尼
z_est[2] 状态量 估计垂直加速度 (m/s²) 内部预测环节的核心,连接加速度测量
corr_baro 误差量 气压计高度偏差 (m) 低频锚点,用于校正高度和加速度计零偏
corr_acc[2] 误差量 加速度测量偏差 (m/s²) 高频信息源,用于快速跟踪真实加速度变化
w_z_baro 权重系数 气压计校正权重 控制气压计信任度,值越大,融合高度越紧跟气压计
w_z_acc 权重系数 加速度计校正权重 控制加速度计信任度,值越大,系统对加速反应越灵敏
w_acc_bias 权重系数 加速度零偏估计权重 控制零偏估计速度,值越大,零偏修正越快,但可能引入噪声

3. 融合参数调参实战:权重系数的艺术

理解了算法流程,我们就可以开始最关键的调参工作。调参的目标是:让 nav.z 这个融合后的高度值,既能在飞机平稳悬停时长期稳定(抑制气压计波动),又能在飞机主动上升下降时快速响应(利用加速度计)。

第一步:初始化与静态测试 首先,给权重系数一个合理的初始值。例如:

  • w_z_baro = 1.0f (中等信任气压计)
  • w_z_acc = 20.0f (高度信任加速度计的动态信息)
  • w_acc_bias = 0.05f (非常缓慢地估计零偏)

将飞机放在桌面上静止不动,上电但不启动电机。通过串口打印 nav.zFBM.AltitudeFilter(原始气压高度)和 accel_NED[2]。观察:

  • nav.z 是否基本稳定?它应该比 FBM.AltitudeFilter 平滑得多,波动显著减小。
  • 用手在气压计附近轻轻扇风,模拟气流扰动。观察 FBM.AltitudeFilter 会剧烈跳动,而 nav.z 应该只有轻微、缓慢的变化。如果 nav.z 也跟着大幅跳动,说明 w_z_baro 太大了,需要减小(例如调到0.5)。

第二步:动态响应测试(手持测试) 务必注意安全,拆掉螺旋桨! 用手握住飞机,缓慢地做上下运动。

  • 观察 nav.z 的变化是否跟得上你手部的运动。如果感觉融合高度反应迟钝,像有延迟一样,说明 w_z_acc 可能偏小,需要增大(例如从20调到30或40)。
  • 在运动停止的瞬间,观察 nav.z 是否会过冲然后慢慢回落,或者停下来后还在缓慢漂移。这可能是 w_z_acc 过大或 w_acc_bias 估计不准导致的。可以尝试微调 w_acc_bias,使其略增(如0.08),加快零偏收敛。

第三步:PID控制器与融合器的协同调参 融合器输出稳定的 nav.z 后,外层的PID参数调参就和经典的单传感器定高类似了,但有一些新的考量。

  • 比例项:使用融合高度 nav.z 作为反馈。因为 nav.z 本身已经比较平滑,所以比例增益 P 可以设置得比单纯用气压计时更高一些,以获得更硬朗的刚度。
  • 微分项这是融合方案带来的巨大优势。你可以直接使用融合器输出的 nav.vz(估计垂直速度)作为微分项的来源,这比用高度差分得到的微分信号要干净、平滑得多。微分增益 D 可以有效地抑制上下振荡。
  • 积分项:由于融合高度 nav.z 在长期是准的(被气压计锚定),积分项 I 的主要作用不再是补偿静态误差,而是对抗持续的风扰或动力不对称。因此 I 值通常可以设置得较小。

调参顺序建议:

  1. 先调P:从小增益开始,逐渐增加,直到飞机在高度保持模式下,对小的高度偏差能做出明确、不过激的响应。表现为轻推油门杆后,飞机能较快地到达新高度,没有严重超调。
  2. 再调D:引入 nav.vz 作为微分源。逐渐增加 D,你会感觉到飞机的“阻尼感”变强,高度变化更“粘稠”,悬停更稳。但 D 过大会导致响应迟钝,尤其在快速升降时。
  3. 最后调I:观察飞机在悬停时是否会在一个高度上缓慢地持续漂移。如果是,缓慢增加 I 值,直到漂移被消除。注意 I 太大会引起低频振荡。

4. 高级技巧与故障排查

当基础调参完成后,你可能会遇到一些特定场景下的问题。这里分享一些进阶思路。

场景一:快速升降时高度“拉不住”或“过冲” 这通常是融合器动态响应与PID响应不匹配。

  • 排查融合器:检查 w_z_acc 是否足够大。在快速加速阶段,融合高度应该主要依赖加速度计积分。可以临时打印 corr_barocorr_acc[2],在快速运动时,corr_acc[2] 应占主导地位。如果不是,增大 w_z_acc
  • 排查PID:如果融合高度 nav.z 本身跟踪良好,但飞机实际运动过冲,可能是PID的 D 增益不足,无法提供足够的减速预见性。尝试增大 D

场景二:悬停时缓慢的上下“呼吸” 这种周期可能长达数秒的振荡,通常源于传感器噪声或参数间的耦合。

  • 气压计噪声:检查 FBM.AltitudeFilter 的滤波强度是否足够。可以在气压计数据进入融合器之前,施加一个更强的低通滤波。
  • 加速度计零偏估计不稳w_acc_bias 可能处于一个临界值。尝试稍微减小它,让零偏估计更保守、更平滑。观察 acc_bias[2] 的变化是否过于剧烈。
  • PID积分饱和:虽然用了融合高度,但积分项 I 如果设置不当,仍可能引起低频振荡。尝试稍微降低 I 值。

场景三:应对突风干扰 这是检验融合算法鲁棒性的关键时刻。理想情况是:阵风导致气压骤变,但飞机姿态基本保持,加速度变化不大。

  • 此时,融合算法中的 corr_baro 会突然变大,但由于 corr_acc[2] 很小,算法会判断为气压计受干扰,从而降低对 corr_baro 的信任(通过 w_z_baro 权重体现,在代码逻辑中是固定的,但思想如此)。融合高度 nav.z 主要依靠加速度积分的延续性,从而保持稳定。
  • 你可以通过用嘴突然吹气靠近气压计来测试。观察飞机是否只是轻微抖动,而不是大幅升降。如果反应过大,可能需要进一步减小 w_z_baro,让系统更“不相信”气压计的突变。

调参是一个需要耐心和观察的过程。没有一套参数能适应所有机架、所有环境。最好的方法是搭建丰富的数据日志系统,记录下每次飞行中的 nav.z、原始传感器数据、PID输出和电机指令。事后在电脑上分析这些曲线,能让你更清晰地理解参数变化所产生的影响,从“凭感觉调”进化到“看数据调”。

最终,当你看到你的四轴在扰动的气流中依然能纹丝不动地悬停,那种成就感,正是嵌入式飞控开发的乐趣所在。这套融合框架的价值,就在于它提供了一种结构清晰、物理意义明确的方法,将不可靠的传感器数据,提炼为可靠的状态估计,为高性能的飞行控制打下了坚实的基础。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐