Jak rozwiązać problem odwrotnej kinematyki?


20

Przednią kinematykę ramienia robota można łatwo rozwiązać. Możemy reprezentować każde połączenie za pomocą macierzy transformacji Denavit – Hartenberg .

Na przykład, jeśli złącze jest siłownikiem liniowym, może mieć macierz transformacji:ith

gdzie długość przedłużenia jest zdefiniowana przez d iTi=[10000100001di0001]di

mając na uwadze, że łącznikiem obrotowym może być:

gdzie α jest kątem, a L jest długością łącza.Ti=[100L0cosαisinαi00sinαicosαi00001]αL

Następnie możemy znaleźć pozycję i orientację efektora końcowego, mnożąc wszystkie macierze transformacji: .Ti

Pytanie brzmi: jak rozwiązać odwrotny problem?

Matematycznie w żądanym położeniu końcowym efektorowych online parametry d I , α i w taki sposób, gatunku , T i = K . Jakie istnieją metody rozwiązania tego równania?MdiαiTi=M

Odpowiedzi:


11

W czasach, gdy się uczyłem, robiąc to, postępowałem zgodnie z prostym gradientem, aby rozwiązać problem IK.

W swoim modelu próbujesz obrócić każde złącze w niewielkim stopniu, aby zobaczyć, jaka to różnica powoduje błąd pozycji punktu końcowego. Po wykonaniu tej czynności obracasz każde złącze o kwotę proporcjonalną do korzyści, jakie daje. Następnie robisz to w kółko, aż będziesz wystarczająco blisko.

Zasadniczo nazywa się to śledzeniem gradientu lub podążaniem za wzniesieniem. Wyobraź sobie ramię robota o dwóch stopniach swobody:

IK

Przegubem A odrobinę przesuwa punkt końcowy w kierunku A . Obracanie złącza B nieznacznie przesuwa punkt końcowy w kierunku b . Oba przybliżają nas do celu o mniej więcej taką samą wartość, więc powinniśmy obracać oba stawy z mniej więcej taką samą prędkością.

Gdybyśmy wykreślili wykres odległości do celu w stosunku do kątów połączenia, wyglądałoby to tak:

IK

Ja pomalowałem w niektórych konturach, aby pomóc. Widzimy ścieżkę, którą podąża ten algorytm. Zauważysz, że w wspólnej przestrzeni wybrana ścieżka nie wygląda optymalnie. To wymaga zakrętu. Jednak w prawdziwej przestrzeni punkt końcowy miałby dość prostą linię do celu. Widać również, że istnieją dwa rozwiązania tego problemu, a algorytm właśnie znalazł najbliższe.

To nie jedyny sposób rozwiązania problemu kinematyki odwrotnej. Z pewnością nie jest to również najlepszy sposób.

Plusy:

  • Jest to koncepcyjnie proste, tak świetne, jeśli tylko się tego nauczysz.
  • Jest łatwy do wdrożenia, nawet jeśli widok matryc transformacyjnych Denavit – Hartenberg budzi lęk.
  • Jest to bardzo ogólny sposób, pozwalający na stosowanie wszelkiego rodzaju połączeń: obrotowych, liniowych, czegoś innego, o ile można oszacować, w jaki sposób powodują ruch punktu końcowego.
  • Radzi sobie dobrze, nawet gdy jest zero lub nieskończona liczba rozwiązań.

Cons:

  • Jest powolny, zajmuje wiele iteracji, aby znaleźć rozwiązanie. Jednak dobrze jest, jeśli rzeczywiste ramię może śledzić postęp algorytmu zgodnie z obliczeniami.
  • Może utknąć w lokalnych minimach. IE Może nie znaleźć najlepszego możliwego rozwiązania, jeśli znajdzie wystarczająco dobre.

Więcej szczegółów na ten temat znajduje się na mojej bardzo starej stronie internetowej: ładnie wyglądająca, sprężysta, sprężysta, sprężysta, wesoła i elastyczna strona .



1

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:

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.