2. 震动测量:加速度计原理、陀螺仪原理、IMU数据读取、震动数据记录方法

好,咱们进入正题。震动测量这件事,说白了就是搞清楚你的无人机到底在抖什么。我见过太多飞友,一上来就调PID,结果调了半天发现是震动太大,传感器数据全是噪声。嗯,这步走错了,后面全是白费功夫。

2.1 加速度计原理

加速度计测量的是比力,不是单纯的重力加速度。这个概念我当年也绕了很久。简单说,它测的是「物体受到的惯性力与重力的合力」。

常见的MEMS加速度计内部有个微小的质量块,固定在弹簧结构上。当无人机加速时,质量块会偏移,电容值发生变化,通过测量电容变化就能反推出加速度。

关键点:加速度计在静止时测量的是重力加速度g(9.8m/s²),在运动时测量的是运动加速度与重力的矢量和。

我在项目中遇到过一个问题:飞机悬停时加速度计Z轴读数不是9.8,而是9.5左右。排查了半天,发现是减震海绵压得太紧,导致传感器感受到了额外的应力。嗯,机械安装也会影响读数,这个坑大家要注意。

2.2 陀螺仪原理

陀螺仪测量的是角速度,单位是°/s。MEMS陀螺仪利用的是科里奥利效应——一个振动的质量块在旋转时会产生垂直于振动方向的位移。

说白了,就是让一个质量块高速振动,然后检测它有没有被「带偏」。偏了多少,就对应转得有多快。

传感器 测量量 单位 常见量程
加速度计 比力(加速度) m/s² 或 g ±2g ~ ±16g
陀螺仪 角速度 °/s ±250 ~ ±2000°/s

我的习惯:多旋翼一般用±2000°/s量程,固定翼可以用±500°/s。量程越小,分辨率越高,但容易饱和。

2.3 IMU数据读取

IMU(惯性测量单元)通常把加速度计和陀螺仪封装在一起,有的还带磁力计。读取IMU数据,最常用的就是I2C和SPI两种接口。

我个人更推荐SPI,速度快、延迟低。I2C虽然接线少,但在高速读取时容易受干扰。你想想看,飞控在高速运算时,I2C总线上的数据包一旦被中断,整个姿态估计就会抖一下。

下面是一个典型的MPU6000读取代码片段(SPI模式):

// MPU6000 SPI读取示例
uint8_t mpu_read_byte(uint8_t reg) {
    uint8_t data;
    CS_LOW();
    spi_transfer(reg | 0x80);  // 读操作
    data = spi_transfer(0x00);
    CS_HIGH();
    return data;
}

// 读取加速度计和陀螺仪数据
void mpu_read_all(float* accel, float* gyro) {
    uint8_t buf[14];
    CS_LOW();
    spi_transfer(MPU6000_ACCEL_XOUT_H | 0x80);
    for (int i = 0; i < 14; i++) {
        buf[i] = spi_transfer(0x00);
    }
    CS_HIGH();
    
    // 解析数据(注意字节序)
    accel[0] = (int16_t)(buf[0] << 8 | buf[1]) * ACCEL_SCALE;
    accel[1] = (int16_t)(buf[2] << 8 | buf[3]) * ACCEL_SCALE;
    accel[2] = (int16_t)(buf[4] << 8 | buf[5]) * ACCEL_SCALE;
    gyro[0]  = (int16_t)(buf[8] << 8 | buf[9]) * GYRO_SCALE;
    gyro[1]  = (int16_t)(buf[10] << 8 | buf[11]) * GYRO_SCALE;
    gyro[2]  = (int16_t)(buf[12] << 8 | buf[13]) * GYRO_SCALE;
}

注意:读取IMU数据时,一定要检查数据就绪标志(DRDY),不要盲目读取。我曾经遇到过SPI时钟线接触不良,读出来的数据全是0xFF,飞控直接翻车。

2.4 震动数据记录方法

震动数据怎么记?最直接的方法是把原始IMU数据以最高速率(通常1kHz)写入SD卡或通过串口传到地面站。

我个人习惯用以下流程:

  1. 设置记录参数:采样率1kHz,加速度计量程±16g,陀螺仪量程±2000°/s
  2. 启动记录:飞机上电后,先记录30秒静态数据(用于基线校准)
  3. 运行工况:在不同油门、不同姿态下记录30-60秒
  4. 停止记录:保存为CSV或BIN格式

数据格式建议这样:

// CSV格式示例
timestamp_ms, accel_x, accel_y, accel_z, gyro_x, gyro_y, gyro_z
0, 0.12, -0.05, 9.81, 0.01, -0.02, 0.00
1, 0.13, -0.04, 9.80, 0.02, -0.01, 0.01
2, 0.11, -0.06, 9.82, 0.00, -0.03, 0.00
...

避坑指南:我曾经用ArduPilot的日志功能直接记录,结果发现日志采样率被降到了100Hz,高频震动信息全丢了。后来我改用Pixhawk的debug输出口,直接以1kHz速率输出原始数据,才抓到真正的震动特征。

为什么要记录静态数据?因为你可以用它来评估传感器的本底噪声。如果静态时加速度计噪声超过0.1g,说明传感器本身就有问题,或者供电纹波太大。

下面这张图展示了震动数据记录和分析的核心流程:

震动数据记录与分析流程 加速度计/陀螺仪 原始模拟信号 ADC采样 1kHz采样率 SPI/I2C读取 DRDY触发 SD卡/串口 CSV/BIN格式 FFT分析 频谱特征提取 滤波器配置 截止频率确定 迭代优化 关键:静态基线数据(30s)→ 工况数据(60s)→ FFT分析 → 滤波器参数确定

记录完数据后,用FFT分析频谱。如果发现某个频率的幅值异常高(比如电机转速对应的频率),那就是震动源。这时候再去调滤波器参数,才有针对性。

总结一下:震动测量不是玄学,是科学。加速度计和陀螺仪的原理搞清楚了,数据读出来了,记录方法规范了,你就能看到真实的震动情况。有了数据,后面调滤波器才有底气。

专注资料整理