Угловая скорость гироскопа вокруг вертикальной оси человека (Android / iOS) - PullRequest
0 голосов
/ 25 октября 2019

Мне нужно определить угловую скорость по гироскопу относительно вертикальной оси человека, держащего смартфон (определить, когда человек делает поворот на 180 градусов), независимо от того, как телефон расположен в кармане, скажем так. Гироскоп телефона выводит скорости относительно положения телефона, поэтому мне нужно преобразовать систему координат.

Я уже пытался использовать кватернион из слияния датчика вектора вращения (кватернион x гироскопический вектор (кватернион с 0 скаляром) x quaternionInverse), но я получаю некоторые странные результаты.

double _totalTurnAngle = 0.0;
Quaternion _lastRotationQuaternion;

void onGyroscopeReading(Vector3 gyroscopeReading) {
    if (_lastRotationQuaternion != null) {
        _totalTurnAngle += calculateAngleDistancePart(gyroscopeReading, _lastRotationQuaternion);
    }
}

void onRotationVectorReading(Quaternion rotationQuaternion) {
    if (_lastRotationQuaternion != rotationQuaternion) {
        _lastRotationQuaternion = rotationQuaternion;
    }
}

double calculateAngleDistancePart(Vector3 gyroscopeReading, Quaternion lastRotationQuaternion) {
  final gyroQuaternion =
      Quaternion(gyroscopeReading.x, gyroscopeReading.y, gyroscopeReading.z, 0);
  final lastRotationQuaternionInverted = lastRotationQuaternion.inverted();
  final correctedVelocity = (lastRotationQuaternion *
      gyroQuaternion *
      lastRotationQuaternionInverted);
  return correctedVelocity.z * samplingPeriod;
}

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

...