Eigen三种旋转之间的初始化以及转换

主要是参考这个教程

Eigen中各种形式的表示

1
2
3
4
5
旋转矩阵(3X3):Eigen::Matrix3d
旋转向量(3X1):Eigen::AngleAxisd
四元数(4X1):Eigen::Quaterniond
平移向量(3X1):Eigen::Vector3d
变换矩阵(4X4):Eigen::Isometry3d

其中因为变换矩阵是一种欧式变换,所以可以使用等距矩阵Isometry来进行表示.若是一般的情况就是使用Affine3d也就是仿射矩阵也是可以的.

旋转向量(轴角)赋值

旋转的角度和旋转轴向量->初始化角轴

该旋转轴向量是一个单位向量

1
AngleAxisd V1(M_PI / 4, Vector3d(0, 0, 1));//以(0,0,1)为旋转轴,旋转45度

旋转矩阵->旋转向量

使用旋转向量的fromRotationMatrix()函数来对旋转向量赋值

注意此方法为旋转向量独有,四元数没有

1
2
AngleAxisd V2;
V2.fromRotationMatrix(t_R);

直接使用旋转矩阵来对旋转向量赋值

1
2
AngleAxisd V3;
V3 = t_R;

使用旋转矩阵来对旋转向量进行初始化

1
AngleAxisd V4(t_R);	

四元数->旋转向量

直接使用四元数来对旋转向量赋值

1
2
AngleAxisd V5;
V5 = t_Q;

使用四元数来对旋转向量进行初始化

1
AngleAxisd V6(t_Q);

四元数赋值

Eigen库中的四元数前三维是虚部,最后一维是实部

旋转的角度和旋转轴向量初始化四元数

使用q=[cos(A/2),n_x*sin(A/2),n_y*sin(A/2),n_z*sin(A/2)]

1
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度
  1. 第一种输出四元数的方式
1
cout << "Quaternion1" << endl << Q1.coeffs() << endl;
  1. 第二种输出四元数的方式
1
2
3
4
cout << Q1.x() << endl << endl;
cout << Q1.y() << endl << endl;
cout << Q1.z() << endl << endl;
cout << Q1.w() << endl << endl;

旋转矩阵->四元数

直接使用旋转矩阵来对旋转向量赋值

1
2
Quaterniond Q2;
Q2 = t_R;

旋转矩阵来对四元数进行初始化

1
Quaterniond Q3(t_R);

旋转向量->四元数

直接使用旋转向量对四元数来赋值

1
2
Quaterniond Q4;
Q4 = t_V;

使用旋转向量来对四元数进行初始化

1
Quaterniond Q5(t_V);

旋转矩阵赋值

自身函数初始化旋转矩阵

1
Matrix3d R1=Matrix3d::Identity();

旋转向量->旋转矩阵

旋转向量的成员函数matrix()来对旋转矩阵赋值

1
2
Matrix3d R2;
R2 = t_V.matrix();

旋转向量的成员函数toRotationMatrix()来对旋转矩阵赋值

1
2
Matrix3d R3;
R3 = t_V.toRotationMatrix();

四元数->旋转矩阵

使用四元数的成员函数matrix()来对旋转矩阵赋值

1
2
Matrix3d R4;
R4 = t_Q.matrix();

使用四元数的成员函数toRotationMatrix()来对旋转矩阵赋值

1
2
Matrix3d R5;
R5 = t_Q.toRotationMatrix();

整体总结