Czwartorzędu i normalizacji

Wiem, że czwartorzędy muszą być znormalizowane, jeśli chcę obrócić wektor.

Ale czy są jakieś powody, aby nie normalizować automatycznie czwartorzędu? A jeśli są, to jakie operacje czwartorzędu prowadzą do unormowania czwartorzędów?

  • mnożenie dwóch czwartorzędów?
  • produkt Dot?

Przepraszam, jeśli to pytanie jest trochę niewyraźne. Wciąż próbuję ogarnąć czwartorzędy.

Author: Sebastian Krysmanski, 2012-07-26

6 answers

Każda operacja, która tworzy kwaternion, będzie musiała zostać znormalizowana, ponieważ błędy precesji zmiennoprzecinkowej spowodują, że nie będzie to długość jednostki.

Odradzam standardowe procedury wykonujące normalizację automatycznie ze względów wydajnościowych. Każdy kompetentny programista powinien być świadomy kwestii precyzji i być w stanie normalizować ilości, gdy jest to konieczne - i nie zawsze jest konieczne, aby mieć quaternion długości jednostki.

To samo dotyczy wektora szef.

 7
Author: ,
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
2013-05-04 17:28:28

[11]} późna odpowiedź; ta odpowiedź jest dla ludzi, którzy natkną się na to pytanie w przyszłości, a nie dla pytającego.

Nie zgadzam się z pozostałymi dwoma odpowiedziami dotyczącymi tylko normalizacji czwartorzędu sporadycznie. Standardowe wzory użycia czwartorzędu do obracania/przekształcania wektora lub do generowania macierzy obrotu / transformacji zakładają, że czwartorzędu jest znormalizowany. Błędy wynikające z użycia nienormalizowanego czwartorzędu są proporcjonalne do kwadratu wielkość czwartorzędu. Kwadratowy wzrost błędu jest czymś, czego najlepiej unikać.

Jeśli normalizujesz często, nie potrzebujesz pierwiastka kwadratowego. Aproksymacja pierwszego rzędu działa całkiem nieźle. Oto, co używam do quaternions jako IEEE doubles, nieco stylizowane:

double qmagsq = quat.square_magnitude();
if (std::abs(1.0 - qmagsq) < 2.107342e-08) {
    quat.scale (2.0 / (1.0 + qmagsq));
}
else {
    quat.scale (1.0 / std::sqrt(qmagsq));
}

Zauważ, że używam aproksymatora Padé pierwszego rzędu 2.0/(1.0+qmagsq) zamiast rozszerzenia Taylora pierwszego rzędu 0.5*(3.0-qmagsq) do oszacowania 1.0/std::sqrt(qmagsq). To przybliżenie, jeśli jest poprawne, zastępuje wywołanie pierwiastka kwadratowego prostym podziałem. Na kluczem jest znalezienie, kiedy to przybliżenie jest ważne, czyli gdzie pojawia się magiczna liczba 2.107342 e-08.

Dlaczego przybliżenie Padé? Dwa powody. Jedną z nich jest to, że dla wartości qmagsq bliskich Jedynce, 1+qmagsq traci mniej precyzji niż 3-qmagsq. Drugim jest to, że przybliżenie Padé ' a zmniejsza błąd o współczynnik trzy w porównaniu do ekspansji Taylora. Dla wartości qmagsq z zakresu od 0 do 2, błąd w tym przybliżeniu jest mniejszy niż (1-qmagsq)^2 / 8. Magiczna liczba 2.107342 e-08 oznacza, gdzie ten błąd jest bardziej niż połowa ULP dla IEEE podwaja. Jeśli robisz rozsądne małe kroki, kwadrat wielkości czwartorzędu zawsze będzie w tym limicie. Nigdy nie zadzwonisz sqrt.

Jedynym wyjątkiem od tego paradygmatu "normalizuj zawsze" może być użycie techniki integracji grup Lie ' a do propagowania czwartorzędów. Jeśli nie wiesz, co to oznacza, prawdopodobnie używasz odpowiednika q(t+Δt) = q(t) + dq(t)/dt*Δt do propagacji czwartorzędu. Nadal tego używasz. Krok Eulera gdzieś, nawet jeśli używasz techniki integracji wyższego rzędu, która nie jest integratorem grup Lie ' a.

 26
Author: David Hammen,
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
2012-10-17 13:17:42

Dość zabawne, budowanie macierzy rotacyjnych jest jedną operacją, w której normalizowanie czwartorzędów nie jest potrzebne, oszczędzając jedną sqrt:

M = [w*w+x*x-y*y-z*z, 2*(-w*z+x*y),    2*(w*y+x*z);
     2*(w*z+x*y),     w*w-x*x+y*y-z*z, 2*(-w*x+y*z);
     2*(-w*y+x*z),    2*(w*x+y*z),     w*w-x*x-y*y+z*z] / (w*w+x*x+y*y+z*z)

(w notacji MATLAB-owskiej) dla czwartorzędu w+x*i+y*j+z*k.

Co więcej, jeśli pracujesz z jednorodnymi współrzędnymi i macierzami transformacji 4x4, możesz również zapisać pewne operacje podziału: po prostu zrób część obrotową 3x3, tak jakby czwartorzęd został znormalizowany, a następnie umieść jego kwadratową długość w kwadracie. (4,4)-element:

M = [w*w+x*x-y*y-z*z, 2*(-w*z+x*y),    2*(w*y+x*z),     0;
     2*(w*z+x*y),     w*w-x*x+y*y-z*z, 2*(-w*x+y*z),    0;
     2*(-w*y+x*z),    2*(w*x+y*z),     w*w-x*x-y*y+z*z, 0;
     0,               0,               0,               w*w+x*x+y*y+z*z].

Mnożenie przez macierz translacji itp., jak zwykle dla całkowitej transformacji. W ten sposób można zrobić, np.

[xh yh zh wh]' = ... * OtherM * M * [xold yold zold 1]';
[xnew ynew znew] = [xh yh zh] / wh.

Normalizacja czwartorzędów przynajmniej sporadycznie jest oczywiście nadal zalecana (może być również wymagana w przypadku innych operacji).

 5
Author: vpozdyayev,
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
2012-10-26 12:37:32

Jeśli quaternion jednostkowy otrzymuje się przez numeryczne całkowanie jego pierwszej pochodnej czasowej, integrator może go automatycznie normalizować za pomocą prostego sprzężenia zwrotnego błędu.

Niech q reprezentuje macierz 4 na 1 kolumnową kwaternionów i DQ jego pochodną czasową. Następnie wysłanie dq+0.5 (1-q.q)q / tau do integratora zamiast dqi użycie odpowiedniej stałej czasowej taubędzie stale normalizować q. q. q reprezentuje wewnętrzną produkt.

Symulowałem konserwatywny, artykulacyjny Mechanizm Bricarda, pływający w przestrzeni wolnej od grawitacji przez 3,6 miliona sekund, czyli prawie 42 dni. Czwartorzędowe reprezentowały orientację pływającego ciała bazowego. Całkowita energia pozostała stała w granicach jednej części na milion przy stałej czasowej tau wynoszącej 0,5 sekundy. W integratorze numerycznym zastosowano bezwzględną tolerancję błędu wynoszącą 10^-12 i względną tolerancję błędu wynoszącą zero DE.

Http://www.amazon.com/Computer-Solution-Ordinary-Differential-Equations/dp/0716704617/

Czwartorzędowe są często uzyskiwane przez całkowanie numeryczne. Jeśli nie zostaną one znormalizowane wewnątrz integratora, wówczas błędy wielkości i faz będą się gromadzić. Znormalizowany quaternion porusza się wzdłuż sfery jednostkowej, a jego pierwsza pochodna czasowa jest styczna do tej sfery. Jeśli czwartorzędowy odrywa się od sfery jednostkowej, zacznie gromadzić błędy fazowe, które normalizują poza integratorem nie można poprawić. Tak więc czwartorzędowy musi być stale znormalizowany w integratorze liczbowym, aby zminimalizować błędy fazowe.

 2
Author: Roger Wehage,
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
2013-03-10 21:59:50

Twoje pytanie jest dwuznaczne, ale jeśli musisz znormalizować quaternion jest prosty

Q_normalized = q / square(norm (q))

Z, q = q1 +q2i + q3 j + q4 k norma (q) = (q1)^2 + (q2)^2 + (q3)^2) + (q4)^4

If else explain to me your question

 0
Author: Amal Kostali Targhi,
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
2016-07-25 02:54:37

Użycie nieunit quaternions może być efektywne.

Tylko kilka operacji wymaga długości jednostki, na przykład interpolacja.

Kilka porad:

  1. Tworzenie i konwersja do czwartorzędów nieunit może być bardziej wydajne.
  2. Konwersja do macierzy z nieunit quaternion jest wciąż szybka. Wystarczy skompensować skalę czwartorzędu do kwadratu.
  3. konwersja macierzy do nieunit quat jest szybsza.

Więc nie jest wymagane używanie tylko kwaternionów jednostek, jest to po prostu powszechna praktyka. Dla każdego przypadku użycia można podjąć decyzję użycia lub nie normalizacji. Osobiście wolę używać nieunit quaternions.

Ostrzeżenie: często, pracując z kwaternionami jednostek, zapominamy o błędach numerycznych. Na przykład konwersja z / na kwaternion macierzy i myślenie, że to jeszcze Jednostka powoduje dużą zmienność liczbową, macierz jest skalowana , czwartorzędy wydobywane są niepoprawne. Możesz łatwo zrobić taki eksperyment.

 -1
Author: minorlogic,
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
2014-03-17 12:01:15