GTSAM:使用gtsam的C++

2023-05-16

GTSAM 是一个在机器人领域和计算机视觉领域用于平滑(smoothing)和建图(mapping)的C++库。它与g2og2o不同的是,g2og2o采用稀疏矩阵的方式求解一个非线性优化问题,而GTSAM是采用因子图(factor graphs)和贝叶斯网络(Bayes networks)的方式最大化后验概率。

相关内容

1)gtsam解析 by 董靖:

https://www.bilibili.com/video/av52770741?from=search&seid=1073002253619093972
image.png
image.png

2))gtsam 的功能

image.png
可以在C++中使用
提供了C++转化 .M 文件的工具
提供了一些factor
可以自己定义factor
4.0提供了自动微分工具,可以求解链式微分
4.0提供了python中使用

3)如何使用gtsam

在gtsam中优化李群这种非 空间的量
对李群变量所在的流形上操作。

学习笔记:https://blog.csdn.net/qq_27262241/article/details/84291471

4)GTSAM在VIO中的应用:

image.png

视觉惯性里程计 VIO - Visual Inertial Odometry 视觉−惯性导航融合SLAM方案
https://blog.csdn.net/xiaoxiaowenqiang/article/details/81192045

slam问题可以看做是一个贝叶斯网络的问题。
image.png
根据各个观测值估计机器人的位置、姿态和和路标点的位置。
第一个问题,这个观测值是如何转化为概率的,还是观测值和概率之间的关系问题。

使用gtsam的C++例子

1.build factor graph
2.give initial values(this is a little bit tricky and highly application-related, design your strategybased on your application!)
3.optimize
4.optional post process,like caculate marginal distributions.

/**
 * @file Pose2SLAMExample.cpp
 * @brief 2D SLAM example
 * @date Nov 7, 2016
 * @author Jing Dong
 */

/**
 * A simple 2D pose-graph SLAM
 * The robot moves from x1 to x5, with odometry information between each pair. 
 * the robot moves 5 each step, and makes 90 deg right turns at x3 - x5
 * At x5, there is a *loop closure* between x2 is avaible
 * The graph strcuture is shown:
 * 
 *  p-x1 - x2 - x3
 *         |    |
 *         x5 - x4 
 */


// In planar cases we use Pose2 variables (x, y, theta) to represent the robot poses in SE(2)
#include <gtsam/geometry/Pose2.h>

// class for factor graph, a container of various factors
#include <gtsam/nonlinear/NonlinearFactorGraph.h>

// class for graph nodes values, a container of various geometric types
// here Values is used as a container of SE(2)
#include <gtsam/nonlinear/Values.h>

// symbol class is used to index varible in values
// e.g. pose varibles are generally indexed as 'x' + number, and landmarks as 'l' + numbers 
#include <gtsam/inference/Symbol.h>

// Factors used in this examples
// PriorFactor gives the prior distribution over a varible
// BetweenFactor gives odometry constraints
#include <gtsam/slam/PriorFactor.h>
#include <gtsam/slam/BetweenFactor.h>

// optimizer class, here we use Gauss-Newton
#include <gtsam/nonlinear/GaussNewtonOptimizer.h>

// Once the optimized values have been calculated, we can also calculate the 
// (appoximated / linearized) marginal covariance of desired variables
#include <gtsam/nonlinear/Marginals.h>


using namespace std;
using namespace gtsam;

int main(int argc, char** argv) {

  // Create a factor graph container
  NonlinearFactorGraph graph;

  // 添加 初始位置的factor 
//Add a prior on the first pose, setting it to the origin
  // The prior is needed to fix/align the whole trajectory at world frame
  // A prior factor consists of a mean value and a noise model (covariance matrix)
  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));

  // odometry measurement noise model (covariance matrix)
  noiseModel::Diagonal::shared_ptr odomModel = noiseModel::Diagonal::Sigmas(Vector3(0.5, 0.5, 0.1));

// Pose2(5, 0, 0) 表示 是 两个状态之间的转化(里程计)
  // Add odometry factors
  // Create odometry (Between) factors between consecutive poses
  // robot makes 90 deg right turns at x3 - x5
  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));

  // loop closure measurement noise model
  noiseModel::Diagonal::shared_ptr loopModel = noiseModel::Diagonal::Sigmas(Vector3(0.5, 0.5, 0.1));

  // Add the loop closure constraint
  graph.add(BetweenFactor<Pose2>(Symbol('x', 5), Symbol('x', 2), Pose2(5, 0, -M_PI_2), loopModel));
  
  // print factor graph
  graph.print("\nFactor Graph:\n"); 

//设置图的初始值 ,
  // initial varible values for the optimization
  // add random noise from ground truth values
  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));
  
  // print initial values
  initials.print("\nInitial Values:\n"); 


  // Use Gauss-Newton method optimizes the initial values
  GaussNewtonParams parameters;
  
  // print per iteration
  parameters.setVerbosity("ERROR");
  
  // optimize!
  GaussNewtonOptimizer optimizer(graph, initials, parameters);
  Values results = optimizer.optimize();
  
  // print final values
  results.print("Final Result:\n");

//求解边界分别并画出协方差矩阵
  // Calculate marginal covariances for all poses
  Marginals marginals(graph, results);
  
  // print marginal covariances
  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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GTSAM:使用gtsam的C++ 的相关文章

  • Halcon 单相机标定

    原文链接 xff1a https blog csdn net weixin 43197380 article details 90438976 comments 13104885 一 理论 为什么要进行单相机标定 xff1f 广义 xff1
  • 将图片嵌入Markdown文档

    将图片嵌入Markdown文档中是一个比较难受的事情 一般大家都会将图片存入本地某个路径或者网络存储空间 xff0c 使用URL链接的形式插入图片 image url to image 将图片放到本地的时候如果想将文档分享给朋友或者换台电脑
  • 自定义的串口通信协议

    自定义的通信协议 自定义一主多从串口通讯 1硬件基础两个从机的 Tx 是相互连接的 xff0c 导致一个从机在需要发送数据时发不出去了 协议思路数据包封装和解封装 树莓派python串口的使用注意更改树莓派串口设备驱动关闭控制台功能pyth
  • Linux串口驱动程序(4)-数据发送

    1 tty数据发送调用关系 怎么样才能找到发送数据所使用的函数呢 xff1f 打开uart register driver函数 xff0c 找到里面的tty register driver xff0c 转到定义 xff0c 这里调用了tty
  • TF 错误:InvalidArgumentError (see above for traceback): Reduction axis 0 is empty in shape [ ]

    Tensorflow python framework errors impl InvalidArgumentError Reduction axis 0 is empty in shape 0 100 Node ArgMax 61 Arg
  • Raspbian安装ROS系统Kinectic|树莓派4B安装ros使用OpenCV(全流程)

    前言 树莓派4B最高拥有4Gb的RAM xff0c 对于承担图像处理任务的嵌入式设计是个性价比很高的选择 众所周知 xff0c ROS系统对Ubuntu系统最友好 xff0c 但是由于树莓派4暂时还无法使用Ubuntu MATE xff0c
  • Ubuntu设置屏幕分辨率及屏幕翻转

    首发于 xff1a yuany3721的WordPress Version Ubuntu 18 04 6 LTS 使用xrandr查看屏幕信息 xrandr Screen 0 minimum 320 x 200 current 1920 x
  • 用美图秀秀换证件照背景颜色

    xff08 JDD KK 原创 xff09 问题描述 xff1a 不会PS xff0c 也没有各种会员 xff0c 怎么为了应急去换证件照背景 xff1f xff08 此方法有局限 xff0c 且质量一般 xff0c 只为应急 xff09
  • 让自己写的程序也有api

    当我们在学习的时候 xff0c 有时候看到别人的api会感觉到蛮高大上的 其实他们的api并不是他们在写完程序之后 xff0c 通过键盘录入的 xff0c 而是通过工具来生生成的 因此我们完全有机会打造属于自己的api api的作用 1 便
  • 记录使用gitlab实现Docker自动化部署

    目录 前言 一 gitlab runner docker安装 二 gitlab runner的注册与使用 1 注册 2 gitlab ci yml 脚本编写 总结 前言 前面搭建了gitlab与harbor xff0c 现在就使用它们来实现

