Przechowuj orientację do tablicy - i porównaj

Chcę osiągnąć:

Chcę, aby użytkownik mógł "rejestrować" ruch iPhone ' a za pomocą żyroskopu. A następnie użytkownik powinien być w stanie odtworzyć ten sam ruch. Wyciągam rzut, rzucam i ziewam używając:

 [self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue]
                                       withHandler: ^(CMDeviceMotion *motion, NSError *error)
     {
         CMAttitude *attitude = motion.attitude;
         NSLog(@"pitch: %f, roll: %f, yaw: %f]", attitude.pitch, attitude.roll, attitude.yaw);
     }];

Myślę, że mógłbym zapisać te wartości w tablicy, jeśli użytkownik jest w trybie rekordów. A kiedy użytkownik próbuje replikować ten ruch, mogę porównać replikowaną tablicę ruchu z nagraną. rzecz czy, Jak mogę porównać dwie tablice w inteligentny sposób?Nigdy nie będą miały dokładnie tych samych wartości, ale mogą być w pewnym sensie takie same.

Czy w ogóle jestem na dobrej drodze?

UPDATE: myślę, że może odpowiedź Alis na temat korzystania z DTW mogłaby być dla mnie tutaj właściwą drogą. Ale nie jestem aż tak mądry (widocznie), więc gdyby ktoś mógł mi pomóc w pierwszych krokach z porównaniem do tablic byłbym szczęśliwym człowiekiem!

Dzięki!
Author: Ali, 2011-06-16

2 answers

Spróbuj dynamiczne wypaczanie czasu . Oto przykład z tablicami 1D. W bazie mamy już 2 tablice:

Array 1: [5, 3, 1]
Array 2: [1, 3, 5, 8, 8]

Mierzyliśmy [2, 4, 6, 7]. Która tablica jest najbardziej podobna do nowo mierzonej? Oczywiście druga tablica jest podobna do nowo mierzonej, a pierwsza Nie.

Obliczmy macierze kosztów według tej pracy, podrozdziału 2.1:

D(i,j)=Dist(i,j)+MIN(D(i-1,j),D(i,j-1),D(i-1,j-1))

Tutaj D(i,j) jest elementem (i,j) macierzy kosztów, patrz poniżej. Sprawdź Rysunek 3 tego artykułu, aby zobaczyć zastosowanie tej relacji powtarzania. W skrócie: kolumny są obliczane jako pierwsze, począwszy od D(1,1); D(0,*) i D(*,0) są pozostawione w MIN. Jeśli porównujemy tablice A i B, to Dist(i,j) jest odległością między A[i] a B[j]. Po prostu użyłem ABS(A[i]-B[j]). Macierze kosztów dla tego przykładu:

Dynamiczne Wypaczanie czasu, matryce kosztów

Dla tablicy 1 mamy 13 jako wynik, dla tablicy 2 mamy 5. Wygrywa niższy wynik, więc najbardziej podobna tablica to tablica 2. Najlepsza ścieżka wypaczania jest zaznaczona na szaro.

To tylko szkic DTW. istnieje wiele problemów, które musisz rozwiązać w rzeczywistych aplikacji. Na przykład użycie offsetu zamiast stałych punktów końcowych lub określenie miar dopasowania: patrz niniejszy artykuł, strona 363, 5. warunki brzegowe i strona 364. Powyższy artykuł zawiera również więcej szczegółów.

Właśnie zauważyłem, że używasz yaw, pitch and roll. po prostu put: don ' t and another reason not to . Czy możesz zamiast tego użyć danych z akcelerometru? "Akcelerometr jest bezpośrednim pomiarem orientacji" (z manuskryptu DCM ) i to jest to, czego potrzebujesz. A co do pytania tc, czy orientacja względem północy ma znaczenie? Chyba nie.

O wiele łatwiej jest porównać wektory przyspieszenia niż orientacje (kąty Eulera, macierze obrotu, czwartorzędy), jak zauważył tc. Jeśli używasz dane przyspieszenia, masz wektory 3 wymiarowe w każdym punkcie czasowym,współrzędne (x,y, Z). Po prostu obliczyłbym

Dist(i,j)=SQRT((A[i][X]-B[j][X])^2+(A[i][Y]-B[j][Y])^2+(A[i][Z]-B[j][Z])^2),

To jest odległość między dwoma punktami.

 46
Author: Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:32:23

Myślę, że podejście Ali jest ogólnie dobrym rozwiązaniem, ale istnieje ogólny problem o nazwie Blokada gimbal (lub więc dyskusje na ten temat) przy użyciu kątów Eulera, tj. Napotkasz go, gdy zarejestrujesz bardziej złożony ruch trwający dłużej niż kilka kleszczy, a tym samym prowadzący do dużych delt kątowych w różnych kierunkach kątowych.

W skrócie oznacza to, że będziesz miał więcej niż jedną reprezentację matematyczną dla tego samego pozycja tylko w zależności od kolejności ruchów wykonane, aby się tam dostać - i utrata informacji po drugiej stronie. Rozważ samolot latający w powietrzu od lewej do prawej. Oś X jest od lewej do prawej, oś Y wskazuje na powietrze. Następujące dwie sekwencje ruchu prowadzą do tej samej pozycji końcowej, chociaż dojdziesz tam na zupełnie inne sposoby:

Sekwencja A:

  1. obrót wokół odchylenia +90°
  2. obrót wokół skoku +90°

Sekwencja B:

  1. obrót wokół skoku +90°
  2. obrót wokół rolki +90°

W obu przypadkach twój samolot wskazuje na ziemię i możesz zobaczyć jego dno z twojej pozycji.

Jedynym rozwiązaniem jest uniknięcie kątów Eulera i tym samym komplikowanie sprawy. Quaternions są najlepszym sposobem, aby sobie z tym poradzić, ale zajęło trochę czasu (dla mnie), aby uzyskać wyobrażenie o tej dość abstrakcyjnej reprezentacji. OK, ta odpowiedź nie idzie o krok dalej w odniesieniu do pierwotnego problemu, ale może to pomóc uniknąć marnowania czasu. Może uda Ci się dokonać pewnych zmian koncepcyjnych, aby skonfigurować swój pomysł.

Kay

 8
Author: Kay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:32:23