2010-01-03 5 views
12

Ho bisogno di implementare un'applicazione nativa per iPhone per misurare la velocità del telefono (fondamentalmente un tachimetro). So che puoi farlo tramite l'API CoreLocation abbastanza facilmente, ma sono preoccupato per il consumo della batteria poiché si tratta di una misurazione in tempo reale che può essere utilizzata per un paio di ore alla volta. La mia comprensione è che mentre si sta attivamente monitorando gli eventi dal LocationManager (anche se non mi interessa realmente la posizione GPS) è a uso intensivo della batteria.Velocità di misurazione via iPhone SDK

L'altra opzione ovvia da esplorare sarebbe utilizzare gli accelerometri per provare a calcolare la velocità, ma non c'è nulla nell'API che ti aiuti a farlo. Sulla base delle mie ricerche, dovrebbe essere possibile farlo, ma sembra estremamente complicato e soggetto a errori. La traduzione dall'accelerazione alla velocità può essere complicata da iniziare, inoltre i dati dell'accelerometro dell'iPhone possono essere "rumorosi". Conosco l'esempio dell'SDK che dimostra l'utilizzo del filtro passa basso/alto, ecc., Ma non ho mai visto un buon esempio in cui sia mostrato il calcolo della velocità.

Qualcuno ha qualche esperienza del mondo reale con cui possono condividere? Il codice sarebbe fantastico, ma in realtà voglio solo sapere se qualcuno lo ha fatto con successo (per un'app di lunga durata) e quale approccio hanno adottato.

EDIT: Ho un prototipo funzionante che utilizza l'API LocationManager. Funziona OK, ma il ciclo di aggiornamento è lontano dall'ideale per una misurazione della velocità in tempo reale. A seconda delle circostanze, a volte possono essere necessari fino a 4-5 secondi per l'aggiornamento. Crociera a una determinata velocità tende a funzionare correttamente, ma l'accelerazione/decelerazione tende a rallentare molto dal punto di vista dell'interazione dell'utente. Inoltre, ho bisogno di alimentare la velocità in altri calcoli che sto facendo e la precisione non è proprio ciò di cui ho bisogno.

Sembra possibile basarsi su (pochissime) altre app che ho visto, in particolare gMeter che dichiara di non utilizzare il GPS ma calcola accuratamente la velocità. Sono davvero sorpreso che non ci siano riferimenti o codici di esempio che dimostrino ciò che posso trovare ovunque. Mi rendo conto che è complesso, ma sicuramente c'è qualcosa là fuori.

+0

Ehi, sarei interessato a qualsiasi successo tu abbia avuto in questa zona. Attualmente sto studiando l'utilizzo dei dati Accelerometer/Gryo da un iPhone 4 insieme ai dati GPS per tracciare una rotta di navigazione inerziale tra gli aggiornamenti GPS. – Jerceratops

risposta

10

Poiché il GPS e l'accelerometro hanno diversi punti deboli, la soluzione migliore è probabilmente un approccio combinato: ottieni una misurazione dal GPS di sempre Circa un minuto, quindi aggiungere modifiche in tempo reale dall'accelerometro.

+0

Sì, questo è l'approccio che ho considerato in base a ciò che ho letto sull'accumulo di errori usando l'accelerazione solo su lunghe distanze. Sto ancora lottando per ottenere l'accelerazione correttamente convertita in velocità per cominciare però. –

3

Non sono sicuro che riuscirete molto a provare a tracciare la velocità utilizzando l'accelerometro. Per fare ciò, dovresti assicurarti di aver catturato OGNI accelerazione, dal momento che qualsiasi punto di dati mancati indica la velocità errata (ciò presumendo che, naturalmente, sia possibile convertire i valori dell'accelerometro riportati in unità standard). Quindi, dovresti eseguire costantemente l'accelerometro, che fa schifo un bel po 'di succo in sé (e, ancora una volta, non ti saranno garantite tutte le accelerazioni). Mi consiglia di utilizzare CoreLocation.

+0

Suona come quello che ho letto in accelerazione -> velocità, anche se la mia impressione è che l'antenna interna utilizzata dall'iPhone per elaborare i segnali dei satelliti/celle usi più energia di quella degli accelerometri (non sono praticamente sempre attivi?) –

10

Dal punto di vista pratico, non si ottiene una velocità accurata dalle forze che agiscono sull'accelerometro.

Utilizzare il GPS con letture effettuate ad intervalli di 1 minuto e mettere il GPS in pausa tra due.

Ecco un esempio:

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]; 
} 
+0

Grazie per l'esempio. Realisticamente questa dovrebbe essere una misurazione quasi in tempo reale per me. Sono ancora preoccupato per il consumo di energia se questo è stato fatto di più su un secondo o due intervallo di aggiornamento. L'hai fatto in un'app reale? –

+0

Non ho la prova del mondo reale che questo salverà davvero il potere. In teoria, spegnendo il GPS per alcuni secondi dopo ogni lettura si dovrebbe usare molta meno energia. – bentford

+0

C'è un "{" mancante in - (void) locationManager –

4

L'errore nell'accelerazione si accumula nel tempo. La cosa migliore è quello di ottenere una velocità precisa dal GPS, forse una volta al minuto o meno:

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

(dove ^2 significa quadrati)

Poi prendere misurazioni frequenti del accelerometro:

newVelocity = oldVelocity + accelerometer*timeBetweenAccelerometerReadings 
2

Mentre non conosco l'API iPhone, so qualcosa sul GPS e sulla navigazione inerziale. Potrebbe essere utile.

I ricevitori GPS con cui ho lavorato possono tutti fornire una misura diretta della velocità dai segnali GPS ricevuti. Queste misurazioni sono anche più accurate dei dati di posizione. Non so se l'API Apple fornisce l'accesso, o anche se Apple ha configurato il proprio ricevitore per fornire questi dati. Questo sarebbe il percorso più efficiente per ottenere una misurazione della velocità.

Il percorso successivo, dato che si dispone di dati di accelerometro e dati GPS è quello di combinarli come accennato in precedenza da altri poster e commenti. L'uso del GPS per correggere periodicamente la misurazione intertiale accumulata dai dati dell'accelerometro funziona molto bene nella pratica. Offre il vantaggio di misurazioni dell'accelerometro più frequenti e l'accuratezza delle misurazioni GPS. Un filtro di Kalman è comunemente usato. Tuttavia, dati i limiti di accuratezza e temporizzazione della piattaforma scelta, un filtro kalman può essere eccessivo e qualcosa di più semplice da implementare ed eseguire dovrebbe funzionare correttamente.

In ogni caso, solo alcune cose a cui pensare.