1.4陀螺仪简介
这个东西是基于角动量守恒的理论 用来感测和维持方向的装置,主要的构成是位于轴心 且可以旋转的转子构成.由于转子的角动量守恒.所以陀螺仪一旦开始旋转.则有抗拒方向改变的趋向.
定轴陀螺仪
偏轴陀螺仪
陀螺仪多用于惯性导航系统,一般情况下陀螺仪可用于陀螺罗盘以辅助或取代磁罗盘,或作为惯性导航系统的一部分。
探测位置偏差
陀螺仪通过测量旋转的惯性元件产生的力矩来感知设备的旋转速率和方向。这个力矩与旋转速率成正比,并且垂直于旋转轴。通过测量这个力矩,陀螺仪可以确定设备的旋转速率。
陀螺仪的输出通常是一个连续变化的电压信号或者数字信号,表示设备的旋转速率。通过积分这个信号,可以得到设备相对于初始位置的角度变化。
MEMS陀螺仪
MEMS陀螺仪使用了不同的工作原理。传统的陀螺仪是一个不停转动的物体,其转轴的指向不随承载它的支架旋转而变化。MEMS陀螺仪在基于传统陀螺仪特性的基础上利用科里奥利力来实现了设备的小型化。MEMS陀螺仪利用科里奥利力(旋转物体在径向运动时所受到的切向力),旋转中的陀螺仪可对各种形式的直线运动产生反映,通过记录陀螺仪部件受到的科里奥利力可以进行运动的测量与控制.
科里奥利力
科里奥利力是对旋转体系中进行运动的质点由于惯性相对于旋转体系产生偏移的现象的表述(看不懂吧 ? 我也懵 )
首先对于地(我们的视角而言)竖直抛出一个物体 物理会沿着直线前进.如上图的图一.但是如果以旋转的圆而言 物体的轨迹是第二个图 .类比于下图:
进行受力分析:
此时这个F. 即是所说的科里奥利力(第一次 我自己认为是科里奥利给)但是只存在于非惯性系统之中.(惯性系可以简单说成是相对地面静止的或者做匀速直线运动的参考系,而非惯性系则是相对地面做加速或者减速运动的参考系)
计算公式为:
陀螺仪信号分析
设置MPU6050的陀螺仪量程为2000dps,在四轴飞行器水平静止在地面上(电机不转)时,通过IIC总线读取出陀螺仪的三个姿态角速度,并通过串口发送到PC端.在主程序硬件初始化完成后调用:
void MPU6050_RawDataOutput(void) { u8 i; s16 main_acc_adc[3]; s16 main_gyr_adc[3]; float main_acc_raw[3]; float main_gyr_raw[3]; while (1) // Software Calc { MPU6050_ReadAcc(main_acc_adc); MPU6050_ReadGyr(main_gyr_adc); for (i = 0; i < 3; i++) { main_acc_raw[i] = (float) main_acc_adc[i] * IMU_ACC_SCALE * IMU_CONSTANTS_ONE_G; main_gyr_raw[i] = (float) main_gyr_adc[i] * IMU_GYR_SCALE * M_PI / 180.0F; // printf("acc_adc: %.8f gyro_adc: %.8f\r\n", // main_acc_adc[i], main_gyro_adc[i]); // printf("acc_raw: %.8f gyro_raw: %.8f\r\n", // main_acc_raw[i], main_gyr_raw[i]); } printf("%.8f %.8f %.8f %.8f\r\n", Delay_GetRuntimeMs() / 1000.0F, main_gyr_raw[0], main_gyr_raw[1], main_gyr_raw[2]); } }
考虑到MPU6050的ADC建立稳定的采样需要时间,所以这里只截取使用3.86s~7.79s共616组数据,最后调用Matlab绘图得到原始姿态角数据随时间变化的曲线。以下是Matlab绘图程序:
clear all; clc; data2=load('./MPU6050_RawGyroData.txt'); x=data2(:,1); y1=data2(:,2); y2=data2(:,3); y3=data2(:,4); subplot(3, 1, 1); plot(x,y1); xlabel('t/s'); ylabel('Amplitude/LSB'); title('GYRO X Axis'); subplot(3, 1, 2); plot(x,y2); xlabel('t/s'); ylabel('Amplitude/LSB'); title('GYRO Y Axis'); subplot(3, 1, 3); plot(x,y3); xlabel('t/s'); ylabel('Amplitude/LSB'); title('GYRO Z Axis');
最后得到的姿态角曲线如下所示:
分析上述曲线可发现四轴飞行器水平静止在地面上(电机不转)时,各轴输出的波动较小,均小于正负0.03LSB(
LSB(最低有效位)是指传感器输出的最小变化单位)
。但是不难发现X、和Z轴数据均为正值,且分别在2*10-3LSB
和6.5*10-3LSB
附近波动,而Y轴数据均为负值,且-0.0255LSB
附近波动,然而正常状态下输出的数据应该在0附近波动。出现这个问题实际上是因为MPU6050在输出数据时没有经过初始偏差矫正,存在一个常值误差,发生了 “角速率零点漂移” 现象。此时只要每次在采样数据时减去这个常值误差即可。如果细心的话还会发现各个轴信号波峰和波谷在波形中所占比例是不同的,比如Y轴波峰所占比例就更大一些,这样对该角速率的积分会随着时间的增加而偏向于一个方向增加。这就是陀螺仪的 “积分漂移” 现象,而波形中的波峰和波谷所占比例不同是硬件存在的固有问题,没法通过软件消除。所以陀螺仪数据在未经过其他数据补偿校正的情况下只能在短时间内使用,否则最终计算出的误差会很大。
以上是在四轴飞行器没有电机振动干扰的情况下得到的结果,但在实际的飞行过程中,高速转动的电机所带来的机体振动会给陀螺仪带来严重的噪声干扰。为了分析电机振动对姿态数据的影响,在保持采样配置相同的情况下,使四轴飞行器静止在水平面,但电机处于怠速运转状态。使用void MPU6050_RawDataOutput(void)
函数串口输出数据并调用Matlab程序绘图。这里截取3.87s~12.68s之间的1354组数据进行处理,为了分析信号的频域特性,对采样的信号进行FFT变换(快速傅里叶变换),绘制出频谱图。最后得到的波形如下:
分析上述时域波形确实可以看到电机的高速转动所产生的振动使得陀螺仪输出数据的波动幅度相比电机不转时的更大,大约有0.2LSB
。由频域波形可以看到在500Hz~900Hz之间存在高频振动,而四轴飞行器是静止在水平面上的,不可能产生高频的信号,所以可知该信号只可能对应于电机和桨叶的高速旋转所带来的高频振动。
加速度计信号分析
设置MPU6050加速度的量程为8g(4096LSB/g),在四轴飞行器水平静止在地面上(电机不转)时,调用void MPU6050_RawDataOutput(void)
串口输出加速度在三个轴上的分量值,这里截取3.87s~7.89s间的587组数据并调用Matlab绘图。最后得到的加速度分量波形如下所示:
分析上述波形后可发现,由于四轴飞行器没有完全水平放置在地面上,所以X和Y轴的输出没有在0附近波动,Z轴也没有在1g(9.8m/s^2)
附近波动。而且加速度计对微小振动非常敏感,即使没有电机振动,输出也会有一定的波动,但是波动幅值小于0.05g
,对姿态的解算影响不大。然而当四轴飞行器水平放置地面并同时开启电机怠速转动时,截取串口从3.86s~12.68s之间发来的共1310组数据并调用Matlab绘图处理.最后得到的波形如下:
由上述波形可见加速度输出信号中存在大量的干扰噪声,其幅值最高可达1.5g/(m/s^2)
,已经将真实信号完全掩盖了,这样的信号是没法直接使用的。(下一文章是滤波)