Loam\Lego-loam的里程计部分,累加相邻两帧的位姿时为什么用的是减号
在学习loam时,发现了一个以前没有注意到的比较细节的地方,那就是在雷达里程计的部分,通过扫描匹配scan-matching技术,得到了相邻两帧的位姿变化,但是还需要将这个局部的位姿估计累加在一起,得到一个相对初始位置的全局位姿信息,并转化为ROS消息发布出去,完成这个功能的是Loam的Accumulation函数和lego_loam的featureAssociaiton.cpp中的integrateTransformation函数,下面我们来看一下这个函数:
为什么位姿的累加用的是减号呢?
这个是lego-loam里featureAssociation.cpp中累加相对位姿的函数:
// 累加相邻两帧的位姿变化,得到一个全局的里程计结果
void integrateTransformation(){
float rx, ry, rz, tx, ty, tz;
\\旋转角的累加,transformSum[0-2]是相对初始位置的角度变化,transformCur[0-2]是当前帧
\\相对上一帧的旋转角度,问题可以表示为:0--->(cx,cy,cz)--->(lx,ly,lz)
\\即:从0时刻到(cx,cy,cz),然后在(cx,cy,cz)的基础上又旋转(lx,ly,lz)
\\总的结果用旋转矩阵表示为: R=R_c* R_l
AccumulateRotation(transformSum[0], transformSum[1], transformSum[2],
-transformCur[0], -transformCur[1], -transformCur[2], rx, ry, rz);
\\旋转角累加之后再进行平移量的累加,旋转矩阵的顺规是:YXZ
float x1 = cos(rz) * (transformCur[3] - imuShiftFromStartX)
-sin(rz) * (transformCur[4] - imuShiftFromStartY);
float y1 = sin(rz) * (transformCur[3] - imuShiftFromStartX)
+ cos(rz) * (transformCur[4] - imuShiftFromStartY);
float z1 = transformCur[5] - imuShiftFromStartZ;
float x2 = x1;
float y2 = cos(rx) * y1 - sin(rx) * z1;
float z2 = sin(rx) * y1 + cos(rx) * z1;
tx = transformSum[3] - (cos(ry) * x2 + sin(ry) * z2);
ty = transformSum[4] - y2;
tz = transformSum[5] - (-sin(ry) * x2 + cos(ry) * z2);
PluginIMURotation(rx, ry, rz, imuPitchStart, imuYawStart, imuRollStart,
imuPitchLast, imuYawLast, imuRollLast, rx, ry, rz);
transformSum[0] = rx;
transformSum[1] = ry;
transformSum[2] = rz;
transformSum[3] = tx;
transformSum[4] = ty;
transformSum[5] = tz;
}
但是按照常规的思路相对位姿的累加不应该是相加么,为什么Accumulation()的参数里当前帧的估计值带了负号,并且平移量的更新也是tx=transformSum[3] - (cos(ry) * x2 + sin(ry) * z2)呢,其实这是因为transformCur[]表示的是以当前帧为参考帧,上一帧相对于当前帧的位姿变化,而transformSum[]表示的则是以第一帧为参考帧,当前帧相对第一帧的位姿,如果进行总的位姿计算,自然要对当前帧相对位姿的估计取负号。
参考文献
[1] : https://www.cnblogs.com/ReedLW/p/9005621.html
[2] : https://github.com/wykxwyc/LeGO-LOAM_NOTED.git
[3]: https://github.com/RobustFieldAutonomyLab/LeGO-LOAM.git