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卡或通过串口传到地面站。
我个人习惯用以下流程:
- 设置记录参数:采样率1kHz,加速度计量程±16g,陀螺仪量程±2000°/s
- 启动记录:飞机上电后,先记录30秒静态数据(用于基线校准)
- 运行工况:在不同油门、不同姿态下记录30-60秒
- 停止记录:保存为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,说明传感器本身就有问题,或者供电纹波太大。
下面这张图展示了震动数据记录和分析的核心流程:
记录完数据后,用FFT分析频谱。如果发现某个频率的幅值异常高(比如电机转速对应的频率),那就是震动源。这时候再去调滤波器参数,才有针对性。
总结一下:震动测量不是玄学,是科学。加速度计和陀螺仪的原理搞清楚了,数据读出来了,记录方法规范了,你就能看到真实的震动情况。有了数据,后面调滤波器才有底气。