陀螺仪的理解MPU6050
自从看到四轴飞行器就一直想自己做一个,于是参考和查看各种资料,其中姿态解算应该是其中很重要一部分,其中涉及到四元数和各种算法(如数据融合:梯度下降,卡尔曼滤波,互补滤波等等),另外就是传感器了,基本的9轴包含(加速度传感器3轴,陀螺仪3轴,电子罗盘3轴)还有气压传感器。
今天将自己对陀螺仪的一些理解记录下来,以助于自己今后查看和各位有相同爱好的同学参阅
陀螺仪大概也看了2天左右,我用的是MPU6050,关于MPU6050 其中包含了加速度传感器和陀螺仪两部分,MPU6050有库文件,用起来还是比较方便的。
关于陀螺仪部分MPU6050主要提供了3组数据,分别代表X轴,Y轴,Z轴的角速度
MPU6050ReadBuffer(MPU6050_DEFAULT_ADDRESS,MPU6050_RA_ACCEL_XOUT_H,14,mpu6050_buffer);//读ADC寄存器
MPU6050_GYRO.X=((((int16_t)mpu6050_buffer[8]) << 8) | mpu6050_buffer[9]) - GYRO_OFFSET_X; //6050数据减去稳态误差
MPU6050_GYRO.Y=((((int16_t)mpu6050_buffer[10]) << 8) | mpu6050_buffer[11]) - GYRO_OFFSET_Y;
MPU6050_GYRO.Z=((((int16_t)mpu6050_buffer[12]) << 8) | mpu6050_buffer[13]) - GYRO_OFFSET_Z;
GYRO_F.X = MPU6050_GYRO.X / GYRO_Sensitivity; //算出角速度
GYRO_F.Y = MPU6050_GYRO.Y / GYRO_Sensitivity;
GYRO_F.Z = MPU6050_GYRO.Z / GYRO_Sensitivity;
Gx = GYRO_F.Y * Angle_intervals/1000; //算出陀螺仪角度变化 Angle_intervals为10
Gy = -GYRO_F.X * Angle_intervals/1000;
Gz = GYRO_F.Z * Angle_intervals/1000;
Gry_angle_n_Ax = Gry_angle_Ax; //积分所得到后的角度
Gry_angle_Ax = Gry_angle_n_Ax + Gx;
Gry_angle_n_Ay = Gry_angle_Ay;
Gry_angle_Ay = Gry_angle_n_Ay + Gy;
Gry_angle_n_Az = Gry_angle_Az;
Gry_angle_Az = Gry_angle_n_Az + Gz;
由上面的代码可以看出每次读取的数据都要减去一个稳态值,稳态值和陀螺仪当前的倾斜度无关,也就是说无论陀螺仪是正的放,斜的放,竖着放都没有关系,它只表示陀螺仪静止时三个轴的输出值。这里可以看出只有当陀螺仪动起来输出的数据才会发生改变。那么话句话说陀螺仪是测量瞬时运动的。
既然是瞬时量那么就会涉及到积分,这里Angle_intervals是10ms,在陀螺仪运动时,可以知道陀螺仪各个轴的角速度,然后通过积分就可以算出陀螺仪角度的变化,最后将上一次的角度在加上这一次的角度变化,就得到了最终的角度。
当陀螺仪静止时 测得数据 = GYRO_OFFSET 所以MPU6050_GYRO = 0,则最终的角度等于上一次的角度。
GYRO_Sensitivity 表示测量数据和角速度的关系 LSB/度/秒
这段程序的误差主要来自积分,也就是说每次运行这段程序的间隔必须要准确,不然误差是会累积的。
当然通常是要用加速度计来修正这个误差的,目前我是想通过卡尔曼滤波的方法来进行修正。
赞() |