@[toc]

一、ceres::LocalParameterization

在许多优化问题中,尤其是传感器融合问题,必须对存在于称为流形的空间中的数量进行建模,例如由四元数表示的传感器的旋转/方向。其中流型中的加法用⊞表示。以旋转矩阵更新为例:
在这里插入图片描述

LocalParameterization 接口允许用户定义参数块并与它们所属的流形相关联。它通过定义 Plus (⊞) 运算及其在 Δ=0 处相对于 Δ 的导数来实现。

class LocalParameterization {
 public:
  virtual ~LocalParameterization() {}
  // 流型空间中的加法
  virtual bool Plus(const double* x,   
                    const double* delta,
                    double* x_plus_delta) const = 0;
  // 计算雅克比矩阵
  virtual bool ComputeJacobian(const double* x, double* jacobian) const = 0;
  // local_matrix = global_matrix * jacobian
  virtual bool MultiplyByJacobian(const double* x,
                                  const int num_rows,
                                  const double* global_matrix,
                                  double* local_matrix) const;
  virtual int GlobalSize() const = 0; // 参数块 x 所在的环境空间的维度。
  virtual int LocalSize() const = 0; // Δ 所在的切线空间的维度
};

二、ceres自带的实例

2.1 IdentityParameterization()

欧式空间中的流型:
在这里插入图片描述

2.2 QuaternionParameterization

四元数的流型
在这里插入图片描述

2.3 EigenQuaternionParameterization

Eigen对四元数的元素采用了与通常使用的不同的内部内存布局。具体来说,Eigen将元素以(x,y,z,w)的形式存储在内存中,即实部(w)作为最后一个元素存储。注意,在通过构造函数创建Eigen四元数时,元素是按w,x,y,z的顺序接受的。

2.4 SubsetParameterization

假设 x 是一个二维向量,并且用户希望保持第一个坐标不变。Δ是一个标量,那么⊞定义为:
在这里插入图片描述

2.5 HomogeneousVectorParameterization

2.6 LineParameterization

2.7 ProductParameterization