Подтвердить что ты не робот

Как измерить угол наклона телефона в плоскости XY с помощью акселерометра в Android

Я попытался использовать данные оси Z из SensorEvent.values, но не обнаружил поворот моего телефона в плоскости XY, т.е. вокруг оси Z.

Я использую это как ссылку для осей координат. Правильно ли это?

axes

Как измерить это движение с использованием значений акселерометра?

Эти игры делают что-то похожее: Экстремальный фигурист, Doodle Jump.

PS: моя ориентация телефона будет альбомной.

4b9b3361

Ответ 1

По существу, здесь есть 2 случая: устройство кладется ровно, а не плоское. Плоскость здесь означает, что угол между поверхностью экрана устройства и плоскостью мира xy (я называю это наклоном) составляет менее 25 градусов или больше 155 градусов. Подумайте о том, что телефон лежит ровно или слегка наклонен немного от стола.

Сначала вам нужно нормализовать вектор акселерометра.
То есть, если g - это вектор, возвращаемый значениями события датчика акселерометра. В коде

float[] g = new float[3]; 
g = event.values.clone();

double norm_Of_g = Math.sqrt(g[0] * g[0] + g[1] * g[1] + g[2] * g[2]);

// Normalize the accelerometer vector
g[0] = g[0] / norm_Of_g
g[1] = g[1] / norm_Of_g
g[2] = g[2] / norm_Of_g

Тогда наклон можно рассчитать как

int inclination = (int) Math.round(Math.toDegrees(Math.acos(g[2])));

Таким образом,

if (inclination < 25 || inclination > 155)
{
    // device is flat
}
else
{
    // device is not flat
}

В случае укладки квартиры вам необходимо использовать компас, чтобы узнать, сколько устройство вращается из исходного положения.

В случае неплоской, поворот (наклон) рассчитывается следующим образом:

int rotation = (int) Math.round(Math.toDegrees(Math.atan2(g[0], g[1])));

Теперь вращение = 0 означает, что устройство находится в нормальном положении. Это портрет без какого-либо наклона для большинства телефонов и, возможно, для планшета. Поэтому, если вы держите телефон как на картинке выше и начинаете вращаться, поворот изменится, и когда телефон будет в пейзаже, вращение будет 90 или -90 зависит от направления вращения.