Ceres LocalParameterization 理解

在Ceres 的SLAM pose_graph_3d中用到了 LocalParameterization这么一个东西,那么这个东西的意思是什么呢?

 

在g2o format文件中的各个点的定义使用的是 px,py,pz,qx,qy,qz,w这种形式的 前三个量带便的是该点的三位坐标 后面四个量的含义是该点的四元数,其实问题就出在这里了。

 

我们知道 四元数表示的是一个SO3,四元数表示的这个东西是一个有三个自由度的东西,然而四元数却有四维也就是四个自由度,这显然是不合理的,所以也就产生了一个单位四元数这么一个东西,单位四元数顾名思义 就是说四元数的四个量的二范数是1.这个其实是一个约束,这个约束就约束了四元数的一个自由度,这样其实四元数就只剩下三个自由度了正好符合一个SO3的维数。

 

然后在ceres里面,如果使用的是自动求导,然后再结合爬山法,那么每步迭代中都会产生一个四维的delta(迭代的增量,参考LM等算法),那么根据常规的爬山法,这样就仅仅需要将 原四元数“加上”这个迭代产生的delta就能够得到新的四元数了,这里问题就来了,直接加上以后这个四元数就不在是一个单位四元数了,就没有意义了,如果非得这么用的话就得每次迭代过后都将这个四元数进行一个归一化处理,这显然很麻烦,于是就产生了LocalParameterization,看看再Ceres库里面是怎么定义这个东西的。

在这个例子中 使用的是一个LocalParameterization的一个继承类LocalParameterization,看看这个东西的定义:


class CERES_EXPORT EigenQuaternionParameterization
    : public ceres::LocalParameterization {
 public:
  virtual ~EigenQuaternionParameterization() {}
  virtual bool Plus(const double* x,
                    const double* delta,
                    double* x_plus_delta) const;
  virtual bool ComputeJacobian(const double* x, double* jacobian) const;
  virtual int GlobalSize() const { return 4; }
  virtual int LocalSize() const { return 3; }
};

这其实就狠容易理解了,GlobalSize 就是表示他真正的维数是一个4维的,LocalSize是告诉Ceres他表示的东西是一个三维的,然后他定义了一个“Plus”函数,这个函数就是定义的加喽。

 

就这样吧。




你可能感兴趣的:(Ceres LocalParameterization 理解)