#include <Eigen/Core>
//Eigen核心部分
#include <Eigen/Dense>
//稠密矩阵的代数运算(逆、特征值等)
可以参考这里
这小节的内容参考博客。
Eigen::AngleAxisd rotation_vector(alpha,Vector3d(x,y,z))
Eigen::Matrix3d rotation_matrix;
rotation_matrix=rotation_vector.matrix();
Eigen::Matrix3d rotation_matrix;
rotation_matrix=rotation_vector.toRotationMatrix();
Eigen::Vector3d eulerAngle=rotation_vector.matrix().eulerAngles(2,1,0);
Eigen::Quaterniond quaternion(rotation_vector);
Eigen::Quaterniond quaternion;
Quaterniond quaternion;
Eigen::Quaterniond quaternion;
quaternion=rotation_vector;
Eigen::Matrix3d rotation_matrix;
rotation_matrix<<x_00,x_01,x_02,x_10,x_11,x_12,x_20,x_21,x_22;
Eigen::AngleAxisd rotation_vector(rotation_matrix);
Eigen::AngleAxisd rotation_vector;
rotation_vector=rotation_matrix;
Eigen::AngleAxisd rotation_vector;
rotation_vector.fromRotationMatrix(rotation_matrix);
Eigen::Vector3d eulerAngle=rotation_matrix.eulerAngles(2,1,0);
Eigen::Quaterniond quaternion(rotation_matrix);
Eigen::Quaterniond quaternion;
quaternion=rotation_matrix;
Eigen::Vector3d eulerAngle(yaw,pitch,roll);
Eigen::AngleAxisd rollAngle(AngleAxisd(eulerAngle(2),Vector3d::UnitX()));
Eigen::AngleAxisd pitchAngle(AngleAxisd(eulerAngle(1),Vector3d::UnitY()));
Eigen::AngleAxisd yawAngle(AngleAxisd(eulerAngle(0),Vector3d::UnitZ()));
Eigen::AngleAxisd rotation_vector;
rotation_vector=yawAngle*pitchAngle*rollAngle;
Eigen::AngleAxisd rollAngle(AngleAxisd(eulerAngle(2),Vector3d::UnitX()));
Eigen::AngleAxisd pitchAngle(AngleAxisd(eulerAngle(1),Vector3d::UnitY()));
Eigen::AngleAxisd yawAngle(AngleAxisd(eulerAngle(0),Vector3d::UnitZ()));
Eigen::Matrix3d rotation_matrix;
rotation_matrix=yawAngle*pitchAngle*rollAngle;
Eigen::AngleAxisd rollAngle(AngleAxisd(eulerAngle(2),Vector3d::UnitX()));
Eigen::AngleAxisd pitchAngle(AngleAxisd(eulerAngle(1),Vector3d::UnitY()));
Eigen::AngleAxisd yawAngle(AngleAxisd(eulerAngle(0),Vector3d::UnitZ()));
Eigen::Quaterniond quaternion;
quaternion=yawAngle*pitchAngle*rollAngle;
Eigen::Quaterniond quaternion(w,x,y,z);
Eigen::AngleAxisd rotation_vector(quaternion);
Eigen::AngleAxisd rotation_vector;
rotation_vector=quaternion;
Eigen::Matrix3d rotation_matrix;
rotation_matrix=quaternion.matrix();
Eigen::Matrix3d rotation_matrix;
rotation_matrix=quaternion.toRotationMatrix();
Eigen::Vector3d eulerAngle=quaternion.matrix().eulerAngles(2,1,0);
以上都只是旋转变换函数,现在讨论旋转+平移的情况。3D空间中的变换,有欧氏变换、相似变换、仿射变换和射影变换,一共4种情况。这里只是讨论属于刚性变换的欧氏变换。其余还没用到,应该是大同小异。
Eigen::AngleAxisd rotation_vector(M_PI / 4, Eigen::Vector3d(0, 0, 1)); //沿 Z 轴旋转 45 度
// 欧氏变换矩阵使用 Eigen::Isometry
Eigen::Isometry3d T = Eigen::Isometry3d::Identity(); // 虽然称为3d,实质上是4*4的矩阵
T.rotate(rotation_vector); // 按照rotation_vector进行旋转
//T.translate(Eigen::Vector3d(1, 3, 4)); // 把平移向量设成(1,3,4),没有pre,则看旋转和平移的代码位置,哪个在前就先进行哪个
//cout << "Transform matrix = \n" << T.matrix() << endl;
T.pretranslate(Eigen::Vector3d(1, 3, 4)); // 把平移向量设成(1,3,4),有pre,所以如果旋转没有pre,则要先平移;如果旋转也有pre,应该也是看谁在前面
/*
猜想如下:Eigen中,对于 有没有pre的效果,总结如下,假设原矩阵为M,操作矩阵为 G:
1、没有pre,则 M=M*G,即直接后乘,直接加到后面的
2、有pre,则 M=G*M,即直接前乘,直接加到前面
例子如下,假设旋转矩阵为R,平移为T
1、两个都是没有pre,比如:如果是M.rotate,则M=M*R;再是M.translate,则为M=M*T;然后总的就是 M=M*R*T;
2、一个有pre,另一个没有pre:比如:M.prerotate 与 M.translate,则 M=R*M*T
3、两个都有 pre,比如:先M.prerotate 再 M.pretranslate,则M=T*R*M
*/
cout << "Transform matrix = \n" << T.matrix() << endl;
Eigen::Isometry3d T = Eigen::Isometry3d::Identity(); // 初始化欧氏矩阵,这里用单位阵示范
Eigen::AngleAxisd rot_vect(T.rotation()); //转旋转向量
cout << "rot_vect = \n" << rot_vect.matrix() << endl;
Eigen::Vector3d tran_vect = T.translation(); //转平移向量
cout << "tran_vect = \n" << tran_vect << endl;
Eigen::Matrix4d rot_test = T.matrix(); //转4*4的矩阵
cout << "Transform matrix = \n" << rot_test << endl;
float row = 3, col = 4;
/* 定义,定义时默认没有初始化,必须自己初始化 */
Eigen::MatrixXf tmp_mat;
/* 初始化 */
tmp_mat = Eigen::MatrixXf::Zero(row, col);
还可以写:4维矩阵转4元数和平移向量等
使用Eigen求解比如: A x = b Ax=b Ax=b这种方程,可以有QR分解、LU分解等做法,可以参考下博客