@
在许多优化问题中,尤其是传感器融合问题,必须对存在于称为流形的空间中的数量进行建模,例如由四元数表示的传感器的旋转/方向。其中流型中的加法用⊞表示。以旋转矩阵更新为例:
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 是一个二维向量,并且用户希望保持第一个坐标不变。Δ是一个标量,那么⊞定义为: