Акселерометр расчет

Я не могу найти, что здесь не так в этом коде. Я пытаюсь получить данные акселерометра, но когда я пытаюсь запустить его на устройстве, которое работает, но не правильное чтение, я думаю, что проблема в вычислениях, та же логика, которую я использовал для гироскопа и взял правильное чтение, но отображается вывод акселерометра Accelx :3.56023e-09 Accely :1.76423e-42 Accelz :1.77404e-42

    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;

Файл dmpmpu_demo для Accel X:

float DmpMPU6050_Demo::Loop_Accelx()
{
if (!dmpReady)
{
return 1;
}

fifoCount = mpu.getFIFOCount();

if (fifoCount == 1024)
{
mpu.resetFIFO();
printf("FIFO overflow!\n");
}

else if (fifoCount >= 42 )
{
mpu.getFIFOBytes(fifoBuffer, packetSize);

#ifdef OUTPUT_READABLE_REALACCEL

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

#endif

printf("\n");

}

}

1

Решение

Вы должен чувствовать гравитационное ускорение Земли. Это означает, что вертикальный компонент вектора, который вы получаете, должен быть четко определен, и вы получите вектор, который явно является нулевым вектором. Это неверно и указывает на то, что вы не получаете правильные значения от акселерометра. Проверь это.

В следующий раз будет лучше опубликовать полный код, так как глобальный accelX, accelY а также accelZ декларации нигде не встречаются в вашем коде, что может быть источником проблем … У нас нет также определений accelerometer->LoopAccel...() прототипы.

И наконец, не встряхивайте, чтобы ощутить данные как было сказано в комментариях. Акселерометры чувствуют гравитационное притяжение Земли, и вы можете просто изменить ее ориентацию, чтобы увидеть изменение вектора ускорения.

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
0

По вопросам рекламы [email protected]