当前位置: 首页 > 工具软件 > Go2o > 使用案例 >

ceres-solver和g2o性能比较

邢骏
2023-12-01

前言

ceres-solverg2o 是slam领域常见的优化器,其中ceres-solver被vins-mono使用,而g2o被orb-slam3使用,因此到底哪个优化器更适合于在slam算法开发中使用?

测试

分别基于这两种优化器实现BA过程,然后针对同一个仿真数据集进行测试,测试程序链接: https://github.com/chennuo0125-HIT/test/tree/main/ceres_g2o_comparer,按readme进行编译运行可得如下结果:

************** solve ba by g2o ***************
# Using EigenSparseCholesky poseDim 6 landMarkDim 3 blockordering 1
Performing full BA:
iteration= 0	 chi2= 238086189.574891	 time= 0.00782969	 cumTime= 0.00782969	 edges= 9135	 schur= 1	 lambda= 5991.771138	 levenbergIter= 1
iteration= 1	 chi2= 12982651.993440	 time= 0.00342487	 cumTime= 0.0112546	 edges= 9135	 schur= 1	 lambda= 1997.257046	 levenbergIter= 1
iteration= 2	 chi2= 657425.312444	 time= 0.00318212	 cumTime= 0.0144367	 edges= 9135	 schur= 1	 lambda= 665.752349	 levenbergIter= 1
iteration= 3	 chi2= 124163.255742	 time= 0.00287256	 cumTime= 0.0173092	 edges= 9135	 schur= 1	 lambda= 221.917450	 levenbergIter= 1
iteration= 4	 chi2= 75275.286988	 time= 0.00304911	 cumTime= 0.0203584	 edges= 9135	 schur= 1	 lambda= 73.972483	 levenbergIter= 1
iteration= 5	 chi2= 34439.999175	 time= 0.00264852	 cumTime= 0.0230069	 edges= 9135	 schur= 1	 lambda= 24.657494	 levenbergIter= 1
iteration= 6	 chi2= 22057.399494	 time= 0.00309912	 cumTime= 0.026106	 edges= 9135	 schur= 1	 lambda= 16.438330	 levenbergIter= 1
iteration= 7	 chi2= 18344.890824	 time= 0.00295518	 cumTime= 0.0290612	 edges= 9135	 schur= 1	 lambda= 5.479443	 levenbergIter= 1
iteration= 8	 chi2= 17868.574026	 time= 0.00397518	 cumTime= 0.0330364	 edges= 9135	 schur= 1	 lambda= 7.305924	 levenbergIter= 2
iteration= 9	 chi2= 17333.014982	 time= 0.00399876	 cumTime= 0.0370351	 edges= 9135	 schur= 1	 lambda= 9.741232	 levenbergIter= 2

point error before optimize: 2.96158
point error  after optimize: 0.462318


************** solve ba by ceres **************

Solver Summary (v 2.0.0-eigen-(3.3.7)-lapack-suitesparse-(5.7.1)-cxsparse-(3.2.0)-eigensparse-no_openmp)

                                     Original                  Reduced
Parameter blocks                          708                      706
Parameters                               2184                     2170
Effective parameters                     2169                     2157
Residual blocks                          9135                     9135
Residuals                               18270                    18270

Minimizer                        TRUST_REGION

Sparse linear algebra library    SUITE_SPARSE
Trust region strategy     LEVENBERG_MARQUARDT

                                        Given                     Used
Linear solver                    SPARSE_SCHUR             SPARSE_SCHUR
Threads                                     1                        1
Linear solver ordering              AUTOMATIC                   693,13
Schur structure                         2,3,6                    2,3,6

Cost:
Initial                          1.217168e+09
Final                            7.973251e+03
Change                           1.217160e+09

Minimizer iterations                        7
Successful steps                            7
Unsuccessful steps                          0

Time (in seconds):
Preprocessor                         0.005044

  Residual only evaluation           0.004244 (7)
  Jacobian & residual evaluation     0.010863 (7)
  Linear solver                      0.034270 (7)
Minimizer                            0.053454

Postprocessor                        0.000078
Total                                0.058576

Termination:                      CONVERGENCE (Function tolerance reached. |cost_change|/cost: 4.362464e-08 <= 1.000000e-06)


point error before optimize: 2.96158
point error  after optimize: 0.0354349

************** cost time **************
g2o cost time: 68.4571 [ms]
ceres cost time: 63.1568 [ms]

结论

基于"说明"中的仿真数据集,可以初步确定ceres-solver在优化精度和耗时方面都优于g2o.

说明

  1. 测试程序中的仿真数据来源于 g2o 中的 ba_demo.cpp,g2o测试用例也是基于该程序改的。
  2. 该测试用例只使用了一组仿真数据集,不足以获得较全面的结论,如果大家有好的测试用例或者别的结论,可以保持交流,我的邮箱: chennuo0125@163.com
 类似资料: