Ceres是谷歌开发的广泛使用的最小二乘问题求解库。用户只需要按照一定的步骤定义待解的优化问题然后交给求解器计算。最小二乘问题一般格式如下:
使用Ceres求解非线性优化问题,一共分为三个部分:
1、 第一部分:构建cost fuction,即代价函数,也就是寻优的目标式。这个部分需要使用仿函数(functor)这一技巧来实现,做法是定义一个cost function的结构体,在结构体内重载()运算符,具体实现方法后续介绍。
2、 第二部分:通过代价函数构建待求解的优化问题。
3、 第三部分:配置求解器参数并求解问题,这个步骤就是设置方程怎么求解、求解过程是否输出等,然后调用一下Solve方法。
也就是寻优的目标式。这个部分需要使用仿函数(functor)这一技巧来实现,做法是定义一个cost function的结构体,在结构体内重载()运算符,具体实现方法后续介绍
假设代价函数为
仿函数参考:
C++ 仿函数_Dablelv的博客专栏-CSDN博客_c++仿函数
第一个参数1:代价函数的维度,在本例中为1,第二个参数为参数块的维度本例中只有一个x也为1。分别对应之前结构体中的residual和x。
将第一部分创建的代价函数CostFunctor传入到此处
优化过程中,求导方式有三种分别为,自动求导,数值求导,解析求导。
这一部分很好理解,创建一个Option,配置一下求解器的配置,创建一个Summary。最后调用Solve方法,求解。
解析求导即我们自己输入雅克比矩阵,不再使用优化库的自动求导方式,速度上会比自动求导的方式快一些。
形式上稍有不同
只有在声明优化函数时与自动求导稍有不同,因为已经知道了雅可比,所以直接创建优化对象即可。
第三部分与解析求导相同
深蓝学院多传感器融合第三节课件
slam十四讲
C++ 仿函数_Dablelv的博客专栏-CSDN博客_c++仿函数
一文助你Ceres 入门——Ceres Solver新手向全攻略_福尔摩睿的工作站-CSDN博客_ceres solver