Использование RotationVector для расчета азимута и высоты - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь разработать приложение, которое может отслеживать звезды. Для этого мне нужно знать азимут и высоту звезды, на которую указывает пользователь телефона. После некоторого исследования я думаю, что используя векторы положения, чтобы получить такую ​​информацию. Я думаю, что я понял, как получить азимут, используя вектор вращения, но я запутался в том, как получить высоту. Мне удалось найти ответ на этот вопрос:

Должен ли я использовать акселерометр или гироскоп для измерения угла по оси z

Это относится к использованию точечного произведения, которое я немного понимаю, но я не уверен, как это сделать, используя векторы вращения. Таким образом, мой вопрос заключается в том, правильно ли я получаю азимут с этим текущим кодом, и является ли правильный ответ в ссылке на стековый поток правильным способом получения повышения с использованием вектора поворота? Это только для акселерометра.

 @Override
public void onSensorChanged(SensorEvent sensorEvent) {


    Log.d(TAG, "onSensorChagnged X" + sensorEvent.values[0]);
    Log.d(TAG, "onSensorChagnged Y" + sensorEvent.values[1]);
    Log.d(TAG, "onSensorChagnged Z" + sensorEvent.values[2]);
    if(sensorEvent.sensor.getType()== Sensor.TYPE_ROTATION_VECTOR) {
        float [] orientation = new float[3];
        float [] rMat = new float[9];
        sensorManager.getRotationMatrixFromVector(rMat, sensorEvent.values);
        mAzimuth = (int) (Math.toDegrees(SensorManager.getOrientation(rMat, orientation)[0]) + 360) % 360;

        Log.d(TAG, "Azimuth Rotation" + mAzimuth);
    } else if (sensorEvent.sensor.getType()==Sensor.TYPE_ACCELEROMETER && sensorEvent.sensor.getType()== Sensor.TYPE_MAGNETIC_FIELD &&
            sensorEvent.sensor.getType() == Sensor.TYPE_GRAVITY){
        float [] gData = new float[3];
        float [] mData = new float[3];
        float [] rMat = new float[9];
        float [] iMat = new float[9];
        float [] orientation = new float[3];
        switch (sensorEvent.sensor.getType()){
            case Sensor.TYPE_ACCELEROMETER:
                gData = sensorEvent.values.clone();
                break;
            case Sensor.TYPE_GRAVITY:
                gData = sensorEvent.values.clone();
                break;
            case Sensor.TYPE_MAGNETIC_FIELD:
                mData = sensorEvent.values.clone();
                break;
            default: return;
        }
        if (SensorManager.getRotationMatrix(rMat,iMat,gData,mData)){
            mAzimuth = (int) (Math.toDegrees(SensorManager.getOrientation(rMat, orientation)[0]) + 360) % 360;
            Log.d(TAG, "Azimuth Tri" + mAzimuth);
        }
    }
}
...