Ceres中的LocalParameterization

255 篇文章 7 订阅
123 篇文章 1 订阅

QuaternionParameterization中表示四元数中四个量在内存中的存储顺序是[w, x, y, z],而Eigen内部四元数在内存中的存储顺序是[x, y, z, w],但是其构造顺序是[w, x, y, z](不要被这个假象给迷惑),所以就要使用另一种参数本地化类,即EigenQuaternionParameterization,下面就以QuaternionParameterization为例子说明,如下:

class CERES_EXPORT QuaternionParameterization : public LocalParameterization {
 public:
  virtual ~QuaternionParameterization() {}
  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; }
};

1、GlobalSize()

表示参数 x

x 的自由度(可能有冗余),比如四元数的自由度是4,旋转矩阵的自由度是9

2、LocalSize()

表示 Δx

Δx 所在的正切空间(tangent space)的自由度,那么这个自由度是3

上面的意思是说,SO3空间是属于非欧式空间的,但是没关系,我们只要保证旋转的局部是欧式空间,就可以使用流形进行优化了. 比如用四元数表示的3D旋转是属于非欧式空间的,那么我们取四元数的向量部分作为优化过程中的微小增量(因为是小量,所以不存在奇异性). 为什么使用四元数的向量部分?这部分可以参考《Quaternion kinematics for the error-state Kalman filter》. 这样一来,向量部分就位于欧式空间了,也就得到了正切空间自由度是3.

可理解为右扰动。

 《视觉 SLAM 十四讲》 4.3.4,在 so(3) 上进行扰动。总结,如果是对整个 se(3) 做一个 Parameterization(参考郑帆的博客《On-Manifold Optimization Demo using Ceres Solver》),那么就需要使用《视觉 SLAM 十四讲》 4.3.5 的导数模型,如果仅仅只是 QuaternionParameterization,那么仅需要使用《视觉 SLAM 十四讲》 4.3.4 的导数模型。在确定 Parameterization 的导数模型时,也应该关注在 CostFunction 中 residual 是如何计算的。

ref:https://blog.csdn.net/hzwwpgmwy/article/details/86490556

https://www.cnblogs.com/JingeTU/p/11707557.html

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hjwang1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值