1.hdl_graph_slam|后端优化|hdl_graph_slam_nodelet.cpp|源码解读(四)
2.[ORB-SLAM2] ORB-SLAM中的源码阈值ORB特征(提取)
3.[LIDAR-SLAM] Iterative Closest Point (ICP)简单实现
4.[ORB-SLAM2] 回环&DBoW视觉词袋
5.Cartographerè°å
6.ORB-SLAM2源码系列--局部建图线程(MapPointCulling和KeyFrameCulling)
hdl_graph_slam|后端优化|hdl_graph_slam_nodelet.cpp|源码解读(四)
hdl_graph_slam源码解读(八):后端优化后端概率图构建核心:hdl_graph_slam_nodelet.cpp
整体介绍 这是整个系统建图的核心,综合所有信息进行优化。源码阈值所有的源码阈值信息都会发送到这个节点并加入概率图中。 包含信息 1)前端里程计传入的源码阈值位姿和点云 2)gps信息 3)Imu信息 4)平面拟合的参数信息 处理信息步骤 1)在对应的callback函数中接收信息,并放入相应的源码阈值队列 2)根据时间戳对队列中的信息进行顺序处理,加入概率图 其他内容 1)执行图优化,源码阈值大漠多线程绑定多窗口源码这是源码阈值一个定时执行的函数,闭环检测也在这个函数里 2)生成全局地图并定时发送,源码阈值即把所有关键帧拼一起,源码阈值得到全局点云地图,源码阈值然后在一个定时函数里发送到rviz上去 3)在rviz中显示顶点和边,源码阈值如果运行程序,源码阈值会看到rviz中把概率图可视化了 关键帧同步与优化 cloud_callback cloud_callback(const nav_msgs::OdometryConstPtr& odom_msg,源码阈值const sensor_msgs::PointCloud2::ConstPtr& cloud_msg) 该函数主要是odom信息与cloud信息的同步,同步之后检查关键帧是源码阈值否更新。 关键帧判断:这里主要看关键帧设置的源码阈值这两个阈值keyframe_delta_trans、keyframe_delta_angle 变成关键帧的要求就是:/hdl_graph_slam/include/hdl_graph_slam/keyframe_updater.hpp 优化函数 optimization_timer_callback(const ros::TimerEvent& event) 函数功能:将所有的位姿放在posegraph中开始优化 loop detection 函数:主要就是将当前帧和历史帧遍历,寻找loop。 闭环匹配与信息矩阵计算 匹配与闭环检测 潜在闭环完成匹配(matching 函数) 不同loop的信息矩阵计算(hdl_graph_slam/information_matrix_calculator.cpp) gps对应的信息矩阵 hdl_graph_slam/graph_slam.cpp 添加地面约束 使用add_se3_plane_edge函数的代码 执行图优化 优化函数optimization_timer_callback 执行图优化,闭环检测检测闭环并加到了概率图中,优化前 生成简化版关键帧,KeyFrameSnapshot用于地图拼接 生成地图并定时发送 生成地图:简化版关键帧拼接 定时发送:src/hdl_graph_slam_nodelet.cpp文件中 系统性能与扩展性 hdl_graph_slam性能问题在于帧间匹配和闭环检测精度不足,系统代码设计好,模块化强,易于扩展多传感器数据融合。 总结 hdl_graph_slam后端优化是表白类源码关键,涉及大量信息融合与概率图构建。系统设计清晰,扩展性强,但在性能上需改进。[ORB-SLAM2] ORB-SLAM中的ORB特征(提取)
ORB-SLAM中的特征构建以其使用统一的ORB(Oriented FAST and Rotated BRIEF)为核心创新点,使得系统构建更为简洁稳定。本文旨在深入探讨ORB特征的提取流程及对ORB特征的优化改良,以提供直观解答。
提取流程概览如下:
第一步:构造金字塔。
金字塔的构建是理解关键点分布的基础,它通过不同尺度的图像层次化表示,以便在多尺度上寻找特征。金字塔的层级数量与特征的分配直接相关,每层图像面积的减小导致特征点数量的减少,分配策略需确保各层特征点的均衡。
第二步:提取FAST角点。
FAST(Features from Accelerated Segment Test)算法基于中心像素与周围像素的灰度对比,高效快速地识别关键点。通过设定阈值,判断像素是否为角点,FAST算法在每个像素点上执行,产生大量角点,再经过非极大值抑制处理以去除冗余点。
第三步:计算角度。下单 软件 源码
通过灰度质心与圆心的向量角度,ORB特征不仅提取了角点,还计算出了每个角点相对于坐标系的角度,这有助于确保每次描述子计算的方向一致性,实现了角度不变性。
第四步:计算旋转感知的BRIEF描述子。
BRIEF(Binary Robust Independent Elementary Features)描述子是一个二进制描述子,以其高速匹配速度著称。通过选定的点对对块内的像素进行比较,形成描述子序列。Steered BRIEF根据角点方向旋转描述子坐标点对位置,实现了旋转不变性。
最后一步:提升抗噪能力。
ORB在计算描述子时使用周围5×5的patch灰度信息,进行滤波处理,提高了描述子的抗噪性。
ORB-SLAM的改进主要集中在FAST角点提取步骤。该系统通过动态调整阈值、利用四叉树划分图像等方法,提高了特征分布的均匀性,有效避免了特征扎堆现象。此策略有助于提升SLAM精度、闭环识别性能,并确保全图特征量满足需求,灌篮源码安装避免了丢失追踪问题。
[LIDAR-SLAM] Iterative Closest Point (ICP)简单实现
迭代最近点算法(ICP)在激光SLAM领域中用于点云配准,旨在求解两组点云的相对位姿。本文简要介绍ICP算法的基本原理及其在点云配准中的应用,并集成简化版的Odometry实现。
ICP算法主要解决以下问题:给定两组点云,求解它们之间的相对位姿,而两组点云之间的匹配关系未知,且点的数量可能不同。算法通过迭代求解匹配关系并优化位姿。
对于已知匹配且点数相同的点云,可通过最小化特定公式求解位姿。首先,去除两组点云的质心,然后计算旋转矩阵和平移量,从而获得解析解。
在实际应用中,两组点云之间的匹配关系通常未知,因此ICP采用迭代方法。迭代流程包括:选择匹配点对、求解位姿、判断迭代收敛条件。通过遍历点云对,使用已知匹配求解方法计算位姿,orb源码matlab不断迭代直至满足收敛条件。
构建匹配点的关键是确定点对之间的欧式距离,选择最近邻点作为匹配。为避免错误匹配,通常设置距离阈值。通过与上一次迭代结果比较,剔除超出阈值的匹配点。
ICP算法实现通常基于特定库,例如PCL库。利用TUM提供的RGB-D数据进行测试,仅使用Depth生成点云,通过ICP计算相邻帧位姿变换,形成Odometry。以此方式,可生成相邻帧间轨迹。
ICP算法自x年提出以来,已发展出多种变体,主要区别在于匹配点选择策略、误差度量、以及优化算法的改进。
[ORB-SLAM2] 回环&DBoW视觉词袋
回环检测在SLAM系统中至关重要,它能有效降低全局误差,构建一致的地图。在跟踪丢失时,回环检测还能用于重定位。检测回环的方法主要有三种:image-to-image、map-to-map和image-to-map,其中,基于外观的image-to-image方法在大场景适应性上表现更佳。目前,常用的方法是基于视觉词袋的方法,特别是针对BRIEF特征的DBoW2方法,以及其改进版DBoW3。以下是对DBoW及其在ORB-SLAM中应用细节的总结。
### 回环检测的评价指标
在测试回环检测算法时,我们通常会关注四种可能的结果。通过在大量数据集上测试,我们能得到两个统计量:准确率(Precision)和召回率(Recall)。准确率描述的是被检测为回环的结果中真正属于回环的比例,这对于SLAM系统至关重要,我们希望其值尽可能高,避免误报。召回率则是实际回环中被检测出的比例,该值越高越好,但通常与准确率存在矛盾。
为了评估一个回环算法的性能,我们可以在不同参数设置下进行测试,并绘制准确率-召回率曲线。理想情况下,曲线的右上角应尽可能接近右上角,形成尽可能方正的形状。
### DBoW2视觉词袋原理
我们的目标是计算两张图像之间的相似度,以此判断是否出现回环。一种直接的方法是匹配特征点并统计匹配数量,但这过程耗时。为提高效率,我们可将特征抽象为单词,例如“车”、“猫”、“人”。通过比较图像中是否存在这些单词来判断图像相似性。这种方法仅关注单词的存在或不存在(0或1)。
在DBoW2中,BRIEF特征被聚类成预设数量的单词。一幅图像的特征点可以转换为单词表示,进而形成一个向量,用于比较两幅图像的相似性。计算相似度时,我们使用诸如汉明距离的分数计算方法。需要注意的是,实际应用中,单词的权重也考虑在内,且相似度计算方式可能有所不同。
### DBoW2单词生成
DBoW2通过在大量图像中提取特征,并利用K-Means算法聚类,生成预设数量的单词。为加速判断特征属于哪个单词,使用K叉树方法,实现快速查找。此外,DBoW2还构建了Direct Index和Inverse Index,分别用于存储与特定单词相关的特征索引,以及所有包含该单词的图像索引和权重信息。这些结构加速了图像相似度计算过程。
### DBoW2相似度计算
在构建词典后,DBoW2通过计算单词的TF-IDF(Term Frequency-Inverse Document Frequency)权重,来调整单词的相对重要性。这有助于区分在环境中出现频率不同的单词,提高算法的区分能力。
### ORB-SLAM中的回环处理
ORB-SLAM维护一个数据库,用于存储每个单词对应的观察关键帧。在检测回环时,关键帧会从数据库中进行搜索。这一过程类似于DBoW中的Inverse Index应用,但由ORB-SLAM自行管理。
在搜索闭环候选帧时,ORB-SLAM首先计算当前帧与其共视图帧之间的相似分数,选择最小值作为基准。然后,从数据库中查找具有共同单词的关键帧。通过一系列筛选条件,包括相似度阈值、共同单词数量、共视图关系等,最终确定闭环候选帧。
### 几何校验与闭环融合
闭环候选帧通过Sim3变换进行几何校验,确保变换的一致性。成功验证后,关键帧及其局部地图与闭环帧对齐,并更新共视图关系。这一过程整合了当前帧和闭环帧的地图信息,保持定位连续性。
### 优化过程
最后,基于Essential graph进行局部优化,随后进行全局BA(Bundle Adjustment),以进一步提高定位和地图构建的准确性。
总结而言,回环检测在SLAM系统中扮演着关键角色,通过高效地识别回环,可以有效降低系统误差,构建一致的地图。DBoW2及其在ORB-SLAM中的应用展示了如何在特征匹配、单词聚类、相似度计算、闭环检测和地图融合等方面优化SLAM系统的性能。
Cartographerè°å
ææ¯æ ç¾ï¼ Cartographeræ ¹æ®Cartographer_rosæ档翻è¯
Cartographeræ¯ä¸ä¸ªå¤æçç³»ç»ï¼è°æ´å®éè¦å¾å¥½å°çè§£å ¶å é¨å·¥ä½ãæ¤é¡µé¢è¯å¾ç´è§å°æ¦è¿°Cartographer使ç¨çä¸ååç³»ç»åå ¶é ç½®å¼ãå¦ææ¨å¯¹Cartographerçä»ç»ä¸ä» ä» æå ´è¶£ï¼è¿åºåèCartographer论æãå®ä» æè¿°äº2D SLAMï¼ä½å®ä¸¥æ ¼å®ä¹äºæ¤å¤æè¿°ç大å¤æ°æ¦å¿µãè¿äºæ¦å¿µé常ä¹éç¨äº3Dã
W. Hess, D. Kohler, H. Rapp, and D. Andor, Real-Time Loop Closure in 2D LIDAR SLAM , in Robotics and Automation (ICRA), IEEE International Conference on . IEEE, . pp. â.
Cartographerå¯ä»¥çä½æ¯ä¸¤ä¸ªç¬ç«ä½ç¸å ³çåç³»ç»ã第ä¸ä¸ªæ¯LocalSLAMï¼ææ¶ä¹ç§°ä¸ºå端æå±é¨è½¨è¿¹æ建å¨ï¼ãå®çå·¥ä½æ¯å»ºç«ä¸ç³»ååå¾ãæ¯ä¸ªåå¾é½æ¯æ¬å°ä¸è´çï¼ä½æ们æ¥åLocalSLAMéçæ¶é´çæ¨ç§»èæ¼ç§»ã大å¤æ°å°æ¹SLAMé项ä¸å¯ä»¥æ¾å° install_isolated/share/cartographer/configuration_files/trajectory_builder_2d.lua 为2Då install_isolated/share/cartographer/configuration_files/trajectory_builder_3d.lua 为3Dãï¼å¯¹äºæ¬é¡µçå ¶ä½é¨åï¼æ们å°åèTRAJECTORY_BUILDER_nDä½ä¸ºå¸¸ç¨é项ï¼
å¦ä¸ä¸ªåç³»ç»æ¯å ¨å±SLAMï¼ææ¶ç§°ä¸ºå端ï¼ãå®å¨åå°çº¿ç¨ä¸è¿è¡ï¼å ¶ä¸»è¦å·¥ä½æ¯æ¾å°åç¯çº¦æãå®éè¿å¯¹åå¾çæ«æå¹é æ¥å®ç°ãå®è¿ç»åäºå ¶ä»ä¼ æå¨æ°æ®ï¼ä»¥è·å¾æ´é«çº§å«çè§å¾ï¼å¹¶ç¡®å®æä¸è´çå ¨å±è§£å³æ¹æ¡ãå¨3Dä¸ï¼å®è¿è¯å¾æ¾å°éåæ¹åãå®ç大å¤æ°é项é½å¯ä»¥å¨ install_isolated / share / cartographer / configuration_files / pose_graph.luaä¸æ¾å°ã
å¨æ´é«çæ½è±¡ä¸ï¼LocalSLAMçå·¥ä½æ¯çæè¯å¥½çåå¾ï¼èå ¨å±SLAMçå·¥ä½æ¯å°å®ä»¬æä¸è´å°ç»åå¨ä¸èµ·ã
æµè·ä¼ æå¨ï¼ä¾å¦ï¼LIDARï¼æä¾å¤ä¸ªæ¹åç深度信æ¯ãä½æ¯ï¼æäºæµéä¸SLAMæ å ³ãå¦æä¼ æå¨é¨å被ç°å°è¦çæè å¦æå®è¢«å¼åæºå¨äººçä¸é¨åï¼åä¸äºæµéè·ç¦»å¯è¢«è§ä¸ºSLAMçåªå£°ãå¦ä¸æ¹é¢ï¼ä¸äºæè¿çæµéä¹å¯è½æ¥èªä¸éè¦çæºï¼åå°ï¼ä¼ æå¨åªå£°ï¼ï¼å¹¶ä¸ä¹ä¸SLAMæ å ³ã为解å³è¿äºé®é¢ï¼Cartographeré¦å åºç¨å¸¦é滤波å¨ï¼å¹¶ä» å°èå´å¼ä¿æå¨æ个æå°åæ大èå´ä¹é´ãåºæ ¹æ®æºå¨äººåä¼ æå¨çè§æ ¼éæ©æå°å¼åæ大å¼ã
注æ
å¨2Dä¸ï¼Cartographerå°æ¯max_rangeæ´æ¢èå´ TRAJECTORY_BUILDER_2D.missing_data_ray_length ãå®è¿æä¾äºå°3Dç¹äºè¿æ»¤ä¸º2Dåå²çå¼ max_z å min_z å¼ã
注æ
å¨Cartographeré ç½®æ件ä¸ï¼æ¯ä¸ªè·ç¦»é½ä»¥ç±³ä¸ºåä½å®ä¹
è·ç¦»æ¯å¨ä¸æ®µæ¶é´å æµéçï¼èæºå¨äººå®é ä¸æ£å¨ç§»å¨ãä½æ¯ï¼è·ç¦»æ¯ç±å¤§åROSæ¶æ¯ä¸çâæ¹éâä¼ æå¨æä¾çãCartographerå¯ä»¥ç¬ç«èèæ¯ä¸ªæ¶æ¯çæ¶é´æ³ï¼ä»¥èèæºå¨äººè¿å¨å¼èµ·çç¸åãCartographerè¿è¡æµéé¢çè¶é«ï¼æµéç»æç»åæä¸ä¸ªå¯ä»¥ç«å³æè·çå个ç¸å¹²æ«æå°±è¶å¥½ãå æ¤ï¼å¼ºç建议éè¿æ«ææä¾å°½å¯è½å¤ç rangedata ï¼ROSæ¶æ¯ï¼ã
Rangedataé常ä»æºå¨äººä¸çå个ç¹æµéï¼ä½æ¯ä»¥å¤ä¸ªè§åº¦æµéãè¿æå³çé è¿ç表é¢ï¼ä¾å¦éè·¯ï¼ç»å¸¸è¢«å»ä¸å¹¶æä¾è®¸å¤ç¹ãç¸åï¼è¿å¤çç©ä½ä¸å¸¸è¢«å»ä¸å¹¶ä¸æä¾è¾å°çç¹æ°ã为äºåå°ç¹å¤çç计ç®æéï¼æ们é常éè¦å¯¹ç¹äºè¿è¡ä¸éæ ·ãç¶èï¼ç®åçéæºæ½æ ·å°ä»æ们已ç»å ·æä½å¯åº¦æµéçåºå移é¤ç¹ï¼å¹¶ä¸é«å¯åº¦åºåä»å°å ·ææ¯æéæ´å¤çç¹ã为äºè§£å³è¿ä¸ªå¯åº¦é®é¢ï¼æ们å¯ä»¥ä½¿ç¨ä¸ä¸ªä½ç´ 滤波ï¼å°åå§ç¹ä¸éæ ·ä¸ºä¸ä¸ªæå®å¤§å°çç«æ¹ä½ï¼å¹¶åªä¿çæ¯ä¸ªç«æ¹ä½çè´¨å¿ã
è¾å°çç«æ¹ä½å¤§å°å°å¯¼è´æ´å¯éçæ°æ®è¡¨ç¤ºï¼ä»è导è´æ´å¤è®¡ç®ãè¾å¤§çç«æ¹ä½å¤§å°ä¼å¯¼è´æ°æ®ä¸¢å¤±ï¼ä½ä¼æ´å¿«ã
å¨åºç¨äºåºå®å°ºå¯¸çä½ç´ 滤éåï¼Cartographerè¿åºç¨äºèªéåºä½ç´ 滤éãæ¤è¿æ»¤å¨å°è¯ç¡®å®æä½³ä½ç´ 大å°ï¼å¨æ大é¿åº¦ä¸ï¼ä»¥å®ç°ç®æ ç¹æ°ãå¨3Dä¸ï¼ä¸¤ä¸ªèªéåºä½ç´ 滤波å¨ç¨äºçæé«å辨çåä½å辨çç¹äºï¼å®ä»¬ç使ç¨å°å¨ LocalSLAMä¸ éæã
æ¯æ§æµéåå å¯ä»¥æ¯SLAMçæç¨ä¿¡æ¯æºï¼å 为å®æä¾ç²¾ç¡®çéåæ¹åï¼å æ¤ï¼å°é¢ï¼åæºå¨äººæ转çåæä½è¯å¥½çæ´ä½æ示ã为äºè¿æ»¤IMUåªå£°ï¼å¨ä¸å®æ¶é´å è§å¯å°éåãå¦ææ¨ä½¿ç¨2D SLAMï¼åå¯ä»¥å®æ¶å¤çèå´æ°æ®èæ éé¢å¤çä¿¡æ¯æ¥æºï¼å æ¤æ¨å¯ä»¥éæ©æ¯å¦è¦è®©Cartographer使ç¨IMUã使ç¨3D SLAMï¼æ¨éè¦æä¾IMUï¼å 为å®ç¨ä½æ«ææ¹åçåå§çæµï¼å¤§å¤§éä½äºæ«æå¹é çå¤ææ§ã
注æ
å¨Cartographeré ç½®æ件ä¸ï¼æ¯æ¬¡å®ä¹å¼é½ä»¥ç§ä¸ºåä½
ä¸æ¦æ«æç»è£ 并ä»å¤ä¸ªèå´æ°æ®ä¸è¿æ»¤ï¼å°±å¯ä»¥ä¸ºLocalSLAMç®æ³å好åå¤ãLocalSLAM 使ç¨æ¥èªä½å§¿ä¼°è®¡å¨çåå§ä¼°è®¡éè¿æ«æå¹é å°æ°æ«ææå ¥å ¶å½ååå¾æé ä¸ãä½å§¿ä¼°è®¡å¨èåçæ³æ³æ¯ä½¿ç¨é¤æµè·ä»ªä¹å¤çå ¶ä»ä¼ æå¨çä¼ æå¨æ°æ®æ¥é¢æµä¸ä¸æ¬¡æ«æåºè¯¥æå ¥åå¾çä½ç½®ã
æ两ç§æ«æå¹é çç¥ï¼
æ 论åªç§æ¹å¼ï¼ CeresScanMatcher é½å¯ä»¥é 置为ç»æ¯ä¸ªè¾å ¥ä¸å®çæéãæéæ¯è¡¡é对æ°æ®ç信任度ï¼å¯ä»¥å°å ¶è§ä¸ºéæåæ¹å·®ãééåæ°çåä½æ¯æ é纲çæ°éï¼ä¸è½å¨å½¼æ¤ä¹é´è¿è¡æ¯è¾ãæ°æ®æºçæéè¶å¤§ï¼Cartographerå¨è¿è¡æ«æå¹é æ¶å°±ä¼è¶å¼ºè°è¿ä¸ªæ°æ®æºãæ°æ®æ¥æºå æ¬å ç¨ç©ºé´ï¼æ«æç¹ï¼ï¼ä½å§¿å¤æ¨å¨ï¼æ RealTimeCorrelativeScanMatcher ï¼ç平移åæ转
注æ
å¨3Dä¸ï¼ occupied_space_weight_0 å occupied_space_weight_1 åæ°åå«ä¸é«å辨çåä½å辨ç滤波ç¹äºç¸å ³ã
å¨ CeresScanMatcher ä»å¾å Ceres Solver ï¼ä»¥è°·æ为解å³é线æ§æå°äºä¹é®é¢çåºãæ«æå¹é é®é¢è¢«å»ºæ¨¡ä¸ºè¿æ ·çé®é¢çæå°åï¼å ¶ä¸ä¸¤ä¸ªæ«æä¹é´çè¿å¨ï¼åæ¢ç©éµï¼æ¯è¦ç¡®å®çåæ°ãCeres使ç¨ä¸éç®æ³é对ç»å®çè¿ä»£æ¬¡æ°ä¼åè¿å¨ãCereså¯ä»¥é ç½®ä¸ºæ ¹æ®æ¨èªå·±çéè¦è°æ´æ¶æé度ã
该 RealTimeCorrelativeScanMatcher å¯ä»¥æ ¹æ®æ¨å¨ä¼ æå¨çä¿¡ä»»è¿è¡åæ¢ãå®çå·¥ä½åçæ¯å¨æç´¢çªå£ä¸æ索类似çæ«æï¼æç´¢çªå£ç±æ大è·ç¦»åå¾åæ大è§åº¦åå¾å®ä¹ãå½ä½¿ç¨æ¤çªå£ä¸çæ«ææ§è¡æ«æå¹é æ¶ï¼å¯ä»¥ä¸ºå¹³ç§»åæ转ç»ä»¶éæ©ä¸åçæéãä¾å¦ï¼å¦ææ¨ç¥éæºå¨äººä¸ä¼æ转å¾å¤ï¼æ¨å¯ä»¥ä½¿ç¨è¿äºæéã
为é¿å æ¯ä¸ªåå¾æå ¥å¤ªå¤æ«æï¼ä¸æ¦æ«æå¹é å¨æ¾å°ä¸¤æ¬¡æ«æä¹é´çè¿å¨ï¼å®å°±ä¼éè¿è¿å¨æ»¤æ³¢å¨ãå¦æ导è´å®çè¿å¨ä¸å¤éè¦ï¼åæ«æå°è¢«å é¤ãä» å½æ«æçè¿å¨é«äºç¹å®è·ç¦»ï¼è§åº¦ææ¶é´éå¼æ¶ï¼æä¼å°æ«ææå ¥å°å½ååå¾ä¸ã
å½LocalSLAMå·²ç»æ¥æ¶å°ç»å®éçèå´æ°æ®æ¶ï¼è®¤ä¸ºåå¾æ建å®æãLocalSLAMä¼éçæ¶é´æ¼ç§»ï¼GlobalSLAMç¨äºè§£å³è¿ç§æ¼ç§»é®é¢ãåå¾å¿ 须足å¤å°ï¼ä»¥ä½¿å ¶å é¨çæ¼ç§»ä½äºå辨çï¼ä»¥ä¾¿å®ä»¬å¨å±é¨æ¯æ£ç¡®ãå¦ä¸æ¹é¢ï¼åå¾åºè¯¥è¶³å¤å¤§ä»¥ä½¿ç¯è·¯éåè½å¤æ£å¸¸å·¥ä½ã
åå¾å¯ä»¥å°å®ä»¬çèå´æ°æ®åå¨å¨å 个ä¸åçæ°æ®ç»æä¸ï¼æ广æ³ä½¿ç¨ç表示称为æ¦çç½æ ¼ãä½æ¯ï¼å¨2Dä¸ï¼è¿å¯ä»¥éæ©ä½¿ç¨æªæçæ符å·è·ç¦»åºï¼TSDFï¼ã
æ¦çç½æ ¼å°ç©ºé´åå为2Dæ3Dè¡¨æ ¼ï¼å ¶ä¸æ¯ä¸ªåå æ ¼å ·æåºå®å¤§å°å¹¶å å«è¢«éç¢ç©å æçæ¦çãæ ¹æ®â å½ä¸ âï¼æµéèå´æ°æ®ï¼åâ æªå½ä¸ âï¼ä¼ æå¨åæµéç¹ä¹é´çèªç±ç©ºé´ï¼æ´æ°Oddsã å½ä¸ å æªå½ä¸ å¯ä»¥å¨å ç¨æ¦ç计ç®ä¸åçæéï¼èµäºæ´å¤ææ´å°çä¿¡ä»»ã
å¨2Dä¸ï¼æ¯ä¸ªåå¾ä» åå¨ä¸ä¸ªæ¦çç½æ ¼ãå¨3Dä¸ï¼åºäºæ«æå¹é æ§è½çåå ï¼ä½¿ç¨ä¸¤ä¸ª æ··å æ¦çç½æ ¼ãï¼æ¯è¯âæ··åâä» æå é¨æ ç¶æ°æ®è¡¨ç¤ºå¹¶è¢«æ½è±¡ç»ç¨æ·ï¼
æ«æå¹é é¦å å°ä½å辨çç¹äºçè¿ç¹ä¸ä½å辨çæ··åç½æ ¼å¯¹é½ï¼ç¶åéè¿å°é«å辨çç¹ä¸é«å辨çæ··åç½æ ¼å¯¹é½æ¥ç»åä½å§¿ã
注æ
CartographerROSæä¾äºä¸ä¸ªå¯è§ååå¾çRVizæ件ãæ¨å¯ä»¥ä»å ¶ç¼å·ä¸éæ©è¦æ¥ççåå¾ãå¨3Dä¸ï¼RVizä» æ¾ç¤º3Dæ··åæ¦çç½æ ¼ç2Dæå½±ï¼ç°åº¦ï¼ãRViz左侧çªæ ¼ä¸æä¾äºé项ï¼å¯å¨ä½å辨çåé«å辨çæ··åç½æ ¼å¯è§åä¹é´åæ¢ã
TODOï¼ è®°å½TSDFé ç½®
å½LocalSLAMçæå ¶è¿ç»çåå¾æ¶ï¼å ¨å±ä¼åï¼é常称为â ä¼åé®é¢ âæâ ç¨çä½å§¿è°æ´ âï¼ä»»å¡å¨åå°è¿è¡ãå®çä½ç¨æ¯éæ°å®æå½¼æ¤ä¹é´çåå¾ï¼ä»¥ä¾¿å®ä»¬å½¢æä¸ä¸ªè¿è´¯çå ¨å±å°å¾ãä¾å¦ï¼è¯¥ä¼åè´è´£æ¹åå½åæ建ç轨迹以æ£ç¡®å°å¯¹åå ³äºç¯éåçåå¾ã
ä¸æ¦æå ¥äºä¸å®æ°éç轨迹èç¹ï¼å°±ä¼æ¹éè¿è¡ä¼åãæ ¹æ®æ¨è¿è¡å®çé¢çï¼æ¨å¯ä»¥è°æ´è¿äºæ¹æ¬¡ç大å°ã
注æ
å° POSE_GRAPH.optimize_every_n_nodes 设置为 0 æ¯ç¦ç¨å ¨å±SLAM并ä¸æ³¨äºLocalSLAMè¡ä¸ºç便æ·æ¹æ³ãè¿é常æ¯è°æ´Cartographerç第ä¸ä»¶äºã
å ¨å±SLAMæ¯ä¸ç§â GraphSLAM âï¼å®æ¬è´¨ä¸æ¯ä¸ç§ä½å§¿å¾ä¼åï¼å®éè¿å¨èç¹ååå¾ä¹é´æ建约æç¶åä¼åå¾å°ç约æå¾æ¥å·¥ä½ãå¯ä»¥ç´è§å°å°çº¦æè§ä¸ºå°ææèç¹æç»å¨ä¸èµ·çå°ç»³ç´¢ãç¨çä½å§¿è°æ´å®å ¨åºå®è¿äºç»³ç´¢ãçæçç½ç§°ä¸ºâ ä½å§¿å¾ âã
注æ
约æå¯ä»¥å¨RVizä¸å¯è§åï¼è°æ´å ¨å±SLAMé常æ¹ä¾¿ãè¿å¯ä»¥åæ¢ POSE_GRAPH.constraint_builder.log_matches 以è·å¾æ ¼å¼å为ç´æ¹å¾ç约ææ建å¨ç常è§æ¥åã
注æ
å®é ä¸ï¼å ¨å±çº¦æä¸ä» å¯ä»¥å¨å个轨迹ä¸æ¥æ¾å¾ªç¯éå ãå®ä»¬è¿å¯ä»¥å¯¹é½ç±å¤ä¸ªæºå¨äººè®°å½çä¸å轨迹ï¼ä½æ们å°ä¿çæ¤ç¨æ³ä»¥åä¸âå ¨å±æ¬å°åâç¸å ³çåæ°è¶ åºæ¬ææ¡£çèå´ã
为äºéå¶çº¦æï¼å计ç®ï¼çæ°éï¼Cartographerä» èèæ建约æçææå ³éèç¹çåéæ ·éãè¿ç±éæ ·ç常æ°æ§å¶ãéæ ·å¤ªå°çèç¹å¯è½å¯¼è´éè¿çº¦æåæ æç循ç¯éå ã对太å¤èç¹è¿è¡éæ ·ä¼éä½å ¨å±SLAMçé度并é»æ¢å®æ¶å¾ªç¯å ³éã
å½èèèç¹ååå¾å»ºç«çº¦ææ¶ï¼å®ä»¬ä¼éè¿å为ç第ä¸ä¸ªæ«æå¹é å¨ FastCorrelativeScanMatcher ã该æ«æå¹é å¨ä¸ä¸ºCartographer设计ï¼å¯å®ç°å®æ¶å¾ªç¯éåæ«æå¹é ãå¨ FastCorrelativeScanMatcher ä¾é â åæ¯å®ç âæºå¶å¨ä¸åçæ ¼ç¹å辨ççå·¥ä½ï¼ææå°æ¶é¤ä¸æ£ç¡®å¹é æ°ãè¿ç§æºå¶å¨æ¬æ件åé¢ä»ç»çå¶å¾æç« ä¸æ广æ³çä»ç»ãå®éç¨äºå¯ä»¥æ§å¶æ·±åº¦çæ¢ç´¢æ ã
ä¸æ¦ FastCorrelativeScanMatcher æ足å¤å¥½ç建议ï¼é«äºæä½å¹é åæ°ï¼ï¼ç¶åå°å ¶è¾å ¥Ceresæ«æå¹é å¨ä»¥æ¹è¿ä½å§¿ã
å½Cartographerè¿è¡ ä¼åé®é¢æ¶ ï¼Ceresç¨äºæ ¹æ®å¤ä¸ª æ®å·® éæ°æååå¾ãæ®å·®æ¯ä½¿ç¨å ææ失å½æ°è®¡ç®çãå ¨å±ä¼åå ·æææ¬å½æ°ä»¥èè大éæ°æ®æºï¼å ¨å±ï¼å¾ªç¯éå ï¼çº¦æï¼éå ¨å±ï¼å¹é å¨ï¼çº¦æï¼IMUå éåæ转æµéï¼å±é¨SLAMç²ç¥å§¿æ估计ï¼æµè·æºæåºå®æ¡æ¶ï¼å¦GPSç³»ç»ï¼ãå¯ä»¥æç § LocalSLAM é¨åä¸ç说æé ç½®æéåCeresé项ã
注æ
éè¿åæ¢ï¼å¯ä»¥æ¾å°æå ³ä¼åé®é¢ä¸ä½¿ç¨çæ®å·®çæç¨ä¿¡æ¯ POSE_GRAPH.max_num_final_iterations
ä½ä¸ºå ¶IMUæ®å·®çä¸é¨åï¼ä¼åé®é¢ä¸ºIMU姿ææä¾äºä¸äºçµæ´»æ§ï¼é»è®¤æ åµä¸ï¼Cereså¯ä»¥èªç±å°ä¼åIMUåè·è¸ªå¸§ä¹é´çå¤é¨æ ¡åãå¦ææ¨ä¸ä¿¡ä»»æ¨çIMUä½å§¿ï¼å¯ä»¥è®°å½Cereså ¨å±ä¼åçç»æ并ç¨äºæ¹è¿æ¨çå¤é¨æ ¡åãå¦æCeres没ææ£ç¡®ä¼åæ¨çIMUä½å§¿å¹¶ä¸æ¨å®å ¨ç¸ä¿¡æ¨çå¤å¨æ ¡åï¼åå¯ä»¥ä½¿æ¤ä½å§¿ä¿æä¸åã
å¨æ®å·®ä¸ï¼å¼å¸¸å¼çå½±åç±é ç½®ææ个Huberé表çHuberæ失å½æ°å¤çãHuberé表 è¶å¤§ ï¼ï¼æ½å¨ï¼å¼å¸¸å¼ çå½±åè¶å¤§ ã
ä¸æ¦è½¨è¿¹å®æï¼Cartographerå°±ä¼è¿è¡ä¸ä¸ªæ°çå ¨å±ä¼åï¼é常æ¯ä»¥åçå ¨å±ä¼åè¦å¤å¾å¤ãè¿æ ·åæ¯ä¸ºäºå®åCartographerçæç»ç»æï¼é常ä¸éè¦æ¯å®æ¶çï¼æ以大éçè¿ä»£é常æ¯æ£ç¡®çéæ©ã
ORB-SLAM2源码系列--局部建图线程(MapPointCulling和KeyFrameCulling)
ORB-SLAM2源码系列--局部建图线程详解
MapPointCulling模块负责筛选新加入的地图点,确保地图质量。在ProcessNewKeyFrame函数中,新点被暂存于mlpRecentAddedMapPoints。筛选过程包括:根据相机类型设定不同的观测阈值
遍历新点,若点已标记为坏点则直接从队列中移除
若点的观察帧数少于预期值的%,或者观察相机数量少于阈值cnThObs,即使过了两个关键帧也会被删除
只有经过三个关键帧且未被剔除的点,才会被认定为高质量点,仅从队列移除
另一方面,KeyFrameCulling则针对共视图中的关键帧进行冗余检测。步骤如下:提取当前关键帧的共视关键帧,并遍历它们
对于每个共视关键帧,检查其地图点:若至少有3个其他关键帧观测到,被认为是冗余点
对于双目或RGB-D,仅考虑近距离且深度值大于零的地图点
若关键帧%以上的有效地图点被判断为冗余,该关键帧将被标记为冗余并删除
这样的筛选机制确保了地图数据的准确性和效率。