Я не могу найти, что здесь не так в этом коде. Я пытаюсь получить данные акселерометра, но когда я пытаюсь запустить его на устройстве, которое работает, но не правильное чтение, я думаю, что проблема в вычислениях, та же логика, которую я использовал для гироскопа и взял правильное чтение, но отображается вывод акселерометра 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");
}
}
Вы должен чувствовать гравитационное ускорение Земли. Это означает, что вертикальный компонент вектора, который вы получаете, должен быть четко определен, и вы получите вектор, который явно является нулевым вектором. Это неверно и указывает на то, что вы не получаете правильные значения от акселерометра. Проверь это.
В следующий раз будет лучше опубликовать полный код, так как глобальный accelX
, accelY
а также accelZ
декларации нигде не встречаются в вашем коде, что может быть источником проблем … У нас нет также определений accelerometer->LoopAccel...()
прототипы.
И наконец, не встряхивайте, чтобы ощутить данные как было сказано в комментариях. Акселерометры чувствуют гравитационное притяжение Земли, и вы можете просто изменить ее ориентацию, чтобы увидеть изменение вектора ускорения.
В файле 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