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采用迭代方法。迭代流程包括:选择匹配点对、求解位姿、判断迭代收敛条件。通过遍历点云对,使用已知匹配求解方法计算位姿,租房/公寓管理系统源码不断迭代直至满足收敛条件。
构建匹配点的关键是确定点对之间的欧式距离,选择最近邻点作为匹配。为避免错误匹配,通常设置距离阈值。通过与上一次迭代结果比较,剔除超出阈值的匹配点。
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,仅考虑近距离且深度值大于零的地图点
若关键帧%以上的有效地图点被判断为冗余,该关键帧将被标记为冗余并删除
这样的筛选机制确保了地图数据的准确性和效率。