惯性室内导航入门到精通(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("西北");        }
           }






}

猜你喜欢

转载自blog.csdn.net/qq_35651984/article/details/83047217