1.前言
g2o是根据边来保存每一个代价函数,它是在边类中构造误差函数,构造边的时候,会设置顶点、测量值、协方差矩阵等。而在ceres中,用problem类型来构造最终的目标函数。先是使用AddResidualBlock来添加代价函数,代价函数和核函数等构造成目标函数。
在ceres中,代价函数就是误差项,目标函数是由很多误差项的范数的平方再各自乘以核函数除以2得到的。
2.定义代价函数类型,定义其create成员来使用ceres当中的AutoDiff特性
所谓的定义代价函数类型是定义了一个SnavelyReprojectionError.h文件,它的构造函数中用的成员变量是observed_x,observed_y,会把传入的值赋值给observed_x,observed_y,这两个值是测量值,在重载运算符()中,只有输入camera,point,residuals,那么camera,point就会计算出预测值,和测量值相减,就可以得到误差项。
而ceres::AutoDiffCostFunction的参数就是这个SnavelyProjectionError类和2,9,3,输入值就是SnavelyProjectionError类。
3.ceresBundle.cpp 添加代价函数
定义point_block_size和camera_block_size,这里是3和9
定义points和cameras指针,返回值分别是parameters_+cmear_block_size()*num_cameras_;和parameters_
定义观测值常量指针observations,返回值是2*num_observations_的列。observations数据不能更改。没有给出观测值的具体值啊,这个是要读取的。
根据观测值数量做一个for循环,定义代价函数指针cost_function.它的值形式就是SnavelyProjectionError.h的create函数,输入变量是observations[2*i+0],observations[2*i+1].
定义损失函数指针为loss_function,这里的损失函数类似于鲁棒核函数,也是用来怕不好的数据点影响迭代效果的。它的值为如果params.robustify是健壮的,就用HuberLoss(1.0)函数,这里的delta定位1.0.如果不健壮就为NULL.
定义数据指针camera,point为cameras+9*camera_index()[i]和points+3*point_index()[i];
point_index为num_observations_长度的列,camera_index同样。

然后往问题里添加代价函数就可以了。是这么添加的
problem->AddResidualBlock(cost_function,loss_function,camera,point)
只有放入代价函数,损失函数,放入camera,point这个SnavelyProjectionError.h就可以用到这两个值得到代价函数的形式。看problem.h可以看到,在problem类中,添加目标函数的变量都是指针形式,分别是代价函数,损失函数,x0和x1.
ResidualBlockId AddResidualBlock(CostFunction* cost_function,
LossFunction* loss_function,
double* x0, double* x1);
4.ceresBundle.cpp 用ParameterBlockOrdering来管理Schur的消元顺序
定义SetOrdering函数来做。在函数里分别定义
num_points,points_block_size,指针points,points值为parameters_ + camera_block_size() * num_cameras_; 跟之前一样。
还有num_cameras,camera_block_size,指针cameras.
如果参数的ordering值为"automatic",那么跳出函数,否则
定义ParameterBlockOrdering指针 ordering.
用ordering的AddElementToGroup对变量进行编号从而定义消元顺序。这里设置点云变量为0,相机变量为1.
先做points的循环
ordering->AddElementToGroup(points+point_block_size*i,0);
然后把ordering放到ceres的求解器options中
options->linear_solver_ordering.reset(ordering)
5.ceresBundle.cpp 设置优化策略
ceres设置优化策略等直接对Solver::Options的类型成员进行赋值就可以了,很方便。
这里设了一个setSolverOptionsFromFlags函数,变量有bal_problem用来提供各种参数值的,params用来判断的,options选择优化策略的。
来看options的几个参数值。
max_num_iterations:最大迭代次数
minimizer_progress_to_stdout:要不要输出到cout,如果输出,填true;
num_threads:用于计算的线程数目,可以加速雅克比矩阵的计算。
trust_region_strategy_type:下降策略的选取
linear_solver_type:增量方程如何求解,例如ceres::DENSE_QR.
设置好options之后,把它放入之前的SetOrdering函数,对schur消元进行排序。
6求解的设置
也还是options的参数
gradient_tolerance=1e-16;梯度
function_tolerance=1e-16:两次迭代之间目标函数之差的阈值。
定义统计信息summary,然后一次把options,&problem,&summary放入求解 函数solve就可以了。其中options是设置求解策略和阈值等的,problem是用来设置目标函数是怎么求得,summary是求解之后的统计信息。

 

