Es gibt zwei breite Ansätze:
- Analyselösungen berechnen in einer Endeffektor-Pose direkt die Gelenkkoordinaten. Im Allgemeinen ist die Lösung nicht eindeutig, sodass Sie einen Satz möglicher Gelenkkoordinaten berechnen können. Einige können dazu führen, dass der Roboter auf Dinge in seiner Umgebung (oder auf sich selbst) trifft, oder Ihre Aufgabe kann Ihnen bei der Auswahl einer bestimmten Lösung helfen, z. Möglicherweise bevorzugen Sie den Ellbogen nach oben (oder unten) oder den Roboter mit dem Arm links (oder rechts) vom Rumpf. Im Allgemeinen gibt es Einschränkungen beim Erhalten einer analytischen Lösung, für 6-Achsen-Roboter wird ein sphärisches Handgelenk (alle Achsen schneiden sich) angenommen. Die Analyselösungen für viele verschiedene Robotertypen wurden im Laufe der Jahrzehnte berechnet, und Sie können wahrscheinlich ein Papier finden, das eine Lösung für Ihren Roboter bietet.
- Numerische Lösungen verwenden, wie in den anderen Antworten beschrieben, einen Optimierungsansatz, um die Gelenkkoordinaten anzupassen, bis die Vorwärtskinematik die richtige Lösung ergibt. Auch hier gibt es eine riesige Literatur und jede Menge Software.
Mit meiner Robotics Toolbox für MATLAB erstelle ich ein Modell eines bekannten 6-Achsen-Roboters unter Verwendung der Denavit-Hartenberg-Parameter
>> mdl_puma560
>> p560
p560 =
Puma 560 [Unimation]:: 6 axis, RRRRRR, stdDH, fastRNE
- viscous friction; params of 8/95;
+---+-----------+-----------+-----------+-----------+-----------+
| j | theta | d | a | alpha | offset |
+---+-----------+-----------+-----------+-----------+-----------+
| 1| q1| 0| 0| 1.5708| 0|
| 2| q2| 0| 0.4318| 0| 0|
| 3| q3| 0.15005| 0.0203| -1.5708| 0|
| 4| q4| 0.4318| 0| 1.5708| 0|
| 5| q5| 0| 0| -1.5708| 0|
| 6| q6| 0| 0| 0| 0|
+---+-----------+-----------+-----------+-----------+-----------+
Wählen Sie dann eine zufällige Gelenkkoordinate
>> q = rand(1,6)
q =
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
Berechnen Sie dann die Vorwärtskinematik
>> T = p560.fkine(q)
T =
-0.9065 0.0311 -0.4210 -0.02271
0.2451 0.8507 -0.4649 -0.2367
0.3437 -0.5247 -0.7788 0.3547
0 0 0 1
Jetzt können wir die inverse Kinematik mit einer veröffentlichten Analyselösung für einen Roboter mit 6 Gelenken und einem sphärischen Handgelenk berechnen
>> p560.ikine6s(T)
ans =
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
und voila, wir haben die ursprünglichen Gelenkkoordinaten.
Die numerische Lösung
>> p560.ikine(T)
Warning: ikine: rejected-step limit 100 exceeded (pose 1), final err 0.63042
> In SerialLink/ikine (line 244)
Warning: failed to converge: try a different initial value of joint coordinates
> In SerialLink/ikine (line 273)
ans =
[]
ist fehlgeschlagen, und dies ist ein häufiges Problem, da sie normalerweise eine gute anfängliche Lösung benötigen. Lass es uns versuchen
>> p560.ikine(T, 'q0', [1 1 0 0 0 0])
ans =
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
Das gibt jetzt eine Antwort, unterscheidet sich aber von der analytischen Lösung. Das ist jedoch in Ordnung, da es mehrere Lösungen für das IK-Problem gibt. Wir können die Richtigkeit unserer Lösung überprüfen, indem wir die Vorwärtskinematik berechnen
>> p560.fkine(ans)
ans =
-0.9065 0.0311 -0.4210 -0.02271
0.2451 0.8507 -0.4649 -0.2367
0.3437 -0.5247 -0.7788 0.3547
0 0 0 1
und überprüfe, ob es dasselbe ist wie die Transformation, mit der wir begonnen haben (was es ist).
Andere Ressourcen: