Inhaltsverzeichnis:

Beschleunigungsmesser & Gyro-Tutorial - Gunook
Beschleunigungsmesser & Gyro-Tutorial - Gunook

Video: Beschleunigungsmesser & Gyro-Tutorial - Gunook

Video: Beschleunigungsmesser & Gyro-Tutorial - Gunook
Video: Ep. 57 Arduino Accelerometer & Gyroscope Tutorial MPU-6050 6DOF Module 2024, Juli
Anonim
Beschleunigungsmesser & Gyro-Tutorial
Beschleunigungsmesser & Gyro-Tutorial

Einführung

Dieses Handbuch richtet sich an alle, die daran interessiert sind, Beschleunigungsmesser und Gyroskope sowie kombinierte IMU-Geräte (Inertial Measurement Unit) in ihren Elektronikprojekten zu verwenden

Wir werden abdecken:

  • Was misst ein Beschleunigungsmesser?
  • Was misst ein Gyroskop (auch bekannt als Gyro)?
  • So konvertieren Sie Analog-Digital (ADC)-Messwerte, die Sie von diesen Sensoren erhalten, in physikalische Einheiten (dies wären g für Beschleunigungsmesser, deg/s für Gyroskop)
  • So kombinieren Sie Beschleunigungsmesser- und Gyroskop-Messwerte, um genaue Informationen über die Neigung Ihres Geräts relativ zur Grundebene zu erhalten

Während des gesamten Artikels werde ich versuchen, die Mathematik auf ein Minimum zu beschränken. Wenn Sie wissen, was Sinus/Cosinus/Tangent sind, sollten Sie diese Ideen verstehen und in Ihrem Projekt verwenden können, unabhängig davon, welche Plattform Sie verwenden: Arduino, Propeller, Basic Stamp, Atmel-Chips, Microchip PIC usw.

Es gibt Leute, die glauben, dass Sie komplexe Mathematik benötigen, um eine IMU-Einheit zu verwenden (komplexe FIR- oder IIR-Filter wie Kalman-Filter, Parks-McClellan-Filter usw.). Sie können all das recherchieren und wunderbare, aber komplexe Ergebnisse erzielen. Meine Art, Dinge zu erklären, erfordert nur grundlegende Mathematik. Ich bin ein großer Anhänger der Einfachheit. Ich denke, ein einfaches System ist einfacher zu steuern und zu überwachen, außerdem verfügen viele eingebettete Geräte nicht über die Leistung und die Ressourcen, um komplexe Algorithmen zu implementieren, die Matrixberechnungen erfordern.

Ich verwende als Beispiel eine neue IMU-Einheit, den Acc_Gyro Accelerometer + Gyro IMU. Wir verwenden Parameter dieses Geräts in unseren Beispielen unten. Dieses Gerät ist ein gutes Gerät für den Anfang, da es aus 2 Geräten besteht:

- LIS331AL (Datenblatt) - ein triaxialer 2G-Beschleunigungsmesser - LPR550AL (Datenblatt) - ein zweiachsiges Nick- und Roll-, 500-Grad/Sek.-Gyroskop

Zusammen stellen sie eine Trägheitsmesseinheit mit 5 Freiheitsgraden dar. Das ist jetzt ein schicker Name! Nichtsdestotrotz verbirgt sich hinter dem ausgefallenen Namen ein sehr nützliches Kombigerät, das wir in diesem Handbuch ausführlich behandeln und erklären.

Schritt 1: Der Beschleunigungsmesser

Der Beschleunigungsmesser
Der Beschleunigungsmesser

Um diese Einheit zu verstehen, beginnen wir mit dem Beschleunigungsmesser. Wenn man an Beschleunigungsmesser denkt, ist es oft nützlich, sich eine Schachtel in Form eines Würfels mit einer Kugel darin vorzustellen. Sie können sich etwas anderes wie einen Keks oder einen Donut vorstellen, aber ich stelle mir einen Ball vor:

Beschleunigungsmesser-Modell
Beschleunigungsmesser-Modell

Wenn wir diese Kiste an einem Ort ohne Gravitationsfelder oder ohne andere Felder nehmen, die die Position der Kugel beeinflussen könnten, schwebt die Kugel einfach in der Mitte der Kiste. Sie können sich vorstellen, dass sich die Kiste im Weltraum befindet, weit entfernt von allen kosmischen Körpern, oder wenn ein solcher Ort schwer zu finden ist, stellen Sie sich zumindest ein Raumschiff vor, das um den Planeten kreist, in dem sich alles in einem schwerelosen Zustand befindet. Aus dem obigen Bild können Sie sehen, dass wir jeder Achse ein Paar Wände zuweisen (wir haben die Wand Y+ entfernt, damit wir in die Box schauen können). Stellen Sie sich vor, dass jede Wand druckempfindlich ist. Wenn wir den Kasten plötzlich nach links bewegen (wir beschleunigen ihn mit Beschleunigung 1g = 9,8m/s^2), trifft der Ball auf die Wand X-. Wir messen dann die Druckkraft, die der Ball auf die Wand ausübt und geben einen Wert von -1g auf der X-Achse aus.

Beschleunigungsmesser-Modell
Beschleunigungsmesser-Modell

Bitte beachten Sie, dass der Beschleunigungsmesser tatsächlich eine Kraft erkennt, die in die entgegengesetzte Richtung des Beschleunigungsvektors gerichtet ist. Diese Kraft wird oft als Trägheitskraft oder fiktive Kraft bezeichnet. Eine Sache, die Sie daraus lernen sollten, ist, dass ein Beschleunigungsmesser die Beschleunigung indirekt durch eine Kraft misst, die auf eine seiner Wände ausgeübt wird (nach unserem Modell kann es in realen Beschleunigungsmessern eine Feder oder etwas anderes sein). Diese Kraft kann durch die Beschleunigung verursacht werden, aber wie wir im nächsten Beispiel sehen werden, wird sie nicht immer durch Beschleunigung verursacht.

Wenn wir unser Modell nehmen und auf die Erde stellen, fällt der Ball auf die Z-Wand und übt eine Kraft von 1 g auf die untere Wand aus, wie im Bild unten gezeigt:

Beschleunigungsmesser-Modell
Beschleunigungsmesser-Modell

In diesem Fall bewegt sich die Box nicht, aber wir erhalten immer noch einen Messwert von -1g auf der Z-Achse. Der Druck, den die Kugel auf die Wand ausgeübt hat, wurde durch eine Gravitationskraft verursacht. Theoretisch könnte es eine andere Art von Kraft sein. Wenn Sie sich beispielsweise vorstellen, dass unser Ball metallisch ist, könnte ein Magnet neben der Schachtel den Ball bewegen, sodass er auf eine andere Wand trifft. Dies wurde nur gesagt, um zu beweisen, dass der Beschleunigungsmesser im Wesentlichen die Kraft und nicht die Beschleunigung misst. Es kommt einfach vor, dass die Beschleunigung eine Trägheitskraft verursacht, die vom Krafterfassungsmechanismus des Beschleunigungsmessers erfasst wird.

Obwohl dieses Modell nicht genau der Konstruktion eines MEMS-Sensors entspricht, ist es oft nützlich, um Probleme im Zusammenhang mit Beschleunigungsmessern zu lösen. Es gibt tatsächlich ähnliche Sensoren, die metallische Kugeln im Inneren haben, sie werden Neigungsschalter genannt, sie sind jedoch primitiver und können normalerweise nur feststellen, ob das Gerät innerhalb eines bestimmten Bereichs geneigt ist oder nicht, nicht das Ausmaß der Neigung.

Bisher haben wir den Beschleunigungsmesserausgang auf einer einzelnen Achse analysiert und das ist alles, was Sie mit einem einachsigen Beschleunigungsmesser erhalten. Der wahre Wert von triaxialen Beschleunigungsmessern liegt darin, dass sie Trägheitskräfte auf allen drei Achsen erfassen können. Kehren wir zu unserem Boxmodell zurück und drehen wir die Box um 45 Grad nach rechts. Der Ball berührt jetzt 2 Wände: Z- und X- wie im Bild unten gezeigt:

Beschleunigungsmesser-Modell
Beschleunigungsmesser-Modell

Die Werte von 0,71 sind nicht willkürlich, sie sind eigentlich eine Näherung für SQRT(1/2). Dies wird deutlicher, wenn wir unser nächstes Modell für den Beschleunigungsmesser vorstellen.

Im Vorgängermodell haben wir die Gravitationskraft fixiert und unsere imaginäre Box gedreht. In den letzten 2 Beispielen haben wir die Ausgabe in 2 verschiedenen Boxpositionen analysiert, während der Kraftvektor konstant blieb. Dies war zwar nützlich, um zu verstehen, wie der Beschleunigungsmesser mit äußeren Kräften interagiert, es ist jedoch praktischer, Berechnungen durchzuführen, wenn wir das Koordinatensystem an den Achsen des Beschleunigungsmessers fixieren und sich vorstellen, dass sich der Kraftvektor um uns dreht.

Beschleunigungsmesser-Modell
Beschleunigungsmesser-Modell

Bitte sehen Sie sich das Modell oben an, ich habe die Farben der Achsen beibehalten, damit Sie gedanklich vom Vorgängermodell zum neuen übergehen können. Stellen Sie sich vor, dass jede Achse im neuen Modell senkrecht zu den entsprechenden Flächen der Box im vorherigen Modell steht. Der Vektor R ist der Kraftvektor, den der Beschleunigungsmesser misst (es könnte entweder die Gravitationskraft oder die Trägheitskraft aus den obigen Beispielen oder eine Kombination aus beiden sein). Rx, Ry, Rz sind Projektionen des R-Vektors auf die X-, Y-, Z-Achsen. Bitte beachten Sie folgenden Zusammenhang:

R^2 = Rx^2 + Ry^2 + Rz^2 (Gl. 1)

was im Grunde das Äquivalent des Satzes des Pythagoras in 3D ist.

Denken Sie daran, dass ich Ihnen vor einiger Zeit gesagt habe, dass die Werte von SQRT(1/2) ~ 0,71 nicht zufällig sind. Wenn Sie sie in die obige Formel einsetzen, können wir, nachdem wir uns daran erinnern, dass unsere Gravitationskraft 1 g betrug, Folgendes überprüfen:

1^2 = (-SQRT(1/2))^2 + 0 ^2 + (-SQRT(1/2))^2

einfach durch Einsetzen von R=1, Rx = -SQRT(1/2), Ry = 0, Rz = -SQRT(1/2) in Gl.1

Nach einer langen Vorrede der Theorie nähern wir uns den Beschleunigungsmessern im wirklichen Leben. Die Werte Rx, Ry, Rz hängen tatsächlich linear mit den Werten zusammen, die Ihr realer Beschleunigungsmesser ausgibt und die Sie für verschiedene Berechnungen verwenden können.

Bevor wir dort ankommen, lassen Sie uns ein wenig darüber sprechen, wie Beschleunigungsmesser uns diese Informationen liefern. Die meisten Beschleunigungsmesser fallen in zwei Kategorien: digital und analog. Digitale Beschleunigungsmesser geben Ihnen Informationen über ein serielles Protokoll wie I2C, SPI oder USART, während analoge Beschleunigungsmesser einen Spannungspegel innerhalb eines vordefinierten Bereichs ausgeben, den Sie mit einem ADC-Modul (Analog-Digital-Wandler) in einen digitalen Wert umwandeln müssen. Auf die Funktionsweise von ADC werde ich nicht näher eingehen, teils weil es ein so umfangreiches Thema ist und teils weil es von Plattform zu Plattform unterschiedlich ist. Einige Mikrocontroller verfügen über integrierte ADC-Module, einige benötigen externe Komponenten, um die ADC-Umwandlungen durchzuführen. Egal welche Art von ADC-Modul Sie verwenden, Sie erhalten einen Wert in einem bestimmten Bereich. Zum Beispiel gibt ein 10-Bit-ADC-Modul einen Wert im Bereich von 0..1023 aus, beachten Sie, dass 1023 = 2^10 -1 ist. Ein 12-Bit-ADC-Modul gibt einen Wert im Bereich von 0..4095 aus, beachten Sie, dass 4095 = 2^12-1.

Betrachten wir ein einfaches Beispiel. Nehmen wir an, unser 10-Bit-ADC-Modul hat uns die folgenden Werte für die drei Beschleunigungsmesserkanäle (Achsen) gegeben:

AdcRx = 586 AdcRy = 630 AdcRz = 561

Jedes ADC-Modul hat eine Referenzspannung, in unserem Beispiel nehmen wir an, sie beträgt 3,3 V. Um einen 10-Bit-Adc-Wert in eine Spannung umzuwandeln, verwenden wir die folgende Formel:

VoltsRx = AdcRx * Vref / 1023

Eine kurze Anmerkung hier: Für 8-Bit-ADC wäre der letzte Teiler 255 = 2 ^ 8 -1, und für 12-Bit-ADC wäre der letzte Teiler 4095 = 2 ^ 12 -1.

Wenn wir diese Formel auf alle 3 Kanäle anwenden, erhalten wir:

VoltsRx = 586 * 3,3V / 1023 =~ 1,89V (wir runden alle Ergebnisse auf 2 Dezimalpunkte) VoltsRy = 630 * 3,3V / 1023 =~ 2,03V VoltsRz = 561 * 3,3V / 1023 =~ 1,81V

Jeder Beschleunigungsmesser hat einen Null-g-Spannungspegel, Sie können ihn in den Spezifikationen finden, dies ist die Spannung, die 0 g entspricht. Um einen vorzeichenbehafteten Spannungswert zu erhalten, müssen wir die Verschiebung von diesem Niveau berechnen. Nehmen wir an, unser 0g-Spannungspegel ist VzeroG = 1,65V. Wir berechnen die Spannungsverschiebungen von der Null-g-Spannung wie folgt:

DeltaVoltsRx = 1,89V - 1,65V = 0,24V DeltaVoltsRy = 2,03V - 1,65V = 0,38V DeltaVoltsRz = 1,81V - 1,65V = 0,16V

Wir haben jetzt unsere Beschleunigungsmesser-Messwerte in Volt, es ist immer noch nicht in g (9,8 m/s^2), um die endgültige Konvertierung durchzuführen, wenden wir die Beschleunigungsmesser-Empfindlichkeit an, die normalerweise in mV/g ausgedrückt wird. Nehmen wir an, unsere Empfindlichkeit = 478,5 mV/g = 0,4785 V/g. Empfindlichkeitswerte finden Sie in den Beschleunigungsmesser-Spezifikationen. Um die endgültigen Kraftwerte in g zu erhalten, verwenden wir die folgende Formel:

Rx = DeltaVoltsRx / Empfindlichkeit

Rx = 0,24V / 0,4785V/g =~ 0,5g Ry = 0,38V / 0,4785V/g =~ 0,79g Rz = 0,16V / 0,4785V/g =~ 0,33g

Wir könnten natürlich alle Schritte in einer Formel kombinieren, aber ich habe alle Schritte durchlaufen, um zu verdeutlichen, wie Sie von ADC-Messwerten zu einer Kraftvektorkomponente in g gelangen.

Rx = (AdcRx * Vref / 1023 - VzeroG) / Empfindlichkeit (Gl.2) Ry = (AdcRy * Vref / 1023 - VzeroG) / Empfindlichkeit Rz = (AdcRz * Vref / 1023 - VzeroG) / Empfindlichkeit

Wir haben jetzt alle 3 Komponenten, die unseren Trägheitskraftvektor definieren. Wenn das Gerät keinen anderen Kräften als der Gravitation unterliegt, können wir annehmen, dass dies die Richtung unseres Gravitationskraftvektors ist. Wenn Sie die Neigung des Geräts relativ zum Boden berechnen möchten, können Sie den Winkel zwischen diesem Vektor und der Z-Achse berechnen. Wenn Sie sich auch für die Neigungsrichtung pro Achse interessieren, können Sie dieses Ergebnis in 2 Komponenten aufteilen: Neigung auf der X- und Y-Achse, die als Winkel zwischen Gravitationsvektor und X / Y-Achse berechnet werden kann. Die Berechnung dieser Winkel ist einfacher als Sie vielleicht denken, da wir nun die Werte für Rx, Ry und Rz berechnet haben. Kehren wir zu unserem letzten Beschleunigungsmesser-Modell zurück und machen einige zusätzliche Notationen:

Bild
Bild

Die Winkel, die uns interessieren, sind die Winkel zwischen den X-, Y-, Z-Achsen und dem Kraftvektor R. Wir definieren diese Winkel als Axr, Ayr, Azr. An dem rechtwinkligen Dreieck, das von R und Rx gebildet wird, können Sie Folgendes erkennen:

cos(Axr) = Rx / R, und ähnlich: cos(Ayr) = Ry / R cos(Azr) = Rz / R

Aus Gleichung 1 können wir ableiten, dass R = SQRT(Rx^2 + Ry^2 + Rz^2).

Wir können jetzt unsere Winkel finden, indem wir die arccos()-Funktion (die inverse cos()-Funktion) verwenden:

Axr = arccos(Rx/R) Ayr = arccos(Ry/R) Azr = arccos(Rz/R)

