slam 表示旋转用到的3种数据结构及其转换方法:
旋转矩阵、四元数、旋转轴和旋转角度(旋转实例)
旋转矩阵
Eigen::Matrix3d rotationMatrix;
rotationMatrix << 0.0, -0.8, 0.6,
0.8, 0.0, -0.4,
-0.6, 0.4, 0.7;
四元数 (w,x,y,z)
Eigen::Quaterniond quaternion;
1、由旋转矩阵生成四元数
Eigen::Quaterniond quaternion(rotationMatrix);
// 输出转换后的四元数
std::cout << "Quaternion: ("
<< quaternion.w() << ", "
<< quaternion.x() << ", "
<< quaternion.y() << ", "
<< quaternion.z() << ")"
<< std::endl;
2、四元素转换成矩阵
// Eigen::Matrix3d r = quaternion.matrix();
3、四元数可以直接得到旋转轴和旋转角度-旋转实例
Eigen::Vector3d axis = quaternion.vec().normalized(); // 计算旋转轴
double angle = 2.0 * acos(quaternion.w()); // 计算旋转角度
可以由旋转轴和角度得到旋转实例
Eigen::Vector3d axis(1.0, 0.0, 0.0); // 假设有一个旋转轴
double angle = 45.0; // 假设有一个旋转角度,单位为度
axis.normalize(); // 将旋转轴向量归一化
Eigen::AngleAxisd rotation(angle * M_PI / 180.0, axis); // 生成旋转实例,将角度转换为弧度
4、由旋转实例直接得到四元数
Eigen::Quaterniond quaternion2(angle_axis); // 使用旋转实例生成四元数
5、由旋转矩阵得到旋转轴和旋转角度-旋转实例
Eigen::AngleAxisd angle_axis(rotationMatrix);
Eigen::Vector3d axis2 = angle_axis.axis(); // 旋转轴
double angle2 = angle_axis.angle(); // 旋转弧度
6、由旋转轴和旋转角度(旋转实例)得到旋转矩阵
Eigen::Matrix3d rotation_matrix = rotation.toRotationMatrix();