【牛熊分界源码】【bspatch源码分析】【leveldb源码解析】g2o源码

2024-11-08 00:13:13 来源:重装系统源码 分类:百科

1.ubuntu上G2O库的安装
2.C++加持让python程序插上翅膀——利用pybind11进行c++和python联合编程示例
3.g2o:非线性优化与图论的源码结合
4.非线性优化(三):g2o源代码

g2o源码

ubuntu上G2O库的安装

       ä¸€ã€ä»€ä¹ˆæ˜¯G2O库?有什么用?

        g2o 是一个图优化库。常常在SLAM 中被使用。

        图优化本质上仍然是非线性优化。只不过利用图的方式表现出来,使问题 可视化 ,然后可以根据可视化的结果来更好的调整优化过程。

        图  æ˜¯ä¸€ç§æ•°æ®ç»“构。在图优化中,用 顶点  (vertex) 表示 优化变量 ,用 è¾¹  (edge) 表示 误差项 。于是,对于任意一个上述形式的非线性最小二乘问题,都可以构建一个与之对应的图。

        在视觉SLAM 十四讲中,常用的后端优化库有两个:g2o 和ceres。ceres 是google 的一个优化库,文档详尽且友好,就不再赘述了。但对于g2o,除了源码,官方用doxygen 生成的帮助文档,就只有论文  g2o: A general framework for graph optimization  å’Œè¿™ç¯‡github 的 文档 。

        二、如何安装G2O库?有哪些依赖项?在安装和使用的过程中,会遇到哪些问题,以及如何解决?

        1安装步骤

        git clone .archive.ubuntu.com/ubuntu bionic/universe amd freeglut3 amd 2.8.1-3

        connetciton failed [IP:... ]

        Err:2 .archive.ubuntu.com/ubuntu bionic/universe amd freeglut3-dev amd 2.8.1-3

        connetciton failed [IP:... ]

        E:Failed to fetch  .archive.ubuntu.com/ubuntu/pool/universe/f/freeglut/freeglut3_2.8.1-3_amd.deb connection failed  [IP:... ]

        E:Failed to fetch  .archive.ubuntu.com/ubuntu/pool/universe/f/freeglut/freeglut3-dev_2.8.1-3_amd.deb connection failed  [IP:... ]

        E:Unable to fetch some archives, maybe run apt-get install libglut-dev

        最终 解决方案 ,  æ›´æ¢ sources.list 阿里源 清华镜像。

        apt-get update

        apt-get upgrade

       3在使用g2o时,编译用到了g2o库的project,遇到报错error: ‘index_sequence’ is not a member of 'std'

        解决方案 ,修改project的CMakeLists.txt添加:set(CMAKE_CXX_STANDARD )

       å‚考链接:

        Ubuntu. 更换 sources.list 阿里源 清华镜像 – 小固件 (atmcu.com)

        (条消息) 视觉SLAM十四讲 报错 error: ‘index_sequence’ is not a member of ‘std‘_CSSDCC的博客-CSDN博客

        (条消息) 视觉SLAM十四讲 报错 error: ‘index_sequence’ is not a member of ‘std‘_CSSDCC的博客-CSDN博客

C++加持让python程序插上翅膀——利用pybind进行c++和python联合编程示例

       在当今的计算机视觉和机器学习领域,Python 和 C++ 是源码两种最常用的编程语言。Python 以其简单易学、源码高效编程和强大的源码科学计算库而闻名,而 C++ 则以其高效性和强大的源码计算能力而著称。然而,源码牛熊分界源码这两种语言各有优劣,源码因此将它们结合起来使用可以发挥它们的源码优点,同时弥补它们的源码缺点。在本文中,源码我们将介绍如何在 Windows VS 环境下使用 pybind 进行 C++ 和 Python 联合编程示例,源码进行机器视觉和相机位姿优化相关的源码程序开发。我们将使用 Python 3.7 和 C++,源码并利用 numpy 数组格式接收 Python 侧的源码两幅图像,并利用 g2o 进行 BA 优化,源码最后将优化结果以 numpy 数组形式返回 Python。

       首先,我们需要安装 pybind 库。pybind 是一个用于将 C++ 代码绑定到 Python 解释器的库,它提供了一种简单的方法来创建 Python 模块,这些模块可以直接调用 C++ 代码。

       pybind库是bspatch源码分析一个纯头文件的库,其实只要从github上下载源码,即可供使用。

       python侧,可以进入conda虚拟环境,注意需要3.7版本的python,直接pip安装:

       安装 pybind 库后,我们可以开始编写 C++ 代码。以g2o ba为例,我们将 上篇博文中的c++代码进行稍加改造,开个python的调用“接口”即可:

       使用bybind,需要将下载的头文件路径引入项目,同时,需要将python3.7的头文件路径及lib引入及链接进项目。 (1)头文件路径加入:

       (2)python3.7的lib加入:

       (3)生成动态库dll类型:

       cpp中添加头文件及导出模块

       在c++程序中去掉main函数,添加头文件,及导出模块设置:

       如上两图,在常规c++文件中首位加入头文件和导出模块定义,我们这次导出的是ab这个函数,ab是将 上篇博文的main函数改成的。

       cpp中添加numpy相关数据结构的接收和返回

       如上,我们ab函数,leveldb源码解析可以接收来自python的图像numpy数组,并将图像转化为了cv::mat格式,交给c++后续处理。最后返回numpy形式的g2o优化后的位姿数组:

       编译生成dll后改成导出模块同名文件的.pyd

       将生成的dll改成g2opy.pyd

       进入与c++依赖的同一个python环境,然后编辑简单的调用程序:

       两帧图像送入c++,优化计算后返回输出:

       本篇所有源码已上传,链接如下: python实现C++程序g2o的ba优化模块调用,python侧的程序资源 本资源为python和C++联合编程的示例vs工程源码

       通过本文的示例,我们验证了如何在 Windows VS 环境下使用 pybind 进行 C++ 和 Python 联合编程的可行性,可进一步进行机器视觉和相机位姿优化相关的程序开发。 有了C++的加持,python的机器人开发在性能上或者是解决方案上,又有了更多的可选项。可以发挥python的更大威力了,keep go on!

