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⃗ =α⃗ -α⃗ s t a r t, możesz zdefiniować funkcję kosztu jot=x⃗ T.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=⎡⎣⎢⎢⎢100001000010xyz1⎤⎦⎥⎥⎥, 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:
⎡⎣⎢100010001000⎤⎦⎥∏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)x⃗ T.Qx⃗ +do⃗ T.x⃗
Z zastrzeżeniem ZAx⃗ ≤b⃗ , 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.