web-dev-qa-db-ja.com

ユーザーが車の中で動いているかどうかを検出する

[〜#〜] notice [〜#〜]:この質問はもともとAppleモーション検出を導入iOS SDKのハードウェアと関連API。ただし、この質問への回答は引き続き重要です。


ユーザーのランニングやウォーキングを追跡するiPhone iOSアプリを作成しています。ユーザーの記録された結果が実行され、歩くことが正直であることは非常に重要です。車を使用しているときに、不正行為をしている(または誤ってトラッカーをオンにした)ユーザーをキャッチする方法が必要です。

ユーザーが車を運転しているか、車に乗っているかを確認するために、最初にこれらの2つのチェックを考えましたが、ユーザーが車に乗っているかどうかを本当に判断できません)。

  1. 次の方法でユーザーの現在の速度を確認します。ユーザーが20-ish MPHよりも速く移動している場合、ユーザーは車に乗っていると想定できます。

    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
          CLLocation *recentLocation = [locations lastObject];
          recentLocation.speed; //If speed is over 20 MPH, assume the user is not on their feet.
    

    しかし、人々が行くように記録されているので、これが本当に良いチェックであるかどうかはわかりません 以前よりも速い 。これは良いチェックですか、それとも他のものを使うべきですか?

  2. Core Motion Framework で提供される加速度計とモーションAPIを使用して、ユーザーの加速速度を決定します。ユーザーが特定の速度で加速する場合、ユーザーが車で移動していると想定できます。

これらの仮定は正しいですか?私の本当の質問はこれだと思います:ユーザーが車両で動いているかどうかを検出するより良い方法はありますか?もしそうならどうですか?そして、そうでない場合、これらのチェックはこの場合に適していますか、これは実際にthat高速である一部のユーザーに迷惑ですか? CoreMotionはこれを行うための適切なAPIですか?


編集:新しいiPhone 5S M7コプロセッサーは、より正確な動き検出を提供します。誰でも新しいM7 APIの使用方法を説明できますか?

32
Samuel Spencer

位置データから運動状態を推測する際の知恵(またはその欠如)に関するすべてのアドバイスが引き続き適用されます。しかし、Core MotionとM7に関するあなたのアップデートに関して...

はい。M7、M8、M9などのモーションコプロセッサー(*)を搭載したデバイスでCore Motionを使用して、ユーザーが運転しているかどうかを示すことができます。

  1. CMMotionActivityManager オブジェクトを作成し(クラスメソッドisActivityAvailableを使用してM7(+)機能があるかどうかを判断した後)、アクティビティの更新を開始するか、クエリを実行します最近の活動。
  2. 返された CMMotionActivity オブジェクトのautomotiveプロパティをチェックして、iOSがユーザーが車に乗っている/乗っていると考えているかどうかを確認します。
  3. ステップ3はありません。

ただし、GPSの推論と同様に、この情報を一粒一粒で取得する必要があります。 CoreMotion APIを使用すると、ユーザーのアクティビティに関するiOSの最良の推測が得られますが、100%正確であるという保証はありません。 (たとえば、電車に乗るとautomotiveとしてカウントされるかどうかはわかりません。また、さまざまなアクティビティタイプは相互に排他的ではないことに注意してください。)アプリがアクティビティタイプをチェックすることをお勧めします不要なものを除外しようとするよりも興味があります。


(*)M7デバイスはA7 SoCを搭載したデバイスです。iPhone5s、iPad Air、iPad mini2。M8はA8、M9はA9などです。要するに、iPhone 5cを除く2013年秋以降に導入されたすべてのiOSデバイス。

30
rickster

この単純なライブラリを使用して、ユーザーが歩いているか、走っているか、車に乗っているか、動いていないかを検出できます。

すべてのiOSデバイスで動作し、M7チップは不要です。

https://github.com/SocialObjects-Software/SOMotionDetector

レポでは、デモプロジェクトを見つけることができます

14
arturdev

CLLocationベースのチェックは、取得できる唯一の信頼できる情報です。 でALiによって指定されているように、ジャイロ+加速度計を使用して距離を検索する必要があります 、より長い期間にわたって速度と位置を検索することは役に立ちません。統合された加速度値は、0.5〜2秒後にドリフトを開始し、再度較正する機会はありません。

ユースケースによっては、Usain Boltの44.72 km/h(27.79 mph)よりも多くの問題が見られます。

  1. トンネル、地下駐車場など、GPS信号のない地域...
  2. GPSのエラー。ドイツアルプスでの6時間の追跡ツアーを思い出します。これはアプリがそれについて考えたことです:-)
    Walking on water with 920 km/h
  3. 既に述べたように、ユーザーが車、電車、地下鉄、バスなどに乗っているかどうかはわかりません。
3
Kay

Xcode 7.3、iOS 9.3

すべての元の貢献者に感謝します。

このかなり単純なクラスが私にとってうまくいかなかった理由を理解しようとして数時間を費やしただけです。上記および他の投稿からのすべての提案を使用して、iOSがCore MotionフレームワークとCMMotionActivityManagerクラスを使用して実行しているとiOSが考えたアクティビティを確認しました。

なんらかの理由で、「設定」->「プライバシー」->「モーションとフィットネス」で「フィットネストラッキング」をオフにしました。そして、フレームワークを追加し、CMクラス、アプリを呼び出した後、何らかの理由で。これを有効にするよう要求しませんでした。手動でこれをオフにしておく必要があります。

最終的に私はこの投稿につまずいた...

iOS-[設定]> [プライバシー]> [モーションアクティビティ]でモーションアクティビティを有効にする

設定を確認して問題を解決することになりました。 「フィットネストラッキング」をオンにしてアプリを実行した後。繰り返しますが、すべてが魅力のように機能しました。

これが誰かの時間を節約することを願っています!乾杯。

1
serge-k