MPU6050: Настройка выходного диапазона гироскопа для позиционного чтения
Я использую MPU6050 в сочетании с Arduino и библиотекой i2cdev Джеффа Роуберга, и мой проект требует, чтобы выходные данные скорости гироскопа были более точными, чем настройка по умолчанию, которая составляет 1/16,4 градуса (+/-2000 градусов). /сек диапазон). Выходы гироскопа можно изменить с помощью mpu.setFullScaleGyroRange(uint8_t range)
, для которого я передал MPU6050_GYO_FS_500
для диапазона, чтобы получить более высокую точность
В этом проекте мне также нужна позиция YPR, которую я получаю с помощью mpu.dmpGetQuaternion(&q, fifoBuffer)
и mpu.dmpGetGravity(&gravity, &q )
и mpu.dmpGetYawPitchRoll(ypr, &q, &gravity)
.
Проблема заключается в новом диапазоне выходного сигнала гироскопа: положение YPR резко меняется, когда MPU вращается, и снова медленно догоняет его, когда MPU удерживается неподвижно. Я думаю, что есть ошибка в фильтре, который объединяет данные гироскопа и ускорения, что делает гироскоп слишком чувствительным. Может быть, DMP делит данные скорости гироскопа на коэффициент чувствительности по умолчанию (16,4), а не на новый (131)?
Как быстро получить точные показания YPR?
Вот скриншот данных. Ось не помечена, но ось X представляет примерно 16 секунд времени. Синяя линия — это данные о скорости гироскопа, а розовая линия — это положение поворота MPU. На графике показаны два оборота MPU.
@Ember, 👍1
1 ответ
У нас была та же проблема, похоже, что код DMP MPU6050 работает так, как только вы меняете шкалы акселерометра и гироскопа.
Работает лучше, если вы используете настройки масштабирования +-2000 град/сек и +-2g.
mpu.setFullScaleGyroRange(MPU6050_GYRO_FS_2000);
mpu.setFullScaleAccelRange(MPU6050_ACCEL_FS_2);
Проблема заключается в том, как внутренняя логика "DMP" объединяет данные, я полагаю, что у нее есть "константы", настроенные только для этих параметров.
Если вам нужны как данные об "измененных настройках", так и данные о "рыскании\тангаже\крене", вы можете реализовать объединение данных датчиков самостоятельно или использовать существующие библиотеки.
Самое простое, что я могу предложить, это реализовать дополнительный фильтр. Более сложным, но точным будет использование фильтра Калмана, все зависит от времени и терпения, которые у вас есть на изучение этих тем :)
- Как подключить вывод INT MPU 6050?
- Как очистить буфер FIFO на MPU6050?
- Как сгенерировать аппаратное прерывание в mpu6050 для пробуждения Arduino из режима SLEEP_MODE_PWR_DOWN?
- MPU6050 не работает
- Понимание того, почему следует избегать «String» и альтернативных решений
- Объяснение кода MPU6050
- Как подключить MPU9250 к NodeMCU с помощью SPI или I2C Slave?
- Линейное ускорение от MPU 6050