Získání posunutí z akcelerometru dat s jádrem Motion

hlasů
19

Jsem rozvoj rozšířená aplikace realitou, že (v tuto chvíli) chce zobrazit jednoduché krychle na vrcholu povrchu, a musí být schopen se pohybovat v prostoru (oba rotující a vytlačování) se dívat na kostku na všech různých úhlů. Problém kalibraci kamery zde neplatí, protože jsem požádat uživatele umístit iPhone na povrchu chce umístit kostku a poté stisknout tlačítko reset postoj. Chcete-li zjistit otáčení fotoaparátu je velmi jednoduché s gyroskopu a jádra Motion. Dělám to takhle:

if (referenceAttitude != nil) {
    [attitude multiplyByInverseOfAttitude:referenceAttitude];
}

CMRotationMatrix mat = attitude.rotationMatrix;

GLfloat rotMat[] = {
    mat.m11, mat.m21, mat.m31, 0,
    mat.m12, mat.m22, mat.m32, 0,
    mat.m13, mat.m23, mat.m33, 0,
    0, 0, 0, 1
};

glMultMatrixf(rotMat);

To funguje opravdu dobře. Další problémy vznikají v každém případě, když se snažím najít posunutí v prostoru během akcelerace. Příklad Apple konvice Core pohybu jen přidává hodnoty x, y a z tohoto vektoru zrychlení do polohy vektoru. Toto (na rozdíl od nemající smysl) má za následek vrácení objekt do původní polohy po akceleraci. (Vzhledem k tomu, zrychlení přejde z pozitivního na negativní nebo obráceně). Dělali to takhle:

translation.x += userAcceleration.x;
translation.y += userAcceleration.y;
translation.z += userAcceleration.z;

Co bych měl udělat, aby zjistil posun od zrychlení v některých istent? (Se známým časový rozdíl). Při pohledu některé další odpovědi, vypadá to, že budu muset integrovat dvakrát dostat rychlost z akcelerace a potom pozici z rychlosti. Ale není tam žádný příklad v kódu vůbec, a nemyslím si, že je opravdu nutné. Také, tam je problém, že když iPhone je stále v letadle, hodnoty akcelerometr nejsou null (tam je nějaký šum myslím). Kolik bych měl filtrovat tyto hodnoty? Mám filtrovat je vůbec?

Položena 15/12/2010 v 12:50
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
21

Cool, existují lidé tam venku potýká se stejným problémem, takže stojí za to, aby strávil nějaký čas :-)

Souhlasím s prohlášením westsider, jak jsem strávil několik týdnů experimentování s různými přístupy a skončil s špatným výsledkům. Jsem si jist, že tam nebude přijatelné řešení buď pro větší vzdálenosti nebo pomalé pohyby, které trvají déle než 1 nebo 2 sekundy. Pokud můžete žít s některými omezeními, jako jsou malé vzdálenosti (<10 cm) a danou minimální rychlostí pro vaše pohyby, pak se domnívám, že by mohla být šance, jak najít řešení - žádnou záruku vůbec. Pokud ano, bude to trvat docela zabrat výzkumu a hodně frustrace, ale pokud si to, bude to velmi velmi cool :-) Možná zjistíte, tyto tipy užitečné:

Za prvé, aby se věci jednoduše stačí se podívat na jednu osu, např x ale zvážit i doleva (-x) a doprava (+ x) mají reprezentovat situaci.

Ano, máte pravdu, budete muset integrovat dvakrát získat pozici v závislosti na čase. A k dalšímu zpracování, měli byste ukládat výsledek prvního integrace je (== rychlost), protože budete potřebovat v pozdější fázi optimalizace. Ještě to velmi opatrní, protože každá drobná chyba povede k obrovským chybám po krátkém časovém období.

Vždy mějte na paměti, že i velmi malé chyby (např <0,1%) poroste rychle po dvakrát dělá integrace. Situace se ještě zhorší po jedné sekundě, pokud konfiguraci akcelerometr s řekněme 50 Hz, tedy 50 klíšťata jsou zpracovávány a drobná zanedbatelná chyba bude předběhnout „skutečnou“ hodnotu. Chtěl bych důrazně doporučujeme, aby nespoléhá na lichoběžníkového pravidla však použít alespoň Simpson nebo vyšším stupněm Newton-Cotes vzorec.

