2011年1月13日木曜日

傾きセンサの方位,ピッチ,ロールを計測する - Measurement of orientation, pitch and roll in inclination sensor -

このエントリーをはてなブックマークに追加
Android SDKは,加速度や磁力といった様々なセンサをサポートしています.今回はデバイスの方位,ピッチ,ロールといった傾きの計測を実現するプログラムについて記述しました.

Android SDK supports various sensors like acceleration and magnetism. In this time, we described the program that measures the inclination like orientation, pitch and roll in device.


センサの計測手順
センサ計測は大きく次の3つの手順を踏みます.

1.SensorManagerインスタンスの取得
SensorManagerはデバイスのセンサにアクセスするためのクラスです.引数にSENSOR_SERVICEを指定したgetSystemServiceメソッドを呼び出すことでSensorManagerインスタンスが得られます.

2.リスナの登録
SensorManagerのregisterListenerメソッドを呼び出すことで,センサに対応したリスナを登録することができます.引数にSensorEventListener,Sensor,センサの受信頻度を指定します.

3.リスナの応答処理記述
SensorEventListenerにはonAccuracyChanged,onSensorChangedメソッドが定義されているので,これらを実装します.onAccuracyChangedはセンサの精度が変更される際に,onSensorChangedはセンサの値が変更される際に呼び出されるメソッドです.


傾きを計測するプログラム
プログラムではonResumeとonPauseでリスナの登録削除を行っています.onResume,onPauseはそれぞれ実行中,一時停止になるタイミングで呼び出されるメソッドです.

傾きを計測するには,Sensorインスタンスの取得のために定数Sensor.SENSOR_ORIENTATIONをsensorを指定します.このとき,onSensorChangedの引数SensorEventのインスタンスであるeventには次のような計測値が入ります.

event.values[0]:方位
event.values[1]:ピッチ
event.values[2]:ロール

これらの値をLogCatに表示するように書きだしています.

/LayoutTest/src/org/example/layout/Alfa.java
package org.example.layout;

import java.util.List;

import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;

public class Alfa extends Activity implements SensorEventListener{
     private boolean registeredSensor = false;
     private SensorManager sensorManager;

     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.alfa);

          sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
     }

     @Override
     protected void onResume() {
          super.onResume();
          List sensors = sensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
          if (sensors.size() > 0) {
               Sensor sensor = sensors.get(0);
               registeredSensor = sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_FASTEST);
          }

     }

     @Override
     protected void onPause() {
          if (registeredSensor) {
               sensorManager.unregisterListener(this);
               registeredSensor = false;
          }

          super.onPause();
     }

     public void onAccuracyChanged(Sensor arg0, int arg1) {
     }

     public void onSensorChanged(SensorEvent event) {
          if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
               Log.v("ORIENTATION", String.valueOf(event.values[0]) + ", " +
                         String.valueOf(event.values[1]) + ", " +
                         String.valueOf(event.values[2]));
          }

     }
}

実行は実機がないので確認できていませんが,どうやらSensorSimulatorというシミュレータを使えば,エミュレータ上でも確認ができるようです.


参考URL
センサー(Sensor)を使用するには

0 件のコメント:

コメントを投稿