Jak rozpoznat iPhone pohyb v prostoru pomocí akcelerometru?

hlasů
13

Snažím se vytvořit aplikaci, která bude zjišťovat, jaký tvar provedené pomocí vašeho iPhone pomocí akcelerometru. Jako příklad, pokud si nakreslit kružnici s vaše ruka iPhone, aplikace by byl schopen ji překreslit na obrazovce. To by mohlo také pracovat s náměstí, nebo dokonce složitějších tvarů. Jediným příkladem uplatnění jsem viděn dělat něco takového je AirPaint ( http://vimeo.com/2276713 ), ale to se zdá být schopen dělat to v reálném čase.

Můj první pokus je použít low-pass filtr na parametrech X a Y z akcelerometru, a aby se ukazatel pohybovat směrem k těmto hodnotám, v poměru k velikosti obrazovky. Ale to zjevně není enought, mám velmi nízkou přesností, i když jsem třást přístroj to také dělá ukazatel tah ...

Nějaké nápady na to? Myslíte si, že akcelerometr data enought na to? Nebo bych měl uvažovat o použití jiných údajů, jako je kompas?

Díky předem !

Položena 20/04/2010 v 12:43
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
10

OK jsem našel něco, co se zdá fungovat, ale stále mám nějaké problémy. Zde je, jak mám postupovat (admiting zařízení je držena vertikálně):

1 - mám default X, Y a Z hodnoty.
2 - extrahovat vektoru gravitace z těchto dat s použitím filtru typu dolní propusť.
3 - I odečteme normalizovaný vektor gravitace z každé x, y, a z, a získat zrychlení pohybu.
4 - Poté jsem integrovat tuto hodnotu zrychlení s ohledem na čas, takže jsem si rychlost.
5 - I začlenit tuto rychlost opět v závislosti na čase, a najít místo.

Všechny níže uvedené kódu do akcelerometru: didAccelerate: delegát mého regulátor. Snažím se, aby míč pohybující se v závislosti na poloze jsem našel. Zde je můj kód:

NSTimeInterval interval = 0;
NSDate *now = [NSDate date];
if (previousDate != nil)
{
    interval = [now timeIntervalSinceDate:previousDate];
}
previousDate = now;

//Isolating gravity vector
gravity.x = currentAcceleration.x * kFileringFactor + gravity.x * (1.0 - kFileringFactor);
gravity.y = currentAcceleration.y * kFileringFactor + gravity.y * (1.0 - kFileringFactor);
gravity.z = currentAcceleration.z * kFileringFactor + gravity.z * (1.0 - kFileringFactor);
float gravityNorm = sqrt(gravity.x * gravity.x + gravity.y * gravity.y + gravity.z * gravity.z);

//Removing gravity vector from initial acceleration
filteredAcceleration.x = acceleration.x - gravity.x / gravityNorm;
filteredAcceleration.y = acceleration.y - gravity.y / gravityNorm;
filteredAcceleration.z = acceleration.z - gravity.z / gravityNorm;

//Calculating velocity related to time interval
velocity.x = velocity.x + filteredAcceleration.x * interval;
velocity.y = velocity.y + filteredAcceleration.y * interval;
velocity.z = velocity.z + filteredAcceleration.z * interval;

//Finding position
position.x = position.x + velocity.x * interval * 160;
position.y = position.y + velocity.y * interval * 230;

Mám-li spustit tento, mám docela dobré hodnoty, myslím vidím zrychlení jít do kladných nebo záporných hodnot v závislosti na pohybu udělám. Ale když se snažím uplatnit toto postavení mého názoru míčem, vidím, že se pohybuje, ale s propencity jít větší v jednom směru než jiný. To znamená, například, když jsem kreslit kruhy s mým zařízením, bude vidím míč popisující křivky směrem do levého horního rohu obrazovky. Něco v tom smyslu: http://img685.imageshack.us/i/capturedcran20100422133.png/

Máte nějaké představy o tom, co se děje? Díky předem !

Odpovězeno 22/04/2010 v 12:47
zdroj uživatelem

hlasů
7

Problém je v tom, že není možné integrovat zrychlení dvakrát získat pozici. Není bez znalosti počáteční polohu a rychlost. Vzpomeňte si na + C termín, který jste přidali ve škole, když se učí o integraci? Dobře v době, kdy se dostanete do požadované polohy je ct + k horizontu. A to je důležité. To je dříve, než se domníváte, že data zrychlení jste dostat zpět se quantised a zprůměrovány, takže nejste vlastně integraci skutečného zrychlení zařízení. Tyto chyby se nakonec stane velký, jakmile budou začleněny dvakrát.

Podívejte se na ukázku AirPaint pozorně a uvidíte přesně to děje, tvary tavené jsou výrazně odlišné tvary přesunuta.

Dokonce i přístroje, které mají nějakou pozici a rychlosti snímání (s Wiimote, například) mají potíže dělá gesto uznání. Je to složité problém, který lidé zaplatí dobré peníze (společnostem jako AILive, například) řešit za ně.

Který uvedl, že můžete pravděpodobně poměrně snadno rozlišit určité typy gesta, pokud jsou jejich velké vlastnosti měřítka jsou odlišné. Kruh může být detekován v případě, že zařízení má uděleno zrychlení v každém ze šesti úhlových rozsahů (například). Ty by mohly odhalit mezi přejetím iPhone do vzduchu a třepání.

Chcete-li zjistit rozdíl mezi kruhu a čtverec bude mnohem obtížnější.

Odpovězeno 24/04/2010 v 01:59
zdroj uživatelem

hlasů
2

Zdá se, jako byste se normalizuje svůj vektor gravitace před odečtením s okamžitým zrychlením. Tak by se zajistilo relativní orientaci, ale odstranit relativní váhu. Nejnovější zařízení I testovány (sice není iDevice) vrátil gravitace zhruba -9.8, který je pravděpodobně kalibrován na m / s. Za předpokladu, že žádné další akceleraci, pokud jste byli normalizovat to pak odečíst ji z filtrovaného přihrávky, měli byste skončit s aktuálním rozběhu z -8.8 namísto 0.0f;

2 možnosti: -Ty stačí odečíst z vektoru gravitace po filtračním průchodu -Capture počáteční délky zrychlení vektoru, normalizovat Accel a gravitační vektorů, měřítko Accel vektor podle bodu ze zrychlení a gravitace normály.

Také třeba připomenout, aby se orientace zařízení v úvahu.

Odpovězeno 06/07/2010 v 22:05
zdroj uživatelem

hlasů
2

Musíte se podívat nahoru, jak zrychlení se vztahuje k rychlosti a rychlost na novou pozici. Moje mysl se má wee prd v tuto chvíli, ale jsem si jist, že integrál ... Chcete integrují zrychlení v závislosti na čase. Wikipedia by vám měl pomoci s matematikou a jsem si jist, že tam je dobrá knihovna někde, že vám může pomoci ven.

Jen nezapomeňte, že i když tyto akcelerometry nejsou dokonalé ani dotázaných dostatečně rychle. Opravdu náhlé pohyby nelze vyzvednout, že dobře. Ale opatrně nasávání vzduchu, měl by fungovat v pořádku.

Odpovězeno 20/04/2010 v 12:52
zdroj uživatelem

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