12

電話の速度を測定するためにネイティブのiPhoneアプリ(基本的にはスピードメーター)を実装する必要があります。CoreLocation APIを介してこれを行うのはかなり簡単ですが、これは一度に最大2時間使用できるリアルタイムの測定であるため、バッテリーの消費量が心配です。私の理解では、LocationManagerからのイベントを積極的に監視している間(実際にはGPSの位置は気にしませんが)、バッテリーを大量に消費します。

探索する他の明白なオプションは、加速度計を使用して速度を計算することですが、APIにはそれを支援するものは何もありません。私の調査によると、これは可能であるはずですが、非常に複雑でエラーが発生しやすいようです。加速度から速度への変換は、最初は難しい場合があります。さらに、iPhoneの加速度計データは「ノイズが多い」場合があります。ローパス/ハイパスフィルタリングなどの使用を示すSDKの例はよく知っていますが、速度の計算を示す良い例はどこにも見当たりません。

誰かがこれを共有できる実際の経験を持っていますか?コードは素晴らしいでしょうが、本当に私は誰かがこれを(長寿命のアプリのために)うまくやったかどうか、そして彼らがどのようなアプローチをとったかを知りたいだけです。

編集:LocationManagerAPIを使用する実用的なプロトタイプがあります。正常に動作しますが、更新サイクルは速度のリアルタイム測定には理想的とは言えません。状況によっては、更新に最大4〜5秒かかる場合があります。特定の速度でのクルージングは​​問題なく機能する傾向がありますが、ユーザーの操作の観点からは、加速/減速は非常に遅れる傾向があります。また、私が行っている他のいくつかの計算に速度を供給する必要があり、精度は実際には必要なものではありません。

私が見た他の(ごく少数の)アプリ、特にGPSを使用しないと主張しているが速度を正確に計算するgMeterに基づいて可能であるように思われます。私が見つけることができるどこにもこれを示す参照やサンプルコードがないことに本当に驚いています。複雑だとは思いますが、確かに何かがあります。

4

5 に答える 5

10

実用的な観点からは、加速度計に作用する力から正確な速度を取得することはできません。

1分間隔で測定値を取得してGPSを使用し、その間にGPSをスリープ状態にします。

次に例を示します。

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];
}
于 2010-01-03T05:11:29.570 に答える
10

GPSと加速度計には異なる弱点があるため、おそらく最善の選択肢は組み合わせたアプローチです。1分ごとにGPSから測定値を取得し、加速度計からリアルタイムの変更を追加します。

于 2010-01-13T03:04:09.727 に答える
4

加速度の誤差は時間の経過とともに蓄積されます。あなたの最善の策は、GPSから正確な速度を取得することです。おそらく1分に1回以下です。

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

(ここで、は二乗^2を意味します)

次に、加速度計を頻繁に測定します。

newVelocity = oldVelocity + accelerometer*timeBetweenAccelerometerReadings
于 2010-01-13T21:31:09.130 に答える
3

加速度計を使用して速度を追跡しようとすると、かなり遠くまで到達できるかどうかはわかりません。これを行うには、すべての加速度をキャプチャしたことを確認する必要があります。これは、欠落したデータポイントが間違った速度を示しているためです(これは、もちろん、報告された加速度計の値を標準単位に変換できることを前提としています)。したがって、加速度計を常に実行する必要があります。これは、それ自体でかなりの量のジュースを吸います(また、すべての加速度が保証されるわけではありません)。CoreLocationの使用をお勧めします。

于 2010-01-03T05:10:35.890 に答える
2

私はiPhoneAPIを知りませんが、GPSと慣性航法については知っています。役に立つかもしれません。

私が使用したGPS受信機はすべて、受信したGPS信号から速度を直接測定できます。これらの測定値は、位置データよりも正確です。Apple APIがアクセスを提供するかどうか、またはAppleがこのデータを提供するようにレシーバーを構成したかどうかはわかりません。これは、速度測定値を取得するためのより効率的なルートになります。

次のパスは、加速度計データとGPSデータがある場合、他のポスターやコメントで前述したように、それらを組み合わせることです。GPSを使用して、加速度計データから累積された内部測定値を定期的に修正することは、実際には非常にうまく機能します。これは、より頻繁な加速度計測定の利点と、GPS測定の精度を提供します。カルマンフィルターが一般的に使用されます。ただし、選択したプラットフォームの精度とタイミングの制限を考えると、カルマンフィルターはやり過ぎであり、実装と実行が簡単なもので問題なく機能するはずです。

とにかく、考えるべきことがいくつかあります。

于 2010-01-19T17:29:39.857 に答える