陀螺仪 MPU6050 解决不同方式安装(基于STM32库函数)


1、背景

    1、MPU6050等相关陀螺仪/惯性传感器(姿态传感器/角度传感器)默认情况下是需要水平放置安装。如图1所示,本次将陀螺仪水平安装在PCB底板上。其中,陀螺仪自身的 x-y轴 已在其模块上标记出,其z轴由右手定则可得到(食指沿着x轴,中指沿着y轴,则z轴沿着大拇指指向)

android开发 陀螺仪 安卓虚拟陀螺仪安装_库函数

android开发 陀螺仪 安卓虚拟陀螺仪安装_库函数_02

    

    图1中,陀螺仪的x-y-z轴与PCB底板的xs-ys-zs轴一致。此情况下,陀螺仪的所受重力方向为z轴负方向;我们通过陀螺仪自带DMP库得到的欧拉角可以如下表示:

    ①沿y轴旋转,为pitch(俯仰)角度

android开发 陀螺仪 安卓虚拟陀螺仪安装_方向更改_03


    ②沿x轴旋转,为roll(横滚)角度

android开发 陀螺仪 安卓虚拟陀螺仪安装_MPU6050_04


    ③沿z轴旋转,为yaw(航向)角度

android开发 陀螺仪 安卓虚拟陀螺仪安装_库函数_05



    2、以正点原子STM32的教学源码——“实验32 MPU6050六轴传感器实验”源码为例:图2为方向设置,图3为重力方向设置。

android开发 陀螺仪 安卓虚拟陀螺仪安装_MPU6050_06


android开发 陀螺仪 安卓虚拟陀螺仪安装_MPU6050_07



    ①方向设置:

android开发 陀螺仪 安卓虚拟陀螺仪安装_android开发 陀螺仪_08


    ②重力设置:

1. 重力沿 z轴
    /* Don't remove gravity! */
    if (accel[2] > 0L)      0是x轴,1是y轴,2是z轴,DMP默认程序写的是accel[2],
        accel[2] -= 65536L;  所以只能通过将芯片水平放置让z轴和G重合才能让 mpu_run_self_test 函数自检成功
    else
        accel[2] += 65536L;
2.重力沿 x轴
    if (accel[0] > 0L)  
        accel[0] -= 65536L;  
    else
        accel[0] += 65536L;
       
3.重力沿 y轴
    if (accel[0] > 0L)  
        accel[0] -= 65536L;  
    else
        accel[0] += 65536L;


2、需求与解决

    1、需求:需要将陀螺仪随着底板PCB垂直安装。①PCB底板的 zs轴与陀螺仪x轴重合(标记zs’,之前PCB底板的xs轴与陀螺仪x轴重合),此时 zs 对应 -x;②PCB底板的y轴与陀螺仪y轴重合(与之前相同),此时 ys 对应 y;③PCB底板的zx轴与陀螺仪z轴与重合,此时 zx 对应 z;④重力方向与陀螺仪x轴正方向重合。因此陀螺仪的方向应设置如下:

陀螺仪方向设置
默认方向
static signed char gyro_orientation[9] = { 1, 0, 0,
                                           0, 1, 0,
                                           0, 0, 1};
                                           
1.将默认方向更改为:系统方向与 x-y-z不同;  系统 xs 为 z , 系统 ys 为 y ,系统  zs 为 -x
static signed char gyro_orientation[9] = { 0, 0, 1,   
                                           0, 1, 0,
                                          -1, 0, 0};

android开发 陀螺仪 安卓虚拟陀螺仪安装_陀螺仪_09



    2、问题解决:

    ①代码更改内容:

第一步:更改重力方向
static int get_st_biases(long *gyro, long *accel, unsigned char hw_test)
{
	...
	...
	/* Don't remove gravity! */ // 调整重力方向
    if (accel[0] > 0L)        0是x轴,1是y轴,2是z轴,DMP默认程序写的是accel[2],
        accel[0] -= 65536L;   所以只能通过将芯片水平放置让z轴和G重合才能让mpu_run_self_test函数自检成功
    else
        accel[0] += 65536L;
    ...
}

第二步:更改陀螺仪方向
//  系统方向与 x-y-z不同;  系统 xs 为 z , 系统 sy 为 y ,系统  sz 为 -x
static signed char gyro_orientation[9] = { 0, 0, 1,   
                                           0, 1, 0,
                                          -1, 0, 0};


    ②更改之后效果:之前陀螺仪的z轴转动yaw航向角,现在已经变更为新的roll横滚角;从而满足垂直安装在机构上的需求。

android开发 陀螺仪 安卓虚拟陀螺仪安装_陀螺仪_10