Forum: Mikrocontroller und Digitale Elektronik Kalman Lagebestimmung BMA180 ITG3200


von Peter (Gast)


Lesenswert?

Hallo,

ich möchte auf gaaaanz Lange Sicht mal einen Oktokopter bauen. Habe mir 
jetzt ohne viel Ahnung von der Materie zu haben einen BMA180 
Beschleunigungssensor und einen ITG3200 Gyrosensor bei Sparkfun gegönnt. 
Ich kann die beiden Sensoren auch schon mit I2C auslesen. Auf Dauer soll 
halt auch GPS und ein Luftdrucksensor rein.
Nun ist die Frage, was mache ich mit den Sensordaten.

Ich habe gelesen, dass man die Sensordaten wohl am besten mit einem 
Kalmanfilter vereint. Kennt jemand ein Tutorial oder ein Buch welches 
den Filter erklärt? Ich möchte eigentlich keinen fertigen Code abtippen 
ohne Ihn zu verstehen. Schön wäre eine Erklärung die sowohl auf die 
Mathematik dahinter als auch auf eine Implementation auf einem µC 
eingeht.

Noch eine weitere Frage:
Wie kalibriere ich diese Sensoren sinnvoll. Selbst in Ruhelage ändern 
sich die Werte der Beschleunigungs/Drehratenregister ständig in einem so 
nicht erwarteten Bereich.

Und noch eine Frage: Die beiden Sensoren haben Temperatursensoren 
integriert. Gehe ich recht in der Annahme, dass diese nicht die 
Außentemperatur sondern die Chiptemperatur messen?

Schonmal Danke für eure Anregungen ;)
Mfg Peter

von Wolfgang H. (Gast)


Lesenswert?

Ich habe auch einen ITG3200 und weiß nicht wie ich diesen kalibiriere. 
Bitte da auch um Hilfe.

von Tom (Gast)


Lesenswert?

Schaut mal hier vorbei...
http://tom.pycke.be/mav/71/kalman-filtering-of-imu-data
http://tom.pycke.be/mav/70/gyroscope-to-roll-pitch-and-yaw
http://tom.pycke.be/mav/69/accelerometer-to-attitude

Peter schrieb:
> Noch eine weitere Frage:
> Wie kalibriere ich diese Sensoren sinnvoll. Selbst in Ruhelage ändern
> sich die Werte der Beschleunigungs/Drehratenregister ständig in einem so
> nicht erwarteten Bereich.

Was heißt "in einem so nicht erwarteten Bereich"?

Tom

von Peter (Gast)


Lesenswert?

Ich glaube ich habe meinen Fehler gefunden. Wenn ich nur das MSB 
Register auslese kommen sinnvolle Werte raus.

Die Werte werden im 2er Komplement ausgegeben und das habe ich beim 
Bitshiften der 14 Bit Zahl nicht bedacht.
Das MSB Register belegt Bit 13-6 und das LSB Register 5-0(allerdings auf 
Bitpositionen 7-2). Wie kombiniere ich die beiden Werte in eine richtige 
unsigned short Variable?

Mfg Peter

von Tom (Gast)


Lesenswert?

Bei mir sieht das ganze etwa so aus:

data->gyro_x_raw = ((data_received[3] << 8) | (data_received[4]));
data->gyro_y_raw = ((data_received[5] << 8) | (data_received[6]));
data->gyro_z_raw = ((data_received[7] << 8) | (data_received[8]));

gyro_x_raw ist als signed short int
und data_received als char deklariert.

gyro_x_raw / 14.375 ergibt dann die Drehrate in °/s

Tom

von Peter (Gast)


Lesenswert?

Hi,

bei einem 16 bit Wert verstehe ich das schon, aber wenn ich nun 14 bit 
in die 16 bit variable reinpackte muss ich ja eigentlich noch um 2 nach 
rechts shiften, damit die jeweiligen bits an der richtigen Stelle sind. 
Durch den Bitshift zerstöre ich doch dann aber die 2er 
Komplementdarstellung, oder?

Mfg Peter

von Tom (Gast)


Lesenswert?

Im Datenblatt S. 27:

8.6 Registers 27 to 34 – Sensor Registers
GYRO_XOUT_H/L 16-bit X gyro output data (2’s complement format)
GYRO_YOUT_H/L 16-bit Y gyro output data (2’s complement format)
GYRO_ZOUT_H/L 16-bit Y gyro output data (2’s complement format)

Da steht was von 16-Bit und bei mir funktionierts zumindest so.

Tom

von Peter (Gast)


Lesenswert?

Ich beschäftige mich grad bei der Auswertung noch nicht mit dem Gyro 
sondern mit dem BMA180, der Gyro kommt erst als nächstes dran ;)

von Lehrmann M. (ubimbo)


Lesenswert?

Peter schrieb:
> ITG3200 Gyrosensor

So eine Anmerkung. Der Sensor klingt zwar cool mit I2C und solchen 
Späßchen allerdings hat er einen Messbereich der absolut unnötig groß 
ist und damit eher unbrauchbar. +- 2000°/Sekunde
Bei einem Quadrocopter (bzw. Octo) sind +-300°/Sekunde mehr als 
ausreichend, da ansonsten die Auflösung darunter leidet. (bzgl. der ADC)
In meinen Augen wird's viele Probleme mit diesem Sensor geben aber ich 
habe selbst noch nicht mit ihm gearbeitet (auf Grund eben dieser 
Überlegungen). Allerdings würde mich interessieren ob du das mit diesem 
Sensor auch hinbekommst. Wäre super wenn du dich mal nochmal melden 
würdest.

