一、方法总览
使用g2o进行优化的时候,总体流程大约需要如下几个步骤:
is-a: 表示继承关系
has-a、has-many:表示包含关系
二、举例说明
十四讲中的一个例子。我们来看下怎么使用g2o实现非线性优化。
1. 代码实现
基本就是按照总览中的图来进行配置:
- 设置线性求解器
- 使用线性求解器初始化BlockSolver
- 使用BlockSolver的指针初始化solver(这时候选择具体的solver形式)
- 设置优化器:配置优化器的求解方案为solver
- 往图模型中添加对应的节点和边
- 最后执行优化
头文件:
代码实现如下所示:
2. 对应图模型
这个例子中的对应图模型样子:
其中每条边就是每次观测。
在这个例子中,每次的观测就是(x, y)数据值。
3. 对应的点和边的写法
顶点部分
- 确定点的维度和数据类型
- 设置估计值,也就是初始值
- 设置点的更新方式(如果是旋转的话,更新就不是简单的加法)
边部分
- 确定边的维度(error维度),数据类型和对应顶点的数据类型
- 确定计算误差方式(通常需要计算雅克比)
三、自定义边
通常做优化,最重要也最容易出错的地方,就是定义边。
继承的话,如下四个函数必须重写。
函数具体解释:
另外的一些重要参数: