Der Adafruit BNO055 9-DOF Sensor IMU Breakout macht es einem nicht leicht – oder doch?

Um bei einem Roboter festzustellen, in welche Richtung er sich wie weit bewegt (hat), nutzt man Odometrie, also Wegmessung. Dieses hilft bei einer Orientierung im Raum, um zum Beispiel festzustellen, ob die Anweisung „fahre x Sekunden lang“ oder „fahre y weit“ auch wirklich funktioniert hat. Es könnte ja sein, dass der Antrieb des Roboter durchdrehte, weil er auf einem herumliegenden Taschentuch auf der Stelle fuhr. Auch könnten Räder beim Anfahren etwas durchdrehen – und schon ist die Abweichung zwischen Realität und Annahme da.

Der Sensor – Die IMU

Eine von vielen Möglichkeiten sind heutzutage günstig gewordene Sensoren wie Beschleunigungssensor, Magnetometer und Gyroskop. Der Adafruit BNO055 9-DOF Sensor enthält ein Bauteil von Bosch, welches all dieses kombiniert und zusätzlich alle Daten der Sensoren konsolidiert und vollautomatisch in verschiedenste Formate umrechnet. Die 9-DOF stehen hier übrigens für neun Freiheitsgrade (degrees of freedom). Hier einmal ein nettes Foto des Breakout-Boards:

Adafruit BNO055 Nahaufnahme
Adafruit BNO055 Nahaufnahme
Übrigens: Das Bauteil ist sehr einfach per I2C mit einem Raspberry Pi oder Arduino ansteuerbar; von den vielen Pins werden dann nur Vin, GND, SCA und SCL benötigt. Und so sieht er auf meinem Roboter verbaut aus:
minibot Mitte finden
minibot Mitte finden
Adafruit BNO055 9DOF Sensor (IMU) auf dem minibot
Adafruit BNO055 9DOF Sensor (IMU) auf dem minibot
Ich habe mich für einen exakt mittigen Platz entschieden, das dürfte für so einen Sensor der beste Platz sein - davon ausgehend, dass die Motoren das Magnetfeld des Kompasses nicht zu sehr stören! Das wird sich sicher noch zeigen.

Erste Tests

Für einen möglichst simplen Test, hielt ich mich an die sehr guten Anleitungen von Adafruit und experimentierte mit dem Sensor erst einmal mit einem Arduino Uno herum. Die ersten Tests sahen grundsätzlich auch vielversprechend aus:

Arduino Test BNO055 - hier stimmt was nicht
Arduino Test BNO055 – hier stimmt was nicht

Was mich aber einige Tage lang fast verzweifeln ließ: Nach den Erklärungen im sehr sehr ausführlichen Datenblatt von Bosch (dem Hersteller des Sensors), sollten die X,Y und Z-Achsen im Raum wie folgt angeordnet sein (meine eigene Zeichnung):

Adafruit BNO055 - die wirklichen Achsen
Adafruit BNO055 – die wirklichen Achsen

Bei Verwendung der Arduino-Software war aber X immer „oben“, statt Z. Leider ist aber auch das Original-Datenblatt von Bosch fehlerhaft und weist in gleichen Diagrammen unterschiedliche Achsen aus. Alles sehr sehr hilfreich…. Nicht!

Und nun?

Man soll es nicht glauben, auch heute findet man noch Hilfe in Foren. Und zwar in dem von Adafruit. Und hier hat ein Teilnehmer mich darauf hingewiesen, dass doch tatsächlich die Adafruit-Bibliothek für den BNO055 ebenfalls fehlerhaft ist und Achsen vertauscht. Da kann man natürlich lange suchen, wenn an zwei Stellen gleich Fehler sind…!

Das Ergebnis

Ich habe versucht ein halbwegs brauchbares Video zu erstellen. Bitte sehr:

minibot – Test der Adafruit BNO055 9DOF Sensor IMU mit einem SparkFun MicroView (OLED Arduino Modul)

Der „Fix“

Um es nochmal ganz deutlich zu zeigen, im Zusammenspiel mit der Version 1.1.3 der Adafruit BNO055 Arduino-Bibliothek muss im Demo-Programm sensorapi.ino der Code zum Beispiel wie folgt angepasst werden:

void loop(void)
{
  // for the new x,y and z axes
  float x,y,z = 0;


  /* Get a new sensor event */
  sensors_event_t event;
  bno.getEvent(&event);

  /*
   * "Fix" Adafruits Arduino library bug in version <=1.1.3
   *
   * See https://forums.adafruit.com/viewtopic.php?f=50&t=119471&p=597457#p597112
   *
   *
   * Beware Adafruit's BNO055 library mixes up the Euler axes.
   * It reads the BNO's Euler registers consecutively into variables x,y,z,
   * but it should read them into heading,roll,pitch which are axes z,y,x.
   *
   * (By the way, I recommend avoiding the BNO's buggy Euler values.
   * If you need Euler, read the quaternion and convert it to Euler yourself.)
   */
  x = event.orientation.z;
  y = event.orientation.y;
  z = event.orientation.x;

  /* Display the floating point data */
  Serial.print("X: ");
  Serial.print(x, 4);
  Serial.print("\tY: ");
  Serial.print(y, 4);
  Serial.print("\tZ: ");
  Serial.print(z, 4);

  [...]

}

Ein Gedanke zu „Der Adafruit BNO055 9-DOF Sensor IMU Breakout macht es einem nicht leicht – oder doch?“

  1. Hallo Markus,
    passender Post von dir, da ich gerade erste Erfahrungen mit dem BNO055 sammle und anfangs auch etwas wegen den Achsen verwirrt war.
    Ich würde dir bei der Achsausrichtung für x, y, z aus deiner Grafik zustimmen. Erwartet hätte ich aus dem Bosch-Datenblatt zwar eine andere – warum nun diese rauskommt, konnte ich noch nicht so ganz nachvollziehen, bzw was genau am Datenblatt falsch ist.
    Abgesehen davon sind bei mir aber auch die Orientierungswerte für x und z Achse vertauscht – den Fix werde ich aber in der AdafruitLibrary direkt vornehmen.
    Aber eine Anmerkung zu den eingezeichneten Eulerwinkeln in der Grafik, Roll beschreibt doch den Drehwinkel um x und Pitch um y.. ?
    Hast du schon Erfahrungen mit den Quaterionen gemacht, ob hier die Daten so korrekt sind, wie sie geliefert werden?
    Viele Grüße,
    Drea

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert