Получить значения акселерометра от BNO055 с помощью Единой библиотеки датчиков adafruit
Если я правильно понимаю, используя Adafruit_Sensor
, можно извлечь информацию из конкретной информации датчика. Эти датчики в настоящее время упоминаются в файле README
. Я использую BNO055 для двух вещей:
- Значения ориентации (курс, тангаж, крен)
- Значения линейного ускорения
Мой код похож на упомянутый пример adafruit_bno055's bunny
Код
Я попробовал следующее в своем цикле()
void loop() {
// put your main code here, to run repeatedly:
sensors_event_t event;
bno.getEvent(&event);
Serial.print(F("Orientation: "));
Serial.print((float)event.orientation.x);
Serial.print(F(" "));
Serial.print((float)event.orientation.y);
Serial.print(F(" "));
Serial.print((float)event.orientation.z);
Serial.println(F(""));
Serial.print(F("Acceleration: "));
Serial.print((float)event.acceleration.x);
Serial.print(F(" "));
Serial.print((float)event.acceleration.y);
Serial.print(F(" "));
Serial.print((float)event.acceleration.z);
Serial.println(F(""));
delay(BNO055_SAMPLERATE_DELAY_MS);
}
Создал событие
sensors_event_t и использовал параметры ориентации
и ускорения
для получения значений ориентации и ускорения в направлениях x, y, z.
выход
Значения ориентации и акклаерации одинаковы:
Orientation: 105.50 -20.56 -101.00
Acceleration: 105.50 -20.56 -101.00
Orientation: 97.81 -14.69 -119.56
Acceleration: 97.81 -14.69 -119.56
Orientation: 93.81 -10.94 -125.56
Acceleration: 93.81 -10.94 -125.56
Orientation: 94.44 -12.25 -122.56
Я попытался добавить еще одно событие event1
в цикл ()
, но все равно получил те же результаты
sensors_event_t event;
bno.getEvent(&event);
Serial.print(F("Orientation: "));
Serial.print((float)event.orientation.x);
Serial.print(F(" "));
Serial.print((float)event.orientation.y);
Serial.print(F(" "));
Serial.print((float)event.orientation.z);
Serial.println(F(""));
sensors_event_t event1;
bno.getEvent(&event1);
Serial.print(F("Acceleration: "));
Serial.print((float)event1.acceleration.x);
Serial.print(F(" "));
Serial.print((float)event1.acceleration.y);
Serial.print(F(" "));
Serial.print((float)event1.acceleration.z);
Serial.println(F(""));
delay(BNO055_SAMPLERATE_DELAY_MS);
Не может ли BNO055 вместе с библиотекой Adafruit_Sensor не предоставлять значения ускорения и ориентации в качестве событий или библиотека используется только для получения значений ориентации из BNO055?
@Shan-Desai, 👍1
Обсуждение2 ответа
Лучший ответ:
Выводы
Если я использую один и тот же sensors_event_t
в коде и использую event.acceleration
и event.orientation
в цикле ()
, и они предоставляют мне точно такие же значения. На самом деле я получаю одинаковые значения для курса, тангажа, крена и ускорения в направлениях x, y, z.
sensors_event_t event;
bno.getEvent(&event);
Serial.print(F("Orientation: "));
Serial.print((float)event.orientation.heading);
Serial.print(F(" "));
Serial.print((float)event.orientation.pitch);
Serial.print(F(" "));
Serial.print((float)event.orientation.roll);
Serial.println(F(""));
Serial.print((float)event.acceleration.x); // same as roll
Serial.println(F(""));
Serial.print((float)event.acceleration.y); // same as pitch
Serial.println(F(""));
Serial.print((float)event.acceleration.z); // same as heading
Serial.println(F(""));
Датчик
У меня есть датчик BNO055 с синей точкой, и на нем есть маркировка для направлений X, Y, Z следующим образом:
Я сверился с логикой углов Эйлера из Википедии
Если я поворачиваюсь вдоль оси x, я действительно получаю крен (от 0 до 360) и так далее.
Вывод
Библиотека
Adafruit_Sensor предоставляет только значения ориентации при использовании с BNO055, а значения линейного ускорения необходимо вызывать отдельно с помощью Adafruit_BNO055.
код для линейного ускорения и ориентации
sensors_event_t event;
bno.getEvent(&event);
Serial.print(F("Orientation: "));
Serial.print((float)event.orientation.heading);
Serial.print(F(" "));
Serial.print((float)event.orientation.pitch);
Serial.print(F(" "));
Serial.print((float)event.orientation.roll);
Serial.println(F(""));
// Serial.print((float)event.acceleration.x); // same as roll
// Serial.println(F(""));
// Serial.print((float)event.acceleration.y); // same as pitch
// Serial.println(F(""));
// Serial.print((float)event.acceleration.z); // same as heading
// Serial.println(F(""));
imu::Vector<3> li_ac = bno.getVector(Adafruit_BNO055::VECTOR_ACCELEROMETER);
Serial.print(F("Li. Acc.: "));
Serial.print((float)li_ac.x());
Serial.print(F(" "));
Serial.print((float)li_ac.y());
Serial.print(F(" "));
Serial.print((float)li_ac.z());
Serial.print(F(" "));
Serial.println();
delay(BNO055_SAMPLERATE_DELAY_MS);
Вы должны установить режим работы из перечисления adafruit_bno055_opmode_t. Используйте bno.setMode
.
Для режимов см. раздел 3.3 в техническом описании.
sensors_event_t-это структура объединения, поэтому доступ к одной и той же памяти осуществляется с разными именами членов.
Я не уверен, какой режим использовать, и я попытался установить его в "IMUPlus", а также попробовал с "NDOF", но я получаю те же значения для "событие.ускорение" и "событие.ориентация"., @Shan-Desai
не очень-то помогает. Я сослался на таблицу данных после того, как вы ответили, и установил их в коде " setup ()", и это обеспечивает тот же вывод, @Shan-Desai
как я пишу, структура-это союз. он содержит массив из 4 поплавков. эти поплавки доступны, так как [0], [1], [2], [3] или над одним из псевдонимов типа "sensors_vec_t" с именами "ускорение", магнитное
, ориентация
и "гироскоп". первый поплавок имеет дополнительные псевдонимы, такие как "температура", расстояние
. Событие может вернуть только одно чтение, @Juraj
прочитайте описание режимов "В режиме IMU относительная ориентация BNO055 в пространстве рассчитывается по данным акселерометра и гироскопа. Расчет выполняется быстро (т. е. с высокой скоростью передачи выходных данных)", @Juraj
Поэтому я предполагаю, что с помощью этой библиотеки я могу использовать только "событие.ориентация" и получать крен, высоту и крен, и мне нужно использовать "Adafruit_BNO055", чтобы получить линейное значение acc. отдельно, @Shan-Desai
вы можете считывать данные отдельных датчиков или режимов слияния. Я не вижу, как считывать данные с помощью этой библиотеки для комбинированных режимов, таких как режим AMG, @Juraj
- Определение относительно точной скорости с помощью ИДУ
- Значения кватернионов из BNO055 недоступны.
- После восстановления смещения BNO055 на датчике все значения калибровки равны 0.
- Как можно ограничить чувствительность емкостных сенсоров?
- Получение точных показаний скорости от IMU
- Калибровка Adafruit TCS34725 для цветов RGB
- Получение угловой скорости по данным кватернионов (BNO055)
- Лучший способ получить угловую скорость от датчика 9 DoF
I2C сканер найти его?, @Juraj
@Juraj да я получаю адреса
0x28
и0x68
. Также у меня есть RTC, подключенный к шине I2C., @Shan-Desaiсогласно данным bno
0x28
является вторичным адресом и, следовательно, обнаруживается., @Shan-Desai