2010-01-03 6 views
12

Ich muss eine native iPhone-App implementieren, um die Geschwindigkeit des Telefons (im Grunde ein Tachometer) zu messen. Ich weiß, dass Sie dies relativ einfach über die CoreLocation-API tun können, aber ich bin besorgt über den Batterieverbrauch, da dies eine Echtzeitmessung sein soll, die bis zu ein paar Stunden gleichzeitig genutzt werden kann. Mein Verständnis ist, dass, während Sie aktiv auf Ereignisse vom LocationManager überwachen (obwohl ich nicht wirklich über GPS-Standort interessiere) es Batterie intensiv ist. Die andere offensichtliche Option zu erkunden wäre die Verwendung der Beschleunigungsmesser zu versuchen, Geschwindigkeit zu berechnen, aber es gibt nichts in der API, um Ihnen dabei zu helfen. Nach meinen Recherchen sollte das möglich sein, scheint aber extrem kompliziert und fehleranfällig zu sein. Übersetzen von Beschleunigung zu Geschwindigkeit kann schwierig sein, zu beginnen, und die iPhone Beschleunigungsmesser Daten können "laut" sein. Ich kenne das SDK-Beispiel, das die Verwendung von Tief-/Hochpassfiltern usw. demonstriert - aber ich habe nirgendwo ein gutes Beispiel gesehen, das die Berechnungsgeschwindigkeit anzeigt.Messung der Geschwindigkeit über iPhone SDK

Hat jemand irgendwelche reale Erfahrung mit diesem können sie teilen? Code wäre fantastisch, aber ich möchte nur wissen, ob jemand das erfolgreich gemacht hat (für eine langlebige App) und welchen Ansatz sie gewählt haben.

BEARBEITEN: Ich habe einen funktionierenden Prototyp, der die LocationManager API verwendet. Es funktioniert in Ordnung, aber der Aktualisierungszyklus ist bei weitem nicht ideal für eine Echtzeitmessung der Geschwindigkeit. Je nach den Umständen kann es manchmal bis zu 4-5 Sekunden dauern, bis die Aktualisierung abgeschlossen ist. Cruisen bei einer gegebenen Geschwindigkeit tendiert dazu, in Ordnung zu arbeiten, aber accel/decel tendiert dazu, vom Standpunkt der Benutzerinteraktion sehr schlecht nachzueilen. Außerdem muss ich Geschwindigkeit in andere Berechnungen einbringen, die ich mache, und die Präzision ist nicht wirklich, was ich brauche.

Es scheint möglich basierend auf (sehr wenige) andere Anwendungen, die ich gesehen habe, vor allem , die behauptet, keine GPS zu verwenden, sondern berechnet die Geschwindigkeit genau. Ich bin wirklich überrascht, dass es keine Referenzen oder irgendeinen Beispielcode gibt, der das irgendwo zeigt, das ich finden kann. Mir ist klar, dass es komplex ist, aber da ist bestimmt etwas.

+0

Hey, ich würde mich für Ihren Erfolg in diesem Bereich interessieren. Ich untersuche gerade die Accelerometer-/Gryo-Daten von einem iPhone 4 zusammen mit GPS-Daten, um eine Inertial-Navigationsroute zwischen GPS-Aktualisierungen zu zeichnen. – Jerceratops

Antwort

10

Da das GPS und Beschleunigungsmesser unterschiedliche Schwächen haben, die beste Wahl ist wahrscheinlich ein kombinierter Ansatz - Holen Sie sich eine Messung vom GPS überhaupt Eine Minute oder so, dann fügen Sie Echtzeitänderungen vom Beschleunigungsmesser hinzu.

+0

Ja, das ist der Ansatz, den ich in Betracht gezogen habe, basierend auf dem, was ich über die Fehlerakkumulation mit Beschleunigung nur über große Entfernungen gelesen habe. Ich habe immer noch Probleme damit, die Beschleunigung richtig auf die Geschwindigkeit umzustellen. –

3

Ich bin mir nicht sicher, ob Sie mit dem Beschleunigungsmesser versuchen werden, die Geschwindigkeit zu verfolgen. Um dies zu tun, müssen Sie sicherstellen, dass Sie JEDE Beschleunigung erfasst haben, da alle fehlenden Datenpunkte die falsche Geschwindigkeit anzeigen würden (vorausgesetzt, Sie können die gemeldeten Beschleunigungsmesserwerte in Standardeinheiten umwandeln). Sie müssten also ständig den Beschleunigungsmesser laufen lassen, der ziemlich viel Saft in sich hineinsaugt (und auch hier werden Ihnen nicht alle Beschleunigungen garantiert). Ich würde empfehlen, CoreLocation zu verwenden.

+0

Klingt nach dem, was ich gelesen habe, Beschleunigung -> Geschwindigkeit, obwohl mein Eindruck ist, dass die interne Antenne, die das iPhone verwendet, um Satellitensignale zu verarbeiten viel mehr Energie verbraucht als die Beschleunigungsmesser (sind sie nicht immer so weit?) –

10

Vom praktischen Standpunkt aus erhalten Sie keine genaue Geschwindigkeit von Kräften, die auf den Beschleunigungsmesser einwirken.

Verwenden Sie das GPS mit Messungen in Abständen von 1 Minute und setzen Sie das GPS dazwischen. Hier

ein Beispiel:

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

Danke für das Beispiel. Realistisch müsste das für mich eine Echtzeitmessung sein. Ich bin immer noch besorgt über den Stromverbrauch, wenn dies mehr auf einem zweiten oder zwei Update-Intervall getan wurde. Hast du das in einer echten App gemacht? –

+0

Ich habe keinen realen Beweis dafür, dass dies tatsächlich Strom sparen wird. Theoretisch sollte das Abschalten des GPS für einige Sekunden nach jedem Lesevorgang deutlich weniger Strom verbrauchen. – bentford

+0

Es gibt ein "{" fehlt in - (void) locationManager –

4

Der Fehler in der Beschleunigung wird sich im Laufe der Zeit ansammeln. Ihre beste Wette ist eine genaue Geschwindigkeit vom GPS zu bekommen, vielleicht einmal eine Minute oder weniger:

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

(wo ^2 bedeutet squared)

Dann häufige Messungen des Beschleunigungsmessers nehmen:

newVelocity = oldVelocity + accelerometer*timeBetweenAccelerometerReadings 
2

Während ich die iPhone API nicht kenne, weiß ich etwas über GPS und Trägheitsnavigation. Es könnte nützlich sein.

Die GPS-Empfänger, mit denen ich gearbeitet habe, können alle eine direkte Messung der Geschwindigkeit der empfangenen GPS-Signale liefern. Diese Messungen sind genauer als Positionsdaten gerade. Ich weiß nicht, ob die Apple API Zugriff gewährt oder ob Apple ihren Empfänger für die Bereitstellung dieser Daten konfiguriert hat. Dies wäre der effizientere Weg, um eine Geschwindigkeitsmessung zu erhalten.

Der nächste Pfad, vorausgesetzt, dass Sie Beschleunigungsmesserdaten und GPS-Daten haben, ist es, sie wie bereits erwähnt von anderen Plakaten und Kommentaren zu kombinieren. Die Verwendung des GPS zur periodischen Korrektur der akkumulierten Intertialmessung aus den Beschleunigungsmesserdaten funktioniert in der Praxis sehr gut. Es bietet den Vorteil häufigerer Beschleunigungsmessermessungen und die Genauigkeit der GPS-Messungen. Ein Kalman-Filter wird üblicherweise verwendet. Aber angesichts der Genauigkeits- und Timing-Limits der von Ihnen gewählten Plattform ist ein Kalman-Filter möglicherweise übertrieben und etwas einfacher zu implementieren und zu laufen sollte gut funktionieren.

Wie auch immer, nur ein paar Dinge zum Nachdenken.