随机推荐

  • ros::ok()

    ros ok 在以下几种情况下会返回false xff1a 按下Ctrl C时 我们被一个同名同姓的节点从网络中踢出 ros shutdown 被应用程序的另一部分调用 所有的ros NodeHandles都被销毁了 一旦ros ok 返回
  • 小觅深度相机标准版 ROS使用

    只写运行起来 xff0c 具体实例运行方法在对应的实例中 系统 xff1a ubuntu16 04 1 安装SDK 下载SDK驱动并解压 xff1a https github com slightech MYNT EYE S SDK 看RE
  • 移动机器人(四)四轴飞行器

    四轴飞行控制原理 四轴飞行器在空间上有6个自由度 xff0c 分别是沿3个坐标轴进行平动和转动 xff0c 通过对四个旋翼的转速控制来实现 xff0c 6个自由度方向的运动姿态分别为 xff1a 垂直升降 俯仰角度 前后飞行 横滚角度 左右
  • (二) 使用vscode

    1 在拉代码过程中 xff0c 使用代码对比工具 左侧有个分支工具 xff0c 点击左侧栏中某个文件 xff0c 右侧出现两栏 以102行为例 xff0c 红色部分为代码改动之前显示 xff0c 右侧绿色部分为代码改动之后显示 2 文件工具
  • 30个实用VSCode 插件,让你的开发效率倍增!

    1 Image preview 通过此插件 xff0c 当鼠标悬浮在图片的链接上时 xff0c 可以实时预览该图片 xff0c 除此之外 xff0c 还可以看到图片的大小和分辨率 2 Auto Rename Tag 使用该插件 xff0c
  • OpenCV 4.5.0+conrtrib 已编译完成(附下载链接)

    OpenCV 4 5 0 43 conrtrib 已编译完成 xff0c 包含编译源码 平台 Windows 43 VS2015 百度网盘链接 提取密码 xff1a rdgh 源码下载 OpenCV源码下载链接推荐 xff08 包含匹配的c
  • 第一篇综述-无人车简介

    综述 无人车简介 xff08 1 xff09 1 1无人车的定义以及分级 1 2无人车的发展历程 参考链接 原文链接 xff1a https blog csdn net thomashtq article details 81161018
  • 在C#中使用Intptr究竟需不需要释放?

    只有是用Marshal 申请的 xff08 AllocHGlobal xff09 这种需要释放 xff1b 对于使用PInvoke 返回的IntPtr不用释放 xff1b 简单来说 xff0c 这个东西是你创建出来的你就得负责回收 xff0
  • .NET中Invoke和BeginInvoke

    在 NET中 xff0c 固定必须主线程才能操作UI界面 xff0c 如果在非主线程中强行对UI界面赋值 xff0c 则会报错 xff0c 跨线程操作UI 是不允许的 xff0c 需要使用Invoke或BeginInvoke xff0c 关
  • php 跨域解决方案

    设置允许访问的域名 xff1a 1 允许全部的域名访问 span class token function header span span class token punctuation span span class token str
  • WPF之转换器

    WPF是一个数据驱动模式 xff0c 开发中都是以数据为中心 xff0c WPF具有数据绑定机制 xff0c 数据有变化时 xff0c 会通知UI进行更新 WPF用的是MVVM模式 MVVM是Model View ViewModel xff
  • CS程序自动更新和手动更新的技术实现

    1 程序启动时检查更新 xff0c 如果可以更新 xff0c 则判断是否为强制性更新 xff0c 如果是则直接强制更新 xff0c 不是则不处理 xff0c 转为到程序更新模块中手动处理 xff0c 这是更新最基本的原理 检查更新 priv
  • 用MATLAB将矩阵数据写入txt文件中,打开乱码原因

    MATLAB将数据写入txt文件中乱码的原因 xff0c 是将数据按照二进制文件写入txt文件 xff0c 所以打开会出现乱码的情况 xff0c 只需要把 fid1 61 fopen 39 piture txt 39 39 w 39 换成
  • boost C++知识点(一)

    1 boost总览 xff1a Boost Any Boost Any 提供了一个名为 boost any 的数据类型 xff0c 可以存放任意的类型 例如 xff0c 一个类型为 boost any 的变量可以先存放一个 int 类型的值
  • python 函数里面直接修改函数外部的全局变量

    python函数内部对全局变量进行修改 全局变量为immutable 不可变的 全局变量为mutable 可变的 全局变量为immutable 不可变的 a span class token operator 61 span span cl
  • ubuntu20.04中安装ROS系统

    自从在自己的电脑上安装了ubuntu20 04 43 window10双系统之后 xff0c 为了下一步开展研究 xff0c 所以安装ROS系统 把安装过程记录下来 xff0c 方便以后学习 亲测有效 xff01 xff01 xff01 x
  • Linux编程的第三方库引用------gcc、pkg-config与CMake一文讲解

    众所周知 linux 下库文件编译三部曲 config make makeinstall configure过程中可能会遇到无法找到某些头文件和动态库 xff1b 原因有两个 xff1a xff08 1 xff09 系统没有这些头文件和动态
  • 论文阅读 Global Localization with Object-Level Semantics and Topology

    摘要 全局定位是SLAM的核心要素 基于外观的方法虽然很成功 xff0c 但是在视觉条件随时间变化很大的环境中仍然面临许多开放的挑战 xff0c 随着时间的变化 xff0c 外观会发生巨大的变化 在本文中 xff0c 我们提出了一种集成解决
  • DOCKER VNC

    reference https www bilibili com video av882822967 以及泡泡机器人公众号文章 泡泡机器人创建了docker镜像 xff0c 极大的提升了环境配置的效率 docker 简介 准备 安装dock
  • GTSAM:使用gtsam的C++

    GTSAM 是一个在机器人领域和计算机视觉领域用于平滑 xff08 smoothing xff09 和建图 xff08 mapping xff09 的C 43 43 库 它与g2og2o不同的是 xff0c g2og2o采用稀疏矩阵的方式求