С помощью этого кода вы получаете точную ориентацию с помощью акселерометра и датчика магнитного поля. (What is the alternative to android orientation sensor?)
public class OrientationTestActivity extends Activity implements SensorEventListener
{
private SensorManager mSensorManager;
private Sensor mAccelerometer;
private Sensor mMagnetometer;
private float[] mLastAccelerometer = new float[3];
private float[] mLastMagnetometer = new float[3];
private boolean mLastAccelerometerSet = false;
private boolean mLastMagnetometerSet = false;
private float[] mR = new float[9];
private float[] mOrientation = new float[3];
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
}
protected void onResume() {
super.onResume();
mLastAccelerometerSet = false;
mLastMagnetometerSet = false;
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
mSensorManager.registerListener(this, mMagnetometer, SensorManager.SENSOR_DELAY_NORMAL);
}
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void onSensorChanged(SensorEvent event) {
if (event.sensor == mAccelerometer) {
System.arraycopy(event.values, 0, mLastAccelerometer, 0, event.values.length);
mLastAccelerometerSet = true;
} else if (event.sensor == mMagnetometer) {
System.arraycopy(event.values, 0, mLastMagnetometer, 0, event.values.length);
mLastMagnetometerSet = true;
}
if (mLastAccelerometerSet && mLastMagnetometerSet) {
SensorManager.getRotationMatrix(mR, null, mLastAccelerometer, mLastMagnetometer);
SensorManager.getOrientation(mR, mOrientation);
Log.i("OrientationTestActivity", String.format("Orientation: %f, %f, %f",
mOrientation[0], mOrientation[1], mOrientation[2]));
}
}
}
При этом вы получаете mOrientation, который содержит азимут, тангаж и крен.
Как объясняется здесь, https://math.stackexchange.com/questions/296799/azimuth-vs-yaw рыскание - это изменение азимута.
Благодарим за помощь! Я нашел сообщение о проблеме использования акселерометра и магнитометра. https://stackoverflow.com/questions/24242972/how-can-i-get-device-tilt Он упоминает, что «пока вы используете акселерометр и магнитометр, но не гироскопы, ваш метод не срабатывает, если устройство проходит быстрое ускорение/замедление ». Это означает, что внезапное движение сделает датчик неточным? Я так смущаюсь с этим датчиком T.T Спасибо за ваше время! – wwwgoodhh
Кроме того, я хочу знать, почему люди, разговаривающие с акселерометром и гироскопом, будут дополнять фильтр. В чем преимущества и недостатки акселерометра и гироскопа стихи акселерометра и магнитометра. – wwwgoodhh
Thats интересно, для моих дел это работало отлично. Но мне не нужно быстрое ускорение/торможение. Для чего вам нужны быстрые вещи? Я хотел бы взглянуть на него позже. – Alex