Ceres Learning
githut
0 参考资料
(1)Ceres Solver
(2)Ceres-Solver学习笔记(1)
(3)Ceres-Solver学习笔记(2)
(4)Ceres-Solver学习笔记(3)
(5)Ceres-Solver学习笔记(4)
(6)Ceres-Solver学习笔记(5)
(7)Ceres-Solver学习笔记(6)
(8)Ceres-Solver学习笔记(7)
(9)Ceres-Solver学习笔记(8)
(10)Ceres-Solver学习笔记(9)
1 练练手
1.1 非约束最优化问题
argminxf(x)=12(10−x)2(1)
步骤
(1)编写CostFunction结构体。必须重载运算符(),必须使用模板类型,所有输入参数和输出参数都使用模板类型。
(2)构造一个求解非线性最小二乘法的Problem来进行未知数求解。
1.2 曲线拟合
(1)魏尔斯特拉斯函数(Weierstrass function)
f(x)=∑n=0Nancos(bnπx)(2)
其中0<a<1,b为正奇数,且满足ab>1+32π
(2)Weierstrass图像绘制

(3)步骤
(3.1)构造数据。设置参数a=0.3,b=7,n=200 。
(3.2)编写CostFunction结构体。
(3.3)构造一个求解非线性最小二乘法的Problem来进行未知数求解。
(4)总结
(4.1)利用ceres无法对非线性函数进行曲线拟合,如魏尔斯特拉斯函数。原因包括两点:函数无法进行微分求解和初始点难以选取。
(4.2)此处改为ceres对y=eax2+b函数进行曲线拟合,其中 a=0.3,b=0.1 。该函数图如下所示:

(4.3)可以采用三种方法对问题进行求解,即:在进行Problem构建时,采用AutoDiffCostFunction或NumericDiffCostFunction进行数值微分求解;当无法使用模板来创建costfunctor时,继承SizedCostFunction类来实现Problem。
1.3 单像空间后方交会问题
(1)共线方程
⎧⎩⎨⎪⎪x−x0=−fa1(X−Xs)+b1(Y−Ys)+c1(Z−Zs)a3(X−Xs)+b3(Y−Ys)+c3(Z−Zs),y−y0=−fa2(X−Xs)+b2(Y−Ys)+c2(Z−Zs)a3(X−Xs)+b3(Y−Ys)+c3(Z−Zs)(3)
其中x0,y0,f已知,abc为旋转矩阵,可以利用ϕ,ω,κ表示如下:
⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪a1=cosϕcosκ−sinϕsinωsinκ,a2=−cosϕsinκ−sinϕsinωcosκ,a3=−sinϕcosω,b1=cosωsinκ,b2=cosωcosκ,b3=−sinω,c1=sinϕcosκ+cosϕsinωsinκ,c2=−sinϕsinκ+cosϕsinωcosκ,c3=cosϕcosω(4)
(2)步骤
(2.1)读入数据,格式为(x,y,X,Y,Z) 。前2维像素坐标—单位mm ,后三维代像坐标—单位m 。
(2.2)编写CostFunction结构体。
(2.3)构造一个求解非线性最小二乘法的Problem来进行未知数求解。
(3)运行结果

1.4 Powell’s Quartic Function
(1)数学表达式
f(X)=(x1+10x2)2+5(x3−x4)2+(x2−2x3)4+10(x1−x4)4(5)
其中:
∙−10≤xi≤10,i=1,2,3,4
∙fmin(X∗)=0
∙x∗i=0
(2)Powell’s Quartic Function分解
f1(x)f2(x)f3(x)f4(x)F(x)=x1+10x2=5‾√(x3−x4)=(x2−2x3)2=10‾‾‾√(x1−x4)2=[f1(x),f2(x),f3(x),f4(x)](6)
(3)最优化问题数学描述
argminx12‖F(x)‖2(7)
(4)步骤
(4.1)编写CostFunction结构体。
(4.2)构造一个求解非线性最小二乘法的Problem来进行未知数求解。
(5)运行结果

1.5 Bundle Adjustment
(1)BA数据集
Bundle Adjustment in the Large
备注:此处使用Ladybug Dataset:problem-49-7776-pre.txt.bz2
(2)BA问题
ceres solver学习之bundle adjustment

(3)步骤
(3.1)读取problem-49-7776-pre.txt.bz2数据。
(3.2)编写CostFunction结构体。
(3.3)构造一个求解非线性最小二乘法的Problem来进行未知数求解。
(4)运行结果
