1. 程式人生 > >慣性室內導航入門到精通(4)-方向獲取

慣性室內導航入門到精通(4)-方向獲取

前言

方向的獲得通過加速度感測器和磁力計共同完成。獲得方向和步數後,就可以初步得到慣性導航座標,再根據之前獲得的指紋法座標,兩者進行卡爾曼演算法,即可獲得較精確的座標。

方向獲取

由於博主最近比較忙,就不詳細介紹了。直接放個程式碼。

public class MainActivity extends AppCompatActivity implements SensorEventListener {

    private SensorManager sensorManager;
    private Sensor sensor_jia;
    private Sensor sensor_di;
private TextView textView; private float[] jia_Values = new float[3]; private float[] di_Values = new float[3]; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView=
findViewById(R.id.textview1); getSensorManager(); } @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { jia_Values = event.values; } if (event.sensor.getType() ==
Sensor.TYPE_MAGNETIC_FIELD) { di_Values = event.values; } calculateOrientation(); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } public void getSensorManager() { sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor_jia = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); sensor_di=sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); } @Override protected void onResume() { super.onResume(); if(sensorManager != null){ sensorManager.registerListener(this,sensor_jia,SensorManager.SENSOR_DELAY_GAME);//延遲兩十毫秒 sensorManager.registerListener(this,sensor_di,SensorManager.SENSOR_DELAY_GAME); } } @Override protected void onPause() { super.onPause(); if(sensorManager != null){ //解除註冊 sensorManager.unregisterListener(this,sensor_jia); } } private void calculateOrientation() { float[] values = new float[3]; float[] R = new float[9]; SensorManager.getRotationMatrix(R, null, jia_Values, di_Values); SensorManager.getOrientation(R, values); values[0] = (float) Math.toDegrees(values[0]);//轉換為角度 if (values[0] >= -5 && values[0] < 5) { textView.setText("正北"); } else if (values[0] >= 5 && values[0] < 85) { textView.setText("東北"); } else if (values[0] >= 85 && values[0] <= 95) { textView.setText("正東"); } else if (values[0] >= 95 && values[0] < 175) { textView.setText("東南"); } else if ((values[0] >= 175 && values[0] <= 180) || (values[0]) >= -180 && values[0] < -175) { textView.setText("正南"); } else if (values[0] >= -175 && values[0] < -95) { textView.setText("西南"); } else if (values[0] >= -95 && values[0] < -85) { textView.setText("正西"); } else if (values[0] >= -85 && values[0] < -5) { textView.setText("西北"); } } }