Autor Wątek: IK 3 stopnia, analitycznie. Układ równań + Profesjonalny rysunek :)  (Przeczytany 1461 razy)

Offline koirat

  • Użytkownik

# Wrzesień 30, 2016, 19:37:42
Witam,

W poprzednim moim poście przedstawiłem pewne równania matematyczne. Po wielu godzinach prób nadal nie udało mi sie rozwiązać tego zadania.

Postanowiłem dać szansę warsztatowiczom ;), również załączam rysunek aby bardziej uzmysłowić o co tak naprawdę walczyłem.

Najbardziej zaskakujące jest to że zadanie wydawało mi się bardzo proste, powiedział bym na miarę liceum.
Być może uda się komuś odnaleźć jakieś znacznie łatwiejsze rozwiązanie.

Przyjąłem konwencje w której oznaczam wektory i punkty za pomcą Dużych i małych liter, gdzie odpowiednio dużą literę można traktować jako x a małą jako y.

Nasze dane napisane są kolorem czarnym, nasze niewiadome kolorem czerwonym.

Na załączonym obrazku przedstawiono trzy połączone segment (niebieskie) sięgające od punktu (0,0) do punktu (T,t).
Jak widać znamy długości poszczególnych segmentów. Kolejność ich jest jak na rysunku.

Jednym z warunków zadania jest aby wektor [T,t] przecinał w połowie segment M. Ten warunek przyjąłem aby unieruchomić cały układ.

Punkty (A,a) , (B,b) oraz k używam jako danych pomocniczych.

Według moich oczekiwań powinny być dokładnie dwa rozwiązania (jeśli jakieś istnieją dla podanych danych).

Zadanie określiłem za pomocą następującego układu równań.

A^2+a^2 = L^2    <--- równanie okręgu
T*k = (B-A)/2 + A  <---- współrzedna środka segmentu M
t*k = (b-a)/2 + a   <---- współrzedna środka segmentu M
(B-T)^2 + (b-t)^2 = N^2  <--- równanie okręgu
 M^2 = (B-A)^2 + (b-a)^2  <--- równanie długości odcinka (A,a);(B,b)

Najbardziej zależy mi na otrzymaniu "k"



Prawdę powiedziawszy to nawet udało mi sie obliczyć A(k) (są dwa pierwiastki, jeśli rzeczywiście są tylko dwa) jeden z nich wygląda tak (drugi jest nie lepszy). Prawidłowo rozwiązują sie po wpisaniu danych.

A(k) =-(t*sqrt(-16*k^4*t^4+((8*M^2+32*L^2)*k^2-32*T^2*k^4)*t^2-16*T^4*k^4+(8*M^2+32*L^2)*T^2*k^2-M^4+8*L^2*M^2-16*L^4)-4*T*k^2*t^2-4*T^3*k^2(M^2-4*L^2)*T)/(8*k*t^2

Cały układ wrzuciłem wcześniej do http://maxima.sourceforge.net/, mielił przez kilkadziesiąt minut i się poddał.

Jeśli ma ktoś z was dostęp do  czegoś mocniejszego (np wolfram Pro) to będę wdzięczny. Jeśl ktoś ma pomyśł na prostsze rozwiązanie to również :)



« Ostatnia zmiana: Wrzesień 30, 2016, 19:40:32 wysłana przez koirat »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline koirat

  • Użytkownik

