Reibungslose Servobewegung für einen kriechenden Roboter

11

Ich habe vor einiger Zeit einen kleinen Crawler-Roboter gebaut, der zwei Beine mit jeweils zwei Freiheitsgraden hatte, also insgesamt 4 RC-Servos. Während ich die Bewegung der Beine programmierte, bemerkte ich, dass sie sich ziemlich steif bewegten. Es ist sinnvoll, dass der interne Controller des RC-Servos sehr schnell auf Positionsbefehle reagiert, aber ich wollte, dass sich mein Crawler auf eine Weise bewegt, die etwas ruhiger und lebensechter erscheint.

Meine Lösung bestand darin, eine kubische Zeitfunktion zu erstellen, die den Weg der Servos beschreibt, und dann ihre Position in kleinen Zeitschritten festzulegen, was zu einer gleichmäßigeren Bewegung führt. Im Wesentlichen löste ich die Koeffizienten in einer kubischen Gleichung unter Verwendung des Zeitintervalls, der Start- und Endposition des Servos und der Start- und Endraten, die das Servo bewegen sollte (was nur die Ableitung der Position ist):ai

Löse nach , , und :a 1 a 2 a 3a0a1a2a3

r a t e ( t ) = p o s i t i o n ' ( t ) = a 1 + 2 a 2 t + 3 a 3 t

position(t)=a0+a1t+a2t2+a3t3
rate(t)=position(t)=a1+2a2t+3a3t2

Gegeben: , , ,p o s i t i o n ( t f ) r a t e ( 0 ) r a t e ( t f )position(0)position(tf)rate(0)rate(tf)

Ich habe die Rate des Servos zwischen zwei Bewegungspaaren auf Null gesetzt, wenn die Bewegungen in entgegengesetzte Richtungen waren, und positiv oder negativ, wenn die Bewegungen beide in positiver bzw. negativer Richtung waren.

Dies hat ziemlich gut funktioniert, aber diese Lösung ist in einigen Punkten begrenzt. Zum einen ist es schwierig zu entscheiden, wie genau die Raten zwischen Bewegungen in dieselbe Richtung sein sollen. Ich habe den Durchschnitt der Steigungen vor und hinter einer bestimmten Position zwischen den Bewegungen verwendet, aber mir ist nicht klar, ob dies optimal ist. Zweitens könnten kubische Kurven das Servo zu Beginn und am Ende einer Bewegung in eine Position außerhalb des Bereichs der Positionen bringen, was unerwünscht sein kann. Beispielsweise kann die Kurve zu einem bestimmten Zeitpunkt während des Zeitintervalls dazu führen, dass das Servo über die zweite Position oder unter die erste Position hinausgeht. Drittens berücksichtigt die Kurvenerzeugung hier nicht die maximale Geschwindigkeit, mit der sich das Servo drehen kann, sodass sich das Servo in einer Kurve möglicherweise mit einer unrealistischen Geschwindigkeit bewegt. Damit,

Wenn man diese letzte Sorge vernachlässigt, können diese Probleme gelöst werden, indem man den Grad des Polynoms erhöht und Einschränkungen hinzufügt, um die Koeffizienten zu lösen, aber jetzt frage ich mich ...

Gibt es einen besseren Weg, um die Servobewegung reibungsloser und lebensechter zu gestalten?

Robz
quelle
Der Code sollte relativ einfach sein. Können Sie mehr darüber sprechen, warum es beteiligt war?
DaemonMaker
1
Sie haben Recht, der Code war ziemlich einfach, obwohl die resultierende Methode zur Steuerung der Servos komplexer war als zuvor. Ich habe meine Frage so bearbeitet, dass sie stattdessen eine Beschreibung der Einschränkungen dieser Methode enthält.
Robz
NURBS , ungleichmäßige rationale B-Splines, könnten den Job machen
James Waldby - jwpat7
@ jwpat7 danke für Ihre Eingabe, aber ich glaube nicht, dass NURBS funktionieren würde, da diese Kurven nicht garantiert die angegebenen Punkte treffen
Robz
Ist es so einfach wie das Verringern Ihres Koeffizienten? Kp
Ian

Antworten:

6

Bewegungsprofilerstellung

In der Vergangenheit habe ich einen Bewegungsprofilgenerator verwendet, um dieses Problem zu lösen. Um es zu verwenden, benötigen Sie die gewünschte Zielposition (Sollwert), maximale Geschwindigkeit und Beschleunigungswerte, die Ihren Motoren zugeordnet sind. Es funktioniert durch Integration einer Trapezgeschwindigkeitskurve, um ein glattes Positionsprofil zu erhalten. Eine S-Kurve kann verwendet werden, wenn die Bewegung noch sanfter sein muss. Verweis auf Artikel zur Erläuterung der Bewegungsprofilerstellung .

Sollwertvorfilterung

Abgesehen von der Route der Bewegungsprofilerstellung können Sie versuchen, den Befehl einfach per Tiefpass an die Servos zu filtern. Diese Art der Sollwertfilterung verlangsamt Ihre Reaktion, glättet sie jedoch auch und ist einfach zu implementieren. Die Grenzfrequenz muss so gewählt werden, dass sie die Bandbreite Ihres Systems unterstützt (damit die gewünschte Bewegung nicht herausgefiltert wird). Einfache Implementierung eines Tiefpassfilters in C.

ddevaz
quelle
+1: definitiv Bewegungsprofilerzeugung.
Guy Sirton
2

Ich denke, die Frage bezieht sich auf diese Art von Gerät: RC-Servo

Diese sind normalerweise nicht sehr leistungsfähig, sodass sie ein generiertes Bewegungsprofil nicht sehr gut verfolgen können. Die meisten kommerziellen Motorsteuerungssysteme verwenden eine S-Kurve für eine Punkt-zu-Punkt-Bewegung (siehe Antwort von @ ddevaz), die ein stückweises Profil erstellt, bei dem jedes Segment eine andere Gleichung verwendet. Ihr Problem wird sein, dass Sie wahrscheinlich ein sehr "langsames" Profil haben, damit Ihr Motor das generierte Profil verfolgen kann. Andernfalls weist das Profil, dem Sie versuchen, dem Gerät zu folgen, einen großen Positionsfehler gegenüber der tatsächlichen Position des Geräts auf.

Idealerweise möchten Sie eine Art Feedback, das Sie während der Ausführung der Bewegung anzeigen können, damit Sie sehen können, wie gut das Gerät den Befehl verfolgt. Aus praktischer Sicht benötigen Sie möglicherweise unterschiedliche Motoren und unterschiedliche Motorsteuerungen, wenn Sie eine deutlich bessere Bewegung wünschen.

Guy Sirton
quelle