C++ 如何将旋转的横滚/俯仰/偏航角映射到0,0,0的参考坐标系?旋转矩阵还是四元数?

C++ 如何将旋转的横滚/俯仰/偏航角映射到0,0,0的参考坐标系?旋转矩阵还是四元数?,c++,matrix,rotation,quaternions,gyroscope,C++,Matrix,Rotation,Quaternions,Gyroscope,我们正在开发一个与硬件系统交互的应用程序,并使用电话和硬件系统的加速计和陀螺仪信息,通过4个延伸的机动臂执行桌子表面的自动调平。此水平面已指定前、后、左和右方向 硬件系统能够知道它的绝对横摇和俯仰,但不能知道它的真实偏航,因为它只是一个6轴传感器。现在,硬件系统安装在需要调平的曲面上不同的位置/方向(不同的滚动/俯仰/偏航组合),因此我们正在创建一个应用程序内“校准”例程,该例程应告知硬件其当前方向(相对于要调平的曲面前部) 校准步骤: 用户将手机沿表面中心线放置,手机顶部指向表面边缘的“前部

我们正在开发一个与硬件系统交互的应用程序,并使用电话和硬件系统的加速计和陀螺仪信息,通过4个延伸的机动臂执行桌子表面的自动调平。此水平面已指定前、后、左和右方向

硬件系统能够知道它的绝对横摇和俯仰,但不能知道它的真实偏航,因为它只是一个6轴传感器。现在,硬件系统安装在需要调平的曲面上不同的位置/方向(不同的滚动/俯仰/偏航组合),因此我们正在创建一个应用程序内“校准”例程,该例程应告知硬件其当前方向(相对于要调平的曲面前部)

校准步骤:

  • 用户将手机沿表面中心线放置,手机顶部指向表面边缘的“前部”(如果我们要调平船只表面,请将手机放平,顶部指向船只前部)

  • 用户按下calibrate(校准)按钮(该按钮记录我们所需的0、0、0参考)

  • 然后,用户将手机移动到硬件系统盒,并将手机放在盒的顶部,手机顶部指向盒的指定“左侧”。使用该方法,我们可以根据初始0,0,0确定系统的横摇/俯仰/偏航方向

现在,我们需要使用旋转矩阵、四元数方法或某种方式将当前XX.XX/YY.YY/ZZ.ZZ方向的方框映射到原点0、0、0

因此,如果长方体的偏航角为90,这意味着俯仰和横滚已反转,现在俯仰读数为横滚,就好像它仍然处于相同的0,0,0方向,并正确控制曲面的正确侧面以使其水平。我们通过旋转矩阵实现了这一点,但这仅在俯仰和滚动为0时有效。不管横滚/俯仰/偏航角如何,我们都需要这样做。箱子可以安装在距离0,0,0设定点90度横滚、15度俯仰和100度偏航的位置,但其参考框架必须始终映射到我们最初设置的0,0,0

可以提供代码,但不确定它有多有用,因为它不能正常工作,我们正在尝试在深入研究技术细节之前巩固我们的方法

此应用程序是在IOS的C中编写的,最终的滚动/俯仰/偏航计算的映射将在船上的C++固件中完成(只有一次,一旦一个盒子被安装,它就不会移动。如果它确实移动,用户必须重新校准它的方向相对于0、0、0点的盒子)

我们真的为此绞尽脑汁,我几乎用尽了我所有的谷歌搜索词想法,因为我找不到很多有用的资源。我们用它来开发一个工作示例,但同样,这只适用于偏航是唯一轴变化的情况:


任何意见都将不胜感激

您好@julianstogs,不幸的是,您的问题没有很好地提出,因此不太可能得到正确的答案。请在此阅读:。然而,为了至少帮一点忙,四元数和矩阵都是三维空间中方向的表示。在一天结束时,它们用稍微不同的数学表示相同的东西,允许一些运算更容易计算,但不会改变问题的基本原理。这两种方法都可以解决你的问题。