Как в C# Xamarin определить наклон Android телефона?

Как получить наклон Android Смартфона в градусах (Относительно любого фиксированного положения)?
Я нашел следующую статью про гироскоп, объясняющую как считывать с него угловую скорость, и написал следующий код, который должен суммируя угловую скорость устройства получать его наклон:
public float AngularVelocityX;
public float AngularVelocityY;
public float AngularVelocityZ;

public ValueShowViewModel()
{
    Gyroscope.Start(SensorSpeed.UI);
    Gyroscope.ReadingChanged += Gyroscope_ReadingChanged;
}

void Gyroscope_ReadingChanged(object sender, GyroscopeChangedEventArgs e)
{
    var data = e.Reading;

    AngularVelocityX += data.AngularVelocity.X;
    AngularVelocityY += data.AngularVelocity.Y;
    AngularVelocityZ += data.AngularVelocity.Z;
}

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

То же самое пытался проделать с акселерометром, однако его значения не реагировали на изменение поворота только по горизонтали.

Есть ли способ с помощью C# получить наклон Android устройства?
  • Вопрос задан
  • 77 просмотров
Пригласить эксперта
Ответы на вопрос 2
@int_i Автор вопроса
Janus74 был прав.
Я решил это проблему не до конца, путем простого извлечения вектора из квантериона.
Датчик ориентации возвращает кватернион вращения устройства, преобразовав который можно получить вращение в углах Эйлера.
Преобразование из этого вопроса и из этой статьи на википедии лично у меня не работают (буду рад если кто поделится работающим вариантом), поэтому я просто извлек из квантериона его вектор, и домножил его на 180.
Значение получается очень приблизительное, но зато с очень минимальными погрешностями.

Vector3 toEuler(Quaternion q)
{
    return new Vector3(q.X * 180, q.Y * 180, q.Z * 180);
}


Статья msdn с приложением, использующим Датчик Ори...
Решение вопроса получения поворота на CodeRoad
Вопрос на StackOverflow на тему преобразования
Вопрос на CodeRoad на тему преобразования
Ещё один алгоритм преобразования
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы