【发布时间】:2019-12-16 11:36:33
【问题描述】:
我目前正在尝试为 SLAM 优化多约束功能。经典优化函数使用 g2o 最小化重投影误差,如 https://fzheng.me/2016/03/15/g2o-demo/ 中提出的那样。
我的问题是我不知道如何修改这个 g2o 示例代码来联合优化两个约束(例如:1 个约束用于重投影误差和 1 个约束用于惯性误差)。
问候,
【问题讨论】:
我目前正在尝试为 SLAM 优化多约束功能。经典优化函数使用 g2o 最小化重投影误差,如 https://fzheng.me/2016/03/15/g2o-demo/ 中提出的那样。
我的问题是我不知道如何修改这个 g2o 示例代码来联合优化两个约束(例如:1 个约束用于重投影误差和 1 个约束用于惯性误差)。
问候,
【问题讨论】:
要包含自定义约束,您必须实现一个 BaseEdge<> 子类的规范。
BaseEdge 有 3 个子类,它们是 BaseUnaryEdge<>(用于自约束)、BaseBinaryEdge<>(在 2 个节点之间)和 BaseMultiEdge<>(任意数量的节点)。
惯性误差是自约束的,所以必须指定 BaseUnaryEdge 的实现。
必须在自定义类中仅实现 computeError() 方法,但您也可以实现 linearizeOplus() 手动设置雅可比。
然后您可以按照您发布的示例代码进行操作。实例化优化器、创建顶点、添加重投影约束并添加您的自定义惯性约束。
【讨论】: