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

12.高博博客中

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

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

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

下一步要做的

ORBSLAM2中的g2o优化器

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容