ceres求解BA第10章的更多相关文章

  1. g2o求解BA 第10章

    1.g2o_bal_class.h1.1 projection.hg2o还是用图模型和边,顶点就是相机和路标,边就是观测,就是像素坐标.只不过这里的相机是由旋转(3个参数,轴角形式,就是theta*n ...

  2. BA模型 第10章

    1.BA模型BA模型就是世界坐标到像素坐标的转换过程.这里多了一个去畸变.因为归一化平面坐标在转成像素坐标的过程中会出现畸变.这里只处理了径向畸变,径向畸变包括桶形失真和枕形失真,都是由于图像放大率随 ...

  3. 《构建之法》之第8、9、10章读后感 ,以及sprint总结

    第8章: 主要介绍了软件需求的类型.利益相关者,获取用户需求分析的常用方法与步骤.竞争性需求分析的框架NABCD,四象限方法以及项目计划和估计的技术. 1.软件需求:人们为了解决现实社会和生活中的各种 ...

  4. 敏捷软件开发:原则、模式与实践——第10章 LSP:Liskov替换原则

    第10章 LSP:Liskov替换原则    Liskov替换原则:子类型(subtype)必须能够替换掉它们的基类型(base type). 10.1 违反LSP的情形 10.1.1 简单例子 对L ...

  5. 孙鑫视频学习:对第10章设置线宽时为什么不调用UpDateData(TRUE)的理解

    在第10章10.2.1小节中,首先分别对视图类和对话框类添加了一个名为m_nLineWidth的int型变量,再将用户在CSetting dlg对话框的edit控件中输入的线宽值记录在dlg.m_nL ...

  6. 第10章 系统级I/O

    第10章 系统级I/O 10.1 Unix I/O 一个Unix文件就是一个m个字节的序列:B0,B1,…,BK,…,Bm-1 Unix I/O:一种将设备优雅地映射为文件的方式,允许Unix内核引出 ...

  7. 高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化

    高性能Linux服务器 第10章    基于Linux服务器的性能分析与优化 作为一名Linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.但硬件问题.软件问题.网络环境等 ...

  8. Linux就这个范儿 第10章 生死与共的兄弟

    Linux就这个范儿 第10章 生死与共的兄弟 就说Linux系统的开机.必须经过加载BIOS.读取MBR.Boot Loader.加载内核.启动init进程并确定运行等级.执行初始化脚本.启动内核模 ...

  9. 【翻译】《深入解析windows操作系统第6版下册》第10章:内存管理

    [翻译]<深入解析windows操作系统第6版下册>第10章:内存管理(第一部分) [翻译]<深入解析windows操作系统第6版下册>第10章:内存管理(第二部分) [翻译] ...

随机推荐

  1. glsl镜面水倒影的实现[转]

    http://blog.sina.com.cn/s/blog_78ea87380101ejbf.html 使用两相机,一个master相机, 主要负责场景的渲染, 另一个rtt相机, 和master相 ...

  2. 转:maven2创建一个eclipse工程,设置M2_REPO

    from: http://tonychanhoho.iteye.com/blog/1584324 M2_REPO是一个用来定义 maven 2仓库在硬盘中的存储位置,windows默认是C:\User ...

  3. 出自 HTML4 规范的可用颜色字符串值列表(常用颜色名称及对应的十六进制值)

    据称由于 HTML5 没有修改专属的颜色,HTML4 的颜色都可以在 HTML5 中正确显示. 出自 HTML4 规范的可用颜色字符串值列表如下,此表来源是 http://www.lovean.com ...

  4. MAC - 命令行中用sublime打开指定文件,使用ln命令建立软链接

    眼下sublime是mac下最好的文本编辑软件.常常要使用它打开一些文件,比如html,js,txt,json等文件,可是sublime2默认不支持在命令行下调用.经过研究发现能够用建立软连接的方式调 ...

  5. AutoCAD如何又快又好标注直径

    如下图所示,想要标注一条直径.先选择快速标注   鼠标单击左右两侧线条(变成虚线),然后按回车,就可以往下拖了.拖完了就是一条直径的标注.   如果想要修改为自己的尺寸,则在文字替换中加上前缀%%c即 ...

  6. iOS开发中地图与定位

    不管是QQ还是微信的移动client都少不了定位功能,之前在微信demo中没有加入定位功能,今天就写个定位的小demo来了解一下定位和地图的东西. 地图和定位看上去是挺高大上一东西.其有使用方法比Ta ...

  7. webstrom 应用 转(http://blog.csdn.net/zghekuiwu/article/details/54382145)

    WebStorm 是 JetBrains 推出的一款商业的 JavaScript 开发工具 任何一个编辑器都需要保存(ctrl + s),这是所有win平台上编辑类软件的特点,但是webstorm编辑 ...

  8. hdu 4862 KM算法 最小K路径覆盖的模型

    http://acm.hdu.edu.cn/showproblem.php?pid=4862 选t<=k次,t条路要经过全部的点一次而且只一次. 建图是问题: 我自己最初就把n*m 个点分别放入 ...

  9. 【强网杯2018】逆向hide

    这是事后才做出来的,网上没有找到现成的writeup,所以在这里记录一下 UPX加壳,而且linux下upx -d无法解,也无法gdb/ida attach 因为是64位,所以没有pushad,只能挨 ...

  10. apt-get update --> Bad header line (fresh install) Ign http://archive.ubuntu.com natty-security/multiverse Sources/DiffIndex W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/natty/Rele

    apt-get update --> Bad header line (fresh install) fresh natty install i386 desktop. I get this e ...