前言
方向的获得通过加速度传感器和磁力计共同完成。获得方向和步数后,就可以初步得到惯性导航坐标,再根据之前获得的指纹法坐标,两者进行卡尔曼算法,即可获得较精确的坐标。
方向获取
由于博主最近比较忙,就不详细介绍了。直接放个代码。
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("西北"); }
}
}