您当前的位置: 首页 > 
  • 2浏览

    0关注

    417博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

史上最简SLAM零基础解读(10.2) - g2o(图优化)→顶点 (Vertex)编程细节

江南才尽,年少无知! 发布时间:2022-09-27 17:31:53 ,浏览量:2

本人讲解关于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)应该如何去理解与使用。

     

关注
打赏
1592542134
查看更多评论
立即登录/注册

微信扫码登录

0.0382s