AM 09: Inertialnavigation: Unterschied zwischen den Versionen
Zeile 90: | Zeile 90: | ||
'''Beschreibung des Hauptprogramms | '''Beschreibung des Hauptprogramms [https://svn.hshl.de/svn/Elektrotechnik_Fachpraktikum/trunk/Projekte/ArduMower/Fachbereich%205%20Software/5.4%20Inertialnavigation/Inertialnavigation/Inertialnavigation.ino Inertialnavigation.ino]''' | ||
Nachdem Objekte für die einzelnen Sensor-Bibliotheken angelegt wurden, werden diese innerhalb der Setup-Routine initialisiert. Hier können auch Einstellungen an den Sensoren vorgenommen werden. Innerhalb der Main/Loop Routine werden nun kontinuierlich Sensorrohdaten eingelesen und anschließend mit einen Tiefpassfilter gefiltert. Es folgen Berechnungen um die Rohdaten in Winkel umzurechnen. | |||
''Beispiel Gyrosensor:'' | |||
float gyroDegreesZ = float(lowPass_gz.output()) * float(timediff)/1000.0; // Integration der Winkelgeschwindigkeit zur Berechnung der Winkeldifferenz; // timediff Umwandlung von Millisekunden zu Sekunden | |||
gyroHeadingZ += (gyroDegreesZ + gyroHeadingCorrectionZ); // Berechnung des neuen Winkels als Summe des alten Winkels, der WInkeldifferenz und der Driftkorrektur | |||
if(gyroHeadingZ < -180) // Überlaufabfrage, damit sich der Winkel stets zwischen -180° und +180° befindet | |||
gyroHeadingZ += 360; | |||
else if(gyroHeadingZ > 180) // Überlaufabfrage, damit sich der Winkel stets zwischen -180° und +180° befindet | |||
gyroHeadingZ -= 360; | |||
Der Gyrosensor misst die Winkelgeschwindigkeit. Soll aus dieser der relative Winkel berechnet werden, müssen die Sensordaten integriert werden. Im Programm wird dafür die Zeit in Millisekunden pro Schreifendurchlauf gemessen und in der Variable timediff gespeichert. Für die Berechnung des Winkels wird nun in jedem Durchlauf der aktuelle Gyrowert mit der Zeitdifferenz multipliziert und zu dem aktuellen Winkel addiert. In einer Kalibrierungsphase wird zudem nach dem Start des Programms eine Driftkorrektur berechnet und in gyroHeadingCorrectionZ gespeichert, um den Winkelwert zu verbessern. | |||
Version vom 13. Januar 2017, 20:29 Uhr
Dieser Wiki-Beitrag ist Teil eines Projektes, welches im Rahmen vom Fachpraktikum Elektrotechnik im 5. Semester Mechatronik absolviert wurde. Ziel des Beitrags ist es, eine nachhaltige Dokumentation zu schaffen, welche die Ergebnisse festhält und das weitere Arbeiten am Projekt ermöglicht.
Autoren:
Betreuer: Prof. Schneider
Aufgabe
Integration einer IMU
Erwartungen an die Projektlösung
- Einarbeitung in die bestehenden Ardumowers-Unterlagen
- Planung und Beschaffung der Bauteile
- Aufbau und Integration der Inertialsensorik (Kompass, 3-Achs-Gyros, 3-Achs-Beschleunigungsmesser)
- Kalibrierung der Sensoren
- Inertialnavigation (Sensordatendfusion) anhand der IMU
- Darstellung der Ergebnisse im Vergleich zur Referenz
- Erstellen Sie ein faszinierendes Video, welches die Funktion visualisiert.
- Test und wiss. Dokumentation
Schwierigkeitsgrad
- Mechanik: *
- Elektrotechnik: *
- Informatik: **
Einleitung
Das Ardumowerprojekt des 5. Semesters Mechatronik in Kooperation mit dem Masterstudiengang Business and System Design Engineering an der Hochschule Hamm-Lippstadt hat zum Ziel, einen voll funktionsfähigen autonomen Rasenmähroboter in Betrieb zu nehmen. Dazu werden die notwendigen Aufgaben für die Erfüllung des Projektes auf einzelne Gruppen aufgeteilt. Die Gruppe Inertialnavigation beschäftigt sich mit der Inbetriebnahme einer IMU (Inertial Measurement Unit), die eine Kombination aus drei verschiedenen Sensoren auf einer Platine darstellt. Es sind dabei ein Magnetsensor (Kompass), ein Beschleunigungssensor und ein Gierratensensor vorhanden. Damit lässt sich die Lage des Mähroboters bestimmen, nachdem die IMU verbaut wurde.
Projektdurchführung
Projektplan
1. Erstellung einer BOM und Beschaffung der IMU
2. Löten der Anschlusspins an die IMU
3. Einlesen in das Datasheet des Sensors
4. Funktionstest mit einem Arduino und passender Library
5. Fehlersuche und -behebung mithilfe grafischer Ausgabe der Sensordaten
6. Anwenden von Filtern (Tiefpassfilter, Kalman) und Kalibrierungsalgorithmen zur Verbesserung der Daten
7. 3D-Darstellung der Bewegung eines Testkörpers in Matlab
Vorstellung der Bauteile
Die inertiale Messeinheit (IMU) GY-85 kombiniert mehrere Inertialsensoren auf einer Platine. Enthalten sind:
- ADXL345 (3-Achsen-Beschleunigungssensor)
- HMC5883L (3-Achsen Digitalkompass)
- ITG3205 (3-Achsen-Drehratensensor (Gyro) und integrierter Temperatursensor)
HMC5883L (3-Achsen Digitalkompass)
Der Kompasssensor stellt Werte für 3-Achsen bereit. Bei einer ebenen Ausrichtung sind nur X- und Y-Achse nötig, um die Abweichung von Norden zu berechnen. Ein 0° Kurs kennzeichnet die Ausrichtung nach Norden. Der Kompasssensor gibt den Kurs absolut an, ist jedoch störungsbehaftet, besonders wenn sich Ferromagnetika oder stromdurchflossene Leiter (v.a. Elektromotoren) in nahem Radius um den Sensor befinden. Der Sensor sollte mit einem minimalen Abstand von 30 cm zu Motoren angebracht werden.
ITG3205 (3-Achsen-Drehratensensor, Gyrosensor)
Der Gyrosensor misst Änderungen der Lage des Sensors im Raum und kann Winkelveränderungen um alle drei Drehachsen (3-Achsen Gyrosensor) detektieren. Seine Funktionalität beruht auf der Massenträgheit. Moderne MEMS-Gyrosensoren nutzen meist den piezoelektrischen Effekt, um ein oder mehrere Piezo-Elemente in Schwingung zu versetzen. Wird die Lagerung des Elementes nun in eine andere Richtung ausgerichtet, verformt dieses sich kurzzeitig, da es aufgrund der Trägheit seiner Masse zunächst in seiner vorherigen Schwingungsposition verbleibt. Der piezoelektrische Effekt findet nun umgekehrt statt und es wird eine Spannung induziert. Sie bildet das Ausgangssignal des Sensors und ist proportional zu dessen Winkelgeschwindigkeit. Die Werte des Gyrosensor kurzzeitig sehr genau, driften allerdings über die Zeit.
ADXL345 (3-Achsen-Beschleunigungssensor)
Der Beschleunigungssensor misst (Überraschung!) Beschleunigungen. Abbildung 1 zeigt das Modell eines solchen Sensors. Es handelt sich bei diesem Sensor um ein mikro-elektro-mechanische System (MEMS). Innerhalb des Sensors befindet sich eine kleine Testmasse, die allseitig von Federn gelagert ist. Bei Beschleunigungen wirkt durch die Trägheit der Testmasse eine Kraft auf eine oder mehrere der Federn. Die Auslenkung der Federn wiederum kann gemessen werden. Im Ruhezustand wird als einzige Beschleunigung die Erdbeschleunigung gemessen. Da diese immer Richtung Erdmittelpunkt gerichtet ist, kann der Beschleunigungssensor gut als Referenz und zu Korrektionen der aktuellen Ausrichtung genutzt werden. Die Werte driften nicht über Zeit, weisen allerdings ein hohes Rauschen auf und sind deshalb zur direkten Winkelbestimmung weniger geeignet die des Gyrosensors.
Ergebnis
Inertialnavigation mithilfe der GY-85 IMU
Die Datenübertragung von Sensor zu Mikrocontroller findet über eine I²C-Kommunikation statt. Die Sensoren weisen verschiedene Schwächen auf, die bei der Nutzung als Navigationssensoren zu berücksichtigen sind.
Wie in Abbildung 1 ersichtlich, soll durch die Fusionierung der drei Sensordaten ein genauerer Kurs ermittelt werden, als würde nur einer der Sensoren benutzt werden. Dabei werden auf kurze Laufzeiten die Daten des Gyrosensors genutzt. In wiederkehrenden Abständen werden diese Werte durch Daten des Beschleunigungssensors korrigiert. Zusätzlich findet der Kompasssensor Anwendung zur Korrektion dieser Werte.
Um die Kommunikation zu den einzelnen Sensoren der inertialen Messeinheit zu verstehen, kann diese zunächst testweise durch kleine Arduino Sketches vorgenommen werden. Dazu wird ein kleines Testprogramm geschrieben. Mithilfe der Standardbibliothek Wire sind I2C Verbindungen zwischen Arduino und Sensoren simple. So können beispielsweise die Einstellungs Register der Sensoren beschrieben oder die Messdaten aus den Daten-Registern gelesen werden. Ein Bespiel hierfür bietet das Wire_Accel_Connect.ino Programm. Die I2C-Adressen der Sensoren können den Datasheets entnommen werden, wo weiterhin auch die Adressierung der einzelnen Register und deren Bedeutungen zu finden sind. Nach Verbindung der IMU mit dem Arduino-Board können die Adressen auch mit dem I2C Scanner ausgelesen werden
Nach erfolgreichem Testen der einzelnen Sensoren werden für die weitere Verwendung der Sensoren Bibliotheken verwendet, die die Handhabung erleichtern.
Die Libraries für die einzelnen Sensoren sind hier erhältlich .
Die Bibliothek Filters übernimmt die Implementierung von Tiefpassfiltern für die Glättung der Sensorwerte.
Beschreibung des Hauptprogramms Inertialnavigation.ino
Nachdem Objekte für die einzelnen Sensor-Bibliotheken angelegt wurden, werden diese innerhalb der Setup-Routine initialisiert. Hier können auch Einstellungen an den Sensoren vorgenommen werden. Innerhalb der Main/Loop Routine werden nun kontinuierlich Sensorrohdaten eingelesen und anschließend mit einen Tiefpassfilter gefiltert. Es folgen Berechnungen um die Rohdaten in Winkel umzurechnen.
Beispiel Gyrosensor:
float gyroDegreesZ = float(lowPass_gz.output()) * float(timediff)/1000.0; // Integration der Winkelgeschwindigkeit zur Berechnung der Winkeldifferenz; // timediff Umwandlung von Millisekunden zu Sekunden gyroHeadingZ += (gyroDegreesZ + gyroHeadingCorrectionZ); // Berechnung des neuen Winkels als Summe des alten Winkels, der WInkeldifferenz und der Driftkorrektur if(gyroHeadingZ < -180) // Überlaufabfrage, damit sich der Winkel stets zwischen -180° und +180° befindet gyroHeadingZ += 360; else if(gyroHeadingZ > 180) // Überlaufabfrage, damit sich der Winkel stets zwischen -180° und +180° befindet gyroHeadingZ -= 360;
Der Gyrosensor misst die Winkelgeschwindigkeit. Soll aus dieser der relative Winkel berechnet werden, müssen die Sensordaten integriert werden. Im Programm wird dafür die Zeit in Millisekunden pro Schreifendurchlauf gemessen und in der Variable timediff gespeichert. Für die Berechnung des Winkels wird nun in jedem Durchlauf der aktuelle Gyrowert mit der Zeitdifferenz multipliziert und zu dem aktuellen Winkel addiert. In einer Kalibrierungsphase wird zudem nach dem Start des Programms eine Driftkorrektur berechnet und in gyroHeadingCorrectionZ gespeichert, um den Winkelwert zu verbessern.
Link für das SVN-Projektarchiv Inertialnavigation
Zusammenfasung
Ausblick
Weiterführende Links
- Ardumower Wiki
- Web-Shop: IMU
- Wiki: IMU
- Global Navigation Satellite Systems, Inertial Navigation, and Integration, 3e
- Matlab File Exchange: Visual Inertial Odometry
- Simulink Blocksatz: Three-Axis Inertial Measurement Unit
- Simulink Blocksatz: Three-Axis Gyroscope
- Simulink Blocksatz: Three-Axis Accelerometer
- MATLAB Examples: Designing a Guidance System in MATLAB and Simulink
- MathWorks: Quadcopter Project
- [Efficient and Robust Pose Estimation Based on Inertial and Visual Sensing https://mediatum.ub.tum.de/doc/1092914/document.pdf]
- Inertiasl-Visual Odometry on mobile Devices
- Live 3D Reconstruction on Mobile Phones
Unterlagen
Literatur
- Wendel, J.': Integrierte Navigationssysteme: Sensordatenfusion, GPS und inertiale Navigation. München : Oldenbourg Verlag, 2. Auflage 2011. ISBN: 9783486704396 eBook
YouTube-Video
→ zurück zum Hauptartikel: Fachpraktikum Elektrotechnik (WS 16/17)