1.ORB-SLAM3 源码剖析:IMU 预积分
2.非线性优化(三):g2o源代码
3.深度科普:ORB-SLAM3论文重点导读及整体算法流程梳理
4.ORBSLAM系列|ORB-SLAM论文带读(一)(划重点)
5.hdl_graph_slam|后端优化|hdl_graph_slam_nodelet.cpp|源码解读(四)
6.ORB-SLAM2源码系列--局部建图线程(MapPointCulling和KeyFrameCulling)
ORB-SLAM3 源码剖析:IMU 预积分
IMU的源码数据结构在ORB-SLAM3中用于表示机体坐标系中的测量值。在特定时刻,解读加速度计测量线加速度和陀螺仪测量角速度。源码假设这些测量值包含高斯白噪声,解读且偏置建模为随机游走,源码其导数也是解读zxing源码解析高斯白噪声。将重力转换到机体坐标系后,源码得到连续视觉帧间的解读IMU预积分结果。这些预积分包括旋转、源码速度和位置测量,解读以及整个测量向量的源码协方差矩阵。
在ORB-SLAM3中,解读每帧的源码IMU预积分在tracking线程中计算,具体由Tracking::PreintegrateIMU()函数执行。解读每帧间的源码IMU测量通过src/ImuTypes.cc中的Preintegrated::IntegrateNewMeasurement()进行积分。主要步骤如下:首先进行偏置校正,然后计算位置、速度的增量,接着计算旋转的增量。旋转变化量以李代数中的旋转向量表示,并通过指数映射转换为旋转矩阵。旋转矩阵按旋转顺序右乘。最后,更新协方差矩阵,并调整与偏置修正相关的位置、速度和旋转雅可比。
IMU的偏置校正、测量、标定和预积分类定义在include/ImuTypes.h文件中。
值得注意的是,对于初学者,了解GDB调试方法是后台奖金结算源码提高ORB-SLAM3源码理解效率的重要步骤。GDB提供了一系列功能,允许开发者在运行程序时设置断点、查看变量值、追踪程序执行流程等,从而深入分析代码行为和潜在问题。
非线性优化(三):g2o源代码
新年伊始,让我们探讨一下g2o(通用图优化)在SLAM(Simultaneous Localization and Mapping)中的后端优化库应用。在《十四讲》中,我们对g2o有了初步的了解,并总结了其在SLAM中的使用情况。与ceres相比,g2o的文档较为简略,主要依赖于两篇论文进行参考。本文将深入探讨g2o的源代码,特别是核心文件夹中的部分,以揭示这个在SLAM领域广为人知的后端优化库的内在机理。
首先,让我们通过一张类关系图来直观理解g2o的架构。整个g2o系统分为三层:HyperGraph、OptimizableGraph、以及SparseOptimizer。HyperGraph作为最高层,提供了一个高度抽象的框架,其内部通过内类的方式实现了Vertex和Edge的结构。Vertex和Edge相互关联,Vertex存储与节点相关联的边的集合,而Edge则记录了与之链接的节点信息。HyperGraph提供了基本的节点和边的操作,如获取、设置等,同时也包含了更复杂的kesion网校系统源码功能,如节点和边的合并、删除等。
OptimizableGraph继承自HyperGraph,进一步丰富了Vertex和Edge的实现,为图优化提供了更具体的接口。OptimizableGraph引入了海塞矩阵和b向量的概念,以及与之相关的操作,如获取海塞矩阵元素、设置参数位置等。此外,它还支持通过栈操作(pop、push)来管理节点信息。
在OptimizableGraph之上,SparseOptimizer作为优化操作的对象,实现了优化的接口,并提供了初始化、辅助函数以及优化的核心函数。SparseOptimizer通过内部类实现了Vertex和Edge的实例化,为具体的优化算法提供了操作图的接口。
在实现细节方面,BaseVertex和BaseEdge类继承了OptimizableGraph中的相应类,实现了节点和边的基本功能。BaseVertex类负责记录节点的海塞矩阵、b向量和估计值,并提供了数值求导的备份和恢复功能。BaseEdge类则负责处理测量信息和信息矩阵的计算,包括计算误差、构造二次形式等。此外,不同类型的边(BaseUnaryEdge、BaseBinaryEdge、gdb 设置源码路径BaseMultiEdge)通过继承BaseEdge类,实现了不同链接节点数量的边的特殊操作。
鲁棒核函数的实现是g2o优化框架中一个关键部分,它在处理非线性优化问题时提供了鲁棒性,确保了优化过程的稳定性。g2o通过RobustKernel虚基类提供了设置和获取核函数参数的接口,并在具体实现中使用了简化版本的计算公式,以保证信息矩阵的正定性。
最后,OptimizationAlgorithm类定义了优化器的一系列接口,如初始化、计算边际值和求解等。g2o的优化算法包括GN、LM和dog-leg,它们分别实现了不同的求解策略,而具体的矩阵求解任务则通过Solver类及其派生类(如BlockSolver)完成。BlockSolver类提供了一个通用框架,允许用户自定义线性求解器,如直接求解、迭代求解等。
综上所述,g2o通过层次化的类结构,提供了从抽象到具体、从基础到进阶的图优化解决方案,其设计旨在高效、鲁棒地解决SLAM中的后端优化问题。深入理解g2o的源代码,对于开发者和研究者来说,不仅能够提高优化算法的实现效率,还能深刻理解SLAM系统中的优化机制。
深度科普:ORB-SLAM3论文重点导读及整体算法流程梳理
本文将深入解读ORB-SLAM3的github下载spring源码关键特点和整体算法流程,它革新了视觉和视觉惯性SLAM系统。首先,ORB-SLAM3作为首个实现短期、中期、长期数据关联的单目和双目系统,显著优于同类技术,尤其在实时性和准确性方面,其性能是其他方法的2-倍。通过几何和局部一致性检查,召回率提高,地图准确性增强。
使用Atlas结构表示断开地图,实现位置识别、相机重定位等操作时的无缝拼合。
抽象的相机表示允许灵活支持不同相机模型,只需提供投影、非投影和雅可比函数。
ORB-SLAM3系统由几个核心组件组成,包括活跃地图的跟踪线程、局部建图线程以及回环和地图合并线程。系统利用ORB-SLAM2和ORB-SLAM-VI作为基础,通过IMU初始化技术,支持单目和立体惯性SLAM。跟踪线程负责实时定位和建图,利用视觉和惯性信息进行优化。
局部建图线程在关键帧区域进行地图构建和优化,利用IMU参数进行最大后验估计。
回环和地图合并线程通过因子图处理地图的融合和回环检测,确保地图的精度和一致性。
在视觉-惯导SLAM中,系统不仅估计相机位姿,还涉及速度、惯性传感器偏置等。通过将视觉和惯性信息结合,形成一个最小化问题,通过因子图表示优化过程。 ORB-SLAM3的源码解析和实际应用将随后进行,对视觉惯性导航和多地图SLAM有兴趣的读者不容错过。ORBSLAM系列|ORB-SLAM论文带读(一)(划重点)
本文介绍了一种名为ORB-SLAM的新型单目SLAM系统,该系统在各种环境条件下都能实时运行。ORB-SLAM具有鲁棒性,支持宽基线回环和重定位,并且提供全自动初始化。系统的核心设计是基于相同的特征用于跟踪、建图、重定位和回环,这使得系统高效、简单且可靠。ORB特征因其对视角和光照变化的鲁棒性而被采用,允许在不依赖GPU的情况下实现实时性能。系统在大环境下的实时运行能力归功于共视图的使用,跟踪和建图着重于局部共视区域,与全局地图尺寸无关。实时回环检测通过基于位姿图(本质图)的优化实现,而实时重定位则支持从跟踪失败中恢复位姿,并增强地图重用性。系统还引入了一种新的基于模型选择的自动且鲁棒的初始化过程,允许创建平面和非平面场景的初始化地图。一种针对地图点和关键帧选择的适者生存策略提高了跟踪的鲁棒性,并且减少了冗余关键帧,增强了长时间运行的能力。
ORB-SLAM在广泛评估中证明了其优越性,特别是在室内和室外环境的主流公开数据集上的评估。与最先进的单目SLAM方法相比,ORB-SLAM实现了前所未有的性能。系统被设计为完整且可靠,提供了一种最高效、精确且易于实施的解决方案。出于造福SLAM社区的目的,源代码已公开,以便其他研究者和开发者能够利用和改进这一系统。演示视频和代码可以在项目网页上找到。
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源码系列--局部建图线程(MapPointCulling和KeyFrameCulling)
ORB-SLAM2源码系列--局部建图线程详解
MapPointCulling模块负责筛选新加入的地图点,确保地图质量。在ProcessNewKeyFrame函数中,新点被暂存于mlpRecentAddedMapPoints。筛选过程包括:根据相机类型设定不同的观测阈值
遍历新点,若点已标记为坏点则直接从队列中移除
若点的观察帧数少于预期值的%,或者观察相机数量少于阈值cnThObs,即使过了两个关键帧也会被删除
只有经过三个关键帧且未被剔除的点,才会被认定为高质量点,仅从队列移除
另一方面,KeyFrameCulling则针对共视图中的关键帧进行冗余检测。步骤如下:提取当前关键帧的共视关键帧,并遍历它们
对于每个共视关键帧,检查其地图点:若至少有3个其他关键帧观测到,被认为是冗余点
对于双目或RGB-D,仅考虑近距离且深度值大于零的地图点
若关键帧%以上的有效地图点被判断为冗余,该关键帧将被标记为冗余并删除
这样的筛选机制确保了地图数据的准确性和效率。视觉SLAMORB-SLAM:让人Orz的SLAM
ORB-SLAM,在视觉SLAM领域享有盛誉,其源码在GitHub上已有4.4K+Star,充分彰显了西班牙小哥的出色贡献。近期深入研究其论文并结合源码,体验了一番酸爽,发现它在SLAM领域确实有着独特的魅力与贡献。
ORB-SLAM的核心框架由三个并发进程组成:跟踪、局部建图和回环检测,系统结构清晰,功能分明。跟踪是主进程,负责定位和跟踪相机运动,通过特征匹配实现定位与优化。局部建图则负责关键帧与地图点的插入、删除及局部优化。回环检测则通过搜索回环关键帧,实现位姿图优化,确保系统鲁棒性。
特征提取是ORB-SLAM的关键之一,它采用ORB特征,兼顾性能与效率。与SURF、SIFT等相比,ORB提取速度快,每张仅需.3ms,适用于实时操作。ORB在FAST角点基础上加入方向信息,使BRIEF描述子旋转不变,同时利用图像金字塔和灰度质心法提取特征,实现尺度不变性。此外,通过网格划分与四叉树结构,ORB-SLAM确保特征点分布均匀,即使特征点不足,也可通过调整FAST阈值增加。
单目初始化是ORB-SLAM的另一大亮点,它通过特征点匹配计算基础矩阵和单应矩阵,自动判断场景类型,无需人工设定模型。共视图与本质图结构则加强了关键帧间的联系,实现高效回环检测。相机重定位策略确保了系统在跟踪失败时能快速恢复,关键帧与地图点的删增策略则优化了系统性能。
ORB-SLAM提供多样化的Bundle Adjustment方式,包括初始化阶段的全BA、跟踪过程的运动BA及局部建图阶段的局部BA,适应不同场景需求。整个系统庞大复杂,通过总结主要特性,虽有其精髓,但仍需深入研究,以充分理解其工作原理与优化策略。
总之,ORB-SLAM在视觉SLAM领域展现出了其独特魅力与贡献,从其高效的特征提取到灵活的系统框架,再到多样化的优化策略,无不体现其在SLAM技术中的卓越地位。向所有SLAM领域的先驱者致以崇高的敬意。