Eigen_四元数笔记

参考资料

学习四元数的小demo:
Eigen_Quaternion_demo
主要的参考文档,Eigen官网中四元数部分:
QuaternionBase

构造函数

常用的四元数格式有Quaternionf(float)和Quaterniond(double),模板类中的Scalar决定数据类型。
官方介绍有七种构造方式,不过常用的一般有以下几种:

  • 直接赋值
    1
    2
    3
    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。

  • 从旋转矩阵或向量构造

    1
    2
    3
    4
    5
    6
    7
    8

    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]

    1
    Eigen::Quaternion< _Scalar, _Options >::Quaternion	(	const Scalar * 	data	)

常用函数

罗列一些比较常用的:

  • 输出系数

    1
    q.coeffs();     //[x y z w]
  • 输出虚部

    1
    q.vec();    //[x y z]

以上两种输出都是以Eigen中的向量Vector形式输出

  • 输出旋转矩阵

要注意的是,只有单位四元数才表示旋转矩阵,所以要先对四元数做单位化

1
2
q.normalized();	//important
Matrix3d R=q.toRotationMatrix();

  • 共轭/即反向旋转

一般不用inverse,在表示旋转的时候(范数是1),共轭即可表示相反的的旋转。

1
2
//q.inverse();
q.conjugate();

  • 遍历元素
    1
    cout<<q.w()<<"  "<<q.x()<<"  "<<q.y()<<"  "<<q.z()<<endl;