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 加速度计误差模型框架图
下面这张图,是我自己总结的加速度计误差模型框架。它把各种误差源和补偿方法串在了一起。你保存下来,以后做校准设计时可以直接参考。
这张图把整个误差模型串起来了。你看,真实加速度先被注入零偏、刻度因子、交叉耦合等确定性误差,再经过非线性环节,最后叠加上随机噪声,才得到测量值。而补偿算法的作用,就是逆向操作——从测量值中反推出真实加速度。
我个人习惯在代码里这样实现补偿:
// 加速度计补偿函数
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