上一节介绍了BLAM的帧间匹配和帧图匹配,代码简洁明了。

本节介绍BLAM的回环检测模块。具体代码块如下:

 // Check for new loop closures.bool new_keyframe;if (HandleLoopClosures(msg_filtered, &new_keyframe)) {// We found one - regenerate the 3D map.PointCloud::Ptr regenerated_map(new PointCloud);loop_closure_.GetMaximumLikelihoodPoints(regenerated_map.get());mapper_.Reset();PointCloud::Ptr unused(new PointCloud);mapper_.InsertPoints(regenerated_map, unused.get());// Also reset the robot's estimated position.localization_.SetIntegratedEstimate(loop_closure_.GetLastPose());} else {// No new loop closures - but was there a new key frame? If so, add new// points to the map.if (new_keyframe) {localization_.MotionUpdate(gu::Transform3::Identity());localization_.TransformPointsToFixedFrame(*msg_filtered, msg_fixed.get());PointCloud::Ptr unused(new PointCloud);mapper_.InsertPoints(msg_fixed, unused.get());}}// Visualize the pose graph and current loop closure radius.loop_closure_.PublishPoseGraph();

我们知道视觉SLAM一般通过词袋模型进行回环,激光SLAM中的佼佼者Cartographer通过分支定界+栅格匹配进行回环,等等。BLAM由于构建的是点云地图,不涉及栅格更新,因此通过最简单的ICP进行回环。接下来逐行解析:

首先使用HandleLoopClosures,向位姿图中加入新位姿节点:

  if (!loop_closure_.AddBetweenFactor(localization_.GetIncrementalEstimate(),  // MJYcovariance, &pose_key)) {

接下来使用AddKeyScanPair,向回环检测模块加入关键帧。

  if (!loop_closure_.AddKeyScanPair(pose_key, scan)) {

然后最重要的:在可回环范围内寻找回环,可回环范围由第一节介绍的几个参数决定。

  if (!loop_closure_.FindLoopClosures(pose_key, &closure_keys)) {

寻找回环的过程中将回环边加入位姿图。

让我们回到BlamSlam.cc,继续HandleLoopClosures以下的内容,使用了如下函数将历史关键帧的点云转换到全局坐标系,合并到一起,加入到回环检测模块的mapper_中:

    loop_closure_.GetMaximumLikelihoodPoints(regenerated_map.get());

注意,这个点云是经过回环校正的点云,因此是经过回环检测优化的map

然后用回环校正的位姿,更新定位模块localization_中的位姿,即:

void PointCloudLocalization::SetIntegratedEstimate(const gu::Transform3& integrated_estimate) {integrated_estimate_ = integrated_estimate;// Publish transform between fixed frame and localization frame.geometry_msgs::TransformStamped tf;tf.transform = gr::ToRosTransform(integrated_estimate_);tf.header.stamp = stamp_;tf.header.frame_id = fixed_frame_id_;tf.child_frame_id = base_frame_id_;tfbr_.sendTransform(tf);
}

最终发布位姿图。没有订阅者是不发布的。

  loop_closure_.PublishPoseGraph();

至此,BLAM源码介绍完毕,接下来尽情调参,实现你自己特定场景的SLAM吧!!!!

BLAM源码解析(五)—— 回环检测相关推荐

  1. cartographer 源码解析 (五)

    相关链接: cartographer 源码解析(一) cartographer 源码解析(二) cartographer 源码解析(三) cartographer 源码解析(四) cartograph ...

  2. (Nacos源码解析五)Nacos服务事件变动源码解析

    Nacos源码解析系列目录 Nacos 源码编译运行 (Nacos源码解析一)Nacos 注册实例源码解析 (Nacos源码解析二)Nacos 服务发现源码解析 (Nacos源码解析三)Nacos 心 ...

  3. BLAM源码解析(一)—— 模块初始化

    接下来写一个开源SLAM算法系列吧,本期介绍BLAM算法.BLAM算法是伯克利的一位大牛写的,首先名字就很有意思,BLAM表示 B(erkeley) L(localization) A(nd) M(a ...

  4. Spring源码解析(五)-Bean的实例化流程(上)

    在前面已经完成了对需要实例化bean的收集并封装成BeanDefinition,并且将BeanPostProcess等组件进行了提前实例化.接下来就到了容器启动的最后一步,也是最复杂的一步-实例化be ...

  5. Tomcat源码解析五:Tomcat请求处理过程

    前面已经分析完了Tomcat的启动和关闭过程,本篇就来接着分析一下Tomcat中请求的处理过程. 在开始本文之前,咋们首先来看看一个Http请求处理的过程,一般情况下是浏览器发送http请求-> ...

  6. Netty源码解析-Netty内存泄露检测

    前言: 在前一篇文章中,我们介绍了ByteBuf的引用计数器的使用,基本所有的ByteBuf都有相关计数的功能,那么这个计数有什么用呢. 实际主要就是做内存泄露检测用的.本文就其如何做检测来进行说明. ...

  7. 【NDPI】源码解析之深度包检测分析(一)

    (Albert.2019.4.28) 文章目录: 前言: 正文: 一.nDPI深度包检测流程: 二.重要结构体的源码分析 1.ndpi_ethdr.ndpi_iphdr.ndpi_tcphdr.ndp ...

  8. spring源码解析五

    2019独角兽企业重金招聘Python工程师标准>>> 1.创建用于承载属性的BeanDefinition 这是一个接口,在spring中存在三种实现:RootBeanDefinit ...

  9. BLAM源码解析(四)—— 基于ICP的位姿更新

    第三节我们介绍了定时器的定时回调,实现对激光数据的批量循环处理,在每一个激光数据的循环当中,除了一开始filter_的点云过滤,最重要的其实是下面的基于ICP的位姿更新,即 if (!odometry ...

最新文章

  1. Android强制设置横屏或竖屏
  2. oracle instead of update触发器,Oracle中的instead of触发器
  3. php企业号自定义菜单,用php实现微信企业号自定义菜单遇到问题,请大神指点!...
  4. html 不透明阴影,CSS_css box-shadow阴影不透明的解决办法,如下面示例: 复制代码代码如 - phpStudy...
  5. Linux安装MariaDB(Mysql)和简单配置
  6. VMware设置及linux静态ip设置
  7. CentOS yum的详细使用方法
  8. 输入x,n计算多项式1+x+x^2/2!+x^3/3!+...前n+1项的和。
  9. 试了试Docker桌面应用自带的K8s集群,一个字“简单”
  10. python控制arduino模拟端口_用Python控制Arduino实现Blink
  11. string的基本用法
  12. 如何通过ngnix将网站访问改为https
  13. vue-amap详细使用教程
  14. web of science上查找相关会议和期刊的论文
  15. jquery下的this,$(this),$(this).get(0);
  16. 一份新的lilypond谱子,能设置页边距和设置换页符了
  17. 播放全景视频【一】:用unity Video Player视频播放器来播放360全景视频
  18. Introduction to Linear Optimization 2.1 多面体和凸集
  19. 屠龙勇士最后都变成了恶龙吗?是!不然你以为恶龙是哪来的?
  20. ABTest流量分发和业界的一些经验

热门文章

  1. 谈谈区块链入门技能(二):以太坊区块链浏览器如何使用?
  2. .so是什么文件_Linux的so文件到底是干嘛的?浅析Linux的动态链接库
  3. 【码云周刊第 28 期】计算机视觉时代的识图技术
  4. ubuntu下新建用户
  5. 光电耦合器原理及应用介绍
  6. 文本分析常用R包的安装(Rweibo、wordcloud、tm、tmcn、Rwordseg、Rcharts、xlsx、XLConnect)
  7. 项目经理应怎么利用人工智能?
  8. 机器学习之Kmeans
  9. js制作的模拟超逼真下雨效果
  10. Nodejs 中 request 出现 ‘socket hang up‘ 的解决办法