Получение стабильных измерений с помощью ИДУ BNO055
Я купил BNO055 "умный" IMU от Adafruit, думая, что это будет простой способ получить данные ориентации для небольшого проекта мобильного робота, но я нашел эту вещь очень трудной в использовании и почти бесполезной.
Он рекламируется как возможность автоматической калибровки, и хотя он пытается сделать это, я обнаружил, что калибровка не выполняется. Он постоянно перекалибрует себя и либо застревает в состоянии ошибки, либо находит успешную калибровку...но затем теряет его через несколько секунд.
Есть ли что-нибудь, что я могу сделать, чтобы улучшить его стабильность? Нужно ли монтировать его внутри специального заземленного корпуса? Есть ли какое-то особое заклинание, которое я должен произнести, прежде чем включить его?
Я читаю его с Arduino Uno через I2C, и хотя проводка и программирование относительно просты, получить его калибровку и оставаться калиброванным я обнаружил, что это почти невозможно.
Даже после того, как флаг "система" говорит о своей полной калибровке, и у меня ИДУ просто сидит на столе, не двигаясь, через минуту он теряет свою "систему" калибровки. Акселерометр, гриоскоп и магнитометр обычно остаются откалиброванными, но как я могу доверять им, если бортовой алгоритм слияния сообщает, что он не готов?
Если BNO055-проигранное дело, есть ли что-нибудь лучше? Я пробовал несколько чипов MPU-**** от InvenSense, но они еще хуже.
@Cerin, 👍1
Обсуждение1 ответ
Попробуйте выполнить постоянную калибровку. С форумов Adafruit:
В основном вам нужно будет читать и записывать регистры данных 55-6A. В обоих случаях вы должны установить датчик в CONFIG_MODE. Более подробная информация приведена на странице 48 таблицы.
На магнитометр влияют окружающие магнитные источники, такие как двигатели. Возможно, вы сможете определить степень эффекта, используя следующий метод:
Статус калибровки системы начнется с 0 и перейдет на 3 когда датчик откалиброван. Например, статус калибровки mag будет 3, если вы сделаете несколько фигур 8. Если вы положите кусок металла рядом с датчиком, статус калибровки снизится до 0. Но когда металл отодвинут, он вернется к 3. Возможно, вы сможете использовать это значение в качестве индикатора потери калибровки. Я обнаружил, что однажды он откалиброван, кажется, он хорошо выдерживает калибровку.
Для получения достоверных показаний гироскопа это может быть полезным советом:
Я не беспокоюсь о масштабировании выходного сигнала гироскопа для каждого образца. Я просто суммирую выходные данные в 32-разрядный (или больший) целочисленный регистр. Я вычитаю нулевое значение в каждом образце, о котором я расскажу позже. Но, по сути, если вы пробуете свой гироскоп на 1 кГц и суммируете выход в накопитель, вы увидите, что значение этого накопления в любое время будет прямо пропорционально углу поворота. Если ваша скорость установлена на 250 град/сек, то вращение на 180 град приведет примерно к 23330000 в аккумуляторе. Я называю это числом GYRO_CAL. Таким образом, в любой момент времени угол в градусах равен deg = accum / GYRO_CAL * 180.
Поскольку выход гироскопа линейный, аккумулятор нечувствителен к тому, быстрое или медленное вращение (до тех пор, пока не превышен максимальный угол в секунду).
Вот моя основная процедура для каждого показания гироскопа:
пустота read_FIFO(){
образец = read_value_from_FIFO(); //считайте последний образец по оси z. Я использую fifo, но в этом нет необходимости
накопление += образец - ноль; //добавьте образец к сумме и вычтите нуль
if((накопление > GYRO_CAL) -= GYRO_CAL*2; //поверните аккумулятор на +180 град.
если((накопится
угол = накопление/GYRO_CAL * 180; // преобразование в градусы
}
Я вычисляю значение null в начале каждого запуска. Я суммирую 1000 показаний и возьмите среднее значение. Для этого гироскопу приходится сидеть неподвижно в течение 3 или 4 секунд . Значение GYRO_CAL может быть вычислено путем суммирования выходных данных при повороте гироскопа на 180 градусов. Или вы можете суммировать за много оборотов и разделить на количество поворотов на 180 градусов для более точного значения.
Вы, вероятно, могли бы использовать 64-разрядный FP для аккумулятора, но так как arduino поддерживает только 32-разрядную версию FP, я счел абсолютно необходимым использовать 32-разрядное целое число, чтобы избежать округления и других ошибок.
Если вы будете следовать этому общему плану, я обещаю, что вы получите отличную производительность от гироскопа. Есть еще несколько небольших оптимизаций это я делаю, и я могу обсудить это позже.
К сожалению, в BNO055 нет такой функции, как "постоянная калибровка". Да, как только я получу стабильные параметры калибровки, я смогу сохранить их, а затем перезагрузить. Вот что описывает эта тема форума, и это то, что я уже делаю. К сожалению, BNO055 постоянно обновляется и перекалибруется, в конечном итоге теряя эти "хорошие" значения, если магнитометр сталкивается с небольшими помехами., @Cerin
- Определение относительно точной скорости с помощью ИДУ
- Получение точных показаний скорости от IMU
- Получение угловой скорости по данным кватернионов (BNO055)
- Лучший способ получить угловую скорость от датчика 9 DoF
- Как подключить MPU9250 к NodeMCU с помощью SPI или I2C Slave?
- Правильный способ получить значения крена, тангажа и перемещения
- Arduino Nano IOT LSM6DS3 получить угол гироскопа в градусах
- После восстановления смещения BNO055 на датчике все значения калибровки равны 0.
вы соблюдали процедуру калибровки?, @jsotola