g2o优化器系列1

参考资料:

[1] 深入理解图优化与g2o:g2o篇
[2]SLAM14讲 6.4 曲线拟合程序
[3]SLAM14讲 7.8.2 PNP中使用g2o
[4]SLAM14讲 7.9.2 ICP中非线性优化
[5]SLAM14讲 8.5.2 定义直接法的边
[6]SLAM14讲 9.3 改进PNP的结果
[7]SLAM14讲 10.3.2 g2o求解BA
[8]SLAM14讲 11.2.1 g2o原生位姿图
[9]SLAM14讲 11.2.2 李代数上的位姿图优化
[10]shenlancollege BALDaset
[11]shenlancollege directBA
[12]g2o优化器相关程序整理

g2o整体介绍

g2o输入是优化变量,输出是优化变量。g2o优化器就像1个盒子,你可以设置优化变量(即顶点)的类型以及优化变量的个数,误差项(即便)的定义。

g2o代码中要注意的地方

1.曲线拟合程序中共有3个未知数,为什么不是3个优化变量呢?
相机位姿是一个优化变量,空间点坐标是一个优化变量,所以我们类比出模型参数也是一个优化变量。
2.协方差矩阵的维度由什么决定?
测量值的维度决定,在setInformation里进行设定。
3.什么时候需要自己定义顶点和边?
你可以自定义顶点的类型,继承basevertex;自定义边的类型,继承baseedge。
4.如何减少去离群点的影响?
用鲁棒核函数。可以见[7]。
5.g2o中用ceres进行求导?
这个可以不用去做。
6.如何保存优化的数据?
参见[7]。

void* memcpy(void* dest,const void* stc,size_t n);
//从src起始地址开始拷贝n个字节到目标dest所指的内存地址当中

7.稀疏求解器和还是稠密求解器怎么选择?
目前试了,没啥区别。具体问题的时候得考虑把。
8.如何写出优化器?
把大神的程序输入,输出看懂,就是模仿。
9.边的个数?
就是误差项的个数,曲线拟合程序中数据有100个,那么边就有100.
10.对优化器中的各种变量不熟悉?
看g2o源码,就可以找到定义了。参考高博[1]的指点。
11.一元边和二元边的写法中要注意的问题?
一元边程序[2]和[4]中:

typedef g2o::BlockSolver > BLock;
//3是优化变量的维度,1是测量值的维度,理解不了的话,可以理解为误差的维度,可以看源码是什么意思,不要乱猜
typedef g2o::BlockSolver > BLock;
//6是优化变量的维度,3是测量值的维度,理解不了的话,可以理解为误差的维度,可以看源码是什么意思,不要乱猜

12.高博博客中

v->setFixed(true);//第一个点固定为0,不知道啥干啥的
 
v->setMarginalized(true);//加速求解的,得加上,不然报错

setParameterId(0,0);//没找到相关的,你可以类比
setRobustKernel(...);//设定鲁棒核函数
edges.push_back(...);//没啥用的,

13.不懂的话看源码,禁止乱猜,类比优秀的程序

下一步要做的

ORBSLAM2中的g2o优化器

你可能感兴趣的:(g2o优化器系列1)