Хотя я не использовал компас на Android, базовая обработка, показанная ниже (в JavaScript), вероятно, будет работать для вас.
Он основан на низкочастотном фильтре акселерометра, рекомендованном Команда Windows Phone с изменениями, подходящими для компаса (циклическое поведение каждые 360 ").
Я предполагаю, что показания компаса указаны в градусах, с плавающей запятой в диапазоне 0-360, и выходной сигнал должен бытьаналогично.
Вы хотите выполнить в фильтре 2 вещи:
- Если изменение невелико, для предотвращения появления блеска постепенно поворачивайте в этом направлении.
- Если изменение велико, чтобы предотвратить отставание, немедленно поверните в этом направлении (и его можно отменить, если вы хотите, чтобы компас двигался только плавно).
Длячто у нас будет 2 константы:
- Поплавок замедления, который определяет, насколько плавным будет движение (1 - не сглаживание, а 0 - никогда не обновляется, по умолчанию - 0,5). Мы будем вызыватьэто SmoothFactorCompass.
- Порог, при котором расстояние достаточно велико для мгновенного поворота (0 - это прыжок всегда, 360 - никогда не прыгает, по умолчанию 30).Мы назовем его SmoothThresholdCompass.
У нас есть одна переменная, сохраненная в вызовах, с плавающей точкой oldCompass, и она является результатом алгоритма.
Итак, определение переменнойis:
var SmoothFactorCompass = 0.5;
var SmoothThresholdCompass = 30.0;
var oldCompass = 0.0;
и функция получает newCompass и возвращает oldCompass в качестве результата.
if (Math.abs(newCompass - oldCompass) < 180) {
if (Math.abs(newCompass - oldCompass) > SmoothThresholdCompass) {
oldCompass = newCompass;
}
else {
oldCompass = oldCompass + SmoothFactorCompass * (newCompass - oldCompass);
}
}
else {
if (360.0 - Math.abs(newCompass - oldCompass) > SmoothThresholdCompass) {
oldCompass = newCompass;
}
else {
if (oldCompass > newCompass) {
oldCompass = (oldCompass + SmoothFactorCompass * ((360 + newCompass - oldCompass) % 360) + 360) % 360;
}
else {
oldCompass = (oldCompass - SmoothFactorCompass * ((360 - newCompass + oldCompass) % 360) + 360) % 360;
}
}
}
Я вижу, что проблема была открыта 5 месяцев назад и, вероятно, больше не актуальна, но я уверен, что другие программисты могут найти ее полезной.
Одед Эльяда.