首先说一下四元数的定义:
P
=
(
q
w
,
q
x
,
q
y
,
q
z
)
=
(
p
,
q
)
P = (q_{w},q_{x},q_{y},q_{z}) = (p,\mathbf{q})
P=(qw,qx,qy,qz)=(p,q)
四元数乘法:
(1)
P
1
∗
P
2
=
(
p
1
p
2
−
q
1
q
2
,
p
1
q
2
+
p
2
q
1
+
q
1
×
q
2
)
P_{1}*P_{2} = (p_{1}p_{2}-\mathbf{q_{1}q_{2}}, p_{1} \mathbf{q_{2}} + p_{2} \mathbf{q_{1}} + \mathbf{q_{1}} \times \mathbf{q_{2}} ) \tag{1}
P1∗P2=(p1p2−q1q2,p1q2+p2q1+q1×q2)(1)
共轭:
P
‾
=
(
p
,
−
q
)
\overline{P} = (p,-\mathbf{q})
P=(p,−q)
在文献[1]中,根据(1)有如下结果:
(2)
P
1
∗
P
2
‾
=
P
1
‾
∗
P
2
‾
\overline{P_{1}*P_{2} } =\overline{P_{1}}*\overline{P_{2}} \tag{2}
P1∗P2=P1∗P2(2)
笔者对(2)进行了推导,发现明显不成立,于是进行了如下实验.
编程实验计算共轭展开公式
首先建立两个表示不同旋转的四元数,然后进行计算.
#include <iostream>
#include <Eigen/Core>
#include "sophus/so3.h"
#include "sophus/se3.h"
int main(int argc, char *argv[])
{
using namespace std;
Eigen::AngleAxisd rotation_vector_z(M_PI / 4, Eigen::Vector3d(2, 2, 1));
Eigen::AngleAxisd rotation_vector_x(M_PI /4, Eigen::Vector3d(1,-1,1));
Eigen::Quaterniond q_z = Eigen::Quaterniond(rotation_vector_z);
Eigen::Quaterniond q_x = Eigen::Quaterniond(rotation_vector_x);
cout<<"quaternion z : \n"<<q_z.coeffs()<<endl;
cout<<"quaternion x : \n"<<q_x.coeffs()<<endl;
Eigen::Quaterniond qz_qx = q_z * q_x;
Eigen::Quaterniond qz_qx_conjugate = qz_qx.conjugate();
cout<<"qz_qx_conjugate : \n\t"<<qz_qx_conjugate.coeffs().transpose()<<endl;
Eigen::Quaterniond qz_conjugate = q_z.conjugate();
Eigen::Quaterniond qx_conjugate = q_x.conjugate();
Eigen::Quaterniond qzc_qxc = qz_conjugate * qx_conjugate;
cout<<"qzc * qxc : \n\t"<<qzc_qxc.coeffs().transpose()<<endl;
return 0;
}
最后输出的结果为:
quaternion z :
0.765367
0.765367
0.382683
0.92388
quaternion x :
0.382683
-0.382683
0.382683
0.92388
qz_qx_conjugate :
-1.5 -0.207107 -0.12132 0.707107
qzc * qxc :
-0.62132 -0.5 -1.29289 0.707107
可以看出来他们的实部是相等的,都是0.707107,但是虚部是不一样的,因为(1)中的叉乘项在分别取共轭后其实并没有改变.
参考文献
[1] B.Graf, Quaternions and dynamics ,2008