Was sind Methoden zum Umgang mit Kompassverzögerung (ratenabhängige Hysterese)?

12

Ich habe einen Roboter mit Profilantrieb, mit Radcodierern geringer Präzision für die Verfolgung der Entfernung und einem elektronischen Kompass für die Bestimmung der Fahrtrichtung. Der Kompass hat eine erhebliche Verzögerung (> 1 Sekunde), wenn sich der Roboter schnell dreht, z. B. nach Erreichen eines Wegpunkts.

Wie kann man mit dem Lag umgehen? Ich würde denken, man könnte viele Messungen durchführen und die Kompassantwort modellieren. Dies scheint jedoch problematisch zu sein, da es ratenabhängig ist und ich die momentane Rate nicht kenne.

Als einfache, aber langsame Annäherung lasse ich den Roboter drehen, bis er sehr grob in die richtige Richtung zeigt, und mache dann sehr kleine inkrementelle Drehungen mit kurzen Messpausen, bis er in die richtige Richtung zeigt. Gibt es andere Möglichkeiten, damit umzugehen?

ViennaMike
quelle

Antworten:

12

Die Verzögerung im Kompass beruht auf einem Tiefpassfilter, um hochfrequentes Rauschen zu unterdrücken.

  • Es gibt teurere Magnetometer, die weniger Rauschen und daher weniger Verzögerung aufweisen.
  • Es ist auch möglich, ein Gyroskop zu verwenden, um die Genauigkeit zu verbessern. Genau das tun Inertial Measurement Units (IMUs). Dies kann durch Verwendung eines Kalman-Filters erreicht werden. Die Verbesserung der Genauigkeit trägt zur Verringerung der Verzögerung bei, da eine höhere Genauigkeit die Abhängigkeit von einem Tiefpassfilter zur Unterdrückung von Rauschen verringert. Der Kalman-Filter verschmilzt die Daten des Magnetometers und des Gyroskops (das die Geschwindigkeit der Kursänderung misst).

