W przypadku 6-osiowego robota, przy danej pozycji efektora końcowego i zakresie orientacji, jak znaleźć optymalne wartości połączeń


10

Biorąc pod uwagę sześcioosiowe przegubowe ramię robota utrzymujące narzędzie w jego efektorze końcowym, jeśli mam pożądaną pozycję narzędzia i orientację narzędzia, będzie dokładnie 1 rozwiązanie odwrotnego równania kinematyki dla robota, aby osiągnąć tę pozycję.
(a raczej do 16 różnych rozwiązań, w zależności od zakresu połączeń)

http://en.wikipedia.org/wiki/Robotic_arm

Ale jeśli robot trzyma coś w rodzaju długopisu i chcę, aby robot zaznaczył określony punkt tym piórem na celu, to nie dbam o to, jak pióro jest zorientowane, o ile jest ono prostopadłe do zaznaczonej powierzchni.

Zatem równanie kinematyki odwrotnej będzie miało nieskończenie wiele rozwiązań.

Jak wybrać spośród tych rozwiązań konfigurację połączenia, która jest najbliższa obecnej konfiguracji: taka, która będzie wymagała najmniejszego ruchu do osiągnięcia?
(lub konfiguracja złącza, która jest optymalna zgodnie z innym podobnym kryterium, takim jak że wszystkie kąty złącza są najdalsze od ich maksimum i minimum?)

Odpowiedzi:


9

Najpierw musimy zdefiniować optymalne . Ponieważ nie mówisz, co uważasz za optymalne, większość ludzi wybiera wyrażenie kwadratowe. Załóżmy na przykład, że twoje obecne kąty połączenia są podane przez wektorα. Możemy rozważyć zminimalizowanie wymaganego ruchu - z błędemx=α-αstzart, możesz zdefiniować funkcję kosztu jot=xT.Qx dla jakiejś matrycy Q. Zwykle używamy macierzy diagonalnej, ale zrobi to każda macierz z dodatnim wynikiem.

W uproszczonym przykładzie z dwoma kątami połączenia, jeśli połączenie za mieliśmy tańszy silnik (być może bliższy efektora końcowego), moglibyśmy mieć funkcję kosztu

jot=[xzaxb][1002)][xzaxb], tj. ruch stawub jest dwa razy droższy niż połączenie za.

Teraz równanie kinematyczne jest formułą macierzową, aw notacji Denavit-Hartenberg może być:

T.ja=[100x010y001z0001], gdzie prawa strona reprezentuje pozycję (x,y,z) i orientacja (obecnie ustawiona jako obrót zerowy), biorąc pod uwagę kąty połączenia.

Ponieważ nie dbamy o orientację, a jedynie o pozycję, możemy obciąć pierwsze 3 kolumny ostatniej macierzy transformacji i ostatni wiersz pierwszej macierzy transformacji. Możemy równoznacznie wyrazić tę formułę jako:

[100001000010]T.ja[0001]=[xyz]

Pomnożąc lewą stronę, otrzymujemy trzy równania. Gdyby parametry były liniowe, rozwiązanie byłoby proste. Dzieje się tak, gdy wszystkie siłowniki są siłownikami liniowymi. W tym przypadku problemem jest program kwadratowy . Możemy ponownie ustawić lewą stronę, aby uzyskać równanie:

K.x=[xyz], dla niektórych matryc K..

Program kwadratowy to problem, który można wyrazić w postaci:

Zminimalizować jot=12)xT.Qx+doT.x

Z zastrzeżeniem ZAxb, mix=re

Aby rozwiązać ten problem, istnieje wiele algorytmów, których można użyć, na przykład punkt wewnętrzny, zestaw aktywny, ... Po prostu znajdź odpowiednią bibliotekę, a ona ją rozwiąże.

Nieliniowy układ równań jest trudniejszy do rozwiązania. Nazywa się to programowaniem nieliniowym , ale tak właśnie jest, jeśli masz obrotowe złącza.

Zasadniczo zamiast równań macierzowych masz funkcje nieliniowe.

