刚刚在项目中使用的到了ceres,从完全不了解、到安装使用解决问题,花费了整整一个周的时间。所以使用的时候过程中踩了不少的坑,所以特别想记录下来。
ceres解决的问题
Ceres solver 是谷歌开发的一款用于非线性优化的库,在谷歌的开源激光雷达slam项目cartographer中被大量使用。ceres的官网比较详细的使用教程,内容还是挺丰富。
ceres主要用于解决如下的非线性最小二乘的问题
ρi(‖‖fi(xi1,…,xik)‖‖2) 这一部分被成为残差块(ResidualBlock),其中的fi(⋅) 叫做代价函数(CostFunction)。代价函数依赖于一系列参数[xi1,…,xik] ,这一系列参数(均为标量)称为参数块(ParameterBlock)。lj 和 uj 分别是变量块 xj 的上下边界。
安装
ceres可以通过命令行直接安装,也可以下载源码编译静态库使用。首先我们需要解决依赖的问题
依赖
ceres依赖挺多开源库的,但并不是必须的,可以在构建时关闭相应的依赖。
- Eigen是必须的。
- glog推荐使用,内部也提供了替代glog的minilog,但是性能赶不上glog,除了在android平台,其他平台建议使用glog。可以不用使用。
- gflags在测试和示例中有使用到。可以不用使用。
- SuiteSparse在解决大型稀疏线性系统所需。推荐使用。SuiteSparse需要BLAS和LAPACK。(我第一次编译的时候没有添加,为了加快求解的速度,不能不重新编译一下)
- CXSparse 与SuiteSparse类似,但更简单,更慢。 CXSparse不依赖于LAPACK和BLAS。 这使得构建过程更简单,二进制文件更小。可以不用使用。
命令行安装
安装依赖
$ sudo apt-get install cmake
# google-glog + gflags
$ sudo apt-get install libgoogle-glog-dev
# BLAS & LAPACK
$ sudo apt-get install libatlas-base-dev
# Eigen3
$ sudo apt-get install libeigen3-dev
# SuiteSparse and CXSparse (optional)
$ sudo apt-get install libsuitesparse-dev
# - However, if you want to build Ceres as a *shared* library, you must
# add the following PPA:
$ sudo add-apt-repository ppa:bzindovic/suitesparse-bugfix-1319687
$ sudo apt-get update
$ sudo apt-get install libsuitesparse-dev
下载源码编译ceres静态库
编译ceres依赖eigen和glog,因此需要先拉取eigen和glog。
# 拉取glog
$ git clone https://github.com/google/glog.git
# 修改option
# option (WITH_GFLAGS "Use gflags" OFF)
$ vi CMakeLists.txt
# 开始编译
$ cmake