本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始 文末正下方中心提供了本人 联系方式, 点击本人照片即可显示 W X → 官方认证 {\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式,\color{blue}点击本人照片即可显示WX→官方认证} 文末正下方中心提供了本人联系方式,点击本人照片即可显示WX→官方认证
一、前言在上一篇博客中,讲解了运行该示例代码环境的搭建,同时对 g2o 进行了简单的讲解。其实对于g2o(图优化)来说,只要理解了
顶点
(
V
e
r
t
e
x
)
\color{red}顶点 (Vertex)
顶点(Vertex) 与
边
(
E
d
g
e
)
\color{red}边(Edge)
边(Edge) ,那么接下下来的构图以及编程都是十分的简单,所以在进行代码讲解之前,先来看看 顶点 (Vertex) 与 边(Edge) 的介绍。该篇文章主要介绍顶点 Vertex,Edge 下篇文章中进行介绍。 主要分为以下几个部分:1、g2o的顶点(Vertex) 从哪里来的;2、g2o的顶点(Vertex) 参数如何理解;3、如何自己定义顶点;4、如何向图中添加顶点。这里先粘贴一下类的结构图:
二、g2o的顶点(Vertex) 从哪里来的
在源码 https://github.com/RainerKuemmerle/g2o 的 doc 目录中,可以看到一下 g2o.pdf 文件,该为教材文件,想深入了解的朋友可以认真查看。其上,上图也是来自于该文档。我们先来看其中关于顶点的这一部分,如下: 首先看到上面的类①HyperGraph::Vertex,其位于源码的 g2o/core/hyper_graph.h 文件中:
class G2O_CORE_API HyperGraph
{
public:
......
......
//! abstract Vertex, your types must derive from that one
class G2O_CORE_API Vertex : public HyperGraphElement {
......
......
};
上的的代码表示 class HyperGraph 包含了 class Vertex ,并且 Vertex 继承于 HyperGraphElement。另外通过注释,可以知道 class Vertex 是一个抽象类,上图②OptimizableGraph::Vertex 由其派生而来,或者说 ②OptimizableGraph::Vertex 继承于 HyperGraph::Vertex。如下所示,在 core/optimizable_graph.h 文件中,可以看到如下代码:
struct G2O_CORE_API OptimizableGraph : public HyperGraph {
......
......
/**
* \brief A general case Vertex for optimization
*/
class G2O_CORE_API Vertex : public HyperGraph::Vertex, public HyperGraph::DataContainer {
......
......
这里很明显可以看出来 OptimizableGraph::Vertex 继承于 HyperGraph::Vertex。不过,这个OptimizableGraph::Vertex 是比较底层的类,具体使用时一般会进行扩展,因此g2o中提供了一个比较通用的适合大部分情况的模板。也就是上图中的③BaseVertex,其在 g2o/core/base_vertex.h 中实现,代码如下:
/**
* \brief Templatized BaseVertex
*
* Templatized BaseVertex
* D : minimal dimension of the vertex, e.g., 3 for rotation in 3D
* T : internal type to represent the estimate, e.g., Quaternion for rotation in 3D
*/
template
class BaseVertex : public OptimizableGraph::Vertex {
public:
typedef T EstimateType;
typedef std::stack
BackupStackType;
static const int Dimension = D; ///< dimension of the estimate (minimal) in the manifold space
......
......
这样就弄清楚了 Vertex 的来源,但是这个模板类 BaseVertex 如何理解呢?
三、g2o的顶点(Vertex) 参数如何理解?因为常用的就是 class BaseVertex,所以我们对其进行讲解,其模板的参数分别为D 和 T,
1、D是int 类型的,表示vertex的最小维度,比如3D空间中旋转是3维的,那么这里 D = 3
2、T是待估计vertex的数据类型,比如用四元数表达三维旋转的话,T就是Quaternion 类型
class BaseVertex 源码中 D 是这样进行注释的:
static const int Dimension = D; ///< dimension of the estimate (minimal) in the manifold space
可以看到这个D并非是顶点(更确切的说是状态变量)的维度,而是其在流形空间(manifold)的最小表示,这里一定要区别开,另外,源码里面也给出了T的作用
typedef T EstimateType;
typedef std::stacksetEstimate ( Eigen::Vector3d ( p.x, p.y, p.z ) );
point->setMarginalized ( true );
optimizer.addVertex ( point );
}
六、结语
通过该篇博客,对于1、g2o的顶点(Vertex) 从哪里来的;2、g2o的顶点(Vertex) 参数如何理解;3、如何自己定义顶点;4、如何向图中添加顶点。四个环节已经讲解完成。下面来看看边(Edge)应该如何去理解与使用。