我有一个应用程序,可以在用户围绕物体行走时记录角度,同时将设备(最好是)指向物体的中心。 在用户命令下,角度会被重置-因此参考姿态会被重置。
使用欧拉角会产生万向锁,所以我目前正在使用四元数,并通过以下方式计算角度:
double angleFromLastPosition = acos(fromLastPositionAttitude.quaternion.w) * 2.0f;
如果设备的俯仰角和偏航角没有变化,那么它具有良好的精度并且可以完美地工作。换句话说,当角度显示为360度时,我最终会停留在圆的起始位置。
问题1:如果设备的偏航角和俯仰角稍微改变(用户未直接指向对象中心),则角度也会随之改变。我理解这一点,因为我的角度公式只是显示3D空间中两个设备姿态之间的角度。
场景:
- 我标记旋转姿态的起始点,并在指向中心的情况下开始沿着对象周围作圆形移动
- 我停在45度处,并通过将设备指向更高或更低来改变俯仰角。相应地改变角度。
- 我希望看到的是:即使俯仰角或偏航角发生变化,角度仍保持在45度。
问题1是,如何使用四元数仅计算设备的Roll,并忽略其他两个轴(至少在某些合理的角度范围内)。
问题2:如果我旋转一段时间然后完全固定设备(在三脚架上,因此完全没有晃动),那么距上一个位置的角度会以每10-20秒约1度的速率漂移,而且似乎不是线性的。换句话说,它一开始漂移得很快,然后明显减缓。有时我根本没有漂移 - 如果设备静止,则角度非常稳定。这使我迷失了解发生了什么。
问题2是,发生了什么,如何解决漂移问题?
我查阅了很多文章和教程,但四元数数学目前对我来说还超出了我的能力范围,希望有人能够通过提示、链接或几行代码来帮助我。