Wir haben einen langen Weg zurückgelegt, um das Beschleunigungsmesser-Modell zu erklären, nur um diese Formeln zu erreichen. Abhängig von Ihren Anwendungen möchten Sie möglicherweise von uns abgeleitete Zwischenformeln verwenden. Wir werden auch bald das Gyroskop-Modell vorstellen und sehen, wie Beschleunigungsmesser- und Gyroskop-Daten kombiniert werden können, um noch genauere Neigungsschätzungen zu ermöglichen.

Aber bevor wir das tun, lassen Sie uns noch ein paar nützliche Notationen machen:

cosX = cos(Axr) = Rx / R cosy = cos(Ayr) = Ry / R cosZ = cos(Azr) = Rz / R

Dieses Triplett wird oft Direction Cosinus genannt und stellt im Wesentlichen den Einheitsvektor (Vektor mit Länge 1) dar, der dieselbe Richtung wie unser R-Vektor hat. Das können Sie ganz einfach überprüfen:

SQRT(cosX^2 + cosY^2 + cosZ^2) = 1

Dies ist eine nette Eigenschaft, da sie uns davon befreit, den Modulus (die Länge) des R-Vektors zu überwachen. Wenn wir nur an der Richtung unseres Trägheitsvektors interessiert sind, ist es oft sinnvoll, seinen Modul zu normalisieren, um andere Berechnungen zu vereinfachen.

Schritt 2: Gyroskop

Gyroskop
Gyroskop

Wir werden kein äquivalentes Boxmodell für das Gyroskop einführen, wie wir es für den Beschleunigungsmesser getan haben, sondern wir werden direkt zum zweiten Beschleunigungsmesser-Modell springen und zeigen, was das Gyroskop gemäß diesem Modell misst.

Bild
Bild

Jeder Kreiselkanal misst die Drehung um eine der Achsen. Zum Beispiel misst ein 2-Achsen-Gyroskop die Drehung um (oder manche sagen "um") die X- und Y-Achse. Um diese Rotation in Zahlen auszudrücken, machen wir einige Notationen. Zuerst definieren wir:

Rxz - ist die Projektion des Trägheitskraftvektors R auf die XZ-Ebene Ryz - ist die Projektion des Trägheitskraftvektors R auf die YZ-Ebene

Aus dem rechtwinkligen Dreieck, das durch Rxz und Rz gebildet wird, erhalten wir mit dem Satz des Pythagoras:

Rxz^2 = Rx^2 + Rz^2, und ähnlich: Ryz^2 = Ry^2 + Rz^2

beachten Sie auch, dass:

R^2 = Rxz^2 + Ry^2, dies kann aus Gleichung 1 und obigen Gleichungen abgeleitet werden, oder es kann aus einem rechtwinkligen Dreieck abgeleitet werden, das aus R und Ryz gebildet wird R^2 = Ryz^2 + Rx^2

Wir werden diese Formeln in diesem Artikel nicht verwenden, aber es ist nützlich, die Beziehung zwischen allen Werten in unserem Modell zu beachten.

Stattdessen definieren wir den Winkel zwischen der Z-Achse und den Rxz-, Ryz-Vektoren wie folgt:

Axz - ist der Winkel zwischen Rxz (Projektion von R auf XZ-Ebene) und Z-Achse Ayz - ist der Winkel zwischen Ryz (Projektion von R auf YZ-Ebene) und Z-Achse

Jetzt kommen wir dem, was das Gyroskop misst, näher. Das Gyroskop misst die Änderungsrate der oben definierten Winkel. Mit anderen Worten wird ein Wert ausgegeben, der sich linear auf die Änderungsrate dieser Winkel bezieht. Um dies zu erklären, nehmen wir an, dass wir den Drehwinkel um die Achse Y (das wäre der Axz-Winkel) zum Zeitpunkt t0 gemessen und als Axz0 definiert haben, als nächstes haben wir diesen Winkel zu einem späteren Zeitpunkt t1 gemessen und es war Axz1. Die Änderungsrate wird wie folgt berechnet:

RateAxz = (Axz1 – Axz0)/(t1 – t0).

Wenn wir Axz in Grad und die Zeit in Sekunden ausdrücken, wird dieser Wert in Grad/s ausgedrückt. Das misst ein Gyroskop.

In der Praxis liefert ein Gyroskop (es sei denn, es handelt sich um ein spezielles digitales Gyroskop) selten einen in Grad/s ausgedrückten Wert. Wie beim Beschleunigungsmesser erhalten Sie einen ADC-Wert, den Sie mit einer Formel ähnlich der Gl. 2, die wir für Beschleunigungsmesser definiert haben. Lassen Sie uns die ADC-zu-Grad/s-Umwandlungsformel für das Gyroskop vorstellen (wir gehen davon aus, dass wir ein 10-Bit-ADC-Modul verwenden, für 8-Bit-ADC ersetzen Sie 1023 durch 255, für 12-Bit-ADC ersetzen Sie 1023 durch 4095).

RateAxz = (AdcGyroXZ * Vref / 1023 - VzeroRate) / Empfindlichkeit Gl.3 RateAyz = (AdcGyroYZ * Vref / 1023 - VzeroRate) / Empfindlichkeit

AdcGyroXZ, AdcGyroYZ - werden von unserem Adc-Modul erhalten und stellen die Kanäle dar, die die Drehung der Projektion des R-Vektors in XZ bzw. in YZ-Ebenen messen, was der Aussage entspricht, dass die Drehung um die Y- bzw. X-Achse erfolgte.

Vref - ist die ADC-Referenzspannung, die wir im folgenden Beispiel verwenden werden 3,3 V VzeroRate - ist die Nullrate-Spannung, mit anderen Worten die Spannung, die das Gyroskop ausgibt, wenn es keiner Drehung unterliegt, für das Acc_Gyro-Board ist es zum Beispiel 1,23V (diese Werte finden Sie in den Spezifikationen) Empfindlichkeit - ist die Empfindlichkeit Ihres Gyroskops, die in mV / (Grad / s) ausgedrückt wird, oft als mV / Grad / s geschrieben, es sagt Ihnen im Wesentlichen, wie viele mV werden die Gyroskopleistung erhöht sich, wenn Sie die Rotationsgeschwindigkeit um ein Grad/s erhöhen. Die Empfindlichkeit der Acc_Gyro-Platine beträgt zum Beispiel 2mV/Grad/s oder 0,002V/Grad/s

Nehmen wir ein Beispiel, angenommen unser ADC-Modul hat folgende Werte zurückgegeben:

AdcGyroXZ = 571 AdcGyroXZ = 323

Mit der obigen Formel und den Spezifikationsparametern des Acc_Gyro-Boards erhalten wir:

RateAxz = (571 * 3,3 V / 1023 - 1,23 V) / (0,002 V/Grad/s) = ~ 306 Grad/s Rate Ayz = (323 * 3,3 V / 1023 - 1,23 V) / (0,002 V/Grad/s) =~ -94 Grad/s

Mit anderen Worten, das Gerät dreht sich um die Y-Achse (oder wir können sagen, es dreht sich in der XZ-Ebene) mit einer Geschwindigkeit von 306 Grad / s und um die X-Achse (oder wir können sagen, es dreht sich in der YZ-Ebene) mit einer Geschwindigkeit von - 94 Grad/s. Bitte beachten Sie, dass das negative Vorzeichen bedeutet, dass sich das Gerät entgegen der herkömmlichen positiven Richtung dreht. Konventionsgemäß ist eine Drehrichtung positiv. Ein gutes Gyroskop-Spezifikationsblatt zeigt Ihnen, welche Richtung positiv ist, andernfalls müssen Sie sie durch Experimentieren mit dem Gerät herausfinden und feststellen, welche Drehrichtung zu einer Erhöhung der Spannung am Ausgangspin führt. Dies geschieht am besten mit einem Oszilloskop, da die Spannung, sobald Sie die Rotation stoppen, auf den Null-Raten-Pegel zurückfällt. Wenn Sie ein Multimeter verwenden, müssen Sie mindestens einige Sekunden lang eine konstante Rotationsrate aufrechterhalten und die Spannung während dieser Rotation notieren und dann mit der Nullrate vergleichen. Ist sie größer als die Nullspannung, bedeutet dies, dass die Drehrichtung positiv ist.

Schritt 3: Kombinieren von Beschleunigungsmesser und Gyro

Kombinieren von Beschleunigungsmesser und Gyro
Kombinieren von Beschleunigungsmesser und Gyro

Alles zusammenfügen - Beschleunigungsmesser- und Gyroskopdaten kombinieren

Wenn Sie diesen Artikel lesen, haben Sie wahrscheinlich ein IMU-Gerät erworben oder beabsichtigen zu erwerben, oder wahrscheinlich planen Sie, eines aus separaten Beschleunigungsmesser- und Gyroskop-Geräten zu bauen.

Der erste Schritt bei der Verwendung eines kombinierten IMU-Geräts, das einen Beschleunigungsmesser und ein Gyroskop kombiniert, besteht darin, ihre Koordinatensysteme auszurichten. Der einfachste Weg, dies zu tun, besteht darin, das Koordinatensystem des Beschleunigungsmessers als Referenzkoordinatensystem zu wählen. Die meisten Datenblätter von Beschleunigungsmessern zeigen die Richtung der X-, Y- und Z-Achsen relativ zum Bild des physischen Chips oder Geräts an. Hier sind zum Beispiel die Richtungen der X-, Y- und Z-Achsen, wie in den Spezifikationen für das Acc_Gyro-Board gezeigt:

acc_gyro-Achsen
acc_gyro-Achsen

Die nächsten Schritte sind:

Identifizieren Sie die Gyroskop-Ausgänge, die den oben diskutierten RateAxz-, RateAyz-Werten entsprechen. Bestimmen Sie, ob diese Ausgänge aufgrund der physischen Position des Gyroskops relativ zum Beschleunigungsmesser invertiert werden müssen

Gehen Sie nicht davon aus, dass ein Gyroskop mit einem mit X oder Y gekennzeichneten Ausgang einer beliebigen Achse im Beschleunigungsmesser-Koordinatensystem entspricht, selbst wenn dieser Ausgang Teil einer IMU-Einheit ist. Am besten testen Sie es. Angenommen, Sie haben die Position des Gyroskops relativ zum Beschleunigungsmesser festgelegt. Es wird davon ausgegangen, dass die Grenzen des Kreisels und des Beschleunigungsmessers parallel zueinander sind, d. h. Sie platzieren den Kreisel in einem Winkel von 90° relativ zum Beschleunigungsmesser-Chip. Wenn Sie ein IMU-Board erworben haben, besteht die Möglichkeit, dass diese bereits auf diese Weise ausgerichtet sind. Wir werden in diesem Artikel nicht auf Modelle eingehen, bei denen das Gyroskop in einem unregelmäßigen Winkel relativ zum Beschleunigungsmesser platziert ist (sagen wir 45 oder 30 Grad), obwohl dies in einigen Anwendungen nützlich sein kann.

Hier ist eine Beispielsequenz, um zu bestimmen, welcher Ausgang des Gyroskops dem oben diskutierten RateAxz-Wert entspricht.

- Beginnen Sie mit der waagerechten Aufstellung des Geräts. Sowohl die X- als auch die Y-Ausgänge des Beschleunigungsmessers würden die Null-G-Spannung ausgeben (zum Beispiel für die Acc_Gyro-Platine ist dies 1,65 V).