g2o:非线性优化与图论的结合

       g2o,全名General Graph Optimization,是用于解决非线性优化问题的一种工具。它的核心在于提供了一种通用的框架,通过自定义图中的顶点和边,几乎可以处理任何能够用图表示的影视源码图标优化问题。常见应用如bundle adjustment、ICP、数据拟合等。

       从技术实现层面看,g2o是一个基于C++的开源项目,采用cmake构建。它广泛使用模板类来实现高度可扩展性和灵活性,特别是通过Eigen库来处理矩阵运算。

       在g2o的类结构中,`SparseOptimizer`是核心类,它封装了一个优化问题的图,并通过添加顶点和边进行构建。优化过程包括选择求解器和迭代算法。求解器通常从PCG、CSparse、Cholmod中选择,而迭代算法则包括Gauss-Newton、Levernberg-Marquardt以及Powell's dogleg。

       优化流程主要分为四个步骤,包括定义问题、选择求解器、webview内核源码配置参数、执行优化。流程图展示了这些步骤的实现逻辑。

       在g2o中,优化求解器是关键,主要负责求解线性方程。线性求解器可以采用Cholesky分解、PCG迭代或Dense方法,也可以利用Eigen库的稀疏Cholesky分解。BlockSolver定义了一系列针对不同位姿和观测点维度的优化器结构,如g2o::BlockSolver_6_3、g2o::BlockSolver_7_3、g2o::BlockSolver_3_2。

       在实现层面,`OptimizationAlgorithm`类提供了Gauss-Newton、Levenberg-Marquardt和Dogleg算法,其中Dogleg法特别适用于优化问题的求解。`SparseOptimizer`类提供了接口,允许用户添加顶点和边,最终调用优化方法。

       顶点部分提供了基础类`Vertex`,允许用户定义不同的顶点类型,例如3D旋转使用四元数表示。g2o预定义了一些常用的顶点类型供用户直接使用。

       边的定义分为一元边、二元边和多元边,分别用于连接一个顶点、两个顶点或多个顶点。边类提供了接口来定义测量值和连接的顶点类型,预定义了一些边缘类型以简化应用。

       源码解读部分,建议深入g2o的官方文档和源代码,进行详细的代码分析和实验,以深入了解其内部实现和优化策略。

非线性优化(三):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提供了基本的节点和边的操作,如获取、设置等,同时也包含了更复杂的功能,如节点和边的合并、删除等。

       OptimizableGraph继承自HyperGraph,进一步丰富了Vertex和Edge的实现,为图优化提供了更具体的接口。OptimizableGraph引入了海塞矩阵和b向量的概念,以及与之相关的操作,如获取海塞矩阵元素、设置参数位置等。此外,它还支持通过栈操作(pop、push)来管理节点信息。

       在OptimizableGraph之上,SparseOptimizer作为优化操作的对象,实现了优化的接口,并提供了初始化、辅助函数以及优化的核心函数。SparseOptimizer通过内部类实现了Vertex和Edge的实例化,为具体的优化算法提供了操作图的接口。

       在实现细节方面,BaseVertex和BaseEdge类继承了OptimizableGraph中的相应类,实现了节点和边的基本功能。BaseVertex类负责记录节点的海塞矩阵、b向量和估计值,并提供了数值求导的备份和恢复功能。BaseEdge类则负责处理测量信息和信息矩阵的计算,包括计算误差、构造二次形式等。此外,不同类型的边(BaseUnaryEdge、BaseBinaryEdge、BaseMultiEdge)通过继承BaseEdge类,实现了不同链接节点数量的边的特殊操作。

       鲁棒核函数的实现是g2o优化框架中一个关键部分,它在处理非线性优化问题时提供了鲁棒性,确保了优化过程的稳定性。g2o通过RobustKernel虚基类提供了设置和获取核函数参数的接口,并在具体实现中使用了简化版本的计算公式,以保证信息矩阵的正定性。

       最后,OptimizationAlgorithm类定义了优化器的一系列接口,如初始化、计算边际值和求解等。g2o的优化算法包括GN、LM和dog-leg,它们分别实现了不同的求解策略,而具体的矩阵求解任务则通过Solver类及其派生类(如BlockSolver)完成。BlockSolver类提供了一个通用框架,允许用户自定义线性求解器,如直接求解、迭代求解等。

       综上所述,g2o通过层次化的类结构,提供了从抽象到具体、从基础到进阶的图优化解决方案,其设计旨在高效、鲁棒地解决SLAM中的后端优化问题。深入理解g2o的源代码,对于开发者和研究者来说,不仅能够提高优化算法的实现效率,还能深刻理解SLAM系统中的优化机制。

本文地址:http://5o.net.cn/html/51a67399275.html 欢迎转发