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):
Löse nach , , und :a 1 a 2 a 3
r a t e ( t ) = p o s i t i o n ' ( t ) = a 1 + 2 a 2 t + 3 a 3 t
Gegeben: , , ,p o s i t i o n ( t f ) r a t e ( 0 ) r a t e ( t f )
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?