0. 项目简介

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

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

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

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

  • 即工具(pangolin、imgui 等)、

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

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

我为最近教授的计算机视觉课程创建了 slamplay。我在空闲时间出于兴趣开始开发它,并从网络上的一些存储库中获取灵感。
slamplay:用C++实现的SLAM工具集-LMLPHP
slamplay:用C++实现的SLAM工具集-LMLPHP
slamplay:用C++实现的SLAM工具集-LMLPHP
slamplay:用C++实现的SLAM工具集-LMLPHP
该存储库由以下主要文件夹构成(具有不言自明的名称):

  • 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

文档

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

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

3.2 谷神星的例子

安装标签2.1.0

文档

请参阅 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,你会称它为秒表,它会告诉你某人跑了一圈有多快,但它不会告诉你现在是什么时间。

10-07 13:06