slamplay:用C++实现的SLAM工具集

0. 项目简介

slamplay 是一个功能强大的工具集合,可用于开始使用 C++ 来玩和试验 SLAM。这是一项正在进行的工作。它在单个 cmake 框架中安装并提供一些最重要的功能

  • 后端框架(g2o、gtsam、ceres、se-sync 等)、

  • 前端工具(opencv、pcl等)、

  • 代数和几何库(eigen、sophus、cholmod 等),

  • 即工具(pangolin、imgui 等)、

  • 闭环框架(DBOW3、iBOW 等)、

以及一些很好的示例,以便轻松快速地开始使用所有这些工具。

我为最近教授的计算机视觉课程创建了 slamplay。我在空闲时间出于兴趣开始开发它,并从网络上的一些存储库中获取灵感。
slamplay:用C++实现的SLAM工具集_第1张图片
slamplay:用C++实现的SLAM工具集_第2张图片

slamplay:用C++实现的SLAM工具集_第3张图片
该存储库由以下主要文件夹构成(具有不言自明的名称):

  • algebra_geometry
  • backend
  • data
  • dense_mapping
  • docs
  • frontend
  • full_slam
  • io
  • loop_closure
  • dense_mapping
  • scripts
  • utils
  • viz

1. 快速启动

安装基本依赖项:

$ ./install_dependencies.sh

在本地文件夹中安装 OpenCV:

$ ./install_local_opencv.sh

(如果需要,请跳过此步骤并使用本地 OpenCV 路径设置 config.sh 中的变量 OpenCV_DIR )

构建框架:

$ ./build.sh

一切构建完成后,您可以进入 build 文件夹并测试不同的示例。特别是,您可以在 full_slam 文件夹中输入:

配置文件 config/kitti.yaml (或 config/euroc.yaml )

并运行 VO 应用 app/run_kitti_stereo (或 app/run_euroc_stereo

2. 自己的教程

请参阅很好的 ascii 快速参考。

  • 快速参考
  • 密集矩阵操作
  • 密集线性问题和分解
  • 稀疏线性代数
  • 几何学

3. 后端

关于后端框架的一些注释。

3.1 GTSAM 示例

安装标签4.2a9

  • https://github.com/borglab/gtsam/tree/4.2a9/examples

文档

  • https://gtsam.org/docs/
  • https://gtsam.org/tutorials/intro.html

请参阅 docs 文件夹以获取更多文档。

问题显然,为了避免退出时 gtsam 出现双重释放或损坏错误,我们需要在构建使用 gtsam 的应用程序时禁用编译选项 -march=native 。这可以通过修改文件夹级别的编译标志并删除 gtsam 相关文件的 March 本机优化来在本地完成。更多详细信息请参见以下链接:

  • https://bitbucket.org/gtborg/gtsam/issues/414/compiling-with-march-native-results-in
  • https://groups.google.com/g/gtsam-users/c/jdySXchYVQg

3.2 谷神星的例子

安装标签2.1.0

  • https://ceres-solver.googlesource.com/ceres-solver/+/refs/tags/2.1.0/examples/

文档

  • http://ceres-solver.org/tutorial.html

请参阅 docs 文件夹以获取更多文档。

3.3. g2o 示例

已安装标签 20230223_git。请参阅相关示例。

Issues: 问题:

  • 构建的依赖于 g2o 的二进制文件链接到系统 g2o(而不是本地编译和安装的 g2o),这会导致崩溃(链接了不同的 g2o 版本)。这个问题有不同的解决方案:

    • 标准一(不舒服):使用 LD_LIBRARY_PATH 使构建的二进制文件正确链接到本地编译和安装的 g2o。

    • 否则,我们可以在构建时使用和设置 RPATH (而不是 RUNPATH )。特别是,这可以通过使用一些编译器选项来完成。这是我在 cmake 配置中设置的: set(MY_FLAGS “${MY_FLAGS} -Wl,–disable-new-dtags”) https://stackoverflow.com/questions/47117443/dynamic-linking-with-rpath-not-working-under-ubuntu-17-10 此配置由我添加的 cmake 选项标志 SET_RPATH 启用/禁用。

  • 如果您在 g2o 中遇到双重释放或损坏错误(退出时),则很可能您在编译此项目时使用了 -march=native 选项,但没有使用相同的选项来构建 g2o 本身。这可能会导致 g2o 和本项目之间出现一些对齐不一致的情况。然后,在这种情况下,使用 -march=native 构建 g2o (即使用 cmake 选项 -DBUILD_WITH_MARCH_NATIVE=ON

4. IO

4.1. chrono

https://www.modernescpp.com/index.php/the-three-clocks

三种不同时钟之间的差异?

std::chrono::sytem_clock:这是系统范围的实时时钟(挂钟)。时钟具有辅助函数 to_time_t 和 from_time_t 将时间点转换为日期。

std::chrono::steady_clock:仅作为时钟提供您无法调整它的保证。因此, std::chrono::steady_clock 是等待一段时间或直到某个时间点的首选时钟。

std::chrono::high_resolution_clock:这是精度最高的时钟,但它可以是时钟的 std::chrono::system_clock 或 std::chrono::steady_clock 的同义词。

C++ 标准不提供有关时钟精度、起始点或有效时间范围的保证。通常,std::chrono:system_clock 的起点是 1.1.1970,即所谓的 UNIX 纪元。对于 std::chrono::steady_clock,通常是 PC 的启动时间。

通俗来说,steady_clock 与 system_clock 之间有什么区别?

如果你手里拿着一个 system_clock,你会称它为手表,它会告诉你现在是什么时间。

如果你手里拿着一个 stable_clock,你会称它为秒表,它会告诉你某人跑了一圈有多快,但它不会告诉你现在是什么时间。

你可能感兴趣的:(slam,c++,开发语言)