DMP с датчика MPU6000

Тема в разделе "Arduino & Shields", создана пользователем DrZ91, 13 окт 2014.

  1. DrZ91

    DrZ91 Нерд

    Добрый день форумчане!

    Я получаю очень странные значения DMP с датчика MPU-6000 InvenSense. Я не уверен, что они верны, так как модель стоит на ровной поверхности и не двигается. Код:

    Код (Text):

    Public variable:
    Code:

    // MPU6050 accel/gyro chip
    AP_InertialSensor_MPU6000 ins;

    In setup():
    Code:

      // initialise sensor fusion on MPU6050 chip (aka DigitalMotionProcessing/DMP)
      hal.console->printf("\n%.1f%%: Initialize MPU6050\n", 5.f*100.f/5.f);
      hal.scheduler->suspend_timer_procs();  // stop bus collisions
      ins.dmp_init();
      hal.scheduler->resume_timer_procs();

    In loop():
    Code:

    ins.update();

    float roll, pitch, yaw;
    ins.quaternion.to_euler(&roll, &pitch, &yaw);
    roll = ToDeg(roll);
    pitch = ToDeg(pitch);
    yaw = ToDeg(yaw);


     // DEBUGGING
    hal.console->printf("Gyro data. Pitch: %.3f, roll: %.3f, yaw: %.3f\n", pitch, roll, yaw);
    hal.scheduler->delay(500);
     
    Результат:

    Gyro data. Pitch: 0.867, roll: 0.028, yaw: 0.007
    Gyro data. Pitch: -0.230, roll: -0.308, yaw: 0.217
    Gyro data. Pitch: -1.145, roll: -0.592, yaw: 0.433
    Gyro data. Pitch: -1.905, roll: -0.829, yaw: 0.657
    Gyro data. Pitch: -2.524, roll: -1.027, yaw: 0.890
    Gyro data. Pitch: -3.038, roll: -1.198, yaw: 1.116
    Gyro data. Pitch: -3.461, roll: -1.329, yaw: 1.356
    Gyro data. Pitch: -3.807, roll: -1.446, yaw: 1.588
    Gyro data. Pitch: -4.097, roll: -1.542, yaw: 1.819
    Gyro data. Pitch: -4.330, roll: -1.625, yaw: 2.049
    Gyro data. Pitch: -4.529, roll: -1.693, yaw: 2.279
    Gyro data. Pitch: -4.678, roll: -1.755, yaw: 2.515
    Gyro data. Pitch: -4.807, roll: -1.796, yaw: 2.757
    Gyro data. Pitch: -4.922, roll: -1.830, yaw: 2.992
    Gyro data. Pitch: -5.008, roll: -1.864, yaw: 3.233
    Gyro data. Pitch: -5.088, roll: -1.884, yaw: 3.473
    Gyro data. Pitch: -5.140, roll: -1.911, yaw: 3.713
    Gyro data. Pitch: -5.192, roll: -1.930, yaw: 3.939

    Может кто сталкивался с подобным случаем. Подскажите где может быть проблема.
     
  2. ets

    ets Нерд

    Хмм, параметры изменяются почти линейно. Может, в переменных накапливается значение?

    Код (Text):
    ins.quaternion.to_euler(&roll, &pitch, &yaw);
    roll = ToDeg(roll);
    pitch = ToDeg(pitch);
    yaw = ToDeg(yaw);
    Что делают эти строки?
     
  3. DrZ91

    DrZ91 Нерд

    Я точно не знаю что делают эти строки, но покапавшись в библиотеках я понял, что в данном фрагменте кода происходит получение кватернионов(http://habrahabr.ru/post/183908/) непосредственно из DMP и перевод их в углы Эйлера.
     
  4. ets

    ets Нерд

    Попробуй каждый цикл обнулять переменные перед считыванием

    roll = 0;
    pitch = 0;
    yaw = 0;

    Если код из надёжного источника, то перепроверь подключение.
     
  5. DrZ91

    DrZ91 Нерд

    Обнуление переменных положительного результата не дало. Насчёт кода, все функции которые здесь используются есть в библиотеках Arduino, но сам код я взял из статьи одного заокеанского товарища(http://www.ghowen.me/build-your-own-quadcopter-autopilot/#toc0). У него данный фрагмент кода используется для системы стабилизации квадрокоптера.

    Кстати, такую же проблему я встречал на англоязычном форуме Arduino, правда там так и не дали ответ.