# Wrzesień 30, 2016, 22:10:03
Kurcze tak sobie wymyśliłem teraz że może być sytuacja w której segment M nigdy nie będzie dzielony na pół. :(
W związku z tym musze to trochę jeszcze przemyśleć :(

Offline strateg

  • Użytkownik

# Wrzesień 30, 2016, 23:20:07
Jesli te trójkąty utworzone są z promieni i stycznych, wtedy powstają dwa trójkąty podobne (sprawdź sobie kąty). Biorąc ta informacje pod uwagę, przeciwprostokatne tych trójkątów są do siebie proporcjonalne jak stosunek długości promieni. To zaś wystarczy, aby stwierdzić, że k jest równe L/(L+N). Sry za literówki, pisze z telefonu.

Offline koirat

  • Użytkownik

# Październik 01, 2016, 01:36:14
To nie muszą być styczne. Może popracuje nad tym jutro bo mam pewną koncepcję.

Offline strateg

  • Użytkownik

# Październik 01, 2016, 02:29:33
W takim razie, co ty chcesz osiągnąć i po co? Jaka jest etymologia tej interpretacji graficznej?

Offline koirat

  • Użytkownik

# Październik 01, 2016, 03:04:04
Obrazek jest dobry tylko równanie uwzględniające że wektor (T,t) dzieli na pół segment M jest złe.

Chce osiągnąć Inverse Kinematics z 3 segmentów, ale z pewnymi warunkami. Jak już wspomniałem mam na to pewną koncepcje i pewnie jutro będe nad tym myślał.

Offline albireo

  • Użytkownik

# Październik 01, 2016, 11:59:00
Można nieco uprościć obliczenia, umieszczając oba okręgi na jednej osi. Na oko patrząc, to powinno wyjść z tego równanie 4 stopnia.
« Ostatnia zmiana: Październik 01, 2016, 12:53:37 wysłana przez albireo »

Offline ld

  • Użytkownik

# Październik 01, 2016, 14:17:04
Najbardziej zależy mi na otrzymaniu "k"

Wydaje mi się ze zachodzi równość jak w załączniku. Pozwala wyznaczyć k znając długości promieni |L| oraz |N|. 



EDIT: Podaje link bo nie mogę zapisać załącznika ani wyświetlić obrazka :(
« Ostatnia zmiana: Październik 01, 2016, 14:30:24 wysłana przez ld »

Offline albireo

  • Użytkownik

# Październik 01, 2016, 18:15:14
Przepuściłem przez solver sympy i wypluł mi takiego potworka (** - potęgowanie; L, M i N są z założeniem, że środki okręgów są w odległości równej 1, więc dla ogólnego przypadku musisz znormalizować):
k = -(27*L**2/8 - 27*N**2/8 + sqrt((27*L**2/4 - 27*N**2/4)**2 - 4*(3*L**2/2 - 3*M**2/4 + 3*N**2/2 + 3/4)**3)/2)**(1/3)/3 + 1/2 - (3*L**2/2 - 3*M**2/4 + 3*N**2/2 + 3/4)/(3*(27*L**2/8 - 27*N**2/8 + sqrt((27*L**2/4 - 27*N**2/4)**2 - 4*(3*L**2/2 - 3*M**2/4 + 3*N**2/2 + 3/4)**3)/2)**(1/3))

Znalazł jeszcze 2 rozwiązania, ale były zespolone, więc raczej nieinteresujące.

Offline koirat

  • Użytkownik

# Październik 01, 2016, 18:31:59
W międzyczasie równanie sie trochę zmieiło i teraz układ równań wygląda tak:

2*M*N*sin(a)sin(a*k+a)+(2*M*N*cos(a)+2*L*N)cos(a*k+a)+2*L*M*cos(a)+N^2+M^2+L^2-D^2=0

gdzie "a" jest niewiadomą a reszta to stałe.

Ale już pierwszy wpis na stackexchange zakłąda że prawdopodobnie nie da się otrzymać ogólnego rozwiązania.

Offline JacekCichy

  • Użytkownik

# Październik 05, 2016, 22:22:33
Podoba mi się to zdanie że "to bardzo proste zadanie na miarę liceum" ( tak jakbym słyszał swojego szefa :P ) i te wyliczenia wyplute z programów matematycznych które już na takie proste nie wyglądają. Otóż Panowie: IK wcale takie proste nie jest, nie było i raczej nie będzie ale da się coś z tym zrobić. Zabrałeś się na początek za 3 członowy mechanizm ( zakładam że wcześniej nie miałeś do czynienia z IK od strony implementacji/równań jeśli się mylę to mnie popraw ) nie jest to za dobre podejście na sam początek. Lepiej zacznij tak:

Krok pierwszy to mechanizm z 1 członem obrotowym - jak się nie trudno domyślić szukane to alpha - kąt obrotu, a zmienne to: x, y czyli mamy dwie zmienne jedną szukaną, możemy to rozwiązać sposobem geometrycznym  korzystając z alpha = arc-tangens( y/x )  wynik oczywiście będzie w radianach. Warto to zaimplementować i zobaczyć sobie jak to działa pomimo że wydaje się do bólu proste choćby z tego powodu że funkcje cyklometryczne w przeciwieństwie do trygonometrycznych matematycznie nie są "ciągłe" więc numerycznie również, dodatkowo precyzja liczb zmienno-przecinkowych lubi płatać figle i zamiast konkretnego wyniku możemy dostać NaN albo coś w tym stylu ( ten efekt jest właśnie związany z tą "nieciągłością")

Krok drugi mechanizm z 2 członami obrotowymi - tu mamy dwa kąty szukane i dwie zmienne - zaczyna się już ciekawie ale w teorii powinniśmy móc ułożyć dwa równania ( mamy dwie szukane ) i problem rozwiązać. Co ciekawe już ten łańcuch kinematyczny ma dwa rozwiązania czyli np. noga dwu członowa może się zginać jak u człowieka albo jak u kury albo innego ptaka do tyłu. Jak to rozwiązać odsyłam do dobrego ( o dziwo polskiego ) artykułu pod tym adresem: http://www.robotyka.com/teoria.php/teoria.76 gdzie wzorki są wyprowadzone a całość dobrze wytłumaczona. Jeżeli uda ci się to przenieść z 2D do 3D możesz być już z siebie całkiem dumny. ( tips: w 3D rozwiązujemy to tak jak w 2D ale zamiast współrzędnych podstawiamy długości wyliczone jako pierwiastek z sumy kwadratów itd. )

Krok trzeci mechanizm z 3 członami obrotowymi - tu już jest bardzo ciekawie bo mamy 3 szukane i dwie zmienne więc matematycznie mamy nieskończenie wiele rozwiązań - jak to rozwiązać? Ha, no właśnie możemy to zrobić sposobem geometrycznym tak jak w kroku 2 dodając więzy na układ czyli kolejne równanie które będzie nam wiązać/ograniczać ruchomość łańcucha ale całość będzie działać lub można próbować sposobów używanych do łańcuchów n - członowych. Wspomnę tylko że do rozwiązywania problemów kinematyki odwrotnej różni mędrcy gorąco sugerują metodę Jakobianów czyli mówiąc po Polsku ( cinżko sprawo ). Problem polega tylko na tym że jak już Ci się ją uda jako tako skumać to się okaże że jej stosowalność w "przemyśle" jest żadna, a różne implementacje czy to programów 3d takich jak 3d studio czy to driverów robotów stosują metody albo iteracyjne z minimalizacją błędu np. CCD ( Cyclic Coordinate Descent ) albo CAA ( Circular Alignment Algorithm ) albo jeszcze coś innego ale nie mającego za wiele wspólnego z gorąco polecanymi Jakobianami.

CCD i CAA opisane dość ładnie tutaj: http://what-when-how.com/advanced-methods-in-computer-graphics/kinematics-advanced-methods-in-computer-graphics-part-4/

Jeżeli jesteś masochistą, nie masz życia itp. to Jakobiany są tutaj: http://what-when-how.com/advanced-methods-in-computer-graphics/kinematics-advanced-methods-in-computer-graphics-part-3/
Był jeszcze na ich temat dość dobry wykład z którejś z amerykańskich uczelni na youtube.

To tyle pozdrawiam i powodzenia!

Offline koirat

  • Użytkownik

# Październik 05, 2016, 23:01:01
W tym momencie zrobiłem to za pomocą lookup-table + interpolacja.
Zabrakło mi woli(chociaż parę dni nad tym siedziałem) ale może kiedyś jeszcze powróce do próby rozwiązania analitycznego, bo zdaje się że jest takowe przy założeniu relacji pomiędzy tymi kątami
zakładam że wcześniej nie miałeś do czynienia z IK od strony implementacji/równań jeśli się mylę to mnie popraw
.
W sumie pisałem magisterkę z zastosowanani metod sztucznej inteligencji do rozwiązywania IK.
Była napisana aplikacja i teoria opisana.

Wspomnę tylko że do rozwiązywania problemów kinematyki odwrotnej różni mędrcy gorąco sugerują metodę Jakobianów czyli mówiąc po Polsku ( cinżko sprawo ). Problem polega tylko na tym że jak już Ci się ją uda jako tako skumać to się okaże że jej stosowalność w "przemyśle" jest żadna, a różne implementacje czy to programów 3d takich jak 3d studio czy to driverów robotów stosują metody albo iteracyjne z minimalizacją błędu np. CCD ( Cyclic Coordinate Descent ) albo CAA ( Circular Alignment Algorithm ) albo jeszcze coś innego ale nie mającego za wiele wspólnego z gorąco polecanymi Jakobianami.
W teorii tan jakobian w IK  nie taki straszny jak go opisują. Wszystko zaczyna mieć ręce i nogi jak sie zrozumie że jakobian można by porównać do pochodnej tylko że funkcji wielu zmiennych. (ok miałem coś więcej napisać ale za dużo by tego było :P ). Btw metody jakobianowe to również są metody iteracyjne.
Mają kilka zalet choćby takich że z powodzeniem można tworzyć układy z wieloma efektorami. (no i rozwiązania wychodzą jakieś takie ładniejsze niż w CCD).

Dzięki za info o CAA jeszcze się z tym nie spotkałem.
[edit]
A nie jednak sie już spotkałem, nawet całkiem niedawno :P
[/edit]
« Ostatnia zmiana: Październik 05, 2016, 23:02:48 wysłana przez koirat »