Wenn Sie bei Ihrem aktuellen Kompass bleiben, gibt es zwei mögliche Lösungen (Achtung, dies wird immer fortgeschrittener, aber Option 1 sollte für die meisten Menschen ohne zu viel Arbeit zugänglich sein).

  1. Sie können versuchen, den Filter aufzuheben. Dies kann Verzögerungen beseitigen, erhöht aber auch das Hochfrequenzrauschen. Anschließend können Sie versuchen, den Roboter anhand der neuen Steuerkursschätzung zu steuern. Dazu müssen Sie experimentieren, um die Tiefpassfilterparameter zu ermitteln. In diskreter Zeit könnten Sie beispielsweise Folgendes finden:

    θ (t)tθt

    θ^(t)=a0θ(t)+a1θ(t1)++akθ(tk)
    wobei die geschätzte Richtung (Kompassausgabe) bei ist Zeit , ist die tatsächliche Richtung (Grundwahrheit) zur Zeit .θ^(t)tθt

    Sie können die Parameter indem Sie ein Experiment durchführen, bei dem Sie die Grundwahrheit mit anderen externen Mitteln messen. Bei Abtastwerten haben Sie folgende Gleichung: ain+k+1

    [θ^(k)θ^(k+n)]=[θ(k)θ(k1)θ(0)θ(k+n)θ(k+n1)θ(n)][a0a1ak]

    Und Sie können lösen, indem Sie finden: wobei die pseudoinverse Matrix von . Es gibt keinen definitiven Weg, um zu , also werden Sie wahrscheinlich nur raten. Bei Bonuspunkten wird davon ausgegangen, dass das Rauschen weiß und unabhängig ist. Sie können es jedoch zuerst aufhellen, um die Verzerrung zu beseitigen und die Schätzung der Parameter zu verbessern.M+Mk

    [a0a1ak]=[θ(k)θ(k1)θ(0)θ(k+n)θ(k+n1)θ(n)]+[θ^(k)θ^(k+n)]
    M+Mk

    Sie können dies in eine Übertragungsfunktion umwandeln (im diskreten Zeitbereich auch als Z-Transformation bezeichnet):

    Θ^(z)Θ(z)=a0+a1z1+...+akzk

    Um dies aufzuheben, können wir die Umkehrung nehmen (wobei unsere neue Schätzung der Überschrift ist):θ¯(t)

    Θ¯(z)Θ^(z)=1a0+a1z1++akzk

    Zurück in die Zeitdomäne konvertieren:

    a0θ¯(t)+a1θ¯(t1)++akθ¯(tk)=θ^(t)

    θ¯(t)=θ^(t)a1θ¯(t1)akθ¯(tk)a0

    Wir können dann , um den Roboter zu steuern.θ¯

    Dies ist sehr laut, daher sollten Sie vor der Verwendung möglicherweise noch durch einen Tiefpassfilter leiten (obwohl möglicherweise einer mit geringerer Verzögerung).θ¯

  2. Die obige Lösung ist immer noch nicht der beste Weg. Die Schätzung des Rauschens ist möglicherweise nicht sehr nützlich. Wenn wir dies in eine Zustandsraumgleichung setzen, können wir ein Kalman-Filter und einen Vollzustands-Rückkopplungsregler unter Verwendung von LQR (linearer quadratischer Regler) entwerfen. Die Kombination aus einem Kalman-Filter und einem LQR-Regler wird auch als LQG-Regler (lineares quadratisches Gauß) bezeichnet und verwendet die Rückgewinnung durch Schleifenübertragung, um einen guten Regler zu erhalten.

    Überlegen Sie sich dazu die (zeitdiskreten) Zustandsraumgleichungen:

    x(t)=Ax(t1)+Bu(t1) ,y(t)=Cx(t)

    oder:

    x(t)=[θ(t)θ(t1)θ(tk)]=[A1A200010000010000010000010]x(t1)+[B0B1000]u(t1)

    y(t)=[θ^(t)]=[a0a1ak]x(t)

    Dabei steht für die Leistung der Motoren zum Drehen des Roboters und , , , Auswirkung auf die Fahrtrichtung auf der Grundlage von Position und Geschwindigkeit (Sie können Werte ungleich Null auswählen für die anderen Elemente der Matrix und auch für die erste Zeile der Matrix).u(t1)A0A1B0B1BA

    Anschließend können Sie Ihren Beobachter (Kalman-Filter) , indem Sie die und für das Prozessrauschen und das . Der Kalman-Filter kann dann die optimale Kursschätzung unter Berücksichtigung dieser Annahmen über das Rauschen finden. Nach der Auswahl der Rauschschätzungen hängt die Implementierung nur von der Implementierung von Code für den Kalman-Filter ab (Gleichungen sind auf Wikipedia verfügbar, daher werde ich hier nicht darauf eingehen).QoRo

    Danach können Sie einen LQR Controller - Design, dieses Mal, die Wahl und die Gewichtung darstellt , um die Regelung der Überschrift gegeben, und zu versuchen , die Verwendung der Aktoren zu begrenzen. In diesem Fall können Sie und . Dies geschieht, weil LQR den optimalen Controller findet, um eine Kostenfunktion zu minimieren:QcRcQc=[100000000000]Rc=[1]J=(xTQx+uTRu)

    Dann setzen Sie es einfach durch die diskrete zeitalgebraische Riccati-Gleichung:

    P=Q+AT(PPB(R+BTPB)1BTP)A

    und löst für eine positiv definite Matrix .P

    So kann Ihr Kontrollgesetz gegeben sein durch:

    u(t)=K(x(t)xref(t))

    wobeiK=(R+BTPB)1(BTPA)

    Letztendlich funktioniert dies nicht sehr gut und ist wahrscheinlich aufgrund des Rauschens instabil. Dies bedeutet in der Tat, dass Option 1 wahrscheinlich erst funktioniert, wenn Sie durch einen Tiefpassfilter geschickt haben (allerdings nicht unbedingt mit einer so langen effektiven Verzögerungszeit). Dies liegt daran, dass LQR zwar garantiert stabil ist, die Garantie jedoch verloren geht, sobald Sie einen Kalman-Filter verwenden.θ¯

    Um dies zu beheben, verwenden wir die Loop Transfer Recovery-Technik, bei der Sie den Kalman-Filter anpassen und stattdessen ein neues wählen , wobei Ihre ursprüngliche Matrix ist und so abgestimmt ist, dass der Kalman-Filter optimal ist . ist eine beliebige positiv definierte symmetrische Matrix, die Sie einfach als Identitätsmatrix auswählen können ( ). Dann wählen Sie einfach einen Skalar . Der resultierende Controller sollte (stabiler) werden als , obwohl die Matrix verstimmt wird, was bedeutet, dass sie weniger optimal ist.Qo=Q0+q2BVBTQ0QVV=IqqQo

    Erhöhen Sie daher einfach bis es stabil ist. Eine weitere Möglichkeit , die Sie versuchen können , um es stabil zu machen, ist zu erhöhen (oder verringern ) die LQR Controller langsamer zu machen.qRcQc

Die Konzepte in diesem Beitrag sind noch recht weit fortgeschritten. Wenn Sie jedoch Dinge wie die Riccati-Gleichung lösen müssen, können Sie MATLAB oder eine andere Software verwenden, um dies zu tun. Möglicherweise gibt es auch Bibliotheken, die den Kalman-Filter bereits implementieren (ich glaube, MATLAB tut dies auch).

Für eine eingebettete Anwendung müssen Sie den Kalman-Filter möglicherweise selbst implementieren, obwohl es wahrscheinlich eine C-Implementierung gibt.

ronalchn
quelle
Vielen Dank für Ihre ausgezeichnete und ausführliche Antwort. Ich folge dem Kern Ihrer ersten Lösung und bin mir sicher, dass ich sie durcharbeiten kann. Der zweite ist, wie Sie sagen, herausfordernder und ich muss arbeiten, um zu sehen, ob ich ihm alles folgen kann.
ViennaMike
4

Ein Kreisel ist die einfache Antwort. Ich habe immer gehört, Gyro für die kurzen Maße, Kompass für die langen. Und realistisch eine Tasse Kallman-Filter zwischen den beiden die meiste Zeit. Der Preis für ein 6DOF-Gyro / acc-Board liegt heutzutage unter 20 US-Dollar, viel zu billig, um eines nicht zu verwenden.

Einmal habe ich den Kallman-Filter einer anderen Person durchgearbeitet . und habe es funktioniert. Ein Kallman-Filter ist eigentlich eher ein Ansatz, keine exakte Implementierung, und im Fall eines Kreisels muss für das Endergebnis keine Matrixmathematik verwendet werden. Dies vereinfacht den Code erheblich.

Spiked3
quelle