Ответ 1
Я просто искал ответ на эту проблему. Это немного разбило мне сердце, чтобы увидеть, что вы опубликовали это более года назад, но я подумал, что вы или кто-то другой могли бы воспользоваться этим решением.
Проблема заключается в блокировке карданного вала. Когда шаг составляет около 90 градусов, рыскание и ролл совпадают, и гироскоп теряет степень свободы. Кватернионы - один из способов избежать карданного замка, но я, честно говоря, не хотел обманывать меня. Вместо этого я заметил, что рыскание и бросок действительно совпадают и могут быть просто подведены для решения проблемы (предполагая, что вы только заботитесь о рыскании).
РЕШЕНИЕ:
float yawDegrees = currentAttitude.yaw * (180.0 / M_PI);
float pitchDegrees = currentAttitude.pitch * (180.0 / M_PI);
float rollDegrees = currentAttitude.roll * (180.0 / M_PI);
double rotationDegrees;
if(rollDegrees < 0 && yawDegrees < 0) // This is the condition where simply
// summing yawDegrees with rollDegrees
// wouldn't work.
// Suppose yaw = -177 and pitch = -165.
// rotationDegrees would then be -342,
// making your rotation angle jump all
// the way around the circle.
{
rotationDegrees = 360 - (-1 * (yawDegrees + rollDegrees));
}
else
{
rotationDegrees = yawDegrees + rollDegrees;
}
// Use rotationDegrees with range 0 - 360 to do whatever you want.
Я надеюсь, что это поможет кому-то еще!