Eigen实现欧拉⾓、四元数和旋转矩阵之间的变换include相应的头⽂件
#include <Eigen/Geometry>
旋转矩阵和旋转向量的表⽰和声明及旋转
// 3D 旋转矩阵直接使⽤ Matrix3d 或 Matrix3f
Eigen::Matrix3d rotation_matrix = Eigen::Matrix3d::Identity();
// 旋转向量使⽤ AngleAxis, 它底层不直接是 Matrix ,但运算可以当作矩阵(因为重载了运算符)
Eigen::AngleAxisd rotation_vector ( M_PI/4, Eigen::Vector3d ( 0,0,1 ) ); // 沿 Z 轴旋转 45 度
cout .precision(3);
cout<<"rotation matrix =\n"<<rotation_vector.matrix() <<endl; //⽤
matrix() 转换成矩阵
// ⽤ AngleAxis 可以进⾏坐标变换
Eigen::Vector3d v ( 1,0,0 );
Eigen::Vector3d v_rotated = rotation_vector * v;
cout<<"(1,0,0) after rotation = "<<anspose()<<endl;
// 或者⽤旋转矩阵
v_rotated = rotation_matrix * v;
cout<<"(1,0,0) after rotation = "<<anspose()<<endl;
欧拉⾓:可以将旋转矩阵直接转换成欧拉⾓
Eigen::Vector3d euler_angles = rotation_matrix.eulerAngles ( 2,1,0 ); // ZYX 顺序,即 yaw pitch roll
顺序
cout<<"yaw pitch roll = "<<anspose()<<endl;
欧⽒变换矩阵使⽤ Eigen::Isometry
Eigen::Isometry3d T=Eigen::Isometry3d::Identity(); //虽然称为 3d ,实质上是 4*4 的矩阵
T.pretranslate ( Eigen::Vector3d ( 1,3,4 ) ); //把平移向量设成 (1,3,4)
cout << "Transform matrix = \n" << T.matrix() <<endl;
⽤变换矩阵进⾏坐标变换
Eigen::Vector3d v_transformed = T*v; //
相当于 R*v+t
cout<<"v tranformed = "<<anspose()<<endl;
对于仿射和射影变换,使⽤ Eigen::Affine3d 和 Eigen::Projective3d 即可
四元数
q=[cos(θ/2),nxsin(θ/2),nysin(θ/2),nzsin(θ/2)]
/identity matrix是什么意思
/ 可以直接把 AngleAxis 赋值给四元数,反之亦然
Eigen::Quaterniond q = Eigen::Quaterniond ( rotation_vector );
cout<<"quaternion = \n"<&ffs() <<endl; // 请注意 coeffs 的顺序是 (x,y,z,w), w 为实部,前三者为虚
// 使⽤四元数旋转⼀个向量,使⽤重载的乘法即可
v_rotated = q*v; // 注意数学上是 qvq^{-1}
cout<<"(1,0,0) after rotation = "<<anspose()<<endl;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。