Ich möchte einen Arduino-basierten Roboter mit 2 Rädern, Quadraturcodierern auf jedem Rad, einem H-Brücken-Treiberchip (oder einer Motorsteuerung) und einer Rolle erstellen. Ich möchte die PID-Bibliothek verwenden, um sicherzustellen, dass die Geschwindigkeit proportional zur zurückgelegten Strecke ist.
Auf konzeptioneller Ebene (vorausgesetzt, die Motoren reagieren nicht identisch auf PWM-Pegel): Wie kann ich die PID-Regelung so implementieren, dass sie in einer geraden Linie und mit einer Geschwindigkeit proportional zur verbleibenden Fahrstrecke läuft?
Antworten:
Besonderheiten
Wenn Sie sich das PID- Basisbeispiel ansehen, müssen Sie nur zwei Kopien des PID-Reglers instanziieren, eine für jedes Rad, jeden Encoder und jede PWM:
Dann
loop()
lesen Sie in Ihrem Äquivalent einfach beide Encoder, übergeben jeden Encoderwert an den entsprechendenPID
und schreiben schließlich beide PWM-Werte aus.Für den Moment
SetpointLeft
undSetpointRight
kann tatsächlich auf den gleichen Wert zeigen, aber wenn Sie sie auf diese Weise separat definieren, können Sie die Fähigkeit zum späteren Wenden hinzufügen.Konzepte
Dies mag zwar für den Grundfall funktionieren, aber ob es wirklich ausreicht, hängt davon ab, wie genau Sie Ihre gerade Linie benötigen.
Totenschein
Vorausgesetzt , dass Sie haben Geber an jedem Rad, wenn Sie zwei PID - Schleifen laufen und vergleichen jeweils Rädern folgende Fehler , dann können Sie möglicherweise berechnen Sie Ihre maximale abbe Fehler über die Distanz, vorausgesetzt , Ihre Räder nicht rutschen. Wenn dieser Fehler kleiner als Ihre Anforderungen ist, ist eine vollständige Abrechnung alles, was Sie benötigen.
Wenn Ihre Räder jedoch zum Durchrutschen neigen, haben Sie möglicherweise einen versteckten Schleppfehler, den Ihr Steuerungssystem nicht erkennen kann, und Sie müssen einen Weg finden, um einen Schlupf zu erkennen oder die Position unabhängig von Ihren Radgebern zu berechnen geforderte Radpositionen / Geschwindigkeiten, um eine gerade Linie zu halten.
Relative Positionsbestimmung
Wie John vorschlägt , können Sie möglicherweise einen Beschleunigungsmesser verwenden, um die Position zu bestimmen. Aufgrund der Genauigkeit und der Auswirkung von Fehlern im Laufe der Zeit ist es jedoch besser, die Beschleunigungsmesserdaten zur Erkennung und Korrektur von Radschlupf zu verwenden.
In der mobilen Robotik werden üblicherweise Kalman-Filtertechniken verwendet, um die Daten aus mehreren Quellen, z. B. einem Beschleunigungsmesser und den Radcodierern, zu verschmelzen, um die aktuelle Position besser zu bestimmen.
Was auch immer Sie tun , mit einem relativen Positionsbestimmung jedoch im Laufe der Zeit die Position , die Sie sich selbst glauben zu sein , in werden von Ihrer tatsächlichen physischen Position abdriften.
Absolute Positionsbestimmung
Die einzige Möglichkeit, dies zu umgehen, besteht darin, einen Referenzpunkt außerhalb des Referenzrahmens Ihres Fahrzeugs zu haben.
Ein Roomba verwendet zum Beispiel im Allgemeinen die Dead Reckoning-Methode, um sich in einem Raum zu bewegen. Wenn er jedoch andocken muss, sucht er nach einem Infrarotlichtstrahl, der von der Ladestation ausgesendet wird. Wenn sich der Roomba zufällig durch diesen Strahl bewegt, erkennt er ihn, rastet auf den Strahl ein und folgt ihm zurück zu seiner Quelle. In Kombination mit den Stoßsensoren kann es sich präzise auf den Ladekontakten positionieren.
Für Ihren Roboter hat er möglicherweise eine Ausgangsposition, an der er zurückkehren und feststellen kann, dass er sich an diesem bekannten Ort befindet. Zu diesem Zeitpunkt weiß es genau, wo es sich befindet, und kann melden, wie weit die berechnete Position von der tatsächlichen Position entfernt ist.
Wenn Sie möchten, dass Ihr Roboter über Hunderte von Metern in einer geraden Linie fährt, können Sie auch zu einer anderen Technik wechseln, z. B. zum Hinzufügen eines Arduino-GPS-Schutzschilds .
Eine Kombination von Techniken
Abhängig von Ihren Genauigkeitsanforderungen müssen Sie möglicherweise eine Kombination dieser Techniken verwenden.
Wenn ein Führungsstrahl möglich ist, können Sie möglicherweise ganz einfach mit einer unsichtbaren Linienverfolgungstechnik das tun, was Sie möchten . Wenn Sie sich in einem eingeschränkten Bereich in einer beliebigen geraden Linie bewegen müssen, können Sie wie beim Roomba möglicherweise ein Paar von Führungsbalken (im rechten Winkel zueinander) verwenden, um Ihre synthetisierte Position in einer kartesischen Achse zu korrigieren Jedes Mal, wenn der Roboter einen der Strahlen passiert.
Hier gibt es viele Optionen, und was Sie ausgewählt haben, hängt davon ab, was Sie benötigen.
quelle
Wenn Sie nicht mit einer einzigen Achse beide Räder antreiben, kann ich nur einen 3-Achsen-Beschleunigungsmesser oder einen anderen Sensor zur Erkennung der Ausrichtung des Roboters einsetzen und die Signale für jeden Motor entsprechend anpassen.
quelle
Wie oben erwähnt, weisen Sie zunächst jedes Rad an, sich mit derselben Geschwindigkeit zu bewegen, und die PID stellt dann sicher, dass sie mit dieser Geschwindigkeit laufen. Aber das wird NICHT perfekt sein. Sie müssen regelmäßig nach Fehlern suchen und diese korrigieren (1), indem Sie die beiden Radgeberzählwerte ablesen und vergleichen und ein Rad ggf. etwas schneller laufen lassen, um die gleichen Zählwerte zu erzielen. und (2) Encoder sind NIEMALS perfekt, wenn Sie einen Beschleunigungsmesser und einen Kompass benötigen.
Sie sehen einen Kalman-Filter. Wenn Sie Encoder-, Kompass- und Beschleunigungsmesserdaten kombinieren möchten, erhalten Sie den Steuerkurs.
quelle
Dieser Link gibt ein gutes Beispiel ohne zwei PID-Berechnungen. Sie können auch imu / compass implementieren, um den geraden Pfad zu messen
quelle