Мне нужно определить угловую скорость по гироскопу относительно вертикальной оси человека, держащего смартфон (определить, когда человек делает поворот на 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 градусов, после чего общий угол очень быстро складывается и становится неправильным.