在博文<三维空间中刚体运动>中介绍了三维空间刚体运动和坐标转换的概念,包括坐标变换的各中表示:旋转矩阵、四元数、旋转角、旋转向量、变换矩阵等,初步尝试了使用Eigen进行坐标变换。本文在此基础上,进一步总结Eigen中各种数据类型及其基本操作,便于查阅。

 

旋转矩阵

构造函数

  • 单位矩阵构造
    Eigen::Matrix3d rotation_m=Eigen::Matrix3d::Identity();

  • 由旋转向量构造
    rotation_m=rotation_v.toRotationMatrix();

常用函数

  • 进行旋转变换

    Eigen::Vector3d p(1,0,0);//P点
    Eigen::Vector3d p_r=m*p;
    cout<<p<<endl<<"after p rotated:"<<p_r<<endl<<endl;

旋转向量

构造函数

  • 旋转轴和旋转角构造. 比如旋转轴向量为[0,0,1],旋转角为M_PI/4时,初始化如下:
    Eigen::AngleAxisd rotation_v(M_PI/4,Eigen::Vector3d(0,0,1));

  • 由旋转矩阵构造
     

常用函数

  • 转换为Matrix格式
    cout<<"rotation_v.matrix:\n"<<rotation_v.matrix()<<endl<<endl;

  • 使用进行旋转

    //使用旋转向量进行旋转变换
    Eigen::Vector3d p(1,0,0);//P点
    Eigen::Vector3d p_r=rotation_v*p;
    cout<<p<<endl<<"after p rotated:"<<p_r<<endl<<endl;

欧拉角

构造函数

  • 由旋转矩阵获得

Eigen::Vector3d euler_a=rotation_m.eulerAngles(2,1,0);
cout<<"yaw pitch roll="<<euler_a.transpose()<<endl<<endl;

 

四元数

构造函数

  • 直接赋值,eg:
    Quaterniond q(1.0,0.0,0.0,0.0);
    赋值的顺序是先实数,再虚数:w,x,y,z,而内部存储则是先虚数,再实数:x,y,z,w

  • 从旋转矩阵构造,eg:

Matrix3d mat;  
Quaterniond q(mat);
  • 从旋转向量构造

VectorXd vq(4);
vq<<1.0, 0, 0, 0;
Quaterniond qv(vq);
  • 使用旋转的角度和旋转轴向量(此向量为单位向量)来初始化四元数,
    即使用当旋转轴向量为N=[n_x,n_y,n_z],旋转角度为A时,四元数初始化为:
    q=[cos(A/2),n_xsin(A/2),n_ysin(A/2),n_z*sin(A/2)]

Quaterniond Q1(cos((M_PI/4)/2), 0*sin((M_PI/4)/2), 0*sin((M_PI/4)/2), 1*sin((M_PI/4)/2));//以(0,0,1)为旋转轴,旋转45度
  • 从数组构造
    数组的顺序应该是[w x y z]

 

常用函数

  • 输出系数
    q.coeffs(); //[x y z w]

  • 输出虚部
    q.vec(); //[x y z]
    以上两种输出都是以Eigen中的向量Vector形式输出

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

q.normalized();	//important
Matrix3d R=q.toRotationMatrix();
  • 输出单个元素
    cout<<q.w()<<" "<<q.x()<<" "<<q.y()<<" "<<q.z()<<endl;

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

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

 

平移向量

构造

  • 直接构造
    Eigen::Vector3d t1 = Eigen::Vector3d(0.3, 0.1, 0.1);


 

变换矩阵

初始化

  • 初始化为单位矩阵
    Eigen::Isometry3d T1 = Eigen::Isometry3d::Identity();

  • 从旋转矩阵和平移向量赋值

    T1.rotate(q1.toRotationMatrix());
    T1.pretranslate(t1);

 

常用函数

  • 获得Matrix:
    cout << T1.matrix() << endl;

  • 求逆:
    T1.inverse()

  • 变换运算

    //欧拉矩阵求解
    p2 = T2 * T1.inverse() * p1;
    cout << p2.transpose() << endl; //转置

 

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