【问题标题】:How to optimize multi-constraint function with g2o如何使用 g2o 优化多约束函数
【发布时间】:2019-12-16 11:36:33
【问题描述】:

我目前正在尝试为 SLAM 优化多约束功能。经典优化函数使用 g2o 最小化重投影误差,如 https://fzheng.me/2016/03/15/g2o-demo/ 中提出的那样。

我的问题是我不知道如何修改这个 g2o 示例代码来联合优化两个约束(例如:1 个约束用于重投影误差和 1 个约束用于惯性误差)。

问候,

【问题讨论】:

    标签: c++ math slam g2o


    【解决方案1】:

    要包含自定义约束,您必须实现一个 BaseEdge<> 子类的规范。

    BaseEdge 有 3 个子类,它们是 BaseUnaryEdge<>(用于自约束)、BaseBinaryEdge<>(在 2 个节点之间)和 BaseMultiEdge<>(任意数量的节点)。

    惯性误差是自约束的,所以必须指定 BaseUnaryEdge 的实现。

    必须在自定义类中仅实现 computeError() 方法,但您也可以实现 linearizeOplus() 手动设置雅可比。

    然后您可以按照您发布的示例代码进行操作。实例化优化器、创建顶点、添加重投影约束并添加您的自定义惯性约束。

    【讨论】:

    • 非常感谢您提供的信息!你如何定义一个约束是否是一个自我约束?
    • 自我约束约束测量本身,而不是测量之间的关系。
    • 我们可以给约束添加权重吗?我的意思是如果我联合优化 c1 和 c2(两个不同的约束),我可以给它们分配一个权重吗?像 alpha*c1 和 beta * c2。
    • @sa.l_dev 是的,您决定在自定义 computeError() 方法中计算错误的方式。您可以将权重作为派生边缘类的属性。
    猜你喜欢
    • 1970-01-01
    • 2011-09-26
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多