DIY-Servoarm mit falscher inverser Kinematik macht keine gerade Linie

Ich habe einen Servoarm mit HS-422-Servo (super einfache Basis-Servomotoren in einem Starterkit) gebaut, der Winkelwerte mit inverser Kinematik in Processing (Java) erhält.

Die inverse Kinematik (am Computer) ist ok und basiert darauf

Die Kommunikation mit Arduino ist in dem Sinne ok, dass wenn ich die 2 Servos auf 0°-0°, 90°-90°, 180°-180° stelle, die Arme in die richtige Position gehen.

ABER wenn ich in meinen Java-Skizzen eine gerade Linie zeichne ... zeichnen die 2 Servoarme ... eine Art seltsames 'U'.

Der Code der inversen Kinematik ist hier .

Aber ich denke, es ist richtig, und es gibt ein strukturmechanisches Problem, das ich nicht verstehe. Kann mir jemand etwas raten?

BEARBEITEN:

beschlossen! Es gab einige Probleme, verursacht durch falsche inverse Kinematik. Dank dieser mächtigen Community waren sowohl Kommentare als auch Antworten hilfreich!

Vielleicht: Ich nehme an, Sie werden versuchen, 0, 90, 180, 270 Grad Strichzeichnungen zu zeichnen. | Versuchen Sie, 45-, 135-, 225-, 315-Grad-Linien vorwärts und rückwärts zu zeichnen, und sehen Sie, welche Ergebnisse symmetrisch und welche asymmetrisch sind. zB wenn eine Komponente das falsche Vorzeichen hat, kann es vorkommen, dass das Ergebnis in einigen Quadranten nach links und in anderen nach rechts krümmt. Arme gleich lang zu machen (sie können es sein oder nicht) vereinfacht Änderungen, die sich auf Dinge auswirken können. Ich habe Ihren Code kurz durchgesehen, aber nichts Offensichtliches. Können Sie Aktionen / Code vereinfachen, um mögliche Fehlerquellen zu entfernen.
Danke für den Kommentar! Ich versuche, einfach Sachen. Übrigens sind meine Servos nur zwischen 0°-180° !

Antworten (2)

Es hört sich so an, als ob die Servogeschwindigkeit nicht richtig gesteuert wird.

Können Sie die Armbewegung verlangsamen?

Denken Sie daran, damit die inverse Kinematik richtig funktioniert, müssen Sie die Rotationsgeschwindigkeit sehr präzise steuern. Wenn sich der Arm Ihres Systems mit der maximal möglichen Geschwindigkeit von einem Punkt zum anderen bewegt, erreichen die Servos möglicherweise ihre maximale Rotationsgeschwindigkeit. Als solches würde ein Servo seine Bewegung vor dem anderen abschließen, was Ihre Linie in eine Reihe von Bogensegmenten verwandeln würde, die teilweise miteinander vermischt werden.

Versuchen Sie, das System so zu steuern, dass sich der Arm zu Punkten in einem XY-Koordinatensystem bewegt. Wenn der Arm den Stift korrekt zu den angegebenen Punkten bewegen kann, handelt es sich um ein Problem mit der Servogeschwindigkeit. Wenn nicht, ist es etwas anderes.

Da es fast unmöglich ist sicherzustellen, dass sich zwei beliebige Servos mit genau der gleichen Geschwindigkeit bewegen, wäre die einfache, allumfassende Lösung, eine Flugbahn für Ihre Endeffektorkoordinaten (X, Y) zu generieren. Wenn Sie also beispielsweise eine gerade Linie zeichnen möchten, erstellen Sie einfach eine lineare Bahn der Form y= mx + b (sollte den meisten von Ihnen bekannt sein). Machen Sie einfach xa zu einer Funktion der Zeit, indem Sie " x = t; t++; " am Ende der Schleife setzen. Sie müssen natürlich eine feste Schleifenzeit haben - wenn Sie während der Bewegung nichts anderes tun müssen, verwenden Sie einfach eine While-Schleife, die endet, wenn die gewünschten Koordinaten erreicht sind. Ein weiterer Vorteil dieser Methode ist, dass Sie die Geschwindigkeit, mit der die Linie gezogen wird, variieren können; Anstelle von „t++“ können Sie zum Beispiel „t += 0.7“ für eine langsamere Geschwindigkeit eingeben.