c++ 如何计算欧拉集的两个连续的单轴旋转

j9per5c4  于 2023-03-25  发布在  其他
关注(0)|答案(2)|浏览(160)

我试图使用一些矩阵库(for example)来找到特定欧拉向量所需的滚动和俯仰旋转。
例如,从[0,0,0](滚动,俯仰,偏航)开始,然后旋转[45,0,0],然后[0,45,0]产生[54.735610,30.000000,35.264390]。使用该库,只需将从这两个Euler旋转导出的两个四元数相乘。
当只给出[54.735610,30.00000,35.264390](或相应的四元数)时,我如何计算所需的滚动和俯仰旋转?或者换句话说,x和y在[0,x,0]和[y,0,0]中。
谢谢。

编辑:如果不清楚,我很抱歉,但我试图找到应用于[0,0,0]的仅滚动+仅俯仰旋转,以产生该或任何其他特定的态度。

mwecs4sa

mwecs4sa1#

忠告一句:避免在代码中像瘟疫一样使用欧拉角。恕我直言,欧拉角唯一有用的地方是向实际改变滚转,俯仰或偏航的物理致动器发送控制命令,或者当从直接测量它们的传感器接收数据时。并且人们应该对这样的数据做的唯一事情是“立即”将它们转换为可以不被测量的另一种表示或从另一种表示转换。欧拉角并不意味着:它们欺骗性的简单性/直观性隐藏了一直引起麻烦的怪物(万向节锁定、顺序模糊、非平凡插值,仅举几例)。
使用旋转(3x 3)或旋转平移(4x 4)矩阵,其中速度或准确性不是问题,或者在需要记录的地方(或“看到”)你的状态,以及其他任何地方的四元数。在四元数和矩阵之间转换是微不足道的,有很多库可以帮助你做到这一点。将旋转矩阵的列解释为坐标系的单位向量是理解和调试运动学问题的方法。
如果上面的话听起来很固执,我很抱歉,我花了太多的时间使用欧拉角来调试别人的坏代码,并指导更多的初级工程师为什么最好避免使用欧拉角。战争故事可应要求提供:-)

l7wslrjt

l7wslrjt2#

对于泰特-布莱恩角(或任何其他形式的欧拉角),存在关于轴和旋转顺序的多个约定的问题,无论变换是主动的(相对于固定轴)还是被动的(相对于旋转坐标轴的坐标),无论旋转是关于外部(固定)还是内部(贴体)轴。
OP的代码样本基于围绕 intrinsic 轴的 active 旋转,但他的旋转顺序不是更常见的。

情况1:围绕z偏航,接着围绕y俯仰,接着围绕x滚转。

(This是更常见的情况,至少在飞行中,但它不是OP正在使用的。)
首先考虑对应的被动变换(坐标轴的改变),然后转置回去以得到主动变换,旋转矩阵R为
(XTYTZT)T=Z(z)Y(y)X(x)
它的结果是https://i.stack.imgur.com/jbnSh.png,在大多数情况下,你可以从中提取原始的Tait-BryanAngular :

roll(x)=atan2(R32,R33)
pitch(y)=asin⁡(-R31)
yaw(z)=atan2(R21,R11)

(The矩阵索引R11、R12等在这里是基于1的。
例外的情况是当cos(y)=0 -万向节锁定时-当滚转和偏航必须从矩阵中的其他项中剔除(非唯一地)时。当然,此时俯仰角将为正负90度,飞机中的乘客将对飞行员有点不满意。

情况2:绕x滚动,接着绕y俯仰,接着绕z偏航。

(This实际上是OP正在使用的(从他的代码片段中),但它不是更常见的情况。)
(ZTYTXT)T=X(x)Y(y)Z(z)
旋转矩阵R由https://i.stack.imgur.com/XLN21.png给出,在 * 大多数 * 情况下,您可以从中提取Tait-BryanAngular :

roll(x)=atan2(-R23,R33)
pitch(y)=asin(R13)
yaw(z)=atan2(-R12,R11)

如果旋转的顺序不同,则必须相应地调整矩阵和公式。
关于旋转矩阵的一些有用的东西:
1.行(和列)是正交的。
1.逆矩阵是转置矩阵(也是从主动变换切换到被动变换的方式)。
1.行列式是+1(如果是-1,那么你走过了一面镜子!)
1.活动旋转矩阵的列是原始单位向量[1,0,0],[0,1,0],[0,0,1]的Map(实际上,这对任何矩阵变换都是正确的,不管它是否是旋转)。
就我个人而言,我不太使用欧拉角或四元数,我通常会处理旋转矩阵或单位向量的Map(无论如何,它们形成了旋转矩阵的列)。

相关问题