Как сделать точный компас на Андроид
мое приложение для 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: у меня нет никакой связи с создателями упомянутых приложений.