Kratak uvod: pišem program za uređaj koji ima ugrađen 3D akcelerometar. Akcelerometar ima desno orijentisani koordinatni sistem. Uređaj može da bude montiran u bilo kom položaju, a posledica toga je da položaj koordinatnog sistema akcelerometra ne odgovara poziciji koordinatnog sistema po kome treba meriti vrednosti. Zato je potrebno izvršiti nivelaciju i koordinatni sistem akcelerometra rotirati tako da odgovara koordinatnom sistemu po kome se mere vrednosti. Kako akcelerometar meri gravitaciono ubrzanje, nivelacija se vrši u stanju mirovanja, kada akcelerometar meri +1g. Nivelacija se radi tako što se koordinatni sistem akcelerometra rotira tako da se smer Z+ ose poklapa sa smerom vektora ubrzanja u stanju mirovanja.
Na prvoj slici, debele ose XYZ su koordinatni sistem akcelerometra, A je vektor ubrzanja koje akcelerometar meri. Ovaj vektor u novom koordinatnom sistemu treba da ima vrednost (x', y', z') = (0, 0, 1).
Na drugoj slici se vidi rotiran koordinatni sistem i smer ose Z'+ se poklapa sa smerom vektora ubrzanja A.
Rotacija koordinatnog sistema se vrši oko vektorskog proizvoda vektora Z+ i A, za -ugao koji oni zaklapaju (0 - 180).
Moje očekivanje je da će rotirani sistem meriti iste koordinate za iste pokrete tela na kome je uređaj postavljen, bez obzira na položaj akcelerometra na tom telu (npr, montiran na vratima automobila, montiran na krovu, i sl). Npr, kada se auto nagne za 30 stepeni na desno, ja očekujem da mi se vrednosti vektora ubrzanja menjaju u smeru Y'- ose. Problem je u tome što mi se ne poklapaju uvek ose X' i Y', nekada ih je potrebno posebno rotirati za još 90, 180 ili 270 stepeni po Z' osi. U pomenutom primeru, prilikom nagiba od 30 stepeni, vrednosti se menjaju u smeru X'+ ose, a ja o;ekujem promenu u smeru Y'- ose.
Gde grešim?
Nadam se da nisam bio previše konfuzan.
Hvala
[Ovu poruku je menjao Rotacija dana 10.02.2011. u 16:16 GMT+1]