Как сделать точный компас на андроид
Мое приложение для Android показывает направление конкретного места в мире и, следовательно, нуждается в получении степени компаса.
Это код, который я использовал для вычисления градусов:
public void getDirection() {
mySensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
List<Sensor> mySensors = mySensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
if(mySensors.size() > 0){
mySensorManager.registerListener(mySensorEventListener, mySensors.get(0), SensorManager.SENSOR_DELAY_UI);
}
else{
TextView alert = (TextView)findViewById(R.id.instruct);
alert.setText(getString(R.string.direction_not_found));
myCompassView.setVisibility(myCompassView.INVISIBLE);
}
}
private SensorEventListener mySensorEventListener = new SensorEventListener(){
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
compassBearing = (float)event.values[0];
float bearing;
bearing = compassBearing - templeBearing;
if (bearing < 0)
bearing = 360 + bearing;
myCompassView.updateDirection(bearing);
}
};
Этот метод обычно работает, но иногда он просто направляется не на север, что мне нужно сделать, чтобы получить более точное местоположение?
1 ответ
У меня есть пара предложений для вас:
1) Ваше устройство не может быть откалибровано. Чтобы сделать это, переместите это в форме 8 ( см. Это). Если вы этого не сделаете, если ваше устройство откалибровано или нет, проведите некоторые тесты, наведя устройство на некоторое известное направление кардинальной точки и сравните значения. Как правило, если устройство не откалибровано, вы увидите большие различия в значениях азимута для малых поворотов. Вот о чем я бы беспокоился.
Теперь не забывайте, что датчик дает вам ориентир на магнитный север, а не на истинный север! Это различие известно как склонение магнитного поля, и его значение изменяется от места к месту и время от времени из-за изменений в магнитном поле Земли. Это приложение может вычислить некоторые значения для вас с относительной точностью. Я бы не слишком волновался по этому поводу, поскольку склонение обычно невелико, но вы, возможно, ищете хорошую точность (в настоящее время, где я живу, склонение составляет 3º).
2) Держитесь подальше от металлических предметов или предметов, которые генерируют сильное магнитное поле. Например, не делайте тесты, если у вас есть телефон рядом с компьютером или любой физической клавиатурой! Это чистый яд для тестирования компаса-геолокации. Некоторые приложения могут измерять напряженность магнитного поля (если устройство поддерживает его). Когда вы приблизитесь к металлическому материалу, вы ощутите более высокие ценности и сильные изменения в направлениях. Для забавы есть также некоторые " детекторы металла": это приложение распознает изменения в магнитном поле и вибрирует, когда вы находитесь рядом с "металлическим предметом" или вещами, которые магнитно мешают устройству.
3) Не забудьте обновить направление, когда вы наклоняете свое устройство в альбомный режим. ( статью обязательно прочитать!) Это потому, что значение азимута основано на повороте перпендикулярной оси к плоскости телефона. Когда вы поворачиваете устройство в горизонтальное положение, это значение изменяется на +/-90º! Это не решается отключением ландшафтного режима приложения! Вы должны будете определить это программно, анализируя повороты вокруг двух других осей (тангаж и крен). Это не тривиально, но есть примеры в сети.
edit: Если вас интересует какой-то код, посмотрите Mixare, это платформа дополненной реальности с открытым исходным кодом под GPL3 для Android. Посмотрите на их код относительно ориентации, геолокации компаса и ориентации.
PS: У меня нет никакой связи с создателями упомянутых приложений.