陀螺仪是无人机惯导系统最基本的组成元件之一,通过对陀螺仪输出的角速度进行积分,能够获得无人机的姿态角信息;在兴趣爱好的驱动下,近来购买了MPU-6050相关模块,通过串口把测试结果传输到电脑端,实现了位姿信号的采集,具体如下图所示:
MPU6050是一种非常流行的空间运动传感器芯片,可以对传感器当前三个加速度分量和三个旋转角速度进行采集。其中,上图中前三个数据分别表述为传感器x,y,z方向的加速度,后三个数据分别表述为传感器绕x,y,z轴的角速度,若mpu-6050设定的加速度倍率为2g,角速度倍率为1000°/s,那么加速度和角加速度的计算公式为:
a x = A C C _ X / 32768 × 2 g {a_x} = ACC\_X/32768 \times 2g ax=ACC_X/32768×2g g x = G R Y _ X / 32768 × 1000 {g_x} = GRY\_X/32768 \times 1000 gx=GRY_X/32768×1000
MPU-6050整合了三轴陀螺仪和三轴加速度计,分别用三个16位的ADC,将其测量的模拟量信号转化为可输出的数字量;其中,陀螺仪的测试范围为±250,±500,±1000, ±2000°/秒( dps),能够对快速和慢速运动的物体实现精确跟踪;加速度计的测试范围为±2, ±4,±8, ±16g(传感器的测量范围可以通过程序进行控制)。
图a表述为mpu-6050实物图,模块的大小与指甲盖相差不大,具体为2cm*1.5cm;图b表述为mpu-6050坐标系定义的方式;图c表述为该模块的原理图,测试过程中,VCC、GND、SCL以及SDA分别与单片机相应的引脚相连接。
mpu-6050每隔一段时间采集一次传感器的状态信息,通过延时函数实现该功能,本实例中采用的程序源码如下所示(部分),其中,delay(2000)表述为延时0.4s,即陀螺仪每秒钟输出2-3个数据点:
void main()
{
delay(500); //上电延时
init_uart();
InitMPU6050(); //初始化MPU6050
delay(150);
while(1)
{
SeriPushSend('A');
SeriPushSend(0x20);SeriPushSend('X'); SeriPushSend(':');
Display10BitData(GetData(ACCEL_XOUT_H)); //显示X轴加速度
SeriPushSend(0x20);SeriPushSend('Y'); SeriPushSend(':');
Display10BitData(GetData(ACCEL_YOUT_H)); //显示Y轴加速度
SeriPushSend(0x20);SeriPushSend('Z'); SeriPushSend(':');
Display10BitData(GetData(ACCEL_ZOUT_H)); //显示Z轴加速度
SeriPushSend(0x20);
SeriPushSend('G');
SeriPushSend(0x20);SeriPushSend('X'); SeriPushSend(':');
Display10BitData(GetData(GYRO_XOUT_H)); //显示X轴角速度
SeriPushSend(0x20);SeriPushSend('Y'); SeriPushSend(':');
Display10BitData(GetData(GYRO_YOUT_H)); //显示Y轴角速度
SeriPushSend(0x20);SeriPushSend('Z'); SeriPushSend(':');
Display10BitData(GetData(GYRO_ZOUT_H)); //显示Z轴角速度
SeriPushSend(0x0d);
SeriPushSend(0x0a);//换行,回车
delay(2000);
}
}
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++);
}
}
附1:研究表明,陀螺仪具有十分精确的短时定位精度,然而长时间工作时产生的累计误差会导致定位精度出现较大的偏差,后续可以通过多源信息融合解决该问题。
附2、前段时间完成传感器信号采集系统的搭建,具体见推文:数据采集系统实际测试效果,在此基础上能够很容易将传感器(陀螺仪等)应用到实际中,~