I²C Motion Tracking

Alles rund um TX(T) und RoboPro, mit ft-Hard- und Software
Computing using original ft hard- and software
Forumsregeln
Bitte beachte die Forumsregeln!
Antworten
chehr
Beiträge: 161
Registriert: 07 Apr 2015, 21:07
Wohnort: Friedrichshafen

I²C Motion Tracking

Beitrag von chehr » 07 Apr 2015, 22:35

Hallo I²C-Fans,
im Download Bereich http://www.ftcommunity.de/data/download ... ion1.0.rpp habe ich einen I²C Treiber für ein "Motion Tracking Device" MPU-6050 eingestellt.
Dieser 3-achsige Beschleunigungssensor und 3-achsiger Kreiselkompass wird intensive in Mobile Telefone und Tablets verwendet, dadurch ist er inzwischen sehr günstig (weniger als 5€ für eine direkt anschließbare Platine).
Ich habe bei weitem nicht alle Funktionen im Treiber abgebildet, da der Sensor sehr komplex ist. Auch ist die Dokumentation vom Hersteller "InvenSense" sehr rudimentär.
Der Sensor unterstützt den 400kHz Übertragungsmodus, jedoch war dieser Modus bei mehreren Platinen nicht zuverlässig, somit hat der Treiber momentan nur die 100kHz. Kann aber ausprobiert werden ob 400kHz funktionieren.

