SLAM学习——Ceres

一、安装配置

  • 依赖
# CMake
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)
# - If you want to build Ceres as a *static* library (the default)
#   you can use the SuiteSparse package in the main Ubuntu package
#   repository:
sudo apt-get install libsuitesparse-dev
  • 安装
tar zxf ceres-solver-1.14.0.tar.gz
mkdir ceres-bin
cd ceres-bin
cmake ../ceres-solver-1.14.0
make -j3
make test
# Optionally install Ceres, it can also be exported using CMake which
# allows Ceres to be used without requiring installation, see the documentation
# for the EXPORT_BUILD_DIR option for more information.
make install
  • CMakeLists.txt配置
# 添加cmake模块以使用ceres库
list( APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules )

# 寻找Ceres库并添加它的头文件
find_package( Ceres REQUIRED )
include_directories( ${CERES_INCLUDE_DIRS} )

# 添加CERES_LIBRARIES依赖
add_executable(main  # 输出名为main的可执行文件
   ./src/main.cpp
)
target_link_libraries( main ${CERES_LIBRARIES} )

二、使用

求解步骤

  1. 定义Cost Function(损失函数)模型,也就是寻优的目标式。这个部分使用仿函数(functor)来实现,做法是定义一个Cost Function的结构体,在结构体内重载()运算符。
  2. 通过代价函数构建待求解的优化问题。
  3. 配置求解器参数并求解问题,这个步骤就是设置方程怎么求解、求解过程是否输出等,然后调用一下Solve方法。

2.1 构造代价函数结构体

2.1.1 自动求导

自动求导构造误差函数变量需要全部为T类型,operator()为模板函数。

一次函数

y = 1 2 ⋅ ( 10 − x ) 2 y = \frac{1}{2} \cdot (10-x)^2 y=21(10x)2

x x x使得 y y y最小(最接近0)

struct CostFunctor
{
    template 
    bool operator()(const T *const x,// 模型参数,一维
                          T *residual) const // 残差  
    {
        residual[0] = T(10.0) - x[0];
        return true;
    }
};

曲线拟合

y = e x p ( a x 2 + b x + c ) + w y = exp(ax^2+bx+c)+w y=exp(ax2+bx+c)+w

假设有一条满足该方程的曲线,其中 a , b , c a,b,c a,b,c为曲线参数, w w w为噪声(理想条件下为0)

struct CURVE_FITTING_COST
{
    CURVE_FITTING_COST(double x,double y):x_(x),y_(y){}
    template