Проблемы с выводом углов. IMU-сенсор на 10 степеней свободы (Troyka-модуль)

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Vladimir_Boryushin, 11 ноя 2019.

  1. Добрый день. Такая проблема при использовании скетча из данной темы: http://wiki.amperka.ru/продукты:troyka-imu-10-dof , конкретнее : фильтр c магнитометром. Pitch(синий) дублирует показания с roll(красный), при вращении только вокруг оси Y(Скрин графика во вложении), при этом вращение вокруг оси X то есть сам pitch отображается корректно. Прошу помочь разобраться с этой проблемой.
    Код (C++):
    // библиотека для работы I²C
    #include <Wire.h>
    // библиотека для работы с модулями IMU
    #include <TroykaIMU.h>
    // множитель фильтра
    #define BETA 0.22
    // создаём объект для фильтра Madgwick
    Madgwick filter;
    // создаём объект для работы с акселерометром
    Accelerometer accel;
    // создаём объект для работы с гироскопом
    Gyroscope gyro;
    // создаём объект для работы с компасом
    Compass compass;
    // переменные для данных с гироскопа, акселерометра и компаса
    float gx, gy, gz, ax, ay, az, mx, my, mz;
    // получаемые углы ориентации (Эйлера)
    float yaw, pitch, roll;
    // переменная для хранения частоты выборок фильтра
    float fps = 100;
    // калибровочные значения компаса
    // полученные в калибровочной матрице из примера «compassCalibrateMatrixx»
    const double compassCalibrationBias[3] = {
      524.21,
      3352.214,
      -1402.236
    };
    const double compassCalibrationMatrix[3][3] = {
      {1.757, 0.04, -0.028},
      {0.008, 1.767, -0.016},
      {-0.018, 0.077, 1.782}
    };
    void setup()
    {
      // открываем последовательный порт
      Serial.begin(115200);
      Serial.println("Begin init...");
      // инициализация акселерометра
      accel.begin();
      // инициализация гироскопа
      gyro.begin();
      // инициализация компаса
      compass.begin();
      // калибровка компаса
      compass.calibrateMatrix(compassCalibrationMatrix, compassCalibrationBias);
      // выводим сообщение об удачной инициализации
      Serial.println("Initialization completed");
    }
    void loop()
    {
      // запоминаем текущее время
      unsigned long startMillis = millis();
      // считываем данные с акселерометра в единицах G
      accel.readGXYZ(&ax, &ay, &az);
      // считываем данные с гироскопа в радианах в секунду
      gyro.readRadPerSecXYZ(&gx, &gy, &gz);
      // считываем данные с компаса в Гауссах
      compass.readCalibrateGaussXYZ(&mx, &my, &mz);
      // устанавливаем коэффициенты фильтра
      filter.setKoeff(fps, BETA);
      // обновляем входные данные в фильтр
      filter.update(gx, gy, gz, ax, ay, az, mx, my, mz);
      // получение углов yaw, pitch и roll из фильтра
      yaw =  filter.getYawDeg();
      pitch = filter.getPitchDeg();
      roll = filter.getRollDeg();
      // выводим полученные углы в serial-порт
    // Serial.print("yaw: ");
    // Serial.print(yaw);
      Serial.print("\t\t");
      Serial.print("pitch: ");
      Serial.print(pitch);
      Serial.print("\t\t");
      Serial.print("roll: ");
      Serial.println(roll);
      // вычисляем затраченное время на обработку данных
      unsigned long deltaMillis = millis() - startMillis;
      // вычисляем частоту обработки фильтра
      fps = 1000 / deltaMillis;
    }
    graph.jpg