Zminimalizować fa(x) z zastrzeżeniem h(x)=0, sol(x)0 (w razie potrzeby zmień ustawienie, aby wartość RHS ograniczeń była równa zero)

Algorytmy zastosowane do rozwiązania tego problemu są jeszcze bardziej złożone, ale obejmują punkty wewnętrzne, sekwencyjne programowanie kwadratowe (SQP), aktywne zestawy, algorytmy refleksyjne regionu zaufania. Oczywiście wyjaśnienie, w jaki sposób działają te algorytmy, jest bardzo długie i nie będę uwzględniał zakresu tej odpowiedzi. Wystarczy powiedzieć, że ilość treści w algorytmach wykorzystywanych do programowania kwadratowego mogłaby sama w sobie stanowić cały kurs.

Powinieneś po prostu znaleźć bibliotekę, aby rozwiązać problem, zajęłoby dużo czasu kodowanie wydajnej implementacji, a wydajne implementacje mogą obsługiwać 100 (lub więcej) zmiennych jednocześnie. Na przykład, jeśli używasz MATLAB, istnieje dokumentacja na temat korzystania z funkcji fmincon z Optymalizatora.

Aby rozwiązać to online, możesz chcieć C ++ lub innej implementacji natywnej, na przykład NLopt. Zauważ, że może to nie być coś, co mikrokontroler może szybko rozwiązać, a wiele bibliotek może mieć inne zależności, które nie są łatwe w użyciu na mikrokontrolerze (ponieważ są przeznaczone dla komputera).


Jeśli nie martwisz się wydajnością i po prostu chcesz czegoś, co możesz samemu zakodować, zakładając, że istnieje funkcja, którą możesz wywołać w celu rozwiązania odwrotnego problemu kinematycznego , możesz po prostu wykonać metodę zejścia gradientowego. Na przykład arbitralnie wybierając losową orientację początkową, rozwiąż odwrotny problem, a następnie sprawdź funkcję kosztu. Następnie możesz użyć analizy zakłóceń, aby sprawdzić, jak zmienić orientację. Na przykład, jeśli sprawdzisz podobne orientacje wokół bieżącej orientacji (tj. 8 punktów na sześciennej siatce), możesz uzyskać przybliżenie drugiego rzędu, w jaki sposób funkcja kosztu zmienia się w każdym kierunku.

Korzystając z aproksymacji drugiego rzędu (znanej jako macierz Hesji, ponieważ jest ona wielowymiarowa - trójwymiarowa dla orientacji), można znaleźć przejście przez zero gradientu funkcji kosztu (tj. Przewidywanych minimów lokalnych).

W nowej przewidywanej orientacji po prostu ponownie włóż ją przez odwrotny solver i powtarzaj, aż dokładność będzie wystarczająca.

Zauważ, że prawdopodobnie nie będzie to tak wydajne, ponieważ sam odwrotny problem kinematyczny musi być iteracyjnie rozwiązany (więc wielokrotnie używasz funkcji, której rozwiązanie zajmuje trochę czasu). Ponadto kod może być mniejszy niż pełnoprawny algorytm optymalizacji, ale nadal jest dość znaczny i nie jest niewielką inwestycją czasu.


Stosując którąkolwiek z metod (formalnie rozwiązując jako program nieliniowy lub stosując iteracyjnie funkcję, aby rozwiązać odwrotny problem), rozwiązanie może nie być optymalne, jeśli istnieje wiele lokalnych minimów. W takim przypadku możesz spróbować znaleźć globalne minima przy użyciu różnych metod. Nawet w przypadku nieliniowego solvera programującego oczekuje się, że zostanie on zapoczątkowany wartościami początkowymi (np. Kątami połączenia). Możesz wielokrotnie uruchamiać dowolną metodę z ziarnem generowanym na różne sposoby:

  • losowy restart (jest generowany losowo)
  • oparty na siatce

lub inne niestandardowe metody.

Pamiętaj jednak, że jeśli istnieje wiele minimów, nie ma dobrego sposobu, aby zagwarantować, że znajdziesz minima globalne. Możesz tylko zwiększyć swoje szanse.


2

Ponieważ pytanie dotyczy robota przemysłowego, prawdopodobnie nie mamy modelu dynamiki robota, więc zakładam, że szukamy rozwiązań, które zoptymalizują tylko kryterium kinematyczne.

Robot ma rozwiązanie w formie zamkniętej dla swojej odwrotnej kinematyki, ale na szczęście efektor końcowy ma dodatkowy stopień swobody obrotu, co oznacza, że ​​robot ma zasadniczo 7 stopni swobody. Ale ponieważ jest to tylko jedno dof , nie jest to tak duży problem, jak mogłoby się wydawać.

Powszechną sztuczką w przypadku prawie nie redundantnych robotów jest zablokowanie dodatkowego stopnia swobody i analityczne rozwiązanie pozostałych wartości połączeń. Załóżmy, że piszemy solver IK w zamkniętej formie dla robota 6 dof , który zwraca rozwiązania0,05ms średnio. Poprzez iterację od1 do 360 dlatego możesz znaleźć optymalne rozwiązanie dla dyskretyzacji kąta pióra wynoszącego 1 w około 18 ms, co biorąc pod uwagę aplikację jest prawdopodobnie więcej niż wystarczające.

Jeśli przez większość czasu pióro porusza się tylko nieznacznie (np. Podczas rysowania linii), inną sztuczką w celu przyspieszenia wyszukiwania jest użycie numerycznego IK, na przykład metoda pseudoinwersyjna:

Pozwolić q1 niech będzie obecna konfiguracja robota, niech jot niech będzie jakobianem i niech Δxbyć przemieszczeniem celu w stosunku do bieżącej transformacji efektora końcowego. RozwiązaćΔx=jotΔq dla Δq i obliczyć nową konfigurację q2)=q1+Δq. Pomijam tutaj szczegóły, ale rozwiązanieΔq powinien zminimalizować Δq dla właściwie wybranego wskaźnika.

Odbywa się to dla robota 7 dof i znów powinno zająć tylko ułamki milisekundy. Mimo żeq2) może nie być prawidłową konfiguracją (łączone wartości mogą być poza zakresem) i może nie być dokładnym rozwiązaniem IK (możesz jednak wykonać więcej pseudo-odwrotnych kroków), przez większość czasu będzie to dobry punkt wyjścia do wyszukiwania za pomocą solver w formie zamkniętej.


1

Jest w tym ładna, zamknięta forma. Powiedzmy, że nie obchodzi nas corzjest (tzn. nie obchodzi nas, jak to zmieniamy ).

jot-1X˙=Θ˙=[jot1jot2)jot3)jot4jot5jot6][x˙y˙z˙rx˙ry˙rz˙]=[θ1˙θ2)˙θ3)˙θ4˙θ5˙θ6˙]
Gdzie jotja jest jath kolumna z jot-1. Możemy się zerwaćΘ˙ do części, która zależy od rz˙ i część, która nie.
Θ˙=Θ˙x˙ry˙+Θ˙rz˙Θ˙rz˙=jot6rz˙
Więc teraz gra się stała, zminimalizujmy
(Θ˙x˙ry˙+Θ˙rz˙)T.re(Θ˙x˙ry˙+Θ˙rz˙)
dla niektórych matryc diagonalnych rejak ronalchn powiedział wyżej. Zamierzam użyćZA=Θ˙x˙ry˙ i b=Θ˙rz˙ dla łatwiejszego przeglądania.

Możemy to rozwinąć do

ZAT.reZA+2)bT.reZA+bT.reblubZAT.reZA+2)rz˙jot6T.reZA+rz˙2)jot6T.rejot6

Teraz mamy łatwe równanie do rozróżnienia rz˙. Znajdujemy pochodną w odniesieniu dorz˙ i ustaw na 0.

2)jot6T.reZA+2)rz˙jot6T.rejot6=0rz˙=-jot6T.reZAjot6T.rejot6
Minimalizuje to „odległość” kąta połączenia między dwoma pozycjami.
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.