GTSAM官方文档学习使用

概述

因子图是适用于复杂的估计问题建模的图模型,例如SLAM、SFM问题。因子图和贝叶斯网络(有向无环图)不同,因子图是一种由连接到变量的因子组成的二分图。变量表示估计问题中的未知随机变量,而因子表示从测量或先验知识派生的这些变量的概率约束。

一.因子图

在这里插入图片描述
上图是一个三个步长的隐马尔可夫模型(HMM)的贝叶斯网络。在贝叶斯网络中,每个节点都与条件概率密度相关联:马尔科夫链编码先验P(X1)和条件概率P(X2|X1)和P(X3|X2),观测Zt仅取决于状态Xt,依据条件概率建模为P(Zt|Xt)。给定已知的观测z1,z2,z3,可以最大化后验概率P(X1,X2,X3|Z1=z1,Z2=z2,Z3=z3),进而得到最有可能的状态变量序列(X1,X2,X3),观Z1,Z2,Z3已知,后验概率与六个因子的乘积有关,其中三个因子来源于马尔科夫链,另外三个似然因子被定义为:
在这里插入图片描述
在这里插入图片描述
下图展示了一个因子图:
在这里插入图片描述
根据如下公式最大化后验概率:
在这里插入图片描述
注:我的理解是,上式的实际意义就是在那个x上最有可能看到观测z。

二、机器人运动建模

1.运动建模

在这里插入图片描述
上图展示了一个基于马尔科夫链的因子图,其中x1,x2,x3为机器人的位姿变量,黑点表示因子,o1,o2,为里程计的测量值。(这是机器人的运动方程,激光slam中通常使用IMU作为运动方程的测量)。

2.创建一个简单的因子图

// Create an empty nonlinear factor graph
NonlinearFactorGraph graph;

// Add a Gaussian prior on pose x_1
Pose2 priorMean(0.0, 0.0, 0.0);
noiseModel::Diagonal::shared_ptr priorNoise =
noiseModel::Diagonal::Sigmas(Vector3(0.3, 0.3, 0.1));
graph.add(PriorFactor<Pose2>(1, priorMean, priorNoise));

// Add two odometry factors
Pose2 odometry(2.0, 0.0, 0.0);
noiseModel::Diagonal::shared_ptr odometryNoise =
noiseModel::Diagonal::Sigmas(Vector3(0.2, 0.2, 0.1));
graph.add(BetweenFactor<Pose2>(1, 2, odometry, odometryNoise));
graph.add(BetweenFactor<Pose2>(2, 3, odometry, odometryNoise));

它会返回一个:

Factor Graph:
size: 3
Factor 0: PriorFactor on 1
  prior mean: (0, 0, 0)
  noise model: diagonal sigmas [0.3; 0.3; 0.1];
Factor 1: BetweenFactor(1,2)
  measured: (2, 0, 0)
  noise model: diagonal sigmas [0.2; 0.2; 0.1];
Factor 2: BetweenFactor(2,3)
  measured: (2, 0, 0)
  noise model: diagonal sigmas [0.2; 0.2; 0.1];

3.省略

4.GTSAM中的非线性优化

在gtsam中使用NonlinearFactorGraph储存因子,使用Values储存变量:

// create (deliberately inaccurate) initial estimate
Values initial;
initial.insert(1, Pose2(0.5, 0.0, 0.2));
initial.insert(2, Pose2(2.3, 0.1, -0.2));
initial.insert(3, Pose2(4.1, 0.1, 0.1));

// optimize using Levenberg-Marquardt optimization
Values result = LevenbergMarquardtOptimizer(graph, initial).optimize();

上面的代码将返回初始位姿,和经过优化后的位姿:

Initial Estimate:
Values with 3 values:
Value 1: (0.5, 0, 0.2)
Value 2: (2.3, 0.1, -0.2)
Value 3: (4.1, 0.1, 0.1)

Final Result:
Values with 3 values:
Value 1: (-1.8e-16, 8.7e-18, -9.1e-19)
Value 2: (2, 7.4e-18, -2.5e-18)
Value 3: (4, -1.8e-18, -3.1e-18)

参考链接:https://gtsam.org/tutorials/intro.html

猜你喜欢

转载自blog.csdn.net/weixin_45112559/article/details/126041763