Gleiches gilt für den Kalmanfilter. Die meisten verwenden ihn einfach 
aber wirklich verstehen tun ihn glaube ich die wenigsten. Es wäre z.B. 
super, wenn du ein Tutorial machen könntest (ausformuliert für 
Nicht-Mathematiker / Dummies) wo der Kalmanfilter erklärt wird. Die 
meisten bezeichnen ihn als "Magic Box" oder so ähnlich =)

von Tom (Gast)


Lesenswert?

Peter schrieb:
> Ich beschäftige mich grad bei der Auswertung noch nicht mit dem Gyro
> sondern mit dem BMA180

Ok. Das würde natürlich erklären wie du auf 14-Bit kommst ;)

Als Beschleunigungssensor hab ich den ADXL345 der mit 10-Bit arbeitet. 
Und das gute Stück lese ich wie die Gyros. Allerdings kann man dem auch 
über das Justify Bit (A setting of 1 in the justify bit selects left 
(MSB) justified mode, and a setting of 0 selects right justified mode 
with sign extension) beibringen wie er die Daten zu schicken hat.

Tom

von tomtom (Gast)


Lesenswert?

Noch ein Tipp von mir, benutzt statt dem I2C lieber den SPI, ist 
sicherer und schneller...

von Wolfgang H. (Gast)


Lesenswert?

@ Lehrmann Michael

Welchen Gyro würdest du denn prinzipiell empfehlen?
Werde mein Glück aber erstmal mit dem ITG versuchen. Stehe ja eh ganz am 
Anfang der Pläne un das Ziel ist noch sehr fern.

Wenn ich das mit dem Kalman Filter irgendwann mal soweit habe, dass ich 
das alles verstehe, kann ich mein Wissen gern teilen. ;)

Mfg Peter

von Mike (Gast)


Lesenswert?

@Wolfgang H.

Vielleicht helfen ja diese beiden Links um zu vergleichen

Accelerometer: 
http://www.sparkfun.com/commerce/tutorial_info.php?tutorials_id=167

Gyro: 
http://www.sparkfun.com/commerce/tutorial_info.php?tutorials_id=167&sipp=1&page=2

und nich einen Link der die Funktion der IMU erklärt:

http://www.starlino.com/imu_guide.html

von _Gast (Gast)


Lesenswert?

welchen g Bereich sollte man bei einem Beschleunigungssensor einstellen?

von ala42 (Gast)


Lesenswert?

signed char MSB = ...
unsigned char LSB = ...
signed short result = (((signed short)MSB) << 6) | (LSB>>2);

Da MSB signed ist wird das Vorzeichen bei der Konvertierung auf signed 
short korrekt expandiert. LSB ist unsigned, damit beim Rechtsschieben 
das (nicht vorhandene) Vorzeichen nicht nachgezogen wird.

von Michael K. (mmike)


Lesenswert?

Hallo Leute,

bin auch grad dabei nen Regler für meinen Tricopter zu programmieren auf 
Basis des XMega 128A1. Als Sensoren hab ich den ITG-3200 (Gyro) und den 
LIS3L02DQ (Accelerometer). Die Sensorfusion mache ich momentan mit einem 
Komoplementärfilter (einfach mal nach "The Balance Filter" googlen) und 
es funktioniert super! Das Gyro ist klasse! Wenig Drift (4° in 35 
Minuten) und wunderbare Auflösung ...

Momentan hab ich das Problem, dass der Sensor öfter mal "hängen" bleibt 
und der XMega "Arbitration lost" meldet. Trotz TWI Reset, Stop 
Condition, ... kommt der Sensor erst wieder in "Schwung", wenn ich einen 
Power-Cycle mache ... hat jemand von Euch auch schon ähnliche 
Erfahrungen gemacht?

Kabel sind ca. 15cm lang und 2.2k Pullups sind drin. Stromversorgung ist 
auch ok (mit dem Oszi gemessen).

Der Sensor ist auf dem Headerboard von Sparkfun (bezogen bei Watterott)

beste Grüße,
Michael

von Michael K. (mmike)


Lesenswert?

Hallo,

ich noch mal ... der Sensor wird mit eine Frequenz von 400Hz abgefragt 
(über den Data Ready Interrupt)

Grüße,
Michael

von Busel (Gast)


Lesenswert?

Lehrmann Michael schrieb:
> Es wäre z.B.
> super, wenn du ein Tutorial machen könntest (ausformuliert für
> Nicht-Mathematiker / Dummies) wo der Kalmanfilter erklärt wird. Die
> meisten bezeichnen ihn als "Magic Box" oder so ähnlich =)

Ja, immer her damit.

Gibt es sowas schon für FFT ?

von Franz (Gast)


Lesenswert?

Hallo,

eine Dokumentation mit Beispielen zum Thema Kalman gibts bei NI :

http://digital.ni.com/worldwide/germany.nsf/web/all/E10103F0159A7F2EC12568E90057F03B


ciao

Franz

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.