为何Scipy旋转矩阵转四元数得到初始四元数的共轭?
问题解答
为什么得到的是初始四元数的共轭?
核心原因是旋转矩阵(DCM)的定义方向与四元数旋转方向不匹配:
- SciPy的
Rotation.from_quat([q1, q2, q3, q_c])创建的实例,as_matrix()返回的是从原点坐标系到体坐标系的主动旋转矩阵——即把原坐标系中的点通过旋转变换到体坐标系。 - 你编写的
convert_dcm_to_quaternion函数,使用的公式基于DCM表示体坐标系到原点坐标系的旋转(被动旋转,等价于原→体旋转的逆矩阵)。这种情况下,转换得到的四元数自然是原四元数的共轭(共轭四元数对应逆旋转)。
修正方案
有两种方式让结果匹配:
- 对输入的DCM取转置(旋转矩阵的转置等于其逆矩阵,对应逆旋转):
# 调用时传入转置后的矩阵 convert_dcm_to_quaternion(rotation.as_matrix().T) - 修改函数中
q_vec的符号,调整旋转方向:# 将原q_vec的表达式取反 q_vec = np.array([[C_32 - C_23], [C_13 - C_31], [C_21 - C_12]]) / (4*q_c)
为什么文献中q1的表达式有时符号相反?
这源于四元数表示旋转的几个常见约定差异:
- 旋转方向约定:部分文献定义四元数表示绕轴逆时针旋转,另一部分定义为顺时针旋转,两者对应的四元数矢量部分符号相反。
- 乘法顺序约定:四元数分为左乘(用四元数左乘点矢量)和右乘两种模式,不同模式下旋转对应的四元数表达式会有符号差异。
- 符号等价性:整个四元数乘以-1(包括标量和矢量部分)表示同一个旋转。如果文献计算
q_c时选择负平方根分支,也会导致矢量部分符号相反。
内容的提问来源于stack exchange,提问作者Guenaweg
相关产品推荐
相关产品推荐

