最詳細的Eigen筆記

在博文<三維空間中剛體運動>中介紹了三維空間剛體運動和座標轉換的概念,包括座標變換的各中表示:旋轉矩陣、四元數、旋轉角、旋轉向量、變換矩陣等,初步嘗試了使用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; //轉置

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章