慣性室內導航入門到精通(4)-方向獲取
阿新 • • 發佈:2018-12-15
前言
方向的獲得通過加速度感測器和磁力計共同完成。獲得方向和步數後,就可以初步得到慣性導航座標,再根據之前獲得的指紋法座標,兩者進行卡爾曼演算法,即可獲得較精確的座標。
方向獲取
由於博主最近比較忙,就不詳細介紹了。直接放個程式碼。
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("西北"); }
}
}