Momentan liefert der Sensor Rohdaten ('Axiale Beschleunigung und rotatorische Geschwindigkeit). Je nach Anwendungsfall ist es sinnvoll bzw. notwendig (verbesserte Genauigkeit bei Integration z.B. Beschleunigung -> Geschwindigkeit -> Position) die Rohdaten zu filtern (z.B. Kalman Filter) um Sensor Störungen zu Entfernen und gegebenfalls mehrere Sensorachsen mathematisch zu verknüpfen, also Sensorfusion.

Bezüglich Sensorfusion sind bei mir Treiber für den MPU-9150 und MPU-9250 schon lauffähig, welche auch einen dreiachsigen Magnetfeldsensor an Board haben. Bezüglich Filtertechnik bin ich erst am Anfang. Aber vielleicht hat schon jemand einen guten Algorithmus in RoboPro implementiert?

Nun viel Spaß beim Ausprobieren
Gruß
Christian

rbudding
Beiträge: 11
Registriert: 01 Nov 2010, 18:36
Wohnort: Bilthoven

Re: I²C Motion Tracking

Beitrag von rbudding » 18 Apr 2015, 08:28

Danke Christian!

Ich kaufte: http://www.dx.com/p/three-axis-gyroscop ... TH2OxfBIkc

wie haben Sie die Kalibrierung gelöst? Der Sensor ist sehr komplex....

tip from Arduino forum:
A data visualiser that makes life easier when starting out.
Also includes an extended version (By http://www.geekmomprojects.com/) of Kordal's code. On Github https://github.com/janaka/Gy521-Dev-Kit

Gruß Richard

chehr
Beiträge: 161
Registriert: 07 Apr 2015, 21:07
Wohnort: Friedrichshafen

Re: I²C Motion Tracking

Beitrag von chehr » 22 Apr 2015, 21:43

Hallo Richard,
bezüglich Kalibrierens gibt es ein spezielles Unterprogramm "MPU-6050-K" welches nach dem Unterprogramm "MPU-6050-Init" gestartet werden sollte. Während der Kalibrierung sollte der Sensor in eine stabile Position gebracht werden. Das Unterprogramm errechnet dann den Mittelwert von gemessenen Offset Werte. Die Anzahl der Messungen lassen sich einstellen über "Iteration 1..20".
Nach der Kalibrierung sollte die Drehrate (GX, GY und GZ) besser als +/-0,2 deg/s sein (zumindest im "Full Scale Range" - bei höherer Auflösung muss ich wohl noch was verbessern!). Bezüglich axiale Beschleunigung (AX, AY und AZ), ist der Sensor schon von Haus aus sehr gut kalibriert (sollte im Ruhezustand bei 0g bzw 1g innerhalb der Toleranz von +/- 0,05g liegen. Deshalb habe ich da keine spezielle Kalibrierung vorgesehen.

Gruß
Christian

chehr
Beiträge: 161
Registriert: 07 Apr 2015, 21:07
Wohnort: Friedrichshafen

Re: I²C Motion Tracking

Beitrag von chehr » 22 Apr 2015, 22:16

Richard,
dein ausgewähltes Board ist sicher ok, bin gespannt ob 400kHz Übertragung möglich sind.

bezüglich Sensorplatine habe ich gute Erfahrungen mit dem GY-87 gemacht. Dieses Board beinhaltet folgende Sensoren:
1. MPU6050
2. HMC5883L (3 Achsen Magnetfeldsensor)
3. BMP180 (Druck und Temperatursensor)

Bei allen 3 Sensoren funktioniert der 400kHz Übertragungsmodus.
Gruß Christian

chehr
Beiträge: 161
Registriert: 07 Apr 2015, 21:07
Wohnort: Friedrichshafen

Re: I²C Motion Tracking

Beitrag von chehr » 01 Mai 2015, 11:37

Hallo FT Fans,
habe im Downloadbereich ein RoboPro Programm "I2C MPU 6050 9150 Motion Detection Version 1.0.rpp" als Erweiterung zum bisherigen MPU-6050 Treiber gestellt.
Dabei handelt es sich um eine weitere Funktion des MPU 6050 bzw. MPU 9150:
Der Sensor stellt eine Bewegung, bzw. Kollision fest und zählt diese und zwar in alle 6 Richtungen unabhängig. Dabei lässt sich die "Sensitivität" und die "Dauer" der Kollision im Unterprogramm "MPU-6050-IS" einstellen ("Motion Detection Threshold" 1..255 wobei 32 = 1g entsprechen und "Motion Detection Duration" 1..255 ms).
Diese Funktion ist Ideal z.B. für den ROBO TX ElectroPneumatic Flipper um Punkte zu vergeben bezüglich Kugelkontakts, je nach Geschwindigkeit und Richtung. Auch lässt sich damit feststellen wenn ein Fahrzeug gegen ein Gegenstand fährt. Denkbar sind auch Verknüpfungen der einzelne Sensorachsen mit "UND" oder "ODER" weil es kann auch sein das beide Richtungen z.B. +X und -X angezeigt werden, je nach größe der Beschleunigung.

Anmerkung: Falls der Treiber nicht funktioniert, kann es an der Einstellung 400kHz liegen, in diesem Fall einfach mit 100kHz ausprobieren.

Nun viel Spaß beim Erforschen.

Gruß
Christian

JStar
Beiträge: 10
Registriert: 20 Okt 2015, 16:19
Wohnort: Lemgo

Re: I²C Motion Tracking

Beitrag von JStar » 04 Nov 2015, 16:49

Hallo Christian,

ich verwende den MPU9150-Chip in Verbindung mit dem TX. In beiden deiner Programme werden die Sende- und Empfangsbausteine abgearbeitet, aber ich bekomme nur 0 als Werte zurück.
In Verbindung mit einem Arduino funktioniert alles. Nur mit RoboPro geht es nicht.

Hast du eine Idee für mich, woran es liegen könnte?

Gruß
Julian

chehr
Beiträge: 161
Registriert: 07 Apr 2015, 21:07
Wohnort: Friedrichshafen

Re: I²C Motion Tracking

Beitrag von chehr » 08 Nov 2015, 19:16

Hallo Julian,
da habe ich zu wenig infos um die Ursache zu finden. Zuerst solltest du prüfen ob ROBO Pro aktuell ist und zwar Version 4.1.8 (nur zur info, diesen Monat soll noch eine neuere Version kommen).
Welche UP hast du verwendet und welche sind durchgelaufen?
Hast du den Magnetometer aktiviert? Dazu muß man zuerst das Unterprogramm "MPU-9150-C-Init" durchlaufen lassen für den I2C BYPASS.

Gruß
Christian

chehr
Beiträge: 161
Registriert: 07 Apr 2015, 21:07
Wohnort: Friedrichshafen

Re: I²C Motion Tracking

Beitrag von chehr » 08 Nov 2015, 20:04

Hallo FT Fans,
bezüglich Motion Tracking (siehe erste Seite) habe ich nun eine geniale Lösung gefunden die ideal für fischertechnik Robotik ist. Bosch hat seit kurzem einen Sensor auf dem Markt gebracht der den fusionsalgorithmus bereits an Bord hat und zwar anhand einem 32-bit Microcontroller:

Der Sensor BNO055, welcher folgende Module beinhaltet:
- Acceleration Sensor (BMA255)
- Gyroscope (BMG160)
- Geomagnetic Sensor (BMM150)
- 32-bit Microcontroller
- Sensor Fusion Algorithms.

Er kann u.a. jeweils 3 Achsen
- Orientierung Absolut (Euler Vektor, 100 Hz; Quaterion)
- Winkelgeschwindigkeit, absolut und relativ
- Winkelposition, pitch, roll, yaw
- Beschleunigung, absolut und relativ, mit und ohne Erdbeschleunigung
- Magnetfeld inklusiv absoluter Kompass (360°)
- Temperatur

Da der Fusions Algorithmus nicht mehr in ROBO Pro laufen muß, verbessert sich die errechnete Positionsgenauigkeit signifikant weil die Sampling rate in ROBO Pro nicht gerade hoch ist.
Ein Treiber für den BNO055 habe ich bereits am Laufen, ist aber noch nicht ganz fertig, da ich mit der Stabilität zu kämpfen habe und weiß momentan nicht ob es an ROBO Pro, am Sensor selbst oder wo auch immer liegt.

Christian

JStar
Beiträge: 10
Registriert: 20 Okt 2015, 16:19
Wohnort: Lemgo

Re: I²C Motion Tracking

Beitrag von JStar » 09 Nov 2015, 14:00

Hallo Christian,

das Problem habe ich gelöst. Es lag an meiner schlechten Verdrahtung. Die Daten vom Gyro- und Beschleunigungssensor und die Temperatur bekomme ich jetzt.
Ich Hatte dein Programm erweitert, um den Magnetsensor auszulesen. Ich bekomme aber für alle drei Achsen den selben Wert zurück. Mit dem Problem bin ich wohl nicht allein. Dort brauchbare Werte zu bekommen, scheint etwas schrieriger zu werden.
Der BNO055 klingt interessant. Halte mich mal auf dem Laufenden!

Gruß
Julian

chehr
Beiträge: 161
Registriert: 07 Apr 2015, 21:07
Wohnort: Friedrichshafen

Re: I²C Motion Tracking

Beitrag von chehr » 09 Nov 2015, 21:35

Hallo Julian,
es ist nicht ganz einfach den Magnetfeldsensor AK8975A anzusprechen. Den muß man zuerst zu Slave 0 machen. Habe das mal vor längerer Zeit gemacht.
Habe nun meinen Treiber für den MPU9150 heute in den Downloadbereich gestellt. Da sollte es ersichtlich sein, wie der Magnetfeldsensor angesprochen werden kann. Viel Spaß - und hofffentlich positive Rückmeldung :!:
File: "I2C MPU 9150 Acceleration Sensor Version 1.0.rpp"

Gruß
Christian

heikoh
Beiträge: 37
Registriert: 23 Dez 2012, 11:29
Wohnort: Heidenheim

Re: I²C Motion Tracking

Beitrag von heikoh » 10 Nov 2015, 07:55

Hallo,

folgendes Breakout board halte ich für den Bosch Sensor für sehr interessant:

https://learn.adafruit.com/adafruit-bno ... r/overview

viele Grüße

Heiko

JStar
Beiträge: 10
Registriert: 20 Okt 2015, 16:19
Wohnort: Lemgo

Re: I²C Motion Tracking

Beitrag von JStar » 13 Nov 2015, 16:06

Hallo Christian,

wo finde ich deine Datei? Im Download unter RoboPro ist sie nicht. Oder muss sie erst noch freigegeben werden?

Gruß
Julian

chehr
Beiträge: 161
Registriert: 07 Apr 2015, 21:07
Wohnort: Friedrichshafen

Re: I²C Motion Tracking

Beitrag von chehr » 21 Nov 2015, 19:35

Hallo Julian,
sie müsste nun freigegeben sein..
http://ftcommunity.de/data/downloads/ro ... ion1.0.rpp
Gruß
Christian

chehr
Beiträge: 161
Registriert: 07 Apr 2015, 21:07
Wohnort: Friedrichshafen

Re: I²C Motion Tracking

Beitrag von chehr » 13 Feb 2016, 15:22

Hallo,
bin gerade dabei meine I2C Treiber (MPU6050, MPU9150, BNO055) bezüglich Gyroscope und Beschleunigung auf meine Anforderungen hin zu optimieren. Dazu habe ich mir ein fischertechnik Model gebaut, bei dem der Sensor mit einem Abstand von ca 17cm um eine Achse dreht, angetrieben vom einem Encodermotor.
1. Dabei bräuchte ich ein Geschwindigkeitsregler, der so in RoboPro nicht direkt vorhanden ist. Leider gibt es auch nicht die Möglichkeit den Encoder direkt über den Impulszähler als schnellen Zähleingang zu verwenden. Die erweiterte Motorsteuerung scheint schon ein Geschwindigkeitsregler zu verwenden, wenn beide Encodermotoren Synchron laufen. Diese Funktion habe ich dann als "Workaround" auch verwendet. Das Ergebnis war aber nicht zufriedenstellend.
Hat da jemand eine gute Idee um einen genauen Geschwindigkeitsregler in RoboPro zu bauen? Ich stelle mir da vor, man definiert eine Geschwindigkeit und RoboPro regelt dann die Geschwindigkeit möglicht genau.

Hier folgen Bilder bezüglich Messergebnisse zur Info.
http://ftcommunity.de/details.php?image_id=42865 -> ohne Geschwindigkeitsregler, Sensor BNO055
http://ftcommunity.de/details.php?image_id=42866#col3 -> mit Geschwindigkeitsregler, Sensor BNO055
http://ftcommunity.de/details.php?image_id=42868#col3 -> ohne Geschwindigkeitsregler, Sensor MPU9255

2. Bei diesen Untersuchungen hat ein Auslesevorgang mit dem TX (alle Lesebefehle offen bis zum letzten der 14 Achsen) fast 100 ms gedauert, bei 3 Achsen noch bei ca 10ms lag, somit war nur eine Samplingrate von 10Hz angebracht.
Gibt es eine Möglichkeit die Auslesegeschwindigkeit zu erhöhen (I2C ist schon bei 400kHz)? Was ist die beste RoboPro Methode um die Samplingszeit genau einzustellen? Momentan verwende ich die "Wartezeit" die restliche Auslesezeit als 0 angenommen wird.
http://ftcommunity.de/details.php?image_id=42867#col3 -> nur 10Hz Sampling rate. (zur Info, Roll/Pitch zeigt die Tisch- oder Armunebenheit von 1,4 deg an und zeigt auch das der Setup etwas vibriert (Eigenfrequenz), Fgz die Erdbeschleunigung von 1g)

Zur Info: Motion Tracking und vieles mehr funktioniert mit dem BNO055 nun bestens.

Gruß
Christian

hamlet
Beiträge: 331
Registriert: 12 Jan 2011, 21:41

Re: I²C Motion Tracking

Beitrag von hamlet » 12 Jun 2020, 10:01

Hallo Forum,
Meine Tochter hat die kleine Version der genialen "Hagelfeuer Droiden" nachgebaut und dann "ein wenig" durch Verwendung von XM-Motoren ohne Untersetzung frisiert. Jetzt läuft er "wie Sau" aber lässt sich leider kaum noch steuern. Ich dachte, dass es ein schöne Anwendung für den MPU-6050 Sensor sein könnte, die Steuerung zu zähmen. Der liegt schon viel zu lang ungenutzt herum.

Als ersten Schritt habe ich versucht den MPU-6050 am TXT mit Christians Treiber in Betrieb zu nehmen:
Runs out oft he box, großartig, Danke Christian!

Die Gyro-Kalibrierung des Treibers hinterlegt die Offsets in den MPU-6050 Registern 0x13, 0x15 und 0x17. Die sind in der Dokumentation des Herstellers (Register Map) gar nicht dokumentiert. Auch zu den beworbenen "MotionFusion algorithms" findet sich dort nichts.

Hat jemand die vollständige Dokumentation und kann sie mir zur Verfügung stellen? Christian?

Grüße,
Helmut

chehr
Beiträge: 161
Registriert: 07 Apr 2015, 21:07
Wohnort: Friedrichshafen

Re: I²C Motion Tracking

Beitrag von chehr » 12 Jun 2020, 19:46

Hallo Helmut,
vielen Dank für das Feedback.

Die Register fürs Kallibrieren sind in einem separaten Dokument "MPU Hardware Offset Registers App Note" beschrieben:

Gyro Offset Registers
6.1 Register Location
Für MPU6050/MPU6500/MPU6515 und MPU9150/MPU9250, die
gyro offset registers sind 0x13 - 0x18

Für MPU6050/MPU9150
Accel offset register sind 0x6 - 0xB


Ich habe lokal den Treiber "I2C MPU 6050 Acceleration Sensor Version 2.0.rpp" mit einracher kallibrierfunktion. Ich weiß allerdings nicht mehr ob dieser Treiber fertig getested war.

Der Fusionsalgorithmus ist nicht öffentlich. Meines wissens muss man einen Memory dump machen. Näheres müsste wenn ich mich noch recht errinnere in dem motion driver beschrieben sein.
Falls du interesse hast kannst mir eine PN schicken.


Infos sollte es z.B. in der motion_driver_test.c geben, hier ein Auszug:

/* To initialize the DMP:
* 1. Call dmp_load_motion_driver_firmware(). This pushes the DMP image in
* inv_mpu_dmp_motion_driver.h into the MPU memory.
* 2. Push the gyro and accel orientation matrix to the DMP.
* 3. Register gesture callbacks. Don't worry, these callbacks won't be
* executed unless the corresponding feature is enabled.
* 4. Call dmp_enable_feature(mask) to enable different features.
* 5. Call dmp_set_fifo_rate(freq) to select a DMP output rate.
* 6. Call any feature-specific control functions.
*
* To enable the DMP, just call mpu_set_dmp_state(1). This function can
* be called repeatedly to enable and disable the DMP at runtime.
*
* The following is a short summary of the features supported in the DMP
* image provided in inv_mpu_dmp_motion_driver.c:
* DMP_FEATURE_LP_QUAT: Generate a gyro-only quaternion on the DMP at
* 200Hz. Integrating the gyro data at higher rates reduces numerical
* errors (compared to integration on the MCU at a lower sampling rate).
* DMP_FEATURE_6X_LP_QUAT: Generate a gyro/accel quaternion on the DMP at
* 200Hz. Cannot be used in combination with DMP_FEATURE_LP_QUAT.
* DMP_FEATURE_TAP: Detect taps along the X, Y, and Z axes.
* DMP_FEATURE_ANDROID_ORIENT: Google's screen rotation algorithm. Triggers
* an event at the four orientations where the screen should rotate.
* DMP_FEATURE_GYRO_CAL: Calibrates the gyro data after eight seconds of
* no motion.
* DMP_FEATURE_SEND_RAW_ACCEL: Add raw accelerometer data to the FIFO.
* DMP_FEATURE_SEND_RAW_GYRO: Add raw gyro data to the FIFO.
* DMP_FEATURE_SEND_CAL_GYRO: Add calibrated gyro data to the FIFO. Cannot
* be used in combination with DMP_FEATURE_SEND_RAW_GYRO.
*/

Viel einfacher ist es den Sensor von Bosch BNO055 zu nehmen. Weil da keine Firmware geladen werden muß und der Fusions Algorithmus fest eingebaut ist incl. MPU.
Dazu gibt es auch einen Treiber von mir.

Gruß
Christian

hamlet
Beiträge: 331
Registriert: 12 Jan 2011, 21:41

Re: I²C Motion Tracking

Beitrag von hamlet » 13 Jun 2020, 12:06

Hallo Christian,
Dank Dir!
Ich hab das "MPU Hardware Offset Registers App Note" Dokument im Netz gefunden. Mein Beschleunigungssensor hat eine ziemlich große Abweichung von fast 0.2g in z-Richtung. Das kann ich ja nun direkt im MPU-6050 korrigieren. Supi.

Ich werde den Sensor zentral auf Höhe der Drehachse der großen Räder des Droiden plazieren. Da es keine seitlichen Kippmomente gibt müsste ich die Pendel-Bewegungen des Motorschlittens einfach rausrechnen und die Beschleunigung und Drehungen in der Bewegungebene extrahieren können, ... hoffe ich. Ich fang mal einfach an und versuche es erstmal ohne Motion Fusion. Die Überraschungen offenbaren sich ja dann beim Implementieren.

Auf dem TXT läuft Dein Treiber auch ohne die Warte-Elemente zwischen den I2C-Zugriffen. Off-line erziele ich dann eine Sampling-Rate von 100Hz. Den Lowpass-Filter des MPU-6050 kann ich dann entsprechend anpassen.

Zu Motion Fusion hab ich noch folgenden Link gefunden: https://github.com/jrowberg/i2cdevlib/t ... er/Arduino Dort in den MPU6050 und MPU9150 Ordnern.

Grüße,
Helmut

Antworten