Недавно я провел некоторое исследование, чтобы использовать как акселерометр, так и гироскоп, чтобы использовать эти сенсоры для отслеживания смартфона без помощи GPS (см. этот пост) Внутренняя система позиционирования на основе гироскопа и акселерометра
Для этой цели мне понадобится моя ориентация (угол (тангаж, крен и т. д.)) и вот что я сделал до сих пор:
public void onSensorChanged(SensorEvent arg0) {
if (arg0.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
{
accel[0] = arg0.values[0];
accel[1] = arg0.values[1];
accel[2] = arg0.values[2];
pitch = Math.toDegrees(Math.atan2(accel[1], Math.sqrt(Math.pow(accel[2], 2) + Math.pow(accel[0], 2))));
tv2.setText("Pitch: " + pitch + "\n" + "Roll: " + roll);
} else if (arg0.sensor.getType() == Sensor.TYPE_GYROSCOPE )
{
if (timestamp != 0) {
final float dT = (arg0.timestamp - timestamp) * NS2S;
angle[0] += arg0.values[0] * dT;
filtered_angle[0] = (0.98f) * (filtered_angle[0] + arg0.values[0] * dT) + (0.02f)* (pitch);
}
timestamp = arg0.timestamp;
}
}
Здесь я пытаюсь определить угол (только для тестирования) с моего акселерометра (шаг), от интеграции gyroscope_X через время, фильтруя его с помощью дополнительного фильтра.
filtered_angle[0] = (0.98f) * (filtered_angle[0] + gyro_x * dT) + (0.02f)* (шаг)
с началом dT более или менее 0,009 секунды
Но я не знаю почему, но мой угол не совсем точен... когда устройство лежит на столе (экраном вверх)
Pitch (angle fromm accel) = 1.5 (average)
Integrate gyro = 0 to growing (normal it's drifting)
filtered gyro angle = 1.2
и когда я поднимаю телефон на 90° (вижу экран обращен к стене передо мной)
Pitch (angle fromm accel) = 86 (MAXIMUM)
Integrate gyro = he is out ok its normal
filtered gyro angle = 83 (MAXIMUM)
Так углы никогда не достигают 90??? Даже если я попытаюсь поднять телефон еще немного... Почему он не поднимается до 90°? Мой расчет неверен? или качество сенсора хреновое?
Еще одна вещь, которая меня интересует, заключается в следующем: с Android я не «считываю» значение датчика, но меня уведомляют, когда они меняются. Проблема в том, что, как вы видите в коде, Accel и Gyro используют один и тот же метод .... поэтому, когда я вычисляю отфильтрованный угол, я возьму шаг измерения ускорения на 0,009 секунды раньше, нет? Это может быть источником моей проблемы?
Спасибо !