我正在尝试使用一些矩阵库(例如)来查找特定欧拉向量所需的滚动和俯仰旋转。
例如,从 [0,0,0](滚动、俯仰、偏航)开始,然后旋转 [45,0,0],然后旋转 [0,45,0],得到 [54.735610,30.000000,35.264390]。使用该库,它只是将这两个欧拉旋转派生的两个四元数相乘。
仅给出 [54.735610,30.000000,35.264390](或相应的四元数)时 - 如何计算所需的横滚和俯仰旋转?或者换句话说 [0,x,0] 和 [y,0,0] 中的 x 和 y。
谢谢。
编辑:如果不清楚,我很抱歉,但我正在尝试找到应用于 [0,0,0] 的仅滚动+仅俯仰旋转以导致该或任何其他特定态度.
忠告:避免像瘟疫一样在代码中使用欧拉角。恕我直言,欧拉角唯一有用的地方是向实际改变滚动、俯仰或偏航的物理执行器发送控制命令,或者从直接测量它们的传感器接收数据时。人们对此类数据唯一应该做的就是“立即”将它们转换为另一种表示形式,或从另一种表示形式转换为人类可以明确理解和调试的表示形式。欧拉角并非如此:它们具有欺骗性的简单性/直觉性隐藏了一直造成麻烦的怪物(万向节锁定、歧义、非平凡插值,仅举几例)。
在速度/精度不是问题的地方,或者在需要记录(或“查看”)状态的地方,以及其他任何地方的四元数中,使用旋转(3x3)或旋转平移(4x4)矩阵。四元数和矩阵之间的转换很简单,有很多库可以帮助您做到这一点。将旋转矩阵的列解释为坐标系的单位向量是您理解和调试运动学问题的方式。
如果以上内容听起来有点自以为是,我深表歉意,我花了太多时间使用欧拉角调试其他人的损坏代码,并指导更多的初级工程师了解为什么最好避免使用它们。可应要求提供战争故事 :-)
如果您的旋转顺序是内在(即关于旋转的body轴),而不是外在(即关于固定空间轴)并且顺序为:roll(x),然后pitch(y),然后yaw(z),旋转矩阵就是乘积
(ZTYTXT)T=X(x)Y(y)Z(z)
(如果您的旋转序列是相对于固定轴的,则矩阵的顺序相反:Z(z)Y(y)X(x)。但是,您提供的少量信息表明您正在使用固有旋转 -这就是飞机上的控制面会给出的。)
旋转矩阵 R 由下式给出
从中你可以 - 在 most 情况下 - 选择原始的 Tait-Bryan 角:
roll(x)=atan2(-R23,R33)
pitch(y)=asin(R13)
yaw(z)=atan2(-R12,R11)
(矩阵索引 R11、R12 等在这里从 1 开始。)
例外情况是当 cos(y)=0 - gimbal lock - 当 roll 和 yaw 必须从矩阵中的其他项中(非唯一地)剔除时。当然,此时俯仰角会正负90度,飞机上的乘客会对飞行员有点不满
如果操作顺序是not roll, then pitch, then yaw, then you will have to adapt your matrix and formulas accordingly.