iPhone 5sの加速度センサで距離の計測はできるか?
前々から興味があったので試してみたのよ。
iPhoneが持ってる加速度センサを使えばモノの長さなんかを測定できるんじゃないの?って。実際そういうアプリがすでに(昔から)リリースされてるんだけど、やっぱりレビューをみてると微妙っぽい。
昨年iPhone 5sが発表された時にM7コプロ積んでどうのこうのと聞いて、もしかして!とか思ったもののそれっきりだったんだけどね。
今回ようやく簡単なテストをやってみたのでまとめておくよ。
(1)物理の復習
加速度を積分したら速度が得られてさらに積分すれば変位がわかる、なんて高校くらいで習うんだっけ?
3-1-1-1 変位と速度と加速度 ■わかりやすい高校物理の部屋■
テキトウにネットを眺めて思い出しといてね。必要なのは加速度と時間。
(2)iPhoneで測定
加速度を測定するにはCoreMotionフレームワークを使うよ。
モーションイベントサンプル3 - CoreMotionを使った各種センサーの利用 | UQ Times 開発の記録
↑ざっくりこんな感じ(誤記があるので注意)。
CMMotionManagerオブジェクトを使って、CMDeviceMotion *motion を取り出すとそこからいろいろデータ取得ができるよね。
ここでは
motion.userAcceleration.y;
を使ってy方向(iPhoneの画面縦方向)だけをみる。

↑これを、、、

↑こう動かす。この時、動き始めはy方向にプラスの加速度が働く。
加速度を取得した時間も motion.timestamp で得ることができる。
とりあえずシンプルにするために、iPhoneは静止状態で開始、iPhone移動後に画面のボタンをタップでグラフ表示するようにしてみたんだわ。
(3)測定結果
定規の長さ35cmを目標に動かしてみたところ、、、

↑34.8cmってすごいじゃない!
横軸はアプリスタート時からの時間、グレーの線は加速度、緑の線は速度。
左右に二本ある青い縦の線が加速度から推測した動き始めと動き終わり(しきい値でえいや、で決めてる)。
動き始めで加速度はプラスに振れて加速、途中でマイナスに振れて減速、停止、というのが見えるね。
なかなかすごい精度じゃないか!って言いたいところだけど、そういう結果を表示しているだけなんだよ。
実はかなりコツが必要で、動かし終わり速度がゼロのはずなのに、大きくプラスだったり、時には大きくマイナスだったりするんだわ(下図のように)。


これだと始点、終点の推測の精度を高めても仕方ないか、ってレベル。

↑特にゆっくり動かすともう停止時のノイズとあまり変わらないのかもう何がなんだかって感じになる。
ゆっくり、と言ってもiPhone使って距離を計測するならたいていの人はこの位の速度じゃね?という程度の速度だよ。
なお、グラフの縦軸は加速度、速度の絶対値の最大値がグラフの端に来るようにしてるので、各グラフで縦軸の最大値は異なるので注意ね。
ともかく実用性からはほど遠いわ、これは。
そもそもiPhoneの持つ加速度センサーはこういう用途にはあってないのかも。userAccelerationは衝撃や振るなどのそこそこ大きい加速度を得るのに適してるのかな。
残念ながらA7/M7のせてるiPhone 5sだともしや、という期待は外れたよ。
ちなみに、、、
iphone - Need to find Distance using Gyro+Accelerometer - Stack Overflow
↑みんな考えてることは同じ。なかなか難しいみたいね。
iPhoneが持ってる加速度センサを使えばモノの長さなんかを測定できるんじゃないの?って。実際そういうアプリがすでに(昔から)リリースされてるんだけど、やっぱりレビューをみてると微妙っぽい。
昨年iPhone 5sが発表された時にM7コプロ積んでどうのこうのと聞いて、もしかして!とか思ったもののそれっきりだったんだけどね。
今回ようやく簡単なテストをやってみたのでまとめておくよ。
(1)物理の復習
加速度を積分したら速度が得られてさらに積分すれば変位がわかる、なんて高校くらいで習うんだっけ?
3-1-1-1 変位と速度と加速度 ■わかりやすい高校物理の部屋■
テキトウにネットを眺めて思い出しといてね。必要なのは加速度と時間。
(2)iPhoneで測定
加速度を測定するにはCoreMotionフレームワークを使うよ。
モーションイベントサンプル3 - CoreMotionを使った各種センサーの利用 | UQ Times 開発の記録
↑ざっくりこんな感じ(誤記があるので注意)。
CMMotionManagerオブジェクトを使って、CMDeviceMotion *motion を取り出すとそこからいろいろデータ取得ができるよね。
ここでは
motion.userAcceleration.y;
を使ってy方向(iPhoneの画面縦方向)だけをみる。

↑これを、、、

↑こう動かす。この時、動き始めはy方向にプラスの加速度が働く。
加速度を取得した時間も motion.timestamp で得ることができる。
とりあえずシンプルにするために、iPhoneは静止状態で開始、iPhone移動後に画面のボタンをタップでグラフ表示するようにしてみたんだわ。
(3)測定結果
定規の長さ35cmを目標に動かしてみたところ、、、

↑34.8cmってすごいじゃない!
横軸はアプリスタート時からの時間、グレーの線は加速度、緑の線は速度。
左右に二本ある青い縦の線が加速度から推測した動き始めと動き終わり(しきい値でえいや、で決めてる)。
動き始めで加速度はプラスに振れて加速、途中でマイナスに振れて減速、停止、というのが見えるね。
なかなかすごい精度じゃないか!って言いたいところだけど、そういう結果を表示しているだけなんだよ。
実はかなりコツが必要で、動かし終わり速度がゼロのはずなのに、大きくプラスだったり、時には大きくマイナスだったりするんだわ(下図のように)。


これだと始点、終点の推測の精度を高めても仕方ないか、ってレベル。

↑特にゆっくり動かすともう停止時のノイズとあまり変わらないのかもう何がなんだかって感じになる。
ゆっくり、と言ってもiPhone使って距離を計測するならたいていの人はこの位の速度じゃね?という程度の速度だよ。
なお、グラフの縦軸は加速度、速度の絶対値の最大値がグラフの端に来るようにしてるので、各グラフで縦軸の最大値は異なるので注意ね。
ともかく実用性からはほど遠いわ、これは。
そもそもiPhoneの持つ加速度センサーはこういう用途にはあってないのかも。userAccelerationは衝撃や振るなどのそこそこ大きい加速度を得るのに適してるのかな。
残念ながらA7/M7のせてるiPhone 5sだともしや、という期待は外れたよ。
ちなみに、、、
iphone - Need to find Distance using Gyro+Accelerometer - Stack Overflow
↑みんな考えてることは同じ。なかなか難しいみたいね。
スポンサーサイト
<< iPhoneで効果音を自分で録音してみた TopPage OpenGLでカメラっぽいことを考えた >>
コメント
コードが欲しいとのコメントをいただきましたが、古くて行方不明です。ごめんなさい。精度的に使い物になりませんし。
スマホの自己位置推定のためならARKitの方が精度が良い気がします。
2017.07.19 たつや 編集
トラックバック
トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/901-9964ebfc
https://ringsbell.blog.fc2.com/tb.php/901-9964ebfc