include_directories("/usr/include/eigen3")
#include <cmath> //c++的标准数学函数库,不是Eigen中的,但一般要用到
#include <Eigen/Core>
#include <Eigen/Geometry>
using namespace Eigen;
Vector3d v(1,0,0);
//使用三维纵向量Vector3d定义
Matrix3d rotation_matrix = Matrix3d::Identity();
//使用Matrix3d或者Matrix3f定义,Matrix3d::Identity()是三阶单位阵
AngleAxisd rotation_vector(M_PI / 4,Vector3d(0,0,1));
//沿Z轴旋转45度
//使用AngleAxisd定义,AngleAxisd(旋转角度,旋转轴单位向量Vector3d)
//AngleAxisd的底层不直接是Matrix,但由于重载了运算符,因此仍可以当做矩阵运算
注意:AngleAxisd不能用cout输出,以该定义为例,要用rotation_vector.matrix()转换成矩阵形式才能输出,但转换后不再是旋转向量形式,而是3x3的旋转矩阵形式。
注意:使用AngleAxisd定义旋转向量时候,C++中M_PI的精度是二十位,并不是真正数学意义上的π \piπ,因此在计算过程中会引入误差。例子如下:
AngleAxisd angle_vector = AngleAxisd(M_PI/2,Vector3d(0, 0, 1));
cout << angle_vector.matrix() << endl;
数学理论上所出来的angle_vector对应的矩阵应该为:
[0 -1 0]
[1 0 0]
[0 0 1]
但程序输出为:
6.12323e-17 -1 0
1 6.12323e-17 0
0 0 1
将程序中精度由d改成f后,程序输出为:
-4.37114e-08 -1 0
1 -4.37114e-08 0
0 0 1
其中,本应该矩阵中应该为0的元素出现了一个极小值,而且该极小值会随着精度的变化而变化,不过目前发现的影响只有对0元素的影响,这个极小值可以看成0.
Vector3d eulerangles(0,0,0);
//使用三维纵向量Vector3d定义
Isometry3d T = Isometry3d::Identity();
//使用Isometry3d定义,虽然叫3d,但实际上是4x4矩阵
//Isometry3d::Identity()是将欧氏矩阵初始化为单位矩阵
Isometry3d T(q);
//使用四元数初始化欧氏变换矩阵
注意:欧氏变换矩阵不能直接用cout输出,以该定义为例,要使用
T.matrix()转换为矩阵形式输出,转换后仍为4x4的欧氏变换矩阵
Quaterniond q(Vector4d(1,2,3,4));
//使用Vector4d定义,定义格式为(x,y,z,w)
Quaterniond q((1,2,3,4));
//直接赋值,定义格式为(w,x,y,z)
注意:该定义方法下,Vector中四个元素对应关系为(x,y,z,w),即最后以为才是四元数的实部
注意:四元数不能直接用cout输出,以该定义为例,输出格式为
cout << q.coeffs() << endl; //输出格式为(x,y,z,w)
注意:四元数在使用前要进行归一化,这样由四元数转化出来的旋转矩阵才满足正交性。归一化方法为:
q.normalize();
显示转换
rotation_matrix = rotation_vector.toRotationMatrix();
或
rotation_matrix = rotation_vector.matrix();
注意:此处也存在M_PI引入的误差问题,详讲1-3)旋转向量定义。
隐式转换(直接赋值)
rotation_matrix = rotation_vector;
rotation_vector = rotation_matrix;
eulerangles = rotation_matrix.eulerAngles(2,1,0);
//参数(2.1.0)表示这是ZYX顺序,即roll pitch yaw
T.rotate(rotation_matrix); //在原来T的基础上按照旋转矩阵进行旋转,然后返回T。就是讲旋转矩阵的变换整合到T中
T.rotate(rotation_vector); //按照旋转向量进行旋转
T.pretranslate(Vector3d(1,3,4)); //按照向量Vector3d(1,3,4)平移
显式转换
q = Quaterniond(rotation_vector)
q = Quaterniond(rotation_matrix)
隐式转换
rotation_vector = q
rotation_matrix = q
q = rotation_matrix
q = rotation_vector
Vector3d v(1,0,0); //定义初始坐标v
Vector3d v_rotated; //定义坐标转换后坐标v_rotated
v_rotated = rotation_matrix * v
v_rotated = rotation_vector * v
Vector3d v_tranformed = T * v
v_rotated = q*v