SLAM本质剖析-GTSAM

0. 前言

在深入剖析了CeresEigenSophusG2O后,以V-SLAM为代表的计算方式基本已经全部讲完,但是就L-SLAM而言我们还差一块,那就是PCL、GTSAM点云计算部分我们还没有详细的去写,正好就这个时间,我想把这块坑给填完,来形成一整个系列,方便自己回顾以及后面的人一起学习。

GTSAM系统认知

我们在一般的认知,G2O和GTSAM都做着后端图优化的功能,而他们当中的全局优化器的性能却是不尽相同。

  • Ceres是针对所有种类的函数的优化,所以只能用最速梯度下降法。
  • G2o是求解的一个标准的最小二乘
    在这里插入图片描述
  • GTSAM准确的说不是解的优化方程。而是先把一个概率图的联合概率的信息矩阵和信息向量表示出来
    在这里插入图片描述
    但具有物理意义的是均值和协方差。所以通过信息矩阵和协方差矩阵的换算计算出均值。这个换算里面有求逆,等于是在解方程。
    如图所示,我们在下图轨迹中进行evo误差估计,发现G2O效果其实略好于GTSAM,但是为了我们系统的完整性,我们仍然需要讲一下GTSAM。
    在这里插入图片描述

在这里插入图片描述

2. GTSAM/ISAM2示例

iSAM2 将图优化问题转换成 Bayes tree 的建立、更新和推理问题。是GTSAM函数库中常用的一种方法(LeGO-LOAM中使用的即为ISAM2)。下面我们针对GTSAM和ISAM2来从两个层面理清楚写法上的差异。这部分的代码参考了这篇文章
在这里插入图片描述
GTSAM

#include <gtsam/geometry/Pose2.h>
#include <gtsam/nonlinear/NonlinearFactorGraph.h>
#include <gtsam/nonlinear/Values.h>
#include <gtsam/inference/Symbol.h>
#include <gtsam/slam/PriorFactor.h>
#include <gtsam/slam/BetweenFactor.h>
#include <gtsam/nonlinear/GaussNewtonOptimizer.h>
#include <gtsam/nonlinear/Marginals.h>
using namespace std;
using namespace gtsam;
int main(int argc, char** argv) 
{
    NonlinearFactorGraph graph;
 
    Values initials;
    initials.insert(Symbol('x', 1), Pose2(0.2, -0.3, 0.2));
    initials.insert(Symbol('x', 2), Pose2(5.1, 0.3, -0.1));
    initials.insert(Symbol('x', 3), Pose2(9.9, -0.1, -M_PI_2 - 0.2));
    initials.insert(Symbol('x', 4), Pose2(10.2, -5.0, -M_PI + 0.1));
    initials.insert(Symbol('x', 5), Pose2(5.1, -5.1, M_PI_2 - 0.1));
    initials.print("\nInitial Values:\n"); 
    //固定第一个顶点,在gtsam中相当于添加一个先验因子
    noiseModel::Diagonal::shared_ptr priorModel = noiseModel::Diagonal::Sigmas(Vector3(1.0, 1.0, 0.1));
    graph.add(PriorFactor<Pose2>(Symbol('x', 1), Pose2(0, 0, 0), priorModel));
 
    //二元位姿因子
    noiseModel::Diagonal::shared_ptr odomModel = noiseModel::Diagonal::Sigmas(Vector3(0.5, 0.5, 0.1));
    graph.add(BetweenFactor<Pose2>(Symbol('x', 1), Symbol('x', 2), Pose2(5, 0, 0), odomModel));
    graph.add(BetweenFactor<Pose2>(Symbol('x', 2), Symbol('x', 3), Pose2(5, 0, -M_PI_2), odomModel));
    graph.add(BetweenFactor<Pose2>(Symbol('x', 3), Symbol('x', 4), Pose2(5, 0, -M_PI_2), odomModel));
    graph.add(BetweenFactor<Pose2>(Symbol('x', 4), Symbol('x', 5), Pose2(5, 0, -M_PI_2), odomModel));
 
    //二元回环因子
    noiseModel::Diagonal::shared_ptr loopModel = noiseModel::Diagonal::Sigmas(Vector3(0.5, 0.5, 0.1));
    graph.add(BetweenFactor<Pose2>(Symbol('x', 5), Symbol('x', 2), Pose2(5, 0, -M_PI_2), loopModel));
    graph.print("\nFactor Graph:\n"); 
 
 
    GaussNewtonParams parameters;
    parameters.setVerbosity("ERROR");
    parameters.setMaxIterations(20);
    parameters.setLinearSolverType("MULTIFRONTAL_QR");
    GaussNewtonOptimizer optimizer(graph, initials, parameters);
    Values results = optimizer.optimize();
    results.print("Final Result:\n");
 
    Marginals marginals(graph, results);
    cout << "x1 covariance:\n" << marginals.marginalCovariance(Symbol('x', 1)) << endl;
    cout << "x2 covariance:\n" << marginals.marginalCovariance(Symbol('x', 2)) << endl;
    cout << "x3 covariance:\n" << marginals.marginalCovariance(Symbol('x', 3)) << endl;
    cout << "x4 covariance:\n" << marginals.marginalCovariance(Symbol('x', 4)) << endl;
    cout << "x5 covariance:\n" << marginals.marginalCovariance(Symbol('x', 5)) << endl;
 
    return 0;
}

ISAM

…详情请参照古月居

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
建图是SLAM(Simultaneous Localization and Mapping,即同时定位与地图构建)中的关键技术之一。它是指在未知环境中,通过传感器获取的数据,包括激光雷达、摄像头等,根据这些数据构建出一个能够表示环境的三维或二维地图。 建图的目的是通过分析传感器数据,确定机器人在环境中的位置,并同时根据这些位置信息构建出地图。这个过程需要解决两个关键问题:定位和建图。 在定位问题中,机器人需要通过传感器的数据,确定自身在环境中的准确位置。这个问题可以通过运动模型和传感器测量数据进行估计。例如,机器人可以通过激光雷达扫描周围环境,利用激光的反射信息计算出自身的位置。 在建图问题中,机器人通过分析传感器数据,将环境的几何结构、边缘和物体等信息构建出来。这个问题可以通过提取特征点、边缘等进行建模和匹配,从而构建出地图。 在SLAM中,定位和建图是紧密相连的。定位问题需要准确的地图信息来进行位置估计,而建图问题则需要准确的定位信息来构建地图。因此,建图的准确性和可靠性对于SLAM系统来说非常重要。 建图技术的发展已经取得了很大的突破,包括基于激光雷达的点云建图、基于摄像头的视觉SLAM等。这些技术在机器人导航、无人驾驶等领域具有广泛的应用前景。 总之,建图是SLAM中的关键技术,通过分析传感器数据,确定机器人的位置并构建环境地图。建图技术的发展对于提高SLAM系统的精度和可靠性具有重要意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敢敢のwings

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值