Mam aplikację, która rejestruje kąty, gdy użytkownik chodzi po obiekcie, jednocześnie wskazując urządzenie (najlepiej) w środku obiektu. Kąt zostaje zresetowany na polecenie użytkownika - w ten sposób ustawienie referencyjne zostanie zresetowane.Zmiana podejścia - problemy z kątami i osią - matematyka kwaternionowa
Korzystanie kąty Eulera powoduje blokadę przegubowego, więc Obecnie używam quaternions i obliczanie kątów w ten sposób:
double angleFromLastPosition = acos(fromLastPositionAttitude.quaternion.w) * 2.0f;
ten wydziela dobrą precyzję i działa prawidłowo, jeżeli wysokość i odchylenie urządzenia nie zmieni się. Innymi słowy, ponieważ kąt pokazuje 360 stopni, kończę w tym samym miejscu co początek koła.
Problem 1: jeśli odchylenie urządzenia i jego wysokość zmieniają się nieznacznie (użytkownik nie wskazuje bezpośrednio na środek obiektu), zmienia się także kątFromLastPosition. Rozumiem tę część, ponieważ moja formuła kątowa pokazuje kąt pomiędzy dwiema postawami urządzenia w przestrzeni 3D.
Scenariusz:
- oznaczyć początek postawy rotacji i ruszyć w kręgu wokół obiektu, wskazując jednocześnie na środku
- zatrzymać w, powiedzmy, 45 stopni i zmiana skoku urządzenia wskazując go wyżej lub niżej. Kąt zmienia się odpowiednio.
- Co chciałbym zobaczyć, to: kąt pozostaje pod kątem 45 stopni, nawet jeśli zmienia się nachylenie lub odchylenie.
Pytanie 1 brzmi, w jaki sposób mogę obliczyć tylko rzut urządzenia za pomocą kwaternionów i pominąć zmiany w innych dwóch osiach (przynajmniej w rozsądnej liczbie stopni).
Problem 2: jeśli obrócę na chwilę, a następnie całkowicie zamroszę urządzenie (na statywie, aby nie było w ogóle drgań), kątFromLastPosition dryfuje z prędkością 1 stopnia na około 10-20 sekund, i wydaje się nie być być liniowe. Innymi słowy, początkowo szybko dryfuje, a następnie znacznie zwalnia. Czasami nie mam żadnego dryfu - kąt jest stabilny, gdy urządzenie jest nieruchome. A to sprawia, że tracę rozumienie tego, co się dzieje.
Pytanie 2, co się tutaj dzieje i jak mogę dbać o dryf?
Przeszedłem przez kilka artykułów i samouczków, a matematyka czwartorzędowa jest obecnie poza mną, mam nadzieję, że ktoś będzie w stanie pomóc z napiwkiem, linkiem lub kilkoma liniami kodu.
dryft może być związany z [Drifting Yaw] (http://stackoverflow.com/questions/13613239/drifting-yaw-angle-after-moving-fast? Rq=1)? jeśli tak, znalezienie wzoru na pytanie 1 zajmie się obydwoma problemami :) –
Jeśli używasz CMAttitude, czy istnieje jakiś szczególny powód, którego nie możesz po prostu użyć zLastPositionAttitude.roll, aby uzyskać przewinięcie urządzenia? Doceniam to, że nie używa się własności kwaternionowej, ale jest tam do użycia! –
tak, zacząłem od tego - używanie kątów Eulera powoduje zablokowanie kardana i utratę stopni swobody. pełny obrót nie wynosi 360 stopni, gdy urządzenie nie jest wyrównane z osią Z. a przynajmniej to jest moje zrozumienie efektu ... –