RTABMAP-ROS 调用RTABMAP的方法

CoreNode.cpp: new CoreWrapper --(CoreWrapper.cpp: process() -- mapsManager_.updateMapCaches)
Q:CoreNode如何与CoreWrapper建立关联?
MapsManager.cpp: iter; memory->getSignatureDataConst

RTABMAP 源码解析

Rtabmap.cpp: process() -- memory->update()
Memory.cpp: update()

定位点生成:

CoreWrapper.cpp -- process函数

  • 首先确定输入的RGB和深度图类型

  • 进入RTABMAP的process函数,接口为

  process(const SensorData& data, Transform odomPose, const cv::Mat& covariance = cv::Mat::eye(6,6, CV_64FC1));

下面为RTABMAP sdk的代码分析

process函数: if RGB-D SLAM is enabled, a pose must be set.

(IncrementalMemory: 增量式构建标志位)

  • !odomPose.isNull() && _memory->isIncremental(): 进入纯地图构建的模式

进入Memory.cpp -- update(data, odomPose, covariance)

没有采用OPENCV_NONFREE模块,因此特征提取使用的是ORB特征点。

主要参数:oFAST: ScaleFactor; rBRIEF: PatchSize

Decimated:对图像进行降采样。decimate原意为十中抽一,此处引申为降采样。// 源代码应该没有进行

进入util3d_features.cpp generateWords3DMono(words, prev_words, cameraModles, transform);  // 此函数中注明使用三角化估计

有极线约束、PnPRANSAC……

RGB-D odometry:

从util3d_features.cpp开始解读:
首先使用极线约束判断3D词典是否具有匹配性:
F = findFundamentalMat并计算P(3*4),判断是否有inliners
如果有的话,使用码盘数据作为较精确的初始估计,赋值给P
triangulatePoints计算后的P作为3D词典特征点对的初始估计
最后PnP RANSAC计算两帧间视觉变换

3D点云构建:

基于不同定位点内的点云及其全局位姿,拼接生成全局点云。
get3DMap函数实现。
具体例子可看examples/RGBDMapping

点云分割与地面检测:

OccupancyGrid.hpp -- segmentCloud函数

  1. 对点云进行体素化与降采样。调用pcl的setLeafSize()实现。
  • rtabmap: cloud_voxel_size: 0.05f, gridCellSize = 0.05f. ICP配准中没有启用voxel(parameters.h)
  1. 根据当前位姿,将点云从相机坐标系转换至世界坐标系。
  • 调用rtabmap的util3d::transformPointCloud()实现。
  1. 机器人范围检测与环境高度检测
  • 分别采用util3d::cropBox和util3d::passThrough方法实现,在util3d_filtering.cpp中。
  1. 检测地面点云
  • util3d::segmentObstaclesFromGround,来自util3d_mapping.hpp

  • 使用util3d::normalFitering方法滤波获取地面点云,指标为与垂直法向量的夹角大小,默认值为45°。首先,通过pcl::NormalEstimationOMP方法,使用KdTree作为搜索方法,并通过setViewPoint方法设置视角,根据公式计算点云所有点的法向量。通过pcl::getAngle3D获得点云每个点法向量与地面垂直向量的夹角。实现方法在util3d_filtering.cpp

  • 提取聚类分离地面与平坦障碍物,方法为util3d::extractClusters,来自util3d_filtering.cpp。具体算法为pcl::EuclideanClusterExtraction

  1. 对地面点云滤波,分离地面与非地面点云

通过地面与障碍物高度排除三维空间外点,采用passThrough直通滤波器方法滤波,从之前的步骤获取这两种点云的下标值

    //setNegative: 在min与max范围内的被保留。minGroundHeight为min输入,maxObstacleHeight为max输入
pcl::PointCloud<pcl::PointXYZRGB>::Ptr passThrough(const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,const std::string & axis,float min,float max,bool negative)
{UASSERT(max > min);UASSERT(axis.compare("x") == 0 || axis.compare("y") == 0 || axis.compare("z") == 0);pcl::PointCloud<pcl::PointXYZRGB>::Ptr output(new pcl::PointCloud<pcl::PointXYZRGB>);pcl::PassThrough<pcl::PointXYZRGB> filter;filter.setNegative(negative); filter.setFilterFieldName(axis);filter.setFilterLimits(min, max);filter.setInputCloud(cloud);filter.filter(*output);return output;
}

或者通过cropbox方法直接通过移动机器人footprint范围来排除三维空间外点

  1. 生成栅格地图
  • util3d::occupancy2DFromGroundObstacles,来自util3d_mapping.cpp

- 各种错误

[ WARN] (2017-04-11 09:49:24.355) OdometryF2M.cpp:256::computeTransform() Registration failed: "Variance is too high! (max inlier distance=0.020000, variance=1.393468)"

-------------------------------------闲聊的分割线---------------------------------------------

聊一下谢布克大学的IntroLab吧

这个实验室的工程师氛围之浓 从介绍网页上就能看出来

再加上RTABMAP代码之规范 使我肃然起敬

而且每年都坚持发ICRA IROS

除了RTABMAP+AZIMUT 根据人声跟踪的移动机器人MakeEars项目也很有意思

愿我不断修炼 让自己有如此的全栈能力 面对问题都能第一时间想到解决办法

转载于:https://www.cnblogs.com/severnvergil/p/6671879.html

RTABMAP-ROS RGB-D的建图原理相关推荐

  1. ROS多机器人协同建图

    ROS多机器人协同建图 一.环境配置 二.主要命令 三.模块分析 四.实现效果 rqt_tf_tree rqt_graph rviz效果图 建图结果 一.环境配置 参考turtlebot3-多机交互程 ...

  2. 【解救ROS】ROS实战之SLAM建图详细过程(含代码)

    1.进入树莓派 ssh clbrobot@clbrobt 2.开启底盘节点 roslaunch clbrobot bringup.launch 3.开启一个新的终端 ssh clbrobot@clbr ...

  3. HDU3338 (建图原理详解)

    很经典的题,但是看到还是没思路,太蠢了. 注意下面的行列指的是连续空白格子组成的行和列(意思是每行可以分出多个行) 注意到每个空白格子上的数字只会贡献给本列上面的数字和本行左边的数字 所以可以考虑把每 ...

  4. walking机器人入门教程-视觉建图-rtabmap使用视觉建图和导航

    系列文章目录 walking机器人入门教程-目录 walking机器人入门教程-硬件清单 walking机器人入门教程-软件清单 walking机器人入门教程-测试底盘 walking机器人入门教程- ...

  5. 一小时让你成为点云建图小将(固定帧数法选取关键帧)

    创作时间:2021年11月1日 文章目录 摘要 建图原理 RGBD相机 1. 简介 2. 特点 TUM数据集 1. 简介 2. 特点 3. 下载 4. *教程 开源库 1. OpenCV 1.1. 简 ...

  6. 探索无人驾驶汽车:SLAM自主建图技术。

    有一天,我会放开双手,任由汽车带着我遨游山河. 有一天,我会放松身心,透过车窗去看这美丽景色. 无人驾驶,随着科技的不断进步倍受关注,它不再是一个遥不可及的设想,也不再是只有在科幻片里才能看到的景象. ...

  7. 速腾聚创rs_lidar_16(Robosense)使用gmapping建图

    1.配置速腾聚创 rs_lidar_16雷达驱动 参考下面教程的第一步,Robosense16线雷达驱动安装 速腾聚创rs_lidar_16使用cartographer配置教程 2.使用pointcl ...

  8. 机器人操作系统ROS—深度相机+激光雷达实现vSLAM建图与导航 转载

    原文:机器人操作系统ROS-深度相机+激光雷达实现vSLAM建图与导航_wx5d23599e462fa的技术博客_51CTO博客 这次将带大家学习如何使用深度相机实现机器人的视觉SLAM建图及导航. ...

  9. 【SLAM建图和导航仿真实例】(三)- 使用RTAB-MAP进行SLAM建图和导航

    引言 在这个-SLAM建图和导航仿真实例-项目中,主要分为三个部分,分别是 (一)模型构建 (二)根据已知地图进行定位和导航 (三)使用RTAB-MAP进行建图和导航 该项目的slam_bot已经上传 ...

最新文章

  1. python十大标准_python对标准类型的分类
  2. module ‘imgaug.augmenters‘ has no attribute ‘Resize‘
  3. 爬虫笔记8实例淘宝商品比价爬虫
  4. Repeater分页
  5. http响应状态码列表
  6. mysql没加引号导致全表扫描_mysql隐蔽的索引规则导致数据全表扫描
  7. vs2010 mysql linq to sql 系列_LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据...
  8. 大多数人贫穷到极致时,就是富人灾难的开始,你认同这句话吗?
  9. 心电图数据结构化标准_自己实现一个类 JSON 数据结构
  10. JSP—跳转页面的三种方式
  11. Redis集群(二)Sentinel哨兵模式
  12. BZOJ-2768: [JLOI2010]冠军调查(超级裸的最小割)
  13. 重启服务器iis网站400,重启IIS服务的几种方法小结
  14. Ribbon详解与实例
  15. 网站性能优化之DNS Prefetch
  16. vue中全局注册和局部注册
  17. Java实现京东登录
  18. STM32 CAN通信的学习笔记总结(从小白开始)
  19. nuke11安装教程 nuke11破解教程
  20. 什么是浮动塌陷css,css样式float造成的浮动“塌陷”问题的解决办法

热门文章

  1. 老路《用得上的商学课》学习笔记(21-25课)
  2. Sth about Gospel||Soul Rock||Punk||RnB||Hip-Hop
  3. The Data Science of Gaming and Fantasy Sports 游戏与幻想体育的数据科学 Lynda课程中文字幕
  4. 谈谈Spring中的IOC、DI和AOP概念
  5. 2022网络安全技术及应用复习重点
  6. X264的ARMV7-a的交叉编译及优化运行
  7. 如何将WPS转Word
  8. vue中Watch 和 Computed 的区别是什么?
  9. Java字符串相关操作(一)
  10. 托马斯插件_托马斯·爱迪生讨厌的营销策略