Android初心者です。皆様の知恵をお貸しください。
現在、加速度センサーと地磁気センサーと使って方位、傾斜、回転角を取得しようと考えています。しかし、
new float[3]
new float[MATRIX_SIZE]
float[] orValues = new float[3];
SensorManager.getOrientation(outR, orValues);
の意味がいまいちわかりません。どのようなことをしているのでしょうか?
回答よろしくお願いします。
public class PianoActivity extends Activity implements SensorEventListener {
private SensorManager mSensorManager; private Sensor mAcclerometer; private Sensor mMagField;
private static final int MATRIX_SIZE = 16;--- //センサーの値 private float[] mgValues = new float[3]; private float[] acValues = new float[3]; **この部分**
String crlf = System.getProperty("line.separator"); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_piano); Intent intent = getIntent(); //センサーマネージャ取得 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); //加速度センサー取得 mAcclerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); //地磁気センサーを取得 mMagField = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); } //センサーからの更新情報を受け取ります @Override public void onResume() { super.onResume(); mSensorManager.registerListener(this, mAcclerometer, SensorManager.SENSOR_DELAY_NORMAL); mSensorManager.registerListener(this, mMagField, SensorManager.SENSOR_DELAY_NORMAL); } //センサーイベントの解除 @Override public void onPause() { super.onPause(); mSensorManager.unregisterListener(this, mAcclerometer); mSensorManager.unregisterListener(this, mMagField); } //センサーの精度が変更されるたびに呼び出されます int accuracyが精度 @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } //センサーの値が変更されるたびに呼び出されます @Override public void onSensorChanged(SensorEvent event) {
//回転行列 float[] inR = new float[MATRIX_SIZE]; float[] outR = new float[MATRIX_SIZE]; float[] I = new float[MATRIX_SIZE]; float[] orValues = new float[3]; **この部分**
switch (event.sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: acValues = event.values.clone(); break; case Sensor.TYPE_MAGNETIC_FIELD: mgValues = event.values.clone(); break; } if (mgValues != null && acValues != null) { SensorManager.getRotationMatrix(inR, I, acValues, mgValues); SensorManager.remapCoordinateSystem(inR, SensorManager.AXIS_X, SensorManager.AXIS_Y, outR); **SensorManager.getOrientation(outR, orValues);** StringBuilder strBuild = new StringBuilder(); strBuild.append("方位角(アジマス);"); strBuild.append(rad2Deg(orValues[0])); strBuild.append(crlf); strBuild.append("傾斜角(ビッチ);"); strBuild.append(rad2Deg(orValues[1])); strBuild.append(crlf); strBuild.append("回転角(ロール);"); strBuild.append(rad2Deg(orValues[2])); strBuild.append(crlf); TextView tv = (TextView)findViewById(R.id.textview); tv.setText(strBuild.toString()); } } //onValues配列に求められる値はラジアンで計測した角度なので、角度に変換 int rad2Deg(float rad) { return (int) Math.floor(Math.toDegrees(rad)); }
}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/07/11 08:45