原文章
此处将a点(当前帧的一个点云点),依据上一帧与当前帧的相对位姿(R、t),转换到上一帧。做相关说明(此原理在aloam的laserOdometry.cpp也有体现)
具体说明
注:
1、当前帧相对于上一帧的相对位姿用R和t表示(未知,要依据运动模型);上一帧相对于上上帧的相对位姿用R_last和t_last表示(已知)。
2、当前帧的一点设为点a,在上一帧中的对应点设为a‘(依据的是运动模型的位姿变换所得,如果是准确的R和t,那么a‘和b点应该是理论重合的)。
1、此教程中,用ceres求解的目的就是寻求当前帧与上一帧的相对位姿(即有一个变换矩阵T(由R、t组成))。
2、而用于构建Kdtree的a‘(将当前帧的点a,依据当前帧相对于上一帧的R和t,旋转到上一帧所得, 即:当前帧点a在上一帧中的对应点a‘)所用到的R和t正是我们准备用ceres求得的R和t(即:此时的R和t是未知的,那怎么用呢)。依据运动模型
3、运动模型说明:当前帧相对与上一帧的位姿变换等同于上一帧相对于上上帧的位姿变换(短时间内运动是平稳的)。
4、此时,点a经R_last和t_last变换得到a‘,在依据a’去寻找bcd点。
5、然后。经过ceres的求解(此时用到的是:当前帧点a到上一帧bcd组成的面的距离(残差函数)),得出当前帧相对于上一帧的相对准确的R和t。
此过程同样体现在scan2map,即:map.cpp文件中,相关代码如下:
附加:一起做激光SLAM[四]相关理解
另外,如下图可见(绿色为里程计轨迹,蓝色为map轨迹),由此可见单由里程计(sacn2scan)构成的地图和由后端优化(scan2map)构成的地图之间还是有一个比较大的相对位姿变换存在的。