SLAM中一个重要的问题就是求取的相机位姿,位姿的描述有多种方式,本文的目的是整理一下能用到的各种位姿的描述方式。
首先要确定相机位姿是什么。位姿即位置和姿态,是刚体在空间中的位置和它自身的姿态,相机的位姿即相机在空间中的位置和相机的朝向。相机的位姿可以看做相机从原始位置到当前位置的变换,包含一个平移变换和一个旋转变换,先旋转再平移。这一变换可以分开描述也可以一起描述,分开描述即将旋转和平移分离开看成两个过程,一起描述即将旋转和平移看成一个完整的过程。
一、分别表述旋转和平移
平移较为简单,由一个平移向量表示。举例:沿X轴平移1
Eigen::Vector3d t ( 1, 0, 0 );
旋转变换的表示则有很多中形式。举例:沿Z轴旋转45°
1、旋转向量,使用AngleAxis
Eigen::AngleAxisd angle ( M_PI / 4, Eigen::Vector3d ( 0, 0, 1 ));
AngleAxis底层不是Matrix,但是因为重载了运算符,可以进行矩阵运算
2、旋转矩阵
Eigen::Matrix3d R;
3、四元数表示旋转
Eigen::Quaterniond q_R ( R );
Eigen::Quaterniond q_angle ( angle );
4、李群SO( 3 )表示旋转
Sophus::SO3 SO3_R ( R );
Sophus::SO3 SO3_q ( q );
Sophus::SO3 SO3_v ( 0, 0, M_PI/4 );
二、把平移、旋转看成一个整的过程
1、变换矩阵
Eigen::Isometry3d T = Eigen::Isometry3d::Identity();
Isometry3d称为3d,但实际上是4×4的矩阵。变换矩阵的赋值由两种方法,一是按照4×4的矩阵进行赋值,另一种方法是用旋转向量和平移向量进行赋值。
T . rotate ( angle );
T . pretranslate ( t );
2、李群SE( 3 )表示变换矩阵
Sophus::SE3 SE3_Rt ( R, t );
Sophus::SE3 SE3_qt ( q, t );