« Google Chrome | メイン | 日本Androidの会 »

加速度計 - Android

2009.02.14 追記:この記事の内容は若干古くなっています。こちらの投稿も併せてご覧下さい。


先日ポストした、Android関連プロジェクトのOpenIntentsのSensorSimulatorを使って遊ぶ目的で簡単なサンプルを作ってみました。

加速度センサーを使っています。上下左右(端末の側面方向)にある程度以上強く動かすと、動かした速度に応じてその方向へ地図が移動します(一応orientation sensorも見て端末の傾きを考慮していますので、どのような持ち方をしていても大丈夫な、、、はずです)。また、正面方向に動かすと、ズームイン、正面と反対(背中)方向に動かすとズームアウトします。

加速度を知るには、android.hardware.SensorListenerインタフェースのメソッド

void onSensorChanged(int sensor, float[] values)


の第1パラメータ(int sensor)が、SensorManager.SENSOR_ACCELEROMETERであるときの、第2パラメータの値(float[] values)を拾う必要があります。この値は要素数3(公式ドキュメントでは、それぞれX, Y, Zと呼んでいます)のfloatの配列(float[] values)です。各要素の値の意味ですが、加速度センサーの場合は

  • X(1つ目の要素)は、端末の右面からの加速度合(右面と垂直な方向のベクトル)

  • Y(2つ目の要素)は、上部からの加速度合

  • Z(3つ目の要素)は、前面(正面)からの加速度合


となります。(下図な感じの雰囲気。)

accerelometer1

ベクトルの度合は、重力加速度(9.82m/s^2)を基準とするようです。加速度計は重力の影響を受けます。地球ならその面を真下に向けると1、真上に向けると-1を示します。例えば、端末の正面が上に来るように地面に置いた状態では、XとYは約0、Zは約-1となります。(下図な感じの雰囲気。)

accerelometer2

加速度計が受ける重力の影響は、端末の傾き(端末をどう持っているか)によって逐次変化しますので、端末の傾きによって挙動に差が出ないアプリを作ろうとした場合は、傾きを考慮した調整が必要です。

 次に、端末と向かい合っている状態(X:0, Y:-1, Z:0)で、端末を左右に動かした場合を考えます。端末を右へ移動させるとXは増え、左に移動させた場合はXは減ります。ただし、これは非常にゆっくり移動させた場合の話で、ある程度以上の勢いをつけた(振るなど)場合は、慣性力の影響で、一旦逆向きの力が働くことに注意する必要があります。(勢いよく車を加速させて発進すると、後ろに引っ張られるのと同じです。)

サンプルのソースは「ここ」に置いています。eclipseプロジェクトを固めたものです。OpenIntentsに依存しているので、動かすためにはOpenIntentsとSimulatorの設定が必要です。詳しくは先日のエントリ(こちら)を参照して下さい。

ご覧になった方、もしバグッてたら、教えて頂けると嬉しいです。

トラックバック

このエントリーのトラックバックURL:
http://www.grandnature.net/bin/mt-tb.cgi/84

コメントを投稿

About

2008年09月05日 23:07に投稿されたエントリーのページです。

ひとつ前の投稿は「Google Chrome」です。

次の投稿は「日本Androidの会」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。