1.顶点定义:
- 继承BaseVertex<定点byte数,顶点结构体>类
- 实现setToRiginImpl()函数,里面给_estimate成员函数赋初值
- _estimate的类型就是模板里指定的顶点结构体
- 实现:oplusImpl(const double * update_)。update_是指向跟新值得指针,使用前需要转换成真实的结构类型。不一定是顶点类型。比如update_可以是李代数,但顶点类型是李群。
- 可以使用esitimate()函数得到顶点的值,类型同上面的顶点结构体。
2.边的定义:
- 继承BaseBinaryEdge<观察值byte数,观察值结构体,第一个顶点的类型,第二个顶点的类型>(两个顶点的边)
- 或继承BaseUnaryEdge<观察值byte数,观察值结构体,顶点的类型>(一个顶点的边)
- 实现函数computeError(),函数里面需要计算_error的值,其他顶点和测量值的成员变量参考其他例子。
- 实现linearizeOplus(),单顶点的计算_jacobianOplusXi矩阵,双顶点的还要计算_jacobianOplusXj矩阵
3.SE3Quat
- 使用map函数来变换一个3d点
4.SparseOptimizer
- 这个应该是总的流程和数据管理器
- setAlgorithm设置具体计算更新值得算法
- addVertex加入顶点
- addEdge()
- addParameter()可以传入一些超参
- initializeOptimization()给顶点填入初始值
- optimize()启动优化流程
- 调用所有边的linearizeOplus()函数,得到每个边的雅克比矩阵,然后把矩阵连接成一个大矩阵
- 调用所有边的computeError(),得到误差矩阵
- 基于雅克比和误差,使用优化器计算更新值(矩阵求逆,主要时间花费在这里)
- 把拆分成各个顶点的值
- 调用顶点的oplusImpl函数,更新顶点的_estimate变量