文章目录
Ceres Solver是谷歌开源的C++非线性优化库,能够解决有约束或无约束条件下的非线性最小二乘问题。2010年之后大量的运用在谷歌的产品开发中,尤其在谷歌开源的cartographer中被大量的使用。
ceres可以在Linux,Windows,macOS,Andrioid,IOS系统进行安装使用,详情可查看下方的官网链接。
题外话:ceres被命名是由于高斯使用了最小二乘方法成功的预测了绕行至太阳背后的小行星ceres的位置。
Ceres Solver 官网:http://ceres-solver.org/
github:https://github.com/ceres-solver/ceres-solver
一. 简介
ceres可以解决带有约束条件的非线性最小二乘问题,数学表达如下:
min X ∑ i 1 2 ρ i ( ∥ f i ( x i 1 , . . . , x i k ) ∥ 2 ) s . t . l j ≤ x j ≤ u j \underset{X}{\min}\sum_{i} \frac{1}{2} ρ_i(∥f_i(x_{i_1},...,x_{i_k})∥^2)\\s.t.\ l_j≤x_j≤u_j Xmini∑21ρi(∥fi(xi1,...,xik)∥2)s.t. lj≤xj≤uj
- ρ i ( ∥ f i ( x i 1 , . . . , x i k ) ∥ 2 ) ρ_i(∥f_i(x_{i_1},...,x_{i_k})∥^2) ρi(∥fi(xi1,...,xik)∥2):残差块(ResidualBlock)
- f i ( ⋅ ) f_i(\cdot) fi(⋅):代价函数(CostFunction),,在slam中称为误差项它的参数块表示为 [ x i 1 , . . . , x i k ] [x_{i_1},...,x_{i_k}] [xi1,...,xik]
- l j 和 l j l_j 和 l_j lj和lj:分别表示参数块 x j x_j xj的下界和上界
- ρ i ρ_i ρi:损失函数(LossFunction)或称为核函数,它属于标量函数,为了减小异常值对非线性优化的影响。
特殊情况:当损失函数 ρ i = x ρ_i=x ρi=x,并且 l j = − ∞ l_j=-∞ lj=−∞, u j = ∞ u_j=\infty uj=∞。那么得到了一个常见的非线性优化函数:
1 2 ∑ i ( ∥ f i ( x i 1 , . . . , x i k ) ∥ 2 ) \frac{1}{2}\sum_{i} (∥f_i(x_{i_1},...,x_{i_k})∥^2) 21i∑(∥fi(xi1,...,xik)∥2)
ceres求解的一般步骤:
- 定义Cost Function模型,即代价函数。也就是我们要寻找的最优目标,这里我们用到了仿函数或称为拟函数(functor)。做法是写一个类,然后在仿函数中重载()运算符。
- 使用定义的代价函数构建待求解的优化问题。即调用AddResidualBlock将误差项,添加到目标函数中。由于优化需要梯度,我们有几种选择:1)使用ceres自动求导(Auto Diff)2)使用数值求导(Numeric Diff)3)自行推导解析形式,提供给ceres。
- 配置求解器参数并求解问题。配置项options比较丰富,可以查看options的定义。
二. Hello World
本例来自于:examples/helloworld.cc
为了快速入门,我们现在举一个简单的例子,待优化的函数形式如下:
1 2 ( 10 − x ) 2 \frac{1}{2}(10-x)^2 21
3715





被折叠的 条评论
为什么被折叠?



