Měření rychlosti pomocí iPhone SDK

hlasů
12

Potřebuji implementovat nativní aplikace pro iPhone pro měření rychlosti telefonu (v podstatě rychloměru). Vím, že můžete tak učinit pomocí API CoreLocation poměrně snadno, ale mám obavy o spotřebu baterie, protože to má být měření v reálném čase, které by mohly být použity až po dobu několika hodin v kuse. Já to chápu tak, že i když jste aktivně sleduje události z LocationManager (i když ne ve skutečnosti záleží na umístění GPS), je baterie náročné.

Druhou zřejmá možnost prozkoumat by se používat akcelerometry, aby se pokusila vypočítat rychlost, ale není to nic v rozhraní API, které vám pomohou učinit. Na svém výzkumu založená, by mělo být možné, jak to udělat, ale zdá se velmi komplikované a náchylné k chybám. Překlady ze zrychlení na rychlosti může být obtížné začít, a údaje akcelerometru iPhone může být „hlučné“. Jsem obeznámen s příkladem SDK, který demonstruje použití vysokého / nízkého filtrování propust, atd - ale neviděl jsem dobrý příklad kdekoli, které ukazuje výpočetní rychlost.

Má někdo nějaké real-svět zkušenosti s tímto mohou sdílet? Kód by bylo fantastické, ale opravdu chci jen vědět, jestli někdo úspěšně udělal (po dlouhou životností app) a jaký přístup vzali.

EDIT : Mám funkční prototyp, který používá API LocationManager. Funguje to OK, ale aktualizace cyklus není ani zdaleka ideální pro měření v reálném čase rychlostí. V závislosti na okolnostech, může trvat až 4-5 sekund občas aktualizovat. Cestovní při dané rychlosti inklinuje k práci v pořádku, ale zrychlení / zpomalení tendenci zaostávají velmi špatně z uživatelské interakce hlediska. Také musím nakrmit rychlosti na některých jiných výpočtů, které dělám a přesnost není opravdu to, co potřebuji.

Zdá se, že je to možné na základě (velmi málo), dalšími aplikacemi, které jsem viděl, a to zejména gMeter který tvrdí, že nevybere žádnou použití GPS, ale vypočítává rychlost přesně. Jsem opravdu překvapen, nejsou tam žádné odkazy nebo jakékoliv ukázkový kód, který demonstruje toto všude, kde mohu najít. Uvědomuji si, že je to složité, ale určitě tam něco tam venku.

Položena 03/01/2010 v 05:47
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
3

Nejsem si jistý, budete mít daleko snaží sledovat rychlost pomocí akcelerometru. K tomu, měli byste se ujistit, že zachytil KAŽDÝ akceleraci, protože všechny zmeškané datových bodů by znamenalo špatnou rychlost (to je za předpokladu, samozřejmě, budete moci převést na vykazované hodnoty akcelerometru do standardních jednotek). To znamená, že budete muset neustále spustit akcelerometru věci, která nasává trochu šťávy samo o sobě (a opět nebude možné zaručit všem zrychlení). Já bych doporučil používat CoreLocation.

Odpovězeno 03/01/2010 v 06:10
zdroj uživatelem

hlasů
10

Z praktického hlediska, nebudete získat přesné rychlosti ze sil působících na akcelerometru.

Používat GPS s hodnotami naměřenými v 1 minutových intervalech a dát GPS spát mezi nimi.

Zde je příklad:

SpeedViewController.h

CLLocationManager *locManager;
CLLocationSpeed speed;
NSTimer *timer;

@property (nonantomic,retain) NSTimer *timer;

SpeedViewController.m

#define kRequiredAccuracy 500.0 //meters
#define kMaxAge 10.0 //seconds

- (void)startReadingLocation {
    [locManager startUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {

    NSTimeInterval ageInSeconds = [newLocation.timestamp timeIntervalSinceNow];

    //ensure you have an accurate and non-cached reading
    if( newLocation.horizontalAccuracy > kRequiredAccuracy || fabs(ageInSeconds) > kMaxAge )
        return;

    //get current speed    
    currentSpeed = newLocation.speed;

    //this puts the GPS to sleep, saving power
    [locManager stopUpdatingLocation]; 

    //timer fires after 60 seconds, then stops
    self.timer = [NSTimer scheduledTimerWithTimeInterval:60.0 target:self selector:@selector(timeIntervalEnded:) userInfo:nil repeats:NO];
}

//this is a wrapper method to fit the required selector signature
- (void)timeIntervalEnded:(NSTimer*)timer {
    [self startReadingLocation];
}
Odpovězeno 03/01/2010 v 06:11
zdroj uživatelem

hlasů
10

Vzhledem k tomu, GPS a akcelerometru mají různé nedostatky, vaše nejlepší volba je pravděpodobně kombinovaný přístup - Get měření z GPS každou minutu nebo tak, a pak přidat v reálném čase změny z akcelerometru.

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

hlasů
4

Došlo k chybě při akceleraci se hromadí v průběhu času. Nejlepším řešením je získat přesné rychlosti z GPS, možná jednou za minutu nebo méně:

distanceTravelled = sqrt( (position2.x-position1.x)^2 + (position2.y-position1.y)^2 )
velocity = distanceTravelled/timeBetweenGPSReadings

(kde ^2prostředky na druhou )

Pak časté měření akcelerometru:

newVelocity = oldVelocity + accelerometer*timeBetweenAccelerometerReadings
Odpovězeno 13/01/2010 v 22:31
zdroj uživatelem

hlasů
2

I když nevím, API iPhone, vím něco o GPS a inerciální navigace. To by mohlo být užitečné.

GPS přijímače jsem spolupracoval to vše může poskytnout přímé měření rychlosti ze signálů GPS, které dostávají. Tato měření jsou přesnější než údaje o poloze i. Já nevím, jestli Apple API umožňuje přístup, nebo i když jablko nakonfiguroval svůj přijímač tyto údaje poskytnout. To by bylo účinnější cestou k získání měření rychlosti.

Příští cesta, vzhledem k tomu, že máte data z akcelerometru a data GPS je zkombinovat jak bylo zmíněno dříve jinými plakáty a připomínky. Pomocí GPS pravidelně korigovat nahromaděné intertial měření z dat akcelerometru funguje v praxi velmi dobře. To poskytuje výhodu častější měření akcelerometru a přesnosti měření GPS. Kalmanova filtru se běžně používá. Ale vzhledem na přesnost a načasování meze zvolené platformě Kalmanova filtru může být zbytečná a něco jednodušší implementovat a spouštět by měly fungovat dobře.

Mimochodem, jen některé věci myslet.

Odpovězeno 19/01/2010 v 18:29
zdroj uživatelem

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