Istnieją dwa ogólne podejścia:
- rozwiązania analityczne, mając pozę efektora końcowego, bezpośrednio obliczają współrzędne złącza. Zasadniczo rozwiązanie nie jest unikalne, więc można obliczyć zestaw możliwych współrzędnych połączenia. Niektóre mogą powodować, że robot uderza rzeczy w swoim otoczeniu (lub w sobie), lub twoje zadanie może pomóc ci wybrać konkretne rozwiązanie, np. możesz preferować łokieć w górę (lub w dół) lub robot, aby jego ramię znajdowało się po lewej (lub prawej) stronie tułowia. Zasadniczo istnieją ograniczenia w uzyskaniu rozwiązania analitycznego, w przypadku robotów 6-osiowych zakłada się, że przegub kulisty (wszystkie osie przecinają się). Rozwiązania analityczne dla wielu różnych rodzajów robotów były obliczane przez dziesięciolecia i prawdopodobnie można znaleźć papier, który daje rozwiązanie dla twojego robota.
- rozwiązania numeryczne, jak opisano w innych odpowiedziach, wykorzystują podejście optymalizacyjne do dostosowania współrzędnych połączenia, aż kinematyka do przodu da właściwe rozwiązanie. Znów jest na ten temat ogromna literatura i mnóstwo oprogramowania.
Korzystając z mojego Robotics Toolbox dla MATLAB, tworzę model dobrze znanego 6-osiowego robota z wykorzystaniem parametrów Denavita-Hartenberga
>> 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|
+---+-----------+-----------+-----------+-----------+-----------+
następnie wybierz losową współrzędną połączenia
>> q = rand(1,6)
q =
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
następnie obliczyć kinematykę do przodu
>> 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
Teraz możemy obliczyć kinematykę odwrotną za pomocą opublikowanego rozwiązania analitycznego dla robota z 6 stawami i sferycznym nadgarstkiem
>> p560.ikine6s(T)
ans =
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
i voila, mamy oryginalne wspólne współrzędne.
Rozwiązanie numeryczne
>> 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 =
[]
nie powiodło się i jest to powszechny problem, ponieważ zazwyczaj potrzebują dobrego początkowego rozwiązania. Spróbujmy
>> p560.ikine(T, 'q0', [1 1 0 0 0 0])
ans =
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
który daje teraz odpowiedź, ale różni się od rozwiązania analitycznego. Jest to w porządku, ponieważ istnieje wiele rozwiązań problemu IK. Możemy sprawdzić, czy nasze rozwiązanie jest poprawne, obliczając kinematykę do przodu
>> 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
i sprawdzanie, czy jest to to samo, co transformacja, od której zaczęliśmy (którym jest).
Inne zasoby: