GTSAM 官方教程学习

0. 前言

年初完成了深蓝学院多传感器融合的课程,接触到因子图,作业中完成了基于ceres库的因子图构建,但存在cost不下降的问题。计划利用gtsam进行重写,开始学习记录。本文主要内容为gtsam官方教程的翻译,结合泡泡机器人公开课56,会在中间穿插自己的理解和应用。但为了记录自己的学习过程,有些理论性已经掌握的内容会稍微省略。
官方git:官方git(https://github.com/borglab/gtsam)
官方教程:官方教程(https://gtsam.org/tutorials/intro.html)

1. 因子图

1.1 序

因子图作为一种概率图模型,是将一个具有多变量的全局函数因子分解,得到几个局部函数的乘积,以此为基础得到的一个双向图叫做因子图。
在面试的过程中,有被问到因子图和位姿图的区别,当时有些懵,这里一起记录。

  • 从BA开始说起,BA是SLAM和SFM定义出来的一个优化问题,以重投影误差为误差函数,以每个时刻位姿和所有路标点为优化变量,即将位姿和特征点一起优化。
    BA

  • 位姿图优化在优化几次以后把特征点固定住不再优化,只当做位姿估计的约束,之后主要优化位姿。其节点是位姿,边为两个节点之间的相对运动。

Pose Graph

  • 因子图是一种概率图,是增量的处理后端优化。每加入一个点,对不需要重新计算的就直接用之前的中间结果,对需要重新计算的再去计算。其节点分为两种,位姿节点与因子节点。 总的来看,BA的计算量最大,需要将位姿与特征点同时优化。位姿图在其基础上减少了对特征点的优化。而因子图和二者区别在于“增量更新”这一点,在储存过去所有信息(会经过边缘化)的基础上并不需要对所有帧进行优化。
    Factor Graph

1.2 因子图

1.2.1 贝叶斯网络

将含有三个时间戳的隐马尔科夫模型的贝叶斯网络表示为例。
在这里插入图片描述
在该贝叶斯网络中,每个节点都和一个条件密度相关联。

  • 顶层马尔科夫链展示了先验 P ( X 1 ) P(X_1) P(X1)、转移概率 P ( X 2 ∣ X 1 ) P(X_2 | X_1) P(X2X1) P ( X 3 ∣ X 2 ) P(X_3| X_2) P(X3X2)
  • 在这一过程中,每一帧的的观测量 Z t Z_t Zt 仅与当前时刻的状态量 X t X_t Xt有关,服从条件密度 P ( Z t ∣ X t ) P(Z_t|X_t) P(ZtXt)
  • 给定一组测量值 z 1 , z 2 , z 3 z_1, z_2, z_3 z1,z2,z3,可以通过最大化后验概率来求得状态 X 1 , X 2 , X 3 X_1, X_2, X_3 X1,X2,X3。即 P ( X 1 , X 2 , X 3 ∣ Z 1 = z 1 , Z 2 = z 2 , Z 3 = z 3 ) P(X_1, X_2, X_3 | Z_1 = z_1, Z_2 = z_2, Z_3 = z_3) P(X1,X2,X3Z1=z1,Z2=z2,Z3=z3)

这里,观测量 Z t Z_t Zt是已知的,因此后验概率可以拆分为六个因子的乘积(和一个系数),即三个先验与三个似然因子1。这里定义 L ( X t ; z ) ∝ P ( Z t = z ∣ X t ) L(X_t ; z) \propto P(Z_t = z | X_t) L(Xt;z)P(Zt=zXt)

P ( X 1 , X 2 , X 3 ∣ Z 1 , Z 2 , Z 3 ) ∝ P ( X 1 ) P ( X 2 ∣ X 1 ) P ( X 3 ∣ X 2 ) L ( X 1 ; z 1 ) L ( X 2 ; z 2 ) L ( X 3 ; z 3 ) P\left(X_{1}, X_{2}, X_{3} \mid Z_{1}, Z_{2}, Z_{3}\right) \propto P\left(X_{1}\right) P\left(X_{2} \mid X_{1}\right) P\left(X_{3} \mid X_{2}\right) L\left(X_{1} ; z_{1}\right) L\left(X_{2} ; z_{2}\right) L\left(X 3 ; z_{3}\right) P(X1,X2,X3Z1,Z2,Z3)P(X1)P

### 使用GTSAM替代Ceres库实现因子图构建 #### 背景介绍 GTSAM(Georgia Tech Smoothing and Mapping Library)是一个用于概率推理和优化的开源C++库,特别适用于因子图优化问题。它提供了丰富的工具来定义变量节点、因子以及求解大规模稀疏非线性最小二乘问题[^1]。 相比之下,Ceres Solver 是另一个强大的非线性最优化库,广泛应用于计算机视觉和机器人领域中的参数估计问题。然而,在某些情况下,可能会遇到代价函数无法有效收敛的情况,这可能是由于初始化不当、模型设计不合理或者数值稳定性不足等原因引起的[^2]。 #### 如何用GTSAM重构基于Ceres的因子图? 以下是具体方法: 1. **安装与配置** 首先需要下载并编译 GTSAM 库及其依赖项。可以通过访问其官方 Git 存储库完成此操作: ```bash git clone https://github.com/borglab/gtsam.git cd gtsam mkdir build && cd build cmake .. make -j4 sudo make install ``` 2. **创建基本结构** 构建一个简单的程序框架,加载必要的头文件,并实例化 `NonlinearFactorGraph` 和 `Values` 对象作为主要的数据容器。 ```cpp #include <gtsam/nonlinear/NonlinearFactorGraph.h> #include <gtsam/nonlinear/GaussNewtonOptimizer.h> #include <gtsam/inference/Symbol.h> using namespace gtsam; int main() { NonlinearFactorGraph graph; Values initialEstimate; // 添加因素和初始猜测... GaussNewtonParams parameters; parameters.setVerbosity("ERROR"); GaussNewtonOptimizer optimizer(graph, initialEstimate, parameters); Values result = optimizer.optimize(); std::cout << "Final Result:\n" << result << std::endl; return 0; } ``` 3. **定义变量和测量值** 假设我们正在处理位姿估计问题,则可以引入 Pose2 或者 Point3 类型表示不同维度下的状态向量;接着通过 PriorFactor 设置先验约束条件,借助 BetweenFactor 表达相对关系等。 4. **调整超参及调试技巧** 如果发现目标损失依旧未能降低,可以从以下几个方面入手排查原因: - 检查输入观测噪声协方差矩阵是否合理; - 尝试更换不同的优化算法比如 Levenberg-Marquardt (LM),可能带来更好的鲁棒性和效率表现; - 提高初值质量以减少局部极小值影响。 5. **参考学习资料推荐** - 官网文档:https://gtsam.org/tutorials/intro.html - 泡泡机器人公开课第56讲深入讲解了关于多传感器融合背景下如何运用该技术解决实际工程难题 #### 示例代码片段展示 下面给出一段简化版的例子演示如何添加两个位置之间的距离限制条件到系统当中去: ```cpp // 创建第一个点的位置信息X(1) Symbol symbol_X_1('X', 1); initialEstimate.insert(symbol_X_1, Point2(0.5, 0.0)); // 同理设置第二个点的信息Y(2)=Point2(-0.3,-0.2) Symbol symbol_Y_2('Y', 2); initialEstimate.insert(symbol_Y_2, Point2(-0.3f, -0.2f)); // 测量得到两者间距大约等于sqrt((0.8)^2+(0.2)^2)≈0.8246m double measured_distance = sqrt(pow(0.8, 2)+pow(0.2, 2)); noiseModel::Diagonal::shared_ptr model = noiseModel::Isotropic::Sigma(1, 0.1); graph.add(BetweenFactor<Point2>(symbol_X_1, symbol_Y_2, Point2(measured_distance*cos(M_PI),measured_distance*sin(M_PI)),model)); ```
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值