Skip to content

Latest commit

 

History

History
74 lines (54 loc) · 2.72 KB

EigenGeometry.md

File metadata and controls

74 lines (54 loc) · 2.72 KB

EigenGeometry

#include<iostream> 
#include<cmath> 

using namespace std; 

#include<Eigen/Core> 
#include<Eigen/Geometry> 

using namespace Eigen; 

//本程序演示了Eigen几何模块的使用方法 
int main(intargc,char**argv){ 
    //Eigen/Geometry模块提供了各种旋转和平移的表示 
    //3D旋转矩阵直接使用Matrix3d或Matrix3f 
    Matrix3drotation_matrix=Matrix3d::Identity();//单位矩阵 

    //旋转向量使用AngleAxis,它底层不直接是Matrix,但运算可以当作矩阵(因为重载了运算符) 
    AngleAxisdrotation_vector(M_PI/4,Vector3d(0,0,1));//沿Z轴旋转45度 

    cout.precision(3); 
    cout<<"rotationmatrix=\n"<<rotation_vector.matrix()<<endl;//用matrix()转换成矩阵 

    //也可以直接赋值 
    rotation_matrix=rotation_vector.toRotationMatrix(); 

    //用AngleAxis可以进行坐标变换 
    Vector3dv(1,0,0); 
    Vector3dv_rotated=rotation_vector*v; 
    cout<<"(1,0,0)afterrotation(byangleaxis)="<<v_rotated.transpose()<<endl; 

    //或者用旋转矩阵 
    v_rotated=rotation_matrix*v; 
    cout<<"(1,0,0)afterrotation(bymatrix)="<<v_rotated.transpose()<<endl; 

    //欧拉角:可以将旋转矩阵直接转换成欧拉角 
    Vector3deuler_angles=rotation_matrix.eulerAngles(2,1,0);//ZYX顺序,即yaw-pitch-roll顺序 
    cout<<"yawpitchroll="<<euler_angles.transpose()<<endl; 
    
    //欧氏变换矩阵使用Eigen::Isometry 
    Isometry3dT=Isometry3d::Identity();//虽然称为3d,实质上是4*4的矩阵 
    T.rotate(rotation_vector);//按照rotation_vector进行旋转 
    T.pretranslate(Vector3d(1,3,4));//把平移向量设成(1,3,4) 
    cout<<"Transformmatrix=\n"<<T.matrix()<<endl; 

    //用变换矩阵进行坐标变换 
    Vector3dv_transformed=T*v;//相当于R*v+t 
    cout<<"vtranformed="<<v_transformed.transpose()<<endl; 

    //对于仿射和射影变换,使用Eigen::Affine3d和Eigen::Projective3d即可,略 
    ##都是调用了有参构造函数 
    //四元数 
    //可以直接把AngleAxis赋值给四元数,反之亦然 
    Quaterniondq=Quaterniond(rotation_vector); 
    cout<<"quaternionfromrotationvector="<<q.coeffs().transpose()<<endl;//请注意coeffs的顺序是(x,y,z,w),w为实部,前三者为虚部 

    //也可以把旋转矩阵赋给它 
    q=Quaterniond(rotation_matrix); 
    cout<<"quaternionfromrotationmatrix="<<q.coeffs().transpose()<<endl; 

    //使用四元数旋转一个向量,使用重载的乘法即可 
    v_rotated=q*v;//注意数学上是qvq^{-1} 
    cout<<"(1,0,0)afterrotation="<<v_rotated.transpose()<<endl; 

    //用常规向量乘法表示,则应该如下计算 
    cout<<"shouldbeequalto"<<(q*Quaterniond(0,1,0,0)*q.inverse()).coeffs().transpose()<<endl; 

    return0; 

}