如何将旋转矩阵转换为四元数 [英] How to convert rotation matrix to quaternion

查看:0
本文介绍了如何将旋转矩阵转换为四元数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我可以将旋转矩阵转换为四元数吗? 我知道如何将四元数转换为旋转矩阵,但我找不到相反的方法。 我可以向您展示如何将四元数转换为旋转矩阵的代码,如下所示。

示例(C++):Quaterniond quat; MatrixXd t; t = quat.matrix(); 我想知道像这样把旋转矩阵转换成四元数的方法。

推荐答案

将方向余弦矩阵D转换为四元数Q的数值稳定算法如下:

T = D(1,1) + D(2,2) + D(3,3)
M = max( D(1,1), D(2,2), D(3,3), T )
qmax = (1/2) * sqrt( 1 – T + 2*M )
if( M == D(1,1) )
        qx = qmax
        qy =  ( D(1,2) + D(2,1) ) / ( 4*qmax )
        qz =  ( D(1,3) + D(3,1) ) / ( 4*qmax )
        qw = ±( D(3,2) - D(2,3) ) / ( 4*qmax )
elseif( M == D(2,2) )
        qx =  ( D(1,2) + D(2,1) ) / ( 4*qmax )
        qy = qmax
        qz =  ( D(2,3) + D(3,2) ) / ( 4*qmax )
        qw = ±( D(1,3) - D(3,1) ) / ( 4*qmax )
elseif( M == D(3,3) )
        qx =  ( D(1,3) + D(3,1) ) / ( 4*qmax )
        qy =  ( D(2,3) + D(3,2) ) / ( 4*qmax )
        qz = qmax
        qw = ±( D(1,3) - D(3,1) ) / ( 4*qmax )
else
        qx = ±( D(3,2) - D(2,3) ) / ( 4*qmax )
        qy = ±( D(1,3) - D(3,1) ) / ( 4*qmax )
        qz = ±( D(2,1) - D(1,2) ) / ( 4*qmax )
        qw = qmax
endif

请注意,四元数本身就存在符号歧义。上面的算法任意选择最大元素qmax的符号为正,但将该符号选择为负号同样有效(即,基本上颠倒结果的所有符号)。应由用户根据应用程序确定哪个选项更合适。

±选择是基于您使用的四元数约定进行的:

选择+表示哈密尔顿左链约定或JPL右链约定

选择-适用于汉密尔顿右链约定或喷气推进剂左链约定

哈密尔顿约定是指四元数元素i,j,k在乘法时的右手行为(如叉积):

 i * j = k , j * k = i , k * i = j

JPL约定是指四元数元素i,j,k以左手方式进行乘法(叉积为负):

 i * j = -k , j * k = -i , k * i = -j

右链表示向量上的四元数旋转运算的右侧有未修改的四元数:

 D * v1 = v2 = q^-1 * v1 * q

左链表示向量上的四元数旋转运算左侧有未修改的四元数:

 D * v1 = v2 = q * v1 * q^-1

为完整起见,以下是另一个方向的算法,将四元数转换为方向余弦矩阵:

 D = (qw^2 - dot(qv,qv))*I3 + 2*qv*qv^T ± 2*qw*Skew(qv)

其中^T表示转置(该术语中的外部产品)和

qv = [qx]
     [qy]
     [qz]

I3 = [1 0 0]
     [0 1 0]
     [0 0 1]

Skew(qv) = [  0 -qz  qy]
           [ qz   0 -qx]
           [-qy  qx   0]

这篇关于如何将旋转矩阵转换为四元数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