Androidデバイスの方位を調べる

Androidデバイスの方位を調べる

デバイスの方位を調べるには
加速度センサー、磁気センサーを使い
包囲角度を計算する

そして、東西南北どの方位に該当するかを計算し、方位を求めることになる

まず、SensorManagerのインスタンス取得

1
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);

次に、センサーの登録
これは、
SensorManagerクラスの
registerListener()を使い加速度センサー、および磁気センサーを登録する

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Override
protected void onResume(){
 
super.onResume();
 
mSensorManager.registerListener(
this,
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI);
 
mSensorManager.registerListener(
this,
SensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
SensorManager.SENSOR_DELAY_UI);
 
}

次に、センサーの解除について

これは、SensorManagerの
unregisterListener()で
加速度センサー、および磁気センサーを解除する

1
2
3
4
5
6
7
@Override
public void onPause(){
 
//センサー解除
mSensorManager.unregisterListener(this);
super.onPause();
}

次に、方位角度を求める

これは、センサーで取得した値から方位角度を計算することで求められる

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
@Override
public void onSensorChanged(SensorEvent event){
 
switch(event.sensor.getType()){
 
//加速度センサーの値取得
case Sensor.TYPE_ACCELEROMETER:
mAcMatrix = event.values.clone();
break;
 
//磁気センサーの値取得
case Sensor.TYPE_MAGNETIC_FIELD:
mMgMatrix = event.values.clone();
break;
}
 
if(mMgMatrix !=null && mAcMatrix !=null){
 
float[] orientation = new float[3];
float R[] = new float[16];
float I[] = new float[16];
 
//加速度センサー、磁気センサーの値を元に、回転行列を計算する
SensorManager.getRotationMatrix(R, I, mAcMatrix, mMgMatrix);
 
//デバイスの向きに応じて回転行列を計算する
SensorManager.getOrientation(R, orientation);
 
//ラジアンから角度へ変換
float angle = (float)Math.floor(Math.toDegrees(orientation[0]));
 
//角度の範囲を0~360度へ調整
if(angle >=0){
 
orientation[0]=angle;
}else if(angle < 0){
orientation[0]= 360 + angle;
}
 
//得られた角度を画面へ表示
mTVAzimuth.setText(String.valueOf(orientation[0]));
}

このように、Androidでは
方位角を求めるには、
加速度センサーと磁気センサーを併用し
加速度の値
磁気センサーの値
デバイスの向きを元に回転行列を作成する

その後で、該当するラジアン値を角度へ変換することで
方位角を求めることができる

注意点として、センサーは一度登録すると解除するまで作動するため
バッテリー消費が激しくなる

このため、登録にはonPause()
解除には onResume()で行うようにする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です