Pokud si to podařilo, budete muset dávat pozor na nastavení správného low-pass filtrování. Nemohu dát obecnou hodnotu, ale jako pravidlo experimentování s filtračními faktory mezi 0,2 a 0,8 bude dobrým výchozím bodem. Správná hodnota závisí na obchodního případu, které potřebujete, například jaký druh hry, jak rychle reagovat na události, ...

Nyní budete mít řešení, které pracuje docela dobře za určitých okolností a v krátkém časovém období. Ale než po několika sekundách se spustí do potíží, protože objekt se vzdaloval. Nyní budete zadávat obtížnou část řešení, které jsem nedokázal zvládnout nakonec v daném časovém rozsahu :-(

Jedním ze slibných možností je zavést něco, co nazývám „synthectic síly“ nebo „virtuální síly“. To je nějaká strategie, jejímž cílem reagovat na několik těžkých životních situací spouštěcí objekt se odloučit, i když je zařízení zůstává pevná (? No rodilý mluvčí, myslím bez pohybu) ve svých rukou. Nejvíce znepokojující z nich je rychlost větší než 0 bez zrychlení. To je nevyhnutelný důsledek šíření chyb a mohou být řešeny tím, že zpomaluje uměle to znamená, že zavedení virtuální zpomalení, i když neexistuje žádný skutečný protějšek. Velmi zjednodušený příklad:

if (vX > 0 && lastAccelerationXTimeStamp > 0.3sec) {

     vX *= 0.9;
}

`

Budete potřebovat kombinaci takových podmínek zkrotit šelmu. Hodně pokusu a omylu je nutné získat cit pro správná cesta, a to bude těžké součástí problému.

Pokud jste někdy podařilo rozluštit kód, pleeeease dejte mi vědět, jsem velmi zvědavý, zda je možné vůbec, nebo ne :-)

Cheers Kay

Odpovězeno 08/01/2011 v 18:18
zdroj uživatelem

hlasů
7

Když se iPhone 4 byl zcela nový, jsem strávil mnoho a mnoho hodin se snaží získat přesný posun pomocí akcelerometry a gyroskop. Tam by neměl být mnoho znepokojení nad kumulativní drift jako zařízení potřebné pohybovat pouze pár metrů nejvýše a sběr dat typicky běžel po dobu několika minut u nejvíce. Zkoušeli jsme všechny druhy přístupů a dokonce měl pomoci z několika inženýry společnosti Apple. Nakonec se zdálo, že gyroskop nebyl nahoru k úloze. Bylo to dobré pro 3D orientaci, ale to bylo všechno ... opět v souladu s velmi knowledgable inženýry.

Já bych rád slyšel někdo odporuje to - protože aplikace nikdy se ukázalo, jak jsme doufali, atd.

Odpovězeno 07/01/2011 v 05:59
zdroj uživatelem

hlasů
5

Jsem také snaží dostat posunutí na iPhone. Namísto použití integrace jsem základní fyzikální vzorec d = .5a * t ^ 2 za předpokladu, že počáteční rychlost 0 (nezní jako lze předpokládat, počáteční rychlost 0). Zatím se zdá, že funguje docela dobře.

Můj problém je, že jsem pomocí deviceMotion.and hodnoty nejsou správné. deviceMotion.gravity přečíst v blízkosti 0. Nějaké nápady? - OK Pevné zřejmě deviceMotion.gravity má sekeru, Y a Z hodnoty. Pokud nechcete určit, které chcete, můžete se vrátit x (což by mělo být blízko 0 ° C).

Odpovězeno 15/01/2011 v 22:29
zdroj uživatelem

hlasů
1

Najít na tuto otázku dva roky později, jsem jen najít AR projekt na iOS 6 docset názvem Park , to poskytuje blízký zachycení posunu a výpočet pomocí gyroskopu, aka CoreMotion.Framework.

Jsem teprve začíná naklánět kód.

pokračování příště...

Odpovězeno 11/10/2012 v 10:29
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more