- Als nächstes beginnen Sie, das Gerät um die Y-Achse zu drehen. Anders ausgedrückt, Sie drehen das Gerät in der XZ-Ebene, so dass sich die X- und Z-Beschleunigungsmesser-Ausgaben ändern und die Y-Ausgabe konstant bleibt. - beim Drehen des Geräts mit konstanter Geschwindigkeit beachten, welcher Gyroskopausgang sich ändert, die anderen Gyroskopausgänge sollten konstant bleiben - Der Gyroskopausgang, der sich während der Drehung um die Y-Achse (Rotation in der XZ-Ebene) geändert hat, liefert den Eingangswert für AdcGyroXZ, woraus Wir berechnen RateAxz - der letzte Schritt besteht darin, sicherzustellen, dass die Drehrichtung unserem Modell entspricht. In einigen Fällen müssen Sie den RateAxz-Wert möglicherweise aufgrund der physischen Position des Gyroskops relativ zum Beschleunigungsmesser invertieren - führen Sie den obigen Test erneut durch und drehen Sie das Gerät herum auf der Y-Achse überwachen Sie diesmal den X-Ausgang des Beschleunigungsmessers (AdcRx in unserem Modell). Wenn AdcRx wächst (die ersten 90 Grad Drehung aus der horizontalen Position), sollte auch AdcGyroXZ wachsen. Andernfalls müssen Sie RateAxz invertieren. Dies erreichen Sie, indem Sie in Gl.3 einen Vorzeichenfaktor wie folgt einführen:

RateAxz = InvertAxz * (AdcGyroXZ * Vref / 1023 - VzeroRate) / Sensitivity, wobei InvertAxz 1 oder -1. ist

Der gleiche Test kann für RateAyz durchgeführt werden, indem das Gerät um die X-Achse gedreht wird, und Sie können feststellen, welcher Gyroskopausgang RateAyz entspricht und ob er invertiert werden muss. Sobald Sie den Wert für InvertAyz haben, sollten Sie die folgende Formel verwenden, um RateAyz zu berechnen:

RateAyz = InvertAyz * (AdcGyroYZ * Vref / 1023 - VzeroRate) / Empfindlichkeit

Wenn Sie diese Tests auf dem Acc_Gyro-Board durchführen würden, erhalten Sie folgende Ergebnisse:

- der Ausgangspin für RateAxz ist GX4 und InvertAxz = -1. - der Ausgangspin für RateAyz ist GY4 und InvertAyz = -1

Von diesem Punkt an gehen wir davon aus, dass Sie Ihre IMU so eingerichtet haben, dass Sie die korrekten Werte für Axr, Ayr, Azr (wie in Teil 1. Beschleunigungsmesser definiert) und RateAxz, RateAyz (wie in Teil 2 definiert Gyroskop) berechnen können). Als nächstes werden wir die Beziehungen zwischen diesen Werten analysieren, die sich als nützlich erweisen, um eine genauere Schätzung der Neigung des Geräts relativ zur Grundebene zu erhalten.

Sie werden sich jetzt vielleicht fragen, wenn uns das Beschleunigungsmessermodell bereits Neigungswinkel von Axr, Ayr, Azr gegeben hat, warum sollten wir uns mit den Gyroskopdaten beschäftigen? Die Antwort ist einfach: Beschleunigungsmesserdaten können nicht immer zu 100 % vertrauenswürdig sein. Es gibt mehrere Gründe, denken Sie daran, dass der Beschleunigungsmesser die Trägheitskraft misst. Eine solche Kraft kann durch die Gravitation (und idealerweise nur durch die Gravitation) verursacht werden, aber sie kann auch durch die Beschleunigung (Bewegung) des Geräts verursacht werden. Als Ergebnis ist der Beschleunigungsmesser, selbst wenn er sich in einem relativ stabilen Zustand befindet, immer noch sehr empfindlich gegenüber Vibrationen und mechanischen Geräuschen im Allgemeinen. Dies ist der Hauptgrund, warum die meisten IMU-Systeme ein Gyroskop verwenden, um Beschleunigungsmesserfehler zu glätten. Aber wie wird das gemacht? Und ist das Gyroskop rauschfrei?

Das Gyroskop ist nicht rauschfrei, aber da es die Drehung misst, ist es weniger empfindlich gegenüber linearen mechanischen Bewegungen, der Art von Rauschen, unter der der Beschleunigungsmesser leidet. Gyroskope haben jedoch andere Arten von Problemen wie z wenn die Drehung stoppt). Nichtsdestotrotz können wir durch Mittelung der Daten von Beschleunigungsmesser und Gyroskop eine relativ bessere Schätzung der aktuellen Geräteneigung erhalten, als wenn wir die Beschleunigungsmesserdaten allein verwenden würden.

In den nächsten Schritten werde ich einen Algorithmus vorstellen, der von einigen Ideen inspiriert wurde, die in Kalman-Filtern verwendet werden, jedoch viel einfacher und einfacher auf eingebetteten Geräten zu implementieren ist. Sehen wir uns vorher an, was unser Algorithmus berechnen soll. Nun, es ist die Richtung des Gravitationskraftvektors R = [Rx, Ry, Rz], aus der wir andere Werte wie Axr, Ayr, Azr oder cosX, cosY, cosZ ableiten können, die uns eine Vorstellung von der Neigung unseres Geräts geben relativ zur Masseebene diskutieren wir die Beziehung zwischen diesen Werten in Teil 1. Man könnte sagen - haben wir diese Werte Rx, Ry, Rz nicht schon aus Gl.2 in Teil 1 ? Nun ja, aber denken Sie daran, dass diese Werte nur aus Beschleunigungsmesserdaten abgeleitet werden. Wenn Sie sie also direkt in Ihrer Anwendung verwenden, erhalten Sie möglicherweise mehr Rauschen, als Ihre Anwendung tolerieren kann. Um weitere Verwirrung zu vermeiden, definieren wir die Beschleunigungsmesser-Messungen wie folgt neu:

Racc - ist der vom Beschleunigungsmesser gemessene Trägheitskraftvektor, der aus folgenden Komponenten besteht (Projektionen auf den X-, Y-, Z-Achsen):

RxAcc = (AdcRx * Vref / 1023 - VzeroG) / Empfindlichkeit RyAcc = (AdcRy * Vref / 1023 - VzeroG) / Empfindlichkeit RzAcc = (AdcRz * Vref / 1023 - VzeroG) / Empfindlichkeit

Bisher haben wir eine Reihe von Messwerten, die wir rein aus den ADC-Werten des Beschleunigungsmessers erhalten können. Wir nennen diesen Datensatz einen "Vektor" und verwenden die folgende Notation.

Racc = [RxAcc, RyAcc, RzAcc]

Da diese Komponenten von Racc aus Beschleunigungsmesserdaten gewonnen werden können, können wir sie als Eingabe für unseren Algorithmus betrachten.

Bitte beachten Sie, dass Sie richtig liegen, da Racc die Gravitationskraft misst, wenn Sie annehmen, dass die Länge dieses wie folgt definierten Vektors gleich oder nahe 1 g ist.

|Racc| = SQRT(RxAcc^2 +RyAcc^2 + RzAcc^2), Zur Sicherheit ist es jedoch sinnvoll, diesen Vektor wie folgt zu aktualisieren:

Racc(normalisiert) = [RxAcc/|Racc|, RyAcc/|Racc|, RzAcc/|Racc|].

Dadurch wird sichergestellt, dass die Länge Ihres normalisierten Racc-Vektors immer 1 ist.

Als nächstes führen wir einen neuen Vektor ein und nennen ihn

Ruhe = [RxEst, RyEst, RzEst]

Dies ist die Ausgabe unseres Algorithmus, dies sind korrigierte Werte basierend auf Gyroskopdaten und basierend auf geschätzten Daten der Vergangenheit.

Hier ist, was unser Algorithmus tun wird: - Beschleunigungsmesser sagt uns: "Sie befinden sich jetzt in Position Racc" - wir sagen "Danke, aber lassen Sie mich überprüfen", - dann korrigieren Sie diese Informationen mit Gyroskopdaten sowie mit früheren Ruhedaten und wir geben einen neuen geschätzten Vektor Rest aus. - Wir betrachten Ruhe als unsere "beste Wahl" in Bezug auf die aktuelle Position des Geräts.

Mal sehen, wie wir es zum Laufen bringen können.

Wir beginnen unsere Sequenz, indem wir unserem Beschleunigungsmesser vertrauen und Folgendes zuweisen:

Ruhe(0) = Rac(0)

Übrigens, denken Sie daran, dass Rest und Racc Vektoren sind, also ist die obige Gleichung nur eine einfache Möglichkeit, 3 Gleichungssätze zu schreiben und Wiederholungen zu vermeiden:

RxEst(0) = RxAcc(0) RyEst(0) = RyAcc(0) RzEst(0) = RzAcc(0)

Als nächstes führen wir regelmäßige Messungen in gleichen Zeitintervallen von T Sekunden durch und erhalten neue Messungen, die wir als Racc(1), Racc(2), Racc(3) usw. definieren. Wir werden auch in jedem Zeitintervall Rest(1), Rest(2), Rest(3) usw. neue Schätzungen ausgeben.

Angenommen, wir sind bei Schritt n. Wir haben zwei bekannte Wertesätze, die wir verwenden möchten:

Rest(n-1) – unsere vorherige Schätzung, mit Rest(0) = Racc(0) Racc(n) – unsere aktuelle Beschleunigungsmessermessung

Bevor wir Rest(n) berechnen können, führen wir einen neuen Messwert ein, den wir von unserem Gyroskop und einer vorherigen Schätzung erhalten können.

Wir nennen es Rgyro, und es ist auch ein Vektor, der aus 3 Komponenten besteht:

Rgyro = [RxGyro, RyGyro, RzGyro]

Wir berechnen diesen Vektor eine Komponente nach der anderen. Wir beginnen mit RxGyro.

Kreiselmodell
Kreiselmodell

Beginnen wir mit der Beobachtung der folgenden Beziehung in unserem Gyroskopmodell, aus dem aus Rz und Rxz gebildeten rechtwinkligen Dreieck können wir das ableiten:

tan(Axz) = Rx/Rz => Axz = atan2(Rx, Rz)

Atan2 ist möglicherweise eine Funktion, die Sie noch nie zuvor verwendet haben 2 Argumente statt eines. Es ermöglicht uns, die beiden Werte von Rx, Rz in Winkel im gesamten Bereich von 360 Grad (-PI zu PI) umzuwandeln. Mehr über atan2 erfahren Sie hier.

Wenn wir also RxEst(n-1) und RzEst(n-1) kennen, können wir finden:

Axz(n-1) = atan2(RxEst(n-1), RzEst(n-1)).

Denken Sie daran, dass das Gyroskop die Änderungsrate des Axz-Winkels misst. Damit können wir den neuen Winkel Axz(n) wie folgt abschätzen:

Axz(n) = Axz(n-1) + RateAxz(n) * T

Denken Sie daran, dass RateAxz von unseren Gyroskop-ADC-Messwerten erhalten werden kann. Eine genauere Formel kann eine durchschnittliche Rotationsrate verwenden, die wie folgt berechnet wird:

RateAxzAvg = (RateAxz(n) + RateAxz(n-1)) / 2 Axz(n) = Axz(n-1) + RateAxzAvg * T

Auf die gleiche Weise finden wir:

Ayz(n) = Ayz(n-1) + RateAyz(n) * T

Okay, jetzt haben wir Axz(n) und Ayz(n). Wohin gehen wir von hier aus, um RxGyro/RyGyro abzuziehen? Aus Gl. 1 können wir die Länge des Vektors Rgyro wie folgt schreiben:

|Rgyro| = SQRT(RxGyro^2 + RyGyro^2 + RzGyro^2)

Da wir unseren Racc-Vektor normalisiert haben, können wir auch davon ausgehen, dass seine Länge 1 ist und er sich nach der Drehung nicht geändert hat, daher ist es relativ sicher zu schreiben:

|Rgyro| = 1

Nehmen wir für die folgenden Berechnungen eine vorübergehend kürzere Schreibweise:

x =RxGyro, y=RyGyro, z=RzGyro

Mit den obigen Beziehungen können wir schreiben:

x = x / 1 = x / SQRT(x^2+y^2+z^2)

Lassen Sie uns Zähler und Nenner des Bruchs durch SQRT (x^2 + z^2) teilen

x = (x / SQRT(x^2 + z^2)) / SQRT((x^2 + y^2 + z^2) / (x^2 + z^2))

Beachten Sie, dass x / SQRT(x^2 + z^2) = sin(Axz), also:

x = sin(Axz) / SQRT (1 + y^2 / (x^2 + z^2))

Nun multiplizieren Sie Zähler und Nenner des Bruchs innerhalb von SQRT mit z^2

x = sin(Axz) / SQRT (1 + y^2 * z ^2 / (z^2 * (x^2 + z^2)))

Beachten Sie, dass z / SQRT(x^2 + z^2) = cos(Axz) und y / z = tan(Ayz) ist, also schließlich:

x = sin(Axz) / SQRT (1 + cos(Axz)^2 * tan(Ayz)^2)

Zurück zu unserer Notation erhalten wir:

RxGyro = sin(Axz(n)) / SQRT (1 + cos(Axz(n))^2 * tan(Ayz(n))^2)

genauso finden wir das

RyGyro = sin(Ayz(n)) / SQRT (1 + cos(Ayz(n))^2 * tan(Axz(n))^2)

Jetzt finden wir endlich:

RzGyro = Sign(RzGyro)*SQRT(1 - RxGyro^2 - RyGyro^2).

Wobei Sign(RzGyro) = 1, wenn RzGyro>=0, und Sign(RzGyro) = -1, wenn RzGyro<0.

Eine einfache Möglichkeit, dies abzuschätzen, ist:

Vorzeichen(RzGyro) = Vorzeichen(RzEst(n-1))

Seien Sie in der Praxis vorsichtig, wenn RzEst(n-1) nahe 0 ist. Sie können in diesem Fall die Kreiselphase ganz überspringen und zuweisen: Rgyro = Rest(n-1). Rz wird als Referenz für die Berechnung der Axz- und Ayz-Winkel verwendet, und wenn es nahe 0 ist, können die Werte überlaufen und schlechte Ergebnisse auslösen. Sie befinden sich im Bereich großer Gleitkommazahlen, bei denen es den Implementierungen der tan() / atan()-Funktion möglicherweise an Genauigkeit mangelt.

Fassen wir also zusammen, was wir bisher haben, wir sind bei Schritt n unseres Algorithmus und haben die folgenden Werte berechnet:

Racc – aktuelle Messwerte von unserem Beschleunigungsmesser Rgyro – erhalten aus Ruhe(n-1) und aktuellen Gyroskopwerten

Welche Werte verwenden wir, um die aktualisierte Schätzung Rest(n) zu berechnen? Sie haben wahrscheinlich erraten, dass wir beide verwenden werden. Wir verwenden einen gewichteten Durchschnitt, sodass:

Ruhe(n) = (Racc * w1 + Rgyro * w2) / (w1 + w2)

Wir können diese Formel vereinfachen, indem wir Zähler und Nenner des Bruchs durch w1 dividieren.

Ruhe(n) = (Racc * w1/w1 + Rgyro * w2/w1) / (w1/w1 + w2/w1)

und nach Einsetzen von w2/w1 = wGyro erhalten wir:

Rest(n) = (Racc + Rgyro * wGyro) / (1 + wGyro)

In der obigen Forumula sagt uns wGyro, wie sehr wir unserem Gyro im Vergleich zu unserem Beschleunigungsmesser vertrauen. Dieser Wert kann experimentell gewählt werden, in der Regel führen Werte zwischen 5..20 zu guten Ergebnissen.

Der Hauptunterschied dieses Algorithmus vom Kalman-Filter besteht darin, dass dieses Gewicht relativ fest ist, während beim Kalman-Filter die Gewichte basierend auf dem gemessenen Rauschen der Beschleunigungsmesser-Messwerte ständig aktualisiert werden. Der Kalman-Filter ist darauf ausgerichtet, Ihnen "die besten" theoretischen Ergebnisse zu liefern, während dieser Algorithmus Ihnen "gut genug" für Ihre praktische Anwendung liefern kann. Sie können einen Algorithmus implementieren, der wGyro abhängig von einigen von Ihnen gemessenen Rauschfaktoren anpasst, aber feste Werte funktionieren für die meisten Anwendungen gut.

Wir sind nur einen Schritt davon entfernt, unsere aktualisierten Schätzwerte zu erhalten:

RxEst(n) = (RxAcc + RxGyro * wGyro) / (1 + wGyro) RyEst(n) = (RyAcc + RyGyro * wGyro) / (1 + wGyro) RzEst(n) = (RzAcc + RzGyro * wGyro) / (1 + wGyro)

Lassen Sie uns nun diesen Vektor noch einmal normalisieren:

R = SQRT(RxEst(n) ^2 + RyEst(n)^2 + RzEst(n)^2)

RxEst(n) = RxEst(n)/R RyEst(n) = RyEst(n)/R RzEst(n) = RzEst(n)/R

Und wir sind bereit, unsere Schleife noch einmal zu wiederholen.

Dieser Leitfaden erschien ursprünglich auf starlino.com, ich habe ein paar leichte Änderungen vorgenommen und ihn mit Erlaubnis erneut veröffentlicht. Danke Starlino!

Empfohlen: