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”函数,这个函数就是定义的加喽。

 

就这样吧。




  • 16
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值