LeGo-LOAM框架后端优化总结

LeGo-LOAM是发表于IROS2018年的文章,全称为:Lightweight and Ground-Optimize Lidar Odometry and Mapping on Variable Terrain.
在这里插入图片描述

一、Lidar Mapping 原理

流程:

  1. transformAsscoiateToMap()
    根据trasnformSum 和 transformAftMapped得到transformTobeMapped
  2. extractSurroundingKeyFrames()
    提取周围关键帧组成submap
  3. downSampleCurrentScan()
    下采样当前帧
  4. scan2MapOptimization()
    scan to map 的优化
  5. saveKeyFramesAndFactor()
    保存关键帧和因子
  6. correctPoses()
    校正位姿

其中1、3、4与LOAM中的处理基本一致。

二、提取周围关键帧组成SubMap

在extractSurroundingKeyFrames()函数中,若回环检测功能开启,则加载历史中最近的50个关键帧形成点云地图(当组成SubMap的关键帧少于50帧时,直接添加即可;当组成SubMap的关键帧等于50帧时,添加新的关键帧之前需要剔除最初的关键帧);若回环检测功能关闭,则加载历史中最近的50个关键帧形成点云地图。 (对于已有的SubMap每次需要删除不在周围区域的关键帧)。

三、保存关键帧和因子

选择关键帧:当前帧和之前帧的距离大于0.3米

        bool saveThisKeyFrame = true;
        if (sqrt((previousRobotPosPoint.x-currentRobotPosPoint.x)*(previousRobotPosPoint.x-currentRobotPosPoint.x)
                +(previousRobotPosPoint.y-currentRobotPosPoint.y)*(previousRobotPosPoint.y-currentRobotPosPoint.y)
                +(previousRobotPosPoint.z-currentRobotPosPoint.z)*(previousRobotPosPoint.z-currentRobotPosPoint.z)) < 0.3){
            saveThisKeyFrame = false;
        }
        // saveThisKeyFrame为false,并且cloudKeyPoses3D不为空
        if (saveThisKeyFrame == false && !cloudKeyPoses3D->points.empty())
        	return

在这里插入图片描述
gtsam插入先验因子:

gtSAMgraph.add(PriorFactor<Pose3>(0, Pose3(Rot3::RzRyRx(transformTobeMapped[2], transformTobeMapped[0], transformTobeMapped[1]), Point3(transformTobeMapped[5], transformTobeMapped[3], transformTobeMapped[4])), priorNoise));
initialEstimate.insert(0, Pose3(Rot3::RzRyRx(transformTobeMapped[2], transformTobeMapped[0], transformTobeMapped[1]),Point3(transformTobeMapped[5], transformTobeMapped[3], transformTobeMapped[4])));

gtsam插入里程计因子,更新关键帧:

gtsam::Pose3 poseFrom = Pose3(Rot3::RzRyRx(transformLast[2], transformLast[0], transformLast[1]),Point3(transformLast[5], transformLast[3], transformLast[4]));
gtsam::Pose3 poseTo   = Pose3(Rot3::RzRyRx(transformAftMapped[2], transformAftMapped[0], transformAftMapped[1]),Point3(transformAftMapped[5], transformAftMapped[3], transformAftMapped[4]));
gtSAMgraph.add(BetweenFactor<Pose3>(cloudKeyPoses3D->points.size()-1, cloudKeyPoses3D->points.size(), poseFrom.between(poseTo), odometryNoise));
initialEstimate.insert(cloudKeyPoses3D->points.size(), Pose3(Rot3::RzRyRx(transformAftMapped[2], transformAftMapped[0], transformAftMapped[1]),Point3(transformAftMapped[5], transformAftMapped[3], transformAftMapped[4])));

更新gtsam:

isam->update(gtSAMgraph, initialEstimate);
isam->update();

gtSAMgraph.resize(0);
initialEstimate.clear();

四、回环检测

回环检测可以消除漂移(drift),通过ICP算法对比当前帧和之前帧是否匹配,如果匹配则进行图优化。回环检测在loopClosureThread中进行。

基本选择原则:

1 将关键帧点云建立kdtree,根据当前位置点,搜索出一定距离范围内的点云;
2 同时遍历距离由近到远的点,其时间与当前时间间隔在30s以上认为检测到回环;
3 根据搜到的回环帧,合并周围的其周围多帧的点云,以进行后续的回环检测;

如果检测到回环之后,接着进行ICP匹配,然后进行图优化。

icp配准:

1 将当前帧点云与回环检测出的邻近帧点云进行icp配准,得到位姿变换矩阵;
2 更新图,进行优化;

在这里插入图片描述

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LEGO-LOAM是一种用于激光雷达SLAM的方法,它将激光雷达数据转换成3D点云地图,并使用scan-to-map匹配来估计机器人的位姿。在后端优化方面,LEGO-LOAM使用了关键帧优化,通过优化机器人在不同帧之间的位姿,来提高整个SLAM系统的精度和鲁棒性。 以下是一些可能的LEGO-LOAM后端优化方法: 1. 优化关键帧选择:关键帧的选择对于后端优化非常重要。如果选择的关键帧数量过多或过少,都会导致优化效果不佳。因此,可以使用一些方法来自适应地选择关键帧,例如基于运动模型的选择或基于地图密度的选择。 2. 优化优化算法:LEGO-LOAM使用了基于因子图的优化算法,可以尝试使用其他优化算法来改进后端优化效果,例如基于非线性最小二乘的优化算法或基于图优化优化算法。 3. 优化约束:在LEGO-LOAM中,每个关键帧之间的约束是由scan-to-map匹配生成的。可以考虑增加其他类型的约束,例如IMU、里程计或视觉约束,来进一步提高后端优化效果。 4. 优化点云配准:LEGO-LOAM使用ICP算法来对激光雷达数据进行配准,可以尝试使用其他点云配准算法来改进配准效果,例如基于特征的点云配准或基于深度学习的点云配准。 5. 优化地图表示:LEGO-LOAM使用稀疏地图表示方法来表示3D点云地图,可以尝试使用其他地图表示方法来改进后端优化效果,例如稠密地图表示或基于深度学习的地图表示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值