Loam\Lego-loam的里程计部分,累加相邻两帧的位姿时为什么用的是减号

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值