南昌企业网站设计深圳百度推广客服
写在前面:时至今日,网络上随便一搜能找到各种关于g2o的教程,但大多数文章让你看完后,有一种不知道自己懂没有懂的感觉。本文想从g2o是干什么的、怎么干的(定义顶点和边的一些疑问点),在弄清楚这些之后,如何对g2o进行封装接口,实现为自己所用。能够实现最后一步也说明比较好的掌握了g2o的使用。当然这样做还有好处就是可以很方便切换不同优化库的使用(如换成ceres),且程序框架比较清晰,遵从高聚低耦思想。
一、g2o是干什么的
机器人和计算机视觉的很多问题,如SLAM、BA,都可以表达为由图表示的非线性误差函数的最小化问题。例如基于图的slam问题,其状态变量是机器人在环境中的位置和机器人能观测到的地标点的位置。因此一个传感器测量数据仅仅依赖于和它相关联的两个状态变量中的位置信息。里程计测量信息也仅仅和其前后两次的状态变量中的位置信息相关。同样,对于一个地图点的位置也仅仅和能够看到它的那几帧对应的相机位姿相关。
这些问题都可以通过图来表示,图的每一个节点(Node)都表示一个可以优化的变量,两个变量之间的每一个边(Edge)代表了和它相连的两个成对的节点。这类问题,基本上都采用了优化方法提供一个可接受的数值解来解决这样的应用问题,比如 Gauss-Newton, Levenberg-Marquardt (LM), Gauss-Seidel relaxation,或variants of grad