4. 加速度计原理:MEMS加速度计工作原理、加速度计输出模型、零偏与刻度因子、加速度计误差源分析

好,咱们今天聊聊加速度计。这东西在无人机里,说白了就是感知“谁朝下”和“动了没”的传感器。没有它,飞控就是瞎的。

我个人习惯把加速度计比作一个弹簧秤。你想想看,弹簧秤挂个重物,弹簧拉长了,我们就能知道重量。加速度计也是类似的道理,只不过它测的是“惯性力”。

4.1 MEMS加速度计工作原理

MEMS加速度计,核心就是一个微小的“质量块”挂在微小的“弹簧”上。当无人机加速或倾斜时,质量块会移动,改变电容值。通过测量电容变化,就能反推出加速度。

我记得刚入行时,总觉得这东西很玄乎。后来拆开一个坏掉的IMU,用显微镜看,才明白——其实就是个微米级的机械结构。

常见的MEMS加速度计有三种工作模式:

  • 电容式:利用梳齿结构,加速度改变极板间距,电容变化。精度高,功耗低,最常用。
  • 压阻式:利用硅的压阻效应,加速度改变电阻值。抗冲击好,但温漂大。
  • 热对流式:加热一个气泡,加速度使气泡偏移。便宜,但精度差,无人机上很少用。

核心要点:MEMS加速度计测的是“比力”,即物体受到的惯性力与重力的矢量和。它分不清重力与加速度。这就是为什么静止时它测到的是1g(重力加速度),而不是0。

嗯,这里要注意:加速度计不能直接给出姿态角。它只能给出“重力矢量在机体坐标系下的投影”。要得到俯仰和横滚角,还得做三角函数运算。

4.2 加速度计输出模型

加速度计的输出,不是简单的“加速度=电压×系数”。真实模型要复杂得多。我一般用这个公式:

a_meas = S · a_true + b + n + 其他误差项

其中:

  • a_meas:测量值(数字量或电压)
  • S:刻度因子矩阵(包含交叉耦合)
  • a_true:真实加速度
  • b:零偏(bias)
  • n:随机噪声

实际项目中,我通常把模型简化成:

a_meas = (1 + s) · a_true + b + n

这里的s是刻度因子误差(无量纲),b是零偏(单位m/s²或g)。

为什么会这样?因为MEMS工艺做不到绝对一致。每个芯片的弹簧刚度、质量块重量都有微小差异。这些差异就体现在零偏和刻度因子上。

4.3 零偏与刻度因子

这两个参数,是加速度计校准的核心。我每次拿到新IMU,第一件事就是标定它们。

参数 定义 典型值(消费级MEMS) 影响
零偏(Bias) 输入加速度为0时的输出值 ±50 mg(约0.5 m/s²) 导致姿态角静态误差
刻度因子(Scale Factor) 输出变化量与输入变化量的比值 ±1% 导致加速度测量比例误差
交叉耦合 一个轴的加速度在另一个轴上的串扰 ±2% 导致轴间干扰

我曾经在一个项目中,忽略了零偏校准,结果无人机悬停时一直朝一个方向飘。查了两天才发现,是加速度计零偏导致水平姿态角有0.5度的误差。嗯,从那以后,我再也不敢跳过校准步骤了。

避坑指南:零偏不是固定值。它会随温度、时间、供电电压变化。我建议每次上电后做一次静态零偏校准(静止10秒取平均)。如果要求高,还得做温度补偿。

4.4 加速度计误差源分析

加速度计的误差,我把它分成三类:确定性误差、随机误差、环境误差。

4.4.1 确定性误差

  • 零偏:可以通过六位置法标定
  • 刻度因子:可以通过转台标定
  • 交叉耦合:轴间非正交,需要矩阵补偿
  • 非线性:大加速度下输出偏离线性

4.4.2 随机误差

  • 白噪声:高频随机波动,可用低通滤波
  • 随机游走:零偏随时间缓慢漂移,需用卡尔曼滤波估计
  • 量化噪声:ADC量化带来的误差,分辨率越高越小

4.4.3 环境误差

  • 温度漂移:MEMS材料对温度敏感,典型值0.1 mg/°C
  • 振动误差:机架振动会耦合到加速度计,需做机械减振
  • 电源噪声:供电纹波会引入额外误差

你想想看,这么多误差叠加在一起,如果不做处理,飞控根本没法用。所以校准和滤波是必修课。

警告:千万不要在电机运转时做加速度计校准!振动会严重污染数据。我见过有人这么干,结果校准出来的参数全是错的,飞机一飞就翻。

4.5 加速度计误差模型框架图

下面这张图,是我自己总结的加速度计误差模型框架。它把各种误差源和补偿方法串在了一起。你保存下来,以后做校准设计时可以直接参考。

MEMS加速度计误差模型与补偿框架 真实加速度 a_true 零偏 b 刻度因子 s 交叉耦合 M 非线性 f(·) 随机噪声 n 测量值 a_meas 补偿算法 补偿后加速度 姿态解算 / 导航 图例: 确定性误差(可标定) 随机误差(需滤波) 补偿环节(软件实现) 注:虚线表示误差注入路径,实线表示信号流

这张图把整个误差模型串起来了。你看,真实加速度先被注入零偏、刻度因子、交叉耦合等确定性误差,再经过非线性环节,最后叠加上随机噪声,才得到测量值。而补偿算法的作用,就是逆向操作——从测量值中反推出真实加速度。

我个人习惯在代码里这样实现补偿:

// 加速度计补偿函数
void accel_compensate(float raw[3], float compensated[3]) {
    // 1. 减去零偏
    float tmp[3];
    for (int i = 0; i < 3; i++) {
        tmp[i] = raw[i] - bias[i];
    }
    
    // 2. 补偿刻度因子和交叉耦合(矩阵乘法)
    // scale_factor_matrix 是3x3矩阵,包含刻度因子和交叉耦合系数
    for (int i = 0; i < 3; i++) {
        compensated[i] = 0;
        for (int j = 0; j < 3; j++) {
            compensated[i] += scale_factor_matrix[i][j] * tmp[j];
        }
    }
    
    // 3. 非线性补偿(如果需要)
    // 通常在小量程下可以忽略
}

嗯,这里要注意:标定scale_factor_matrix需要六位置法或转台。我建议至少做六位置法,精度够用,成本也低。

小技巧:如果你没有转台,可以用“重力对齐法”粗略标定。把加速度计每个轴依次朝上和朝下,记录数据,就能算出零偏和刻度因子。精度虽然不如转台,但够飞控用。

好了,加速度计的原理就讲到这里。记住一句话:加速度计是飞控的“眼睛”,但它看到的画面是模糊的。校准和滤波,就是给它配一副眼镜。


公众号:蓝海资料掘金营,微信deep3321