加速度计计算

时间:2016-08-31 14:39:37

标签: c++ qt-creator accelerometer raspberry-pi2 gyroscope

我在这段代码中找不到什么问题。我正在尝试获取加速度计数据,但是当我尝试在设备上运行时,这是工作但不是正确的读数我认为计算中的问题,我用于陀螺仪的相同逻辑并采取适当的读数但加速度计输出显示{{1 }}

Accelx :3.56023e-09  Accely :1.76423e-42  Accelz :1.77404e-42

accel x的dmpmpu_demo文件:

    accelX = accelerometer->Loop_Accelx();
    accelY = accelerometer->Loop_Accely();
    accelZ = accelerometer->Loop_Accelz();

    for(int i = 0; i<2; i++) //averaging of accelerometer data upto 3 readings
    {
        float accelX1 = accelerometer->Loop_Accelx(); //storing the Accelx value from DmpMPU6050_Demo class
        float accelY1 = accelerometer->Loop_Accely(); //storing the Accely value from DmpMPU6050_Demo class
        float accelZ1 = accelerometer->Loop_Accelz(); //storing the Accelz value from DmpMPU6050_Demo class

        accelX = accelX + accelX1;
        accelY = accelY + accelY1;
        accelZ = accelZ + accelZ1;

        delay(1);
    }

    accelX = accelX/3;
    accelY = accelY/3;
    accelZ = accelZ/3;

    if(numbercount == number){

    emit Accelx_Data(accelX);
    emit Accely_Data(accelY);
    emit Accelz_Data(accelZ);

    cout<<"Accelx :"<<accelX<<"  Accely :"<<accelY<<"  Accelz :"<<accelZ<<endl;

2 个答案:

答案 0 :(得分:0)

必须感知地球的重力加速度。这意味着你得到的矢量的垂直分量必须清楚地定义,你得到的矢量显然是零矢量。这是错误的,表示您没有从加速度计获得正确的值。检查一下。

下次发布完整代码会更好,因为代码中的任何地方都看不到全局accelXaccelYaccelZ声明,实际来源可能是什么问题......我们还没有accelerometer->LoopAccel...()原型的定义。

最后,不要像评论中所说的那样动摇它来感知数据。加速度计感知地球的引力,你可以改变它的方向,看看加速度矢量的变化。

答案 1 :(得分:0)

在dmpmpu.cpp文件中我添加了返回

    #ifdef OUTPUT_READABLE_REALACCEL

    mpu.dmpGetQuaternion(&q, fifoBuffer);
    mpu.dmpGetAccel(&aa, fifoBuffer);
    mpu.dmpGetGravity(&gravity, &q);
    mpu.dmpGetLinearAccel(&aaReal, &aa, &gravity);

    return 3;
    #endif

    printf("\n");

用于计算没有数字计数的Accelero值

        accelX = accelerometer->Loop_Accelx();
    accelY = accelerometer->Loop_Accely();
    accelZ = accelerometer->Loop_Accelz();

    for(int i = 0; i<2; i++) //averaging of accelerometer data upto 3 readings
    {
        float accelX1 = accelerometer->Loop_Accelx(); //storing the Accelx value from DmpMPU6050_Demo class
        float accelY1 = accelerometer->Loop_Accely(); //storing the Accely value from DmpMPU6050_Demo class
        float accelZ1 = accelerometer->Loop_Accelz(); //storing the Accelz value from DmpMPU6050_Demo class

        accelX = accelX + accelX1;
        accelY = accelY + accelY1;
        accelZ = accelZ + accelZ1;

        delay(1);
    }

    accelX = accelX/ 0.16384;
    accelY = accelY/ 0.16384;
    accelZ = accelZ/ 0.16384;

最后我得到了像

这样的输出
yaw :8.3854  pitch :8.3854  roll :8.3854
Accelx :54.9316  Accely :54.9316  Accelz :54.9316
yaw :-5.5964  pitch :-5.5964  roll :-5.5964
Accelx :42.7246  Accely :36.6211  Accelz :30.5176
yaw :-129.255  pitch :-129.255  roll :-91.2928
Accelx :36.6214  Accely :48.8281  Accelz :30.5176