1.ubuntuä¸G2Oåºçå®è£
2.C++加持让python程序插上翅膀——利用pybind11进行c++和python联合编程示例
3.g2o:非线性优化与图论的源码结合
4.非线性优化(三):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库是bigdecimal次方计算源码一个纯头文件的库,其实只要从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函数,ap6330源码可以接收来自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,是用于解决非线性优化问题的一种工具。它的核心在于提供了一种通用的框架,通过自定义图中的顶点和边,几乎可以处理任何能够用图表示的阅读android源码顺序优化问题。常见应用如bundle adjustment、ICP、数据拟合等。
从技术实现层面看,g2o是一个基于C++的开源项目,采用cmake构建。它广泛使用模板类来实现高度可扩展性和灵活性,特别是通过Eigen库来处理矩阵运算。
在g2o的类结构中,`SparseOptimizer`是核心类,它封装了一个优化问题的图,并通过添加顶点和边进行构建。优化过程包括选择求解器和迭代算法。求解器通常从PCG、CSparse、Cholmod中选择,而迭代算法则包括Gauss-Newton、Levernberg-Marquardt以及Powell's dogleg。
优化流程主要分为四个步骤,包括定义问题、选择求解器、APP短视频源码配置参数、执行优化。流程图展示了这些步骤的实现逻辑。
在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系统中的优化机制。