Значения кватернионов из BNO055 недоступны.
Я пытаюсь получить значения Quaternion от BNO055, подключенного к плате ESP32-PoE от Olimex.
Код
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO055.h>
#include <utility/imumaths.h>
Adafruit_BNO055 bno = Adafruit_BNO055(55);
void setup() {
// put your setup code here, to run once:
Wire.begin(13, 16, 400000);
Serial.begin(115200);
if (!bno.begin()) {
Serial.println("No BNO055 Detected!");
while(1);
}
delay(100);
bno.setMode(Adafruit_BNO055::OPERATION_MODE_NDOF_FMC_OFF);
bno.setExtCrystalUse(true);
}
void loop() {
// put your main code here, to run repeatedly:
imu::Quaternion quat = bno.getQuat();
imu::Vector<3> euler = quat.toEuler();
Serial.print("W: ");
Serial.print(quat.w());
Serial.print(F(" "));
Serial.print("x: ");
Serial.print(quat.x());
Serial.print(F(" "));
Serial.print("y: ");
Serial.print(quat.y());
Serial.print(F(" "));
Serial.print("z: ");
Serial.print(quat.z());
Serial.print(F(" "));
Serial.print("X: ");
Serial.print((float)euler.x());
Serial.print(F(" "));
Serial.print("Y: ");
Serial.print((float)euler.y());
Serial.print(F(" "));
Serial.print("Z: ");
Serial.print(float(euler.z()));
Serial.print(F(" "));
Serial.println("");
delay(200);
}
выход
W: 0.00 x: 0.00 y: 0.00 z: 0.00 X: 0.00 Y: nan Z: 0.00
W: 0.00 x: 0.00 y: 0.00 z: 0.00 X: 0.00 Y: nan Z: 0.00
W: 0.00 x: 0.00 y: 0.00 z: 0.00 X: 0.00 Y: nan Z: 0.00
W: 0.00 x: 0.00 y: 0.00 z: 0.00 X: 0.00 Y: nan Z: 0.00
W: 0.00 x: 0.00 y: 0.00 z: 0.00 X: 0.00 Y: nan Z: 0.00
W: 0.00 x: 0.00 y: 0.00 z: 0.00 X: 0.00 Y: nan Z: 0.00
W: 0.00 x: 0.00 y: 0.00 z: 0.00 X: 0.00 Y: nan Z: 0.00
W: 0.00 x: 0.00 y: 0.00 z: 0.00 X: 0.00 Y: nan Z: 0.00
W: 0.00 x: 0.00 y: 0.00 z: 0.00 X: 0.00 Y: nan Z: 0.00
W: 0.00 x: 0.00 y: 0.00 z: 0.00 X: 0.00 Y: nan Z: 0.00
Датчик, похоже, работает, поскольку я попробовал простой скрипт и значения доступны.
Не хватает какой-то конкретной настройки во время setup()
для получения кватернионов.
Цель
Для абсолютной ориентации значения кватерниона необходимо преобразовать в эйлеровы.
@Shan-Desai, 👍0
Обсуждение1 ответ
Лучший ответ:
▲ 0
Очевидно, что в setup()
предпочтительнее иметь delay(1000)
, а не delay(100)
.
Код
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO055.h>
#include <utility/imumaths.h>
#include <math.h>
#define DEG (180/M_PI)
Adafruit_BNO055 bno = Adafruit_BNO055(55);
void setup() {
// поместите сюда свой код установки для однократного запуска:
Wire.begin(13, 16, 400000);
Serial.begin(115200);
if (!bno.begin()) {
Serial.println("No BNO055 Detected!");
while(1);
}
delay(1000);
bno.setMode(Adafruit_BNO055::OPERATION_MODE_NDOF_FMC_OFF);
bno.setExtCrystalUse(true);
}
void loop() {
// поместите сюда свой основной код для многократного запуска:
imu::Quaternion quat = bno.getQuat();
imu::Vector<3> euler = quat.toEuler();
// Serial.print("W: ");
// Serial.print(quat.w());
// Serial.print(F(" "));
//
// Serial.print("x: ");
// Serial.print(quat.x());
// Serial.print(F(" "));
//
// Serial.print("y: ");
// Serial.print(quat.y());
// Serial.print(F(" "));
//
// Serial.print("z: ");
// Serial.print(quat.z());
// Serial.print(F(" "));
Serial.print("Yaw: ");
Serial.print(euler[0] * DEG);
Serial.print(F(" "));
Serial.print("Pitch: ");
Serial.print(euler[1] * DEG);
Serial.print(F(" "));
Serial.print("Roll: ");
Serial.print(euler[2] * DEG);
Serial.print(F(" "));
Serial.println("");
delay(200);
}
,
@Shan-Desai
Смотрите также:
- Определение относительно точной скорости с помощью ИДУ
- После восстановления смещения BNO055 на датчике все значения калибровки равны 0.
- Получить значения акселерометра от BNO055 с помощью Единой библиотеки датчиков adafruit
- bh1750 lightsesor не будет работать
- Контакты ESP32 не помещаются в беспаянную макетную плату
- Как определить наличие воды с помощью всего двух проводов
- Увеличить частоту дискретизации на плате ESP32
- Как можно ограничить чувствительность емкостных сенсоров?
почему setExtCrystalUse? есть ли у модуля внешний кристалл?, @Juraj
Я думаю, что это для часов I2C. В большинстве приложений установлено значение true., @Shan-Desai