Получение стабильных измерений с помощью ИДУ BNO055

Я купил BNO055 "умный" IMU от Adafruit, думая, что это будет простой способ получить данные ориентации для небольшого проекта мобильного робота, но я нашел эту вещь очень трудной в использовании и почти бесполезной.

Он рекламируется как возможность автоматической калибровки, и хотя он пытается сделать это, я обнаружил, что калибровка не выполняется. Он постоянно перекалибрует себя и либо застревает в состоянии ошибки, либо находит успешную калибровку...но затем теряет его через несколько секунд.

Есть ли что-нибудь, что я могу сделать, чтобы улучшить его стабильность? Нужно ли монтировать его внутри специального заземленного корпуса? Есть ли какое-то особое заклинание, которое я должен произнести, прежде чем включить его?

Я читаю его с Arduino Uno через I2C, и хотя проводка и программирование относительно просты, получить его калибровку и оставаться калиброванным я обнаружил, что это почти невозможно.

Даже после того, как флаг "система" говорит о своей полной калибровке, и у меня ИДУ просто сидит на столе, не двигаясь, через минуту он теряет свою "систему" калибровки. Акселерометр, гриоскоп и магнитометр обычно остаются откалиброванными, но как я могу доверять им, если бортовой алгоритм слияния сообщает, что он не готов?

Если BNO055-проигранное дело, есть ли что-нибудь лучше? Я пробовал несколько чипов MPU-**** от InvenSense, но они еще хуже.

, 👍1

Обсуждение

вы соблюдали процедуру калибровки?, @jsotola


1 ответ


2

Попробуйте выполнить постоянную калибровку. С форумов 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