在g2o图优化框架中,顶点(Vertex)和边(Edge)的定义与功能的区别
在g2o图优化框架中,顶点(Vertex)和边(Edge)是构建优化问题的核心组件,两者的定义与功能存在以下关键区别:
1. 作用与本质差异
-
顶点(Vertex)
代表待优化的变量,例如:- 位姿(如
VertexSE3Expmap
表示3D位姿,包含平移和旋转) - 空间点坐标(如
VertexPointXYZ
表示3D点) - 参数(如
VertexSBAPointXYZ
用于SBA优化)
在SLAM中,顶点通常是机器人位姿或地图点。
- 位姿(如
-
边(Edge)
表示误差项,通过连接顶点定义约束关系,例如:- 一元边(
BaseUnaryEdge
):连接单个顶点(如先验约束) - 二元边(
BaseBinaryEdge
):连接两个顶点(如里程计约束) - 多元边(
BaseMultiEdge
):连接多个顶点(复杂约束)
在BA优化中,边常表示重投影误差或传感器测量误差。
- 一元边(
2. 定义时的代码结构差异
顶点定义
// 模板参数:<优化变量维度, 数据类型>
class CustomVertex : public g2o::BaseVertex<3, Eigen::Vector3d> {
public:// 重置顶点初始值void setToOriginImpl() override { _estimate << 0, 0, 0; }// 顶点更新函数(增量Δx叠加)void oplusImpl(const double* update) override {_estimate += Eigen::Vector3d(update[0], update[1], update[2]);}// 读写函数(若无需磁盘操作可空实现)bool read(std::istream& in) override { return true; }bool write(std::ostream& out) const override { return true; }
};
关键点:
- 必须重写
setToOriginImpl()
和oplusImpl()
,定义初始化和增量更新逻辑。 - 模板参数中维度对应优化变量自由度(如3维位姿为6)。
边定义
// 模板参数:<误差维度, 测量值类型, 顶点类型...>
class CustomEdge : public g2o::BaseBinaryEdge<2, Vector2d, VertexSE3, VertexPoint> {
public:// 误差计算(核心)void computeError() override {const VertexSE3* pose = static_cast<VertexSE3*>(_vertices[0]);const VertexPoint* point = static_cast<VertexPoint*>(_vertices[1]);_error = measurement_ - project(pose->estimate(), point->estimate());}// 雅可比矩阵计算(可手动或自动求导)