Richtungsänderung mit MP6050

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
dascoco
User
Beiträge: 2
Registriert: Mittwoch 21. März 2018, 11:32

Mittwoch 21. März 2018, 11:36

Hallo,

Ich bastle an einem kleinen Roboter auf Basis eines RasPi Zero.
Bisher kann er schon Hindernisse erkennen und diesen ausweichen.

Jetzt habe ich noch einen MPU 6050 angebracht und mir ist es auch schon gelungen die Ergebnisse in Python auszulesen.

Jetzt würde ich gerne die Änderung der Fahrtrichtung darüber bestimmen, um Drehungen in einem angegebenen Winkel durchzuführen. (z.B. Der Roboter soll seine Fahrtrichtung um 90° im Uhrzeigersinn ändern)

Da der Gyro wohl eine Drift hat muss man das ganze mit der Beschleunigung Korrigieren wie ich gelesen habe. z.B mit einem Kalmanoder recht gut annähern über den Complementary Filter

Code: Alles auswählen

angle = 0.98 *(angle+gyro*dt) + 0.02*acc


Aber wie bekomme ich allgemein erst einmal den Winkel?

Einfach die Differenz des Gyro Z-Achse zum Zeitpunkt 0 und Zeitpunkt 1.

Und wie würde man das ganze am besten in Python umsetzen? Bin noch Anfänger in Python.
__deets__
User
Beiträge: 8097
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mittwoch 21. März 2018, 14:51

Kalman oder Complimentary Filter helfen dir bei einer MPU6050 nicht. Denn fuer die von dir gewuenschte Hochachse hast du gar keine Daten fuer eine Sensorfusion. Das geht nur fuer Nick- und Rollachse mit dem Vektor der Erdachse aus den Beschleunigungssensoren.

Dafuer koenntest du probieren eine MPU9050 zu benutzen, die auch noch einen Kompass hat. Besonders gut ist der aber nicht.

Stattdessen kannst du die (sehr temperaturabhaengige drift!) per Tabelle kompensieren. Fuer kurze Bewegungen wie 90 Grad drehen innerhalb von zB ein paar Sekunden sollte das gut genug sein.

Und du bekommst die Daten natuerlich einfach nur durch zyklisches abfragen und integrieren der Werte. Ich bin was Differentialgleichungen angeht nicht der grosse Held, aber ggf. lohnt es sich, da neben einfachem summieren auch mal auf ein anderes Verfahren wie Runge-Kutta zu schauen. Aber wie gesagt - da bin ich nicht super firm.
dascoco
User
Beiträge: 2
Registriert: Mittwoch 21. März 2018, 11:32

Samstag 24. März 2018, 11:29

Könntest du das mit der Temperaturtabelle etwas genauer erklären?
Hier mal mein bisheriger code. Allerdings ändert sich der WInkel selbst im Ruhezustand stark, da der Winkkel-Offset nicht immer 0 ist
Ich nutze folgende Bibliothek um die Sensorwerte abzufragen https://github.com/Tijndagamer/mpu6050/ ... mpu6050.py

Code: Alles auswählen

#!/usr/bin/python
import time
from mpu6050 import mpu6050
 
mpu = mpu6050(0x68)
gyro_data = mpu.get_gyro_data()

angle = 0
dt = 0
offset = gyro_data['z']

while 1:
		
	gyro_data = mpu.get_gyro_data()	
	gyroZ = gyro_data['z']
	angle = angle + (gyroZ-offset)*dt
	print gyroZ

 	dt += 0.01
	time.sleep(0.01)
__deets__
User
Beiträge: 8097
Registriert: Mittwoch 14. Oktober 2015, 14:29

Samstag 24. März 2018, 12:09

Wenn du dein Modul auf den Tisch legst und es fixierst, wirst du immer noch eine Drehrate messen. Verschieden groß auf verschiedenen Achsen, aber diese drift ist immer da.

Und jetzt nimmst du du einen Fön und bläst dein Modul an. Da wirst du eine deutliche Veränderung bemerken.

Darum haben die einen Temperatursensor eingebaut, und mit dem kannst du die drift pro Achse und Temperatur bestimmen. Und das liefert dir eine Tabelle, in der du einen Korrekturwert nachschlagen kannst. Und interpolieren zwischen den beiden nächstgelegenen Werten.

Das musst aber alles DU programmieren. Das kann das Modul nicht. Aber die Temperatur gibt es dir ja.
__deets__
User
Beiträge: 8097
Registriert: Mittwoch 14. Oktober 2015, 14:29

Samstag 24. März 2018, 12:13

Nachtrag: dein Code funktioniert so nicht. Du tust so als ob du ein fixes dt hast. Das stimmt nicht. Nur weil du schreibst sleep(.1) schläft der noch lange nicht präzise eine 10tel Sekunde. Mal abgesehen davon, das der Rest deins Codes ja auch was Zeit kostet.

Du musst also stattdessen immer die wirklich verflossene Zeit bestimmen, und DIE benutzen für deine Berechnung. Ggf kannst du vor und nach der Abfrage eine Zeitstempel nehmen, und mit dem Mittelwert rechnen. Weil das dann so ungefähr der tatsächliche Messpunkt ist. Besser wäre wahrscheinlich der FIFO Modus der MPU, weil der dann seinen eigenen Takt hat. Das kann aber das Modul nicht wenn ich das richtig gesehen habe. Selbst hinbekommen habe ich das nicht. Ist aber auch schon was her das ich es probiert habe.
Antworten