参考资料
学习四元数的小demo:
Eigen_Quaternion_demo
主要的参考文档,Eigen官网中四元数部分:
QuaternionBase
构造函数
常用的四元数格式有Quaternionf(float)和Quaterniond(double),模板类中的Scalar决定数据类型。
官方介绍有七种构造方式,不过常用的一般有以下几种:
- 直接赋值
Eigen::Quaternion< _Scalar, _Options >::Quaternion( const Scalar & w,const Scalar & x,const Scalar &y,const Scalar & z )
//for example
Quaterniond q(1.0, 0.0, 0.0, 0.0);
要注意Eigen中四元数赋值的顺序,实数w在首;但是实际上它的内部存储顺序是[x y z w]。实际上后面输出系数的时候也是按内部存储顺序输出
Note the order of the arguments: the real w coefficient first, while internally the coefficients are stored in the following order: [x, y, z, w]
3。
- 从旋转矩阵或向量构造
Eigen::Quaternion< _Scalar, _Options >::Quaternion(const MatrixBase< Derived > & other)
//for example
Matrix3d mat;
Quaterniond q(mat);
VectorXd vq(4);
vq<<1.0, 0, 0, 0;
Quaterniond qv(vq);
- 从数组构造
数组的顺序应该是[w x y z]
Eigen::Quaternion< _Scalar, _Options >::Quaternion ( const Scalar * data )
常用函数
罗列一些比较常用的:
- 输出系数
q.coeffs(); //[x y z w]
- 输出虚部
q.vec(); //[x y z]
以上两种输出都是以Eigen中的向量Vector形式输出
- 输出旋转矩阵
要注意的是,只有单位四元数才表示旋转矩阵,所以要先对四元数做单位化
q.normalized(); //important
Matrix3d R=q.toRotationMatrix();
- 共轭/即反向旋转
一般不用inverse,在表示旋转的时候(范数是1),共轭即可表示相反的的旋转。
//q.inverse();
q.conjugate();
- 遍历元素
cout<<q.w()<<" "<<q.x()<<" "<<q.y()<<" "<<q.z()<<endl;