Meine längere Antwort im Folgenden geht daher davon aus, dass das Board beschleunigt wird und Sie in dieser Zeit immer noch in der Lage sein müssen, Ihre Neigung, Ihr Rollen und Ihr Gieren innerhalb kurzer Zeit zu messen. Wenn das Brett für alle Messungen stationär ist, funktioniert die Antwort von Mahendra Gunawardena perfekt für Sie. Wenn dies in ein Gerät wie einen Segway oder ein Modellflugzeug oder einen Multirotor oder irgendetwas geht, das sich bewegt, möchten Sie vielleicht weiterlesen. In diesem Beitrag wird erläutert, wie alle drei Sensoren mithilfe einer als Sensorfusion bezeichneten Methode verwendet werden. Mithilfe der Sensorfusion können Sie die Stärken der einzelnen Sensoren ermitteln und die Auswirkungen der Schwächen der einzelnen Sensoren minimieren.
Sensoreigenschaften und Hintergrund
Verstehen Sie zunächst, dass ein Beschleunigungsmesser alle Kräfte misst, die auf ihn einwirken, nicht nur die Schwerkraft. In einer perfekten Welt, in der sich der Beschleunigungsmesser in einer unbewegten Position ohne Vibrationen befindet, können Sie mithilfe einer einfachen Trigonometrie, wie Mahendra Gunawardenas Antwort zeigt, genau bestimmen, in welche Richtung er sich bewegt. Da ein Beschleunigungsmesser jedoch alle Kräfte aufnimmt, führen Vibrationen zu Geräuschen. Wenn das Board beschleunigt, können Sie nicht nur eine einfache Trigonometrie verwenden, da die vom Beschleunigungsmesser gemeldete Kraft nicht nur die Erdschwerkraft ist, sondern auch die Kraft, die Sie zum Beschleunigen veranlasst.
Ein Magnetometer ist einfacher als ein Beschleunigungsmesser. Bewegungen verursachen keine Probleme, aber Dinge wie Eisen und andere Magnete beeinträchtigen Ihre Leistung. Wenn die Quellen, die diese Störung verursachen, konstant sind, ist es nicht schwer damit umzugehen, aber wenn diese Quellen nicht konstant sind, wird es Tonnen von Geräuschen erzeugen, die problematisch zu beseitigen sind.
Von den drei Sensoren ist das Gyroskop wahrscheinlich der zuverlässigste und sie können normalerweise sehr gut die Drehzahl messen. Es wird nicht von Dingen wie Eisenquellen beeinflusst und Beschleunigungen haben im Grunde keinen Einfluss auf ihre Fähigkeit, die Drehzahl zu messen. Sie melden sehr gut die Geschwindigkeit, mit der sich das Gerät dreht. Da Sie jedoch einen absoluten Winkel suchen, müssen Sie die Geschwindigkeit integrieren, um die Position zu ermitteln. Auf diese Weise wird der Fehler der letzten Messung zum Fehler der neuen Messungen addiert, da die Integration im Grunde genommen eine Summe von Werten über einen Bereich ist, selbst wenn der Fehler für eine Messung nur 0,01 Grad pro Sekunde von Ihrer Position bei 100 Messungen abweicht kann um 1 Grad abweichen, bei 1000 Messungen können Sie um 10 Grad abweichen. Wenn Sie Hunderte von Messungen pro Sekunde durchführen, Sie können sehen, dass dies Probleme verursacht. Dies wird allgemein als Kreiseldrift bezeichnet.
Sensorfusion
Das Schöne daran, dass all diese Sensoren zusammenarbeiten, ist, dass Sie die Informationen von Beschleunigungsmesser und Magnetometer verwenden können, um die Kreiseldrift auszugleichen. Dies ermöglicht es Ihnen, die Genauigkeit und Geschwindigkeit des Kreisels ohne den fatalen Fehler der Kreiseldrift zu erreichen.
Die Daten dieser drei Sensoren können auf mehr als eine Weise kombiniert werden. Ich werde über die Verwendung eines Komplementärfilters sprechen, da ein Kalman-Filter und Kalman-Filter viel mehr Ressourcen auf eingebetteten Systemen verbrauchen. Oft ist ein komplementärer Filter gut genug, einfacher zu implementieren (vorausgesetzt, Sie verwenden keine vorgefertigte Bibliothek), und Sie können die Daten schneller verarbeiten.
Nun zum Prozess. Als erstes müssen Sie den Gyroskopausgang integrieren, um die Winkelgeschwindigkeit in die Winkelposition umzuwandeln. Sie müssen höchstwahrscheinlich auch einen Tiefpassfilter auf den Beschleunigungsmesser und den Magnetometer anwenden, um das Rauschen im Ausgang zu behandeln. Ein einfacher FIR-Filter wie der unten gezeigte funktioniert hier. Mit etwas Trigonometrie können Sie die Neigung und das Rollen mit dem Beschleunigungsmesser und das Gieren mit dem Magnetometer finden.
filteredData = (1-weight)*filteredData + weight*newData
Das Gewicht ist nur eine Konstante, die abhängig von der Lautstärke angepasst werden kann. Je höher die Lautstärke, desto geringer der Gewichtswert. Das Zusammenführen der Daten von den Sensoren kann nun durch die folgende Codezeile erfolgen.
fusedData = (1-weight)*gyroData + weight*accelMagData
Es ist anzumerken, dass die Daten ein Vektor des Nickens, Rollens und Gierens sind. Sie können auch nur drei Variablen anstelle von Arrays verwenden, wenn Sie möchten. Für diese Berechnung gibt der Kreisel eine Position in Grad in Nick, Roll und Gier an, der Magnetometer gibt einen Winkel für das Gieren an, während der Beschleunigungsmesser seine eigenen Zahlen für Nick und Roll angibt.
Wenn Sie noch mehr Informationen wünschen, können Sie "Sensor Fusion mit komplementärem Filter" googeln. Es gibt viele Artikel darüber.