diff --git a/docs/source/index.rst b/docs/source/index.rst index 53444e7b3584ebb121c15e97751ed842f05a4681..70a7a90d357514d05064d31138b2009e9e71c687 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -54,6 +54,10 @@ openEuler ROS sig成立于2020年6月,主要目标是将ROS1/ROS2移植到open slam-nav/slam_gmapping.md slam-nav/stage_ros.md slam-nav/cartographer.md + slam-nav/orb_slam3_porting.md + slam-nav/rtabmap_dependencies_analysis.md + slam-nav/rtabmap_porting.md + slam-nav/pangolin_prerequisites.md .. toctree:: :maxdepth: 1 diff --git "a/docs/source/slam-nav/image/DBoW2\347\274\226\350\257\221\346\210\220\345\212\237.png" "b/docs/source/slam-nav/image/DBoW2\347\274\226\350\257\221\346\210\220\345\212\237.png" new file mode 100644 index 0000000000000000000000000000000000000000..22bba108471c343005475ed7c5e4bfd53e65795f Binary files /dev/null and "b/docs/source/slam-nav/image/DBoW2\347\274\226\350\257\221\346\210\220\345\212\237.png" differ diff --git "a/docs/source/slam-nav/image/ORB-SLAM3\347\274\226\350\257\221\346\210\220\345\212\237.png" "b/docs/source/slam-nav/image/ORB-SLAM3\347\274\226\350\257\221\346\210\220\345\212\237.png" new file mode 100644 index 0000000000000000000000000000000000000000..45d2d69e6f66b5f7133fc7dc45e8317b53332d67 Binary files /dev/null and "b/docs/source/slam-nav/image/ORB-SLAM3\347\274\226\350\257\221\346\210\220\345\212\237.png" differ diff --git "a/docs/source/slam-nav/image/Pangolin\346\236\204\345\273\272\346\210\220\345\212\237.png" "b/docs/source/slam-nav/image/Pangolin\346\236\204\345\273\272\346\210\220\345\212\237.png" new file mode 100644 index 0000000000000000000000000000000000000000..83117d06d4c0ea9c3eedb0abcc71c3d8468ddb25 Binary files /dev/null and "b/docs/source/slam-nav/image/Pangolin\346\236\204\345\273\272\346\210\220\345\212\237.png" differ diff --git a/docs/source/slam-nav/image/SimpleDisplay.png b/docs/source/slam-nav/image/SimpleDisplay.png new file mode 100644 index 0000000000000000000000000000000000000000..2f9f176712138939d35ae0baab01ef1af02ff762 Binary files /dev/null and b/docs/source/slam-nav/image/SimpleDisplay.png differ diff --git a/docs/source/slam-nav/image/SimpleMultiDisplay.png b/docs/source/slam-nav/image/SimpleMultiDisplay.png new file mode 100644 index 0000000000000000000000000000000000000000..c07e24f6e54373158da68a0d34debacbe9a2f8a5 Binary files /dev/null and b/docs/source/slam-nav/image/SimpleMultiDisplay.png differ diff --git a/docs/source/slam-nav/image/SimplePlot.png b/docs/source/slam-nav/image/SimplePlot.png new file mode 100644 index 0000000000000000000000000000000000000000..9a543ea3d4c82b22cfcc1e444645a9f6d33fc0b9 Binary files /dev/null and b/docs/source/slam-nav/image/SimplePlot.png differ diff --git "a/docs/source/slam-nav/image/Sophus\347\274\226\350\257\221\346\210\220\345\212\237.png" "b/docs/source/slam-nav/image/Sophus\347\274\226\350\257\221\346\210\220\345\212\237.png" new file mode 100644 index 0000000000000000000000000000000000000000..bf1627a6ac102f8c0533fd21757dc14f7cd695e0 Binary files /dev/null and "b/docs/source/slam-nav/image/Sophus\347\274\226\350\257\221\346\210\220\345\212\237.png" differ diff --git "a/docs/source/slam-nav/image/g2o\347\274\226\350\257\221\346\210\220\345\212\237.png" "b/docs/source/slam-nav/image/g2o\347\274\226\350\257\221\346\210\220\345\212\237.png" new file mode 100644 index 0000000000000000000000000000000000000000..e9338fd6fd6a70644d9bb61c61dc1eab788dc0f6 Binary files /dev/null and "b/docs/source/slam-nav/image/g2o\347\274\226\350\257\221\346\210\220\345\212\237.png" differ diff --git a/docs/source/slam-nav/image/image-1.png b/docs/source/slam-nav/image/image-1.png new file mode 100644 index 0000000000000000000000000000000000000000..7bdc0d276a6d51ecaf09a91e28cdb55201891638 Binary files /dev/null and b/docs/source/slam-nav/image/image-1.png differ diff --git a/docs/source/slam-nav/image/image.png b/docs/source/slam-nav/image/image.png new file mode 100644 index 0000000000000000000000000000000000000000..dcb222db89cb18eee960748003e3560b35a809df Binary files /dev/null and b/docs/source/slam-nav/image/image.png differ diff --git a/docs/source/slam-nav/image/robot_mapping_demo.png b/docs/source/slam-nav/image/robot_mapping_demo.png new file mode 100644 index 0000000000000000000000000000000000000000..86cca9fb63a951c5158e8a8ff78ab7cd033575dd Binary files /dev/null and b/docs/source/slam-nav/image/robot_mapping_demo.png differ diff --git "a/docs/source/slam-nav/image/\345\215\225\347\233\256+\346\203\257\346\200\247\345\257\274\350\210\252\346\265\213\350\257\225.gif" "b/docs/source/slam-nav/image/\345\215\225\347\233\256+\346\203\257\346\200\247\345\257\274\350\210\252\346\265\213\350\257\225.gif" new file mode 100644 index 0000000000000000000000000000000000000000..2ea6796839a6a91880cf9b5665970c24f61970f3 Binary files /dev/null and "b/docs/source/slam-nav/image/\345\215\225\347\233\256+\346\203\257\346\200\247\345\257\274\350\210\252\346\265\213\350\257\225.gif" differ diff --git "a/docs/source/slam-nav/image/\345\215\225\347\233\256\346\221\204\345\203\217\345\244\264\346\265\213\350\257\225.gif" "b/docs/source/slam-nav/image/\345\215\225\347\233\256\346\221\204\345\203\217\345\244\264\346\265\213\350\257\225.gif" new file mode 100644 index 0000000000000000000000000000000000000000..8d5c25cce3132234b89418669b06ef85076b608e Binary files /dev/null and "b/docs/source/slam-nav/image/\345\215\225\347\233\256\346\221\204\345\203\217\345\244\264\346\265\213\350\257\225.gif" differ diff --git "a/docs/source/slam-nav/image/\345\217\214\347\233\256\346\221\204\345\203\217\345\244\264\346\265\213\350\257\225.gif" "b/docs/source/slam-nav/image/\345\217\214\347\233\256\346\221\204\345\203\217\345\244\264\346\265\213\350\257\225.gif" new file mode 100644 index 0000000000000000000000000000000000000000..0b821167196c2de2f426de61864f788279f45a42 Binary files /dev/null and "b/docs/source/slam-nav/image/\345\217\214\347\233\256\346\221\204\345\203\217\345\244\264\346\265\213\350\257\225.gif" differ diff --git "a/docs/source/slam-nav/image/\351\252\214\350\257\201\347\274\226\350\257\221.png" "b/docs/source/slam-nav/image/\351\252\214\350\257\201\347\274\226\350\257\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..31cb21358ce6c8cdac48ce3720f0775363176619 Binary files /dev/null and "b/docs/source/slam-nav/image/\351\252\214\350\257\201\347\274\226\350\257\221.png" differ diff --git "a/docs/source/slam-nav/image/\351\252\214\350\257\201\347\274\226\350\257\221\347\216\257\345\242\203.png" "b/docs/source/slam-nav/image/\351\252\214\350\257\201\347\274\226\350\257\221\347\216\257\345\242\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..4748d0103381e0ab110ade44c1099b472d788237 Binary files /dev/null and "b/docs/source/slam-nav/image/\351\252\214\350\257\201\347\274\226\350\257\221\347\216\257\345\242\203.png" differ diff --git a/docs/source/slam-nav/orb_slam3_porting.md b/docs/source/slam-nav/orb_slam3_porting.md new file mode 100644 index 0000000000000000000000000000000000000000..a0055365aa901d0819b873607cecc95d179beb51 --- /dev/null +++ b/docs/source/slam-nav/orb_slam3_porting.md @@ -0,0 +1,174 @@ +# ORB-SLAM3 移植到 openEuler 24.03 RISC-V 详细流程 + +## 一、项目概述 + +### 1.1 移植目标 +将ORB-SLAM3视觉SLAM系统成功移植到openEuler 24.03 RISC-V架构上,确保基本功能正常运行。ORB-SLAM3是目前最先进的实时SLAM库之一,支持视觉、视觉-惯性和多地图SLAM,适用于单目、双目和RGB-D相机。 + +### 1.2 主要挑战 +- RISC-V架构特性差异 +- 依赖库的RISC-V支持 +- 性能优化需求 +- 可能的代码适配 + +### 1.3 移植意义 + +将ORB-SLAM3移植到openEuler RISC-V平台具有重要的实际价值。首先,这将验证RISC-V架构在运行复杂视觉算法方面的实际能力,为RISC-V在机器人、无人机等领域的应用提供关键技术支撑。其次,成功的移植将使openEuler RISC-V版本具备完整的视觉SLAM功能,提升其在边缘计算和嵌入式设备市场的竞争力。从技术角度看,移植过程中积累的经验,包括依赖库适配、性能优化、架构特定问题的解决方案等,将为后续其他大型项目的RISC-V移植提供宝贵参考。此外,由于RISC-V的开源特性和较低的授权成本,基于RISC-V的SLAM解决方案在成本敏感的应用场景中具有明显优势。最终,这项工作不仅能推动RISC-V生态系统的完善,还能为国产处理器在智能感知领域的应用探索可行路径。 + +## 二、环境准备阶段 + +### 2.1 系统环境检查 +```bash +# 确认系统版本 +cat /etc/os-release +uname -a + +# 检查编译工具链 +gcc --version +g++ --version +cmake --version + +# 检查可用内存和存储 +free -h +df -h +``` + +### 2.2 基础开发工具安装 +```bash +# 更新系统包 +sudo dnf update -y + +# 安装基础开发工具 +sudo dnf install -y git wget vim cmake cmake-gui +sudo dnf install -y gcc-c++ python3-devel +``` + +## 三、依赖库准备阶段 + +### 3.1 检查和安装系统级依赖 + +#### 3.1.1 基础库 +```bash +# 安装基础依赖 +sudo dnf install -y libjpeg-devel libpng-devel libtiff-devel +sudo dnf install -y libGL-devel libGLU-devel +sudo dnf install -y libX11-devel libXi-devel libXmu-devel +``` + +#### 3.1.2 Eigen3 (线性代数库) +```bash +# 检查是否有预编译包 +sudo dnf search eigen3 + +# 直接安装 +sudo dnf install -y eigen3-devel + +``` + +#### 3.1.3 OpenCV (计算机视觉库) +```bash +# 检查是否有预编译包 +sudo dnf search opencv + +# 直接安装 +sudo dnf install -y opencv +``` + +#### 3.1.4 Pangolin (可视化库) + +见本目录下“移植Pangolin库-前置依赖.md” + + +## 四、ORB-SLAM3获取与初步分析 + +### 4.1 获取源代码 +```bash +# 克隆ORB-SLAM3 +git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git +cd ORB_SLAM3 + +``` + +### 4.2 修复部分导致编译的问题 + +```bash +# 更新 CakeList文件 +见本目录下的CMakeList文件,主要更新修复有关“C++”标准设置和移除“-march=native“以适配ricv架构 + + +# 显示图像 +修改./Examples/Monocular/mono_euroc.cc中: +ORB_SLAM3::System SLAM(argv[1],argv[2],ORB_SLAM3::System::MONOCULAR, false); --》 ORB_SLAM3::System SLAM(argv[1],argv[2],ORB_SLAM3::System::MONOCULAR, true); + +## `-march=native` 编译参数在RISC-V架构上不被支持 + +修改DBoW2: +sed -i 's/-march=native//g' Thirdparty/DBoW2/CMakeLists.txt + +修改g2o: +sed -i 's/-march=native//g' Thirdparty/g2o/CMakeLists.txt + +修改Sophus: +sed -i 's/-march=native//g' Thirdparty/Sophus/CMakeLists.txt + +# std::chrono::monotonic_clock 不是C++标准库的一部分 +find Examples -type f -exec sed -i 's/std::chrono::monotonic_clock/std::chrono::steady_clock/g' {} + +find Examples_old -type f -exec sed -i 's/std::chrono::monotonic_clock/std::chrono::steady_clock/g' {} + + + +``` + +### 4.3 自动编译 + +```bash +./build.sh + +``` + +![DBoW2编译成功](./image/DBoW2编译成功.png) + +![g2o编译成功](./image/g2o编译成功.png) + +![Sophus编译成功](./image/Sophus编译成功.png) + +![ORB-SLAM3编译成功](./image/ORB-SLAM3编译成功.png) + +## 五、ORB-SLAM3测试 + +### 4.1 获取EuRoC 测试数据集 + +EuRoC 数据集包含视觉惯性数据,适合测试视觉惯性 SLAM,包括 Machine Hall 和 Vicon Room 序列。数据格式为 ROS bag 或 ASL Dataset Format,包含立体图像、IMU 和地面真相。 + +- **步骤**: + 1. 访问官网:https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets + 2. 选择序列(推荐:Machine Hall 01-05 “easy” 到 “difficult”,Vicon Room 1 01-03)。 + 3. 下载 ROS bag 或 ASL zip 文件。例如: + - Machine Hall 01 (easy): http://robotics.ethz.ch/~asl-datasets/ijrr_euroc_mav_dataset/machine_hall/MH_01_easy/MH_01_easy.bag (ROS bag) 或 MH_01_easy.zip (ASL)。 + - 类似地下载其他序列,如 MH_02_easy、V1_01_easy 等。 + 4. 解压并放置在 ORB-SLAM3/Data/EuRoC/ 下。 + +### 4.2 进行简单测试 + +单目摄像头测试: + +```bash +./Examples/Monocular/mono_euroc ./Vocabulary/ORBvoc.txt ./Examples/Monocular/EuRoC.yaml /home/openeuler/shared/Datasets/EuRoC/MH01 ./Examples/Monocular/EuRoC_TimeStamps/MH01.txt dataset-MH01_mono +``` +![单目摄像头测试](./image/单目摄像头测试.gif) + + +双目摄像头测试: + +```bash +./Examples/Stereo/stereo_euroc ./Vocabulary/ORBvoc.txt ./Examples/Stereo/EuRoC.yaml /home/openeuler/shared/Datasets/EuRoC/V101 ./Examples/Stereo/EuRoC_TimeStamps/V101.txt dataset-V101_stereo +``` +![双目摄像头测试](./image/双目摄像头测试.gif) + + +单目+惯性导航 (Monocular-Inertial) 测试: +```bash +./Examples/Monocular-Inertial/mono_inertial_euroc ./Vocabulary/ORBvoc.txt ./Examples/Monocular-Inertial/EuRoC.yaml /home/openeuler/shared/Datasets/EuRoC/V101 ./Examples/Monocular-Inertial/EuRoC_TimeStamps/V101.txt dataset-V101_monoi +``` +![单目+惯性导航测试](./image/单目+惯性导航测试.gif) + + diff --git a/docs/source/slam-nav/pangolin_prerequisites.md b/docs/source/slam-nav/pangolin_prerequisites.md new file mode 100644 index 0000000000000000000000000000000000000000..fea9f389c8261b58855a7de1eaf7a6d73df5a0f2 --- /dev/null +++ b/docs/source/slam-nav/pangolin_prerequisites.md @@ -0,0 +1,172 @@ +# Pangolin库移植到openEuler 24.03 RISC-V方案 + +## 项目概述 + +### 目标 +将Pangolin库成功移植到openEuler 24.03 RISC-V架构上,为后续ORB-SLAM3移植奠定基础。 + +### Pangolin库简介 +- **项目地址**: https://github.com/stevenlovegrove/Pangolin +- **功能**: 轻量级的OpenGL显示和交互库,提供3D可视化功能 +- **用途**: 主要用于计算机视觉、机器人学、SLAM等领域的数据可视化 +- **语言**: C++ + +## 环境分析 + +### 目标平台 +- **操作系统**: openEuler 24.03 +- **架构**: RISC-V 64位 +- **编译环境**: QEMU虚拟机内直接编译 +- **编译器**: 本地GCC + +### 依赖库分析 + +#### 必需依赖 +1. **构建系统** + - CMake 3.16+ (必需) + - C++17兼容编译器 (GCC/Clang) + +#### 核心依赖(推荐安装) +1. **渲染系统** + - OpenGL或OpenGL ES + - Mesa (软件渲染支持) + +2. **窗口系统(Linux平台)** + - X11开发库 (libX11-devel) + - 相关X11扩展库 + +#### 可选依赖(按功能分类) + +1. **视频和图像支持** + - libpng-devel (PNG图像支持) + - libjpeg-devel (JPEG图像支持) + - TIFF库 (TIFF图像支持) + - FFmpeg (视频编解码) + - DC1394 (IEEE 1394相机支持) + +2. **Python绑定** + - Python3开发库 + - pybind11 + +3. **测试框架** + - Catch2 (单元测试,仅在BUILD_TESTS=ON时需要) + +4. **特殊平台支持** + - Emscripten (Web编译) + +#### 依赖特点 +根据Pangolin官方文档,**大多数依赖都是可选的**,Pangolin采用"尽力而为"的构建策略: +- 未找到的依赖会被静默忽略 +- 只构建能找到依赖的功能模块 +- 使用工厂模式支持不同后端的动态选择 + +## 移植策略 + +### 阶段一:环境准备(当前任务) + +1. **基础编译环境** + ```bash + # 更新系统包管理器 + sudo dnf update + + # 安装基础编译工具 + sudo dnf groupinstall "Development Tools" + sudo dnf install cmake gcc-c++ make git + + # 验证编译环境 + gcc --version + cmake --version + ``` + ![验证编译环境](./image/验证编译环境.png) + +2. **完整依赖库安装** + ```bash + # 核心渲染依赖 + sudo dnf install mesa-libGL-devel mesa-libGLU-devel + sudo dnf install libGL-devel libGLU-devel + + # X11窗口系统依赖 + sudo dnf install libX11-devel libXrandr-devel + sudo dnf install libXinerama-devel libXcursor-devel + sudo dnf install libXi-devel libXmu-devel + + # 图像处理库 + sudo yum install libepoxy-devel + sudo dnf install libpng-devel libjpeg-devel + sudo dnf install libtiff-devel + + # 视频处理(可选但推荐) + sudo dnf install ffmpeg-devel + + # Python支持(可选) + sudo dnf install python3-devel python3-pip + pip3 install wheel + + # 其他工具库 + sudo dnf install pkg-config + sudo dnf install eigen3-devel + ``` + +### 阶段二:源码获取与分析 +1. **获取源码** + ```bash + git clone https://github.com/stevenlovegrove/Pangolin.git + cd Pangolin + git submodule update --init --recursive + ``` + +### 阶段三:CMake配置适配 +1. **基础构建配置** + ```bash + mkdir build + cd build + cmake -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_EXAMPLES=ON \ + -DBUILD_TESTS=OFF \ + -DBUILD_TOOLS=ON \ + -DBUILD_SHARED_LIBS=ON \ + .. + + # 构建核心库 + cmake --build . + ``` + ![构建成功截图](./image/Pangolin构建成功.png) + +2. **关键配置选项说明** + - `BUILD_EXAMPLES`: 构建示例程序(开启用于测试) + - `BUILD_TESTS`: 构建测试(需要Catch2,暂时关闭) + - `BUILD_TOOLS`: 构建工具(如VideoViewer) + - `BUILD_SHARED_LIBS`: 构建共享库vs静态库 + +### 阶段四:功能验证 + +1. **构建验证** + ```bash + # 验证核心库编译 + ls build/* + ``` + ![验证核心库编译](./image//验证编译.png) + +2. **基础功能测试** + ```bash + cd build/examples + # 测试简单显示 + ./SimpleDisplay/SimpleDisplay + # 测试多显示窗口 + ./SimpleMultiDisplay/SimpleMultiDisplay + # 测试绘图功能 + ./SimplePlot/SimplePlot + ``` + ![测试简单显示](./image/SimpleDisplay.png) + ![测试多显示窗口](./image/SimpleMultiDisplay.png) + ![测试绘图功能](./image/SimplePlot.png) + +3. **安装** + ```bash + sudo cmake --install . + ``` + + +### 总结与展望 + +本文档详细阐述了Pangolin库在openEuler 24.03 RISC-V架构上的移植方案,包括环境准备、依赖分析、CMake配置以及功能验证等关键步骤。通过成功移植并验证Pangolin库,我们为后续ORB-SLAM3等依赖Pangolin的计算机视觉和机器人学项目在RISC-V平台上的顺利部署奠定了坚实的基础。下一步工作将聚焦于ORB-SLAM3的移植与优化,以期充分发挥RISC-V架构在该领域的潜力。 \ No newline at end of file diff --git a/docs/source/slam-nav/rtabmap_dependencies_analysis.md b/docs/source/slam-nav/rtabmap_dependencies_analysis.md new file mode 100644 index 0000000000000000000000000000000000000000..210d7f8972bf90cbdc53013211b72a36acb23a00 --- /dev/null +++ b/docs/source/slam-nav/rtabmap_dependencies_analysis.md @@ -0,0 +1,253 @@ +# RTABMAP 依赖分析报告(openEuler 24.03 RISC-V + ROS 2 Humble) + +## 一、项目概述 + +RTABMAP(Real-Time Appearance-Based Mapping)项目由两个主要部分组成:rtabmap核心库和rtabmap_ros包集。核心库是一个独立的C++库,版本为0.22.0,提供了完整的SLAM算法实现,不依赖于任何ROS组件。而rtabmap_ros包集则是核心库在ROS 2 Humble环境下的封装,包含了rtabmap_conversions、rtabmap_msgs、rtabmap_sync、rtabmap_util、rtabmap_odom、rtabmap_slam、rtabmap_viz、rtabmap_rviz_plugins等多个功能包,以及用于演示和示例的配置包。 + +从提供的CMakeLists文件分析可以看出,rtabmap核心库采用了高度模块化的设计,通过大量的编译选项来控制各种可选功能的启用与禁用。这种设计使得该项目可以根据不同的硬件平台和应用需求进行灵活配置。对于RISC-V架构的移植,这种灵活性尤为重要,因为我们可以轻松地排除那些依赖于特定硬件加速(如CUDA)的功能模块。 + +## 二、核心库依赖树分析 + +### 基础依赖层级 + +rtabmap核心库的依赖关系呈现出清晰的层次结构。在最底层是构建工具和基础库,这些是整个系统运行的基石。CMake作为构建系统要求版本不低于3.14,而编译器则需要支持C++11标准,部分模块在检测到相应依赖时会自动启用C++14或C++17支持。 + +``` +rtabmap核心库 (0.22.0) +├── 构建系统 +│ ├── CMake (>= 3.14) +│ └── GCC (>= 4.0, 支持C++11/14/17) +│ +├── 必需依赖 +│ ├── OpenCV (必需模块) +│ │ ├── core +│ │ ├── calib3d +│ │ ├── imgproc +│ │ ├── highgui +│ │ ├── stitching +│ │ ├── photo +│ │ ├── video +│ │ └── videoio +│ │ └── [可选] xfeatures2d, nonfree (SIFT/SURF特征) +│ │ +│ ├── PCL (>= 1.7) +│ │ ├── common +│ │ ├── io +│ │ ├── kdtree +│ │ ├── search +│ │ ├── surface +│ │ ├── filters +│ │ ├── registration +│ │ ├── sample_consensus +│ │ ├── segmentation +│ │ └── [WITH_QT时] visualization +│ │ +│ ├── ZLIB (压缩支持) +│ ├── SQLite3 (数据库,可用内置版本) +│ └── 间接依赖 +│ ├── Eigen3 (通过PCL) +│ ├── FLANN (通过PCL) +│ └── Boost (条件性需要) +│ +└── GUI支持 (WITH_QT=ON时) + ├── Qt (4/5/6自动检测) + └── VTK (3D可视化,Qt启用时必需) +``` + +### SLAM优化器依赖 + +SLAM系统的核心是图优化,rtabmap支持多种图优化后端。这些优化器之间并非互斥关系,但系统要求至少有一个可用的优化器。在RISC-V架构上,所有这些优化器都可以正常编译和运行,因为它们都是纯CPU实现的算法库。 + +``` +图优化后端 (至少需要一个) +├── g2o (推荐,支持多种优化算法) +│ └── 可选: Vertigo (鲁棒优化,需要g2o) +├── GTSAM (佐治亚理工,推荐) +│ ├── Boost (必需) +│ └── 可选: Vertigo (也可配合GTSAM使用) +├── Ceres Solver (Google,大规模非线性优化) +│ └── 注意: OKVIS或FLOAM启用时会自动引入 +├── TORO (Tree-based netwORk Optimizer,基础选项) +└── MRPT (移动机器人编程工具包,额外支持) +``` + +### 传感器驱动依赖 + +传感器驱动是SLAM系统获取数据的关键接口。在RISC-V架构下,需要特别注意区分哪些驱动依赖CUDA,哪些可以在纯CPU环境下运行。根据CMakeLists文件的分析,大部分相机驱动都提供了CPU模式的支持。 + +``` +相机与传感器驱动 +├── 深度相机驱动 (CPU兼容) +│ ├── OpenNI (Kinect v1, Xtion) +│ ├── OpenNI2 (新版本驱动框架) +│ ├── Freenect (Kinect v1开源驱动) +│ ├── Freenect2 (Kinect v2, 需要OpenCL但不需要CUDA) +│ ├── RealSense (Intel D400系列旧版) +│ ├── RealSense2 (Intel D400/L500系列) +│ ├── K4A (Azure Kinect, CPU模式可用) +│ ├── MyntEye (小觅相机) +│ ├── DepthAI (OAK相机,需要depthai-core >= 2.24) +│ ├── ZEDOC (ZED Open Capture, 无CUDA版本) +│ └── XVisio SDK +│ +├── 深度相机驱动 (需要CUDA,RISC-V不支持) +│ └── ZED SDK (Stereolabs,强制依赖CUDA) +│ +└── 其他相机驱动 + ├── DC1394 (FireWire/IEEE1394相机) + └── FlyCapture2 (Point Grey相机,需专有SDK) +``` + +### 点云处理与地图构建依赖 + +点云处理和地图构建模块提供了多种数据结构和算法实现。这些模块都是纯算法实现,不依赖特定硬件加速,因此在RISC-V平台上都可以正常使用。需要注意的是,某些计算密集型的算法可能在RISC-V上表现出较低的性能。 + +``` +点云与地图处理 +├── 点云IO与处理 +│ ├── PDAL (点云数据抽象库) +│ ├── libLAS (LAS/LAZ格式支持) +│ └── libpointmatcher (ICP算法库) +│ ├── libnabo (最近邻搜索) +│ └── yaml-cpp (配置文件) +│ +├── 地图表示 +│ ├── OctoMap (3D概率占用八叉树) +│ ├── GridMap (2D栅格地图) +│ ├── CPUTSDF (截断符号距离场,CPU版本) +│ └── OpenChisel (大规模TSDF融合) +│ +└── 3D处理库 + ├── CCCoreLib (CloudCompare核心库) + ├── Open3D (需要CMake >= 3.19) + └── AliceVision (3D重建,编译资源需求高) + ├── Geogram (几何处理) + └── assimp (3D模型导入) +``` + +### 视觉里程计与SLAM算法依赖 + +视觉里程计模块提供了多种前端跟踪算法的实现。这些算法大多是学术研究成果的开源实现,各有其特点和适用场景。在RISC-V平台上,所有列出的视觉里程计算法都可以编译运行,因为它们都提供了CPU实现版本。 + +``` +视觉里程计实现 +├── 稀疏特征方法 +│ ├── FOVIS (快速视觉里程计,MIT) +│ ├── libviso2 (MATLAB移植,立体视觉) +│ └── ORB_SLAM2/3 (ORB特征,支持单目/双目/RGB-D) +│ └── 注意: 自带g2o版本,需禁用系统g2o +│ +├── 直接方法 +│ └── DVO (稠密视觉里程计,直接法) +│ +├── 视觉惯性融合 +│ ├── OKVIS (关键帧优化) +│ │ ├── brisk (特征检测,版本2) +│ │ ├── opengv (几何视觉) +│ │ └── Ceres (优化器,需1.9.0版本) +│ ├── MSCKF_VIO (多状态约束卡尔曼滤波) +│ ├── VINS-Fusion (香港科技大学) +│ └── OpenVINS (特拉华大学) +│ +└── 激光雷达里程计 + ├── LOAM (激光里程计与建图) + └── FLOAM (快速LOAM) + └── Ceres (优化器依赖) +``` + +### 特殊功能与加速依赖 + +某些功能模块设计时考虑了硬件加速,这些模块在RISC-V平台上需要特别处理。CUDA相关的功能必须完全禁用,而一些针对ARM优化的库在RISC-V上可能无法达到预期性能。 + +``` +特殊功能模块 +├── GPU加速 (RISC-V不支持) +│ ├── CudaSift (GPU SIFT实现) +│ ├── Torch/libtorch (深度学习,SuperPoint) +│ └── OpenCV CUDA模块 +│ ├── opencv::gpu +│ ├── opencv::cudafeatures2d +│ ├── opencv::cudaoptflow +│ └── opencv::cudaimgproc +│ +├── 平台优化库 (RISC-V性能未知) +│ └── FastCV (高通移动平台优化) +│ +└── 其他功能 + ├── Python支持 (Python3 + pybind11 + NumPy) + ├── OpenGV (多视图几何) + ├── OpenMP (并行计算,RISC-V支持) + ├── Madgwick (IMU滤波算法) + └── ORB_OCTREE (ORB特征八叉树索引) +``` + +## 三、ROS 2封装层依赖分析 + +rtabmap_ros作为ROS 2的封装层,其依赖关系建立在核心库之上,同时引入了ROS 2生态系统的标准组件。每个子包都有其特定的功能定位和依赖需求,它们之间也存在相互依赖关系。 + +``` +rtabmap_ros包集 +├── rtabmap_msgs (消息定义) +│ ├── rosidl_default_generators +│ ├── builtin_interfaces +│ ├── geometry_msgs +│ ├── std_msgs +│ ├── sensor_msgs +│ └── std_srvs +│ +├── rtabmap_conversions (数据转换) +│ ├── rtabmap_msgs +│ ├── RTABMap核心库 (>= 0.22.0) +│ ├── cv_bridge +│ ├── image_geometry +│ ├── laser_geometry +│ ├── pcl_conversions +│ ├── tf2_eigen +│ └── tf2_geometry_msgs +│ +├── rtabmap_sync (数据同步) +│ ├── rtabmap_conversions +│ ├── rtabmap_msgs +│ ├── image_transport +│ ├── message_filters +│ ├── diagnostic_updater +│ └── 可选: 多相机支持 (RTABMAP_SYNC_MULTI_RGBD) +│ +├── rtabmap_util (工具节点) +│ ├── rtabmap_conversions +│ ├── rtabmap_msgs +│ ├── RTABMap核心库 +│ ├── pcl_ros +│ ├── laser_geometry +│ └── 可选扩展 +│ ├── octomap_msgs (OctoMap集成) +│ └── grid_map_ros (GridMap集成) +│ +├── rtabmap_odom (里程计) +│ ├── rtabmap_sync +│ ├── rtabmap_util +│ ├── rtabmap_conversions +│ ├── pluginlib +│ └── rclcpp_components +│ +├── rtabmap_slam (SLAM核心) +│ ├── rtabmap_sync +│ ├── rtabmap_util +│ ├── visualization_msgs +│ └── 可选标记检测 +│ ├── apriltag_msgs +│ ├── aruco系列消息 +│ └── nav2_msgs (导航集成) +│ +├── rtabmap_viz (可视化界面) +│ ├── rtabmap_sync +│ └── RTABMap::gui (需要核心库GUI支持) +│ +└── rtabmap_rviz_plugins (RViz插件) + ├── rtabmap_conversions + ├── rviz_common + ├── rviz_rendering + └── rviz_default_plugins +``` + +各个ROS 2包之间形成了清晰的依赖链条:消息定义包(rtabmap_msgs)位于最底层,不依赖其他rtabmap包;转换包(rtabmap_conversions)依赖消息定义并连接核心库;同步和工具包提供中间层服务;而里程计、SLAM和可视化包则构建在这些基础设施之上。这种分层设计使得系统具有良好的模块性,便于在不同场景下选择性地使用所需功能。 \ No newline at end of file diff --git a/docs/source/slam-nav/rtabmap_porting.md b/docs/source/slam-nav/rtabmap_porting.md new file mode 100644 index 0000000000000000000000000000000000000000..5842edad63f81a185d25aae065e8d3f140231666 --- /dev/null +++ b/docs/source/slam-nav/rtabmap_porting.md @@ -0,0 +1,543 @@ +# RTABMAP 移植到 openEuler 24.03 RISC-V 详细流程 + +## 一、项目概述 + +### 1.1 移植目标 +将RTABMAP(Real-Time Appearance-Based Mapping)实时外观建图系统及其ROS 2 Humble接口成功移植到openEuler 24.03 RISC-V架构上,确保核心SLAM功能、点云处理、闭环检测和可视化功能正常运行。RTABMAP是一个基于外观的实时定位与建图解决方案,支持激光雷达、立体相机、RGB-D相机等多种传感器,具有增量式建图、多会话建图、闭环检测和图优化等先进功能。 + +### 1.2 主要挑战 +- RISC-V架构下复杂依赖链的管理(PCL、OpenCV、VTK等大型库) +- ROS 2 Humble在RISC-V平台的完整性 +- 图优化器(g2o、GTSAM)的架构适配 +- 内存使用优化和实时性能保证 +- Qt GUI组件在RISC-V上的渲染性能 + +### 1.3 移植意义 +将RTABMAP移植到openEuler RISC-V平台具有应用价值。作为一个成熟的RGB-D SLAM解决方案,RTABMAP在服务机器人、自动驾驶、无人机测绘等领域有广泛应用,其成功移植将直接推动RISC-V架构在这些高价值领域的落地应用。相比于其他SLAM系统,RTABMAP的独特优势在于其强大的闭环检测能力和对大规模环境的支持,能够实现持续的增量式建图,这对于长时间运行的机器人系统至关重要。 + +从技术生态角度看,RTABMAP依赖众多核心库(PCL、OpenCV、VTK、Qt等),其成功移植将验证RISC-V平台对复杂软件栈的支撑能力,为整个计算机视觉和机器人软件生态在RISC-V上的构建奠定基础。此外,RTABMAP与ROS 2的深度集成使其成为验证ROS 2在RISC-V平台完整性的理想测试案例,这对于推动整个机器人中间件生态向RISC-V迁移具有示范效应。 + +从产业应用角度看,基于RISC-V的RTABMAP方案可以显著降低机器人视觉系统的成本,特别是在需要部署大量边缘设备的场景中。开源的RISC-V架构配合开源的RTABMAP系统,将为国产自主可控的机器人感知方案提供完整的技术路径,有助于打破国外在高端传感器和处理器领域的技术垄断。 + +## 二、环境准备阶段 + +### 2.1 系统环境检查 +```bash +# 确认系统版本和架构 +cat /etc/os-release | grep -E "NAME|VERSION" +uname -m # 应显示 riscv64 +lscpu # 查看CPU详细信息 + +# 检查编译工具链版本 +gcc --version # 需要 >= 4.0,支持C++11/14/17 +g++ --version +cmake --version # 需要 >= 3.14 +make --version + +# 检查Python环境(用于ROS 2和可选的Python绑定) +python3 --version +pip3 --version + +# 检查系统资源 +free -h # 建议至少8GB RAM用于编译 +df -h / # 建议至少20GB可用空间 +nproc # 查看可用CPU核心数 +``` + +### 2.2 基础开发环境配置 +```bash +# 更新系统包索引 +sudo dnf update -y + +# 安装基础开发工具 +sudo dnf groupinstall -y "Development Tools" +sudo dnf install -y \ + git wget curl vim cmake cmake-gui \ + gcc-c++ gdb valgrind \ + pkg-config autoconf automake libtool + +# 安装Python开发环境(ROS 2需要) +sudo dnf install -y \ + python3-devel python3-pip python3-setuptools \ + python3-wheel python3-numpy + +``` + +### 2.3 ROS 2 Humble基础环境 +```bash +# 添加ROS 2仓库(如果尚未添加) +# 注:具体仓库配置需根据openEuler RISC-V的ROS 2支持情况调整 + +# 安装ROS 2基础包 +sudo dnf install -y \ + ros-humble-desktop \ + ros-humble-ros-base \ + python3-colcon-common-extensions \ + python3-rosdep + +# 配置ROS 2环境变量 +echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc +source ~/.bashrc +``` + +## 三、依赖库准备阶段 + +### 3.1 系统仓库依赖安装 + +通过openEuler官方仓库安装RTABMAP所需的基础依赖库。这些包经过官方测试,与系统兼容性良好,优先使用可以减少编译时间和潜在的兼容性问题。 + +#### 3.1.1 核心必需依赖 +```bash +# OpenCV及其依赖(计算机视觉核心) +sudo dnf install -y opencv + +# 读取/写入 pcap(点云 I/O)或处理 PNG(图像 I/O) +sudo dnf install -y libpcap-devel libpng-devel + +# PCL点云库及其依赖链 +sudo dnf install -y \ + pcl pcl-devel pcl-tools \ + eigen3-devel flann-devel + +# 基础数学和数据处理库 +sudo dnf install -y \ + boost-devel boost-thread boost-filesystem \ + boost-system boost-iostreams boost-program-options \ + boost-date-time boost-chrono boost-serialization \ + zlib-devel sqlite-devel yaml-cpp-devel +``` + +#### 3.1.2 GUI和可视化依赖 +```bash +# Qt5开发环境(GUI支持) +sudo dnf install -y \ + qt5-qtbase-devel qt5-qtbase-gui \ + qt5-qtsvg-devel qt5-qttools-devel \ + qt5-qtdeclarative-devel qt5-qtmultimedia-devel + +# OpenGL和渲染相关 +sudo dnf install -y \ + mesa-libGL-devel mesa-libGLU-devel \ + freeglut-devel libXmu-devel libXi-devel +``` + +#### 3.1.3 ROS 2集成依赖 +```bash +# ROS 2核心通信和工具包 +sudo dnf install -y \ + ros-humble-rclcpp ros-humble-std-msgs \ + ros-humble-sensor-msgs ros-humble-geometry-msgs \ + ros-humble-nav-msgs ros-humble-visualization-msgs \ + ros-humble-tf2-ros ros-humble-tf2-eigen \ + ros-humble-tf2-geometry-msgs + +# ROS 2图像和点云处理 +sudo dnf install -y \ + ros-humble-cv-bridge ros-humble-image-transport \ + ros-humble-image-geometry ros-humble-pcl-ros \ + ros-humble-pcl-conversions ros-humble-laser-geometry + +# ROS 2工具和插件系统 +sudo dnf install -y \ + ros-humble-message-filters ros-humble-pluginlib \ + ros-humble-diagnostic-updater \ + ros-humble-rclcpp-components + +# ROS 2可视化(RViz2) +sudo dnf install -y \ + ros-humble-rviz2 ros-humble-rviz-common \ + ros-humble-rviz-default-plugins \ + ros-humble-rviz-rendering +``` + +#### 3.1.4 可选功能依赖 +```bash +# 传感器驱动支持 +sudo dnf install -y \ + libuvc-devel libusb-devel \ + libdc1394-devel libraw1394-devel + +# Python绑定支持(可选) +sudo dnf install -y \ + python3-numpy python3-matplotlib \ + pybind11-devel python3-pybind11 + +# 多线程和性能优化 +sudo dnf install -y \ + tbb-devel openmp-devel \ + openblas-devel lapack-devel + +# 附加工具库 +sudo dnf install -y \ + protobuf-devel protobuf-compiler \ + hdf5-devel jsoncpp-devel \ + libxml2-devel libpng-devel libjpeg-devel libtiff-devel +``` + +#### 3.1.5 依赖验证 +```bash +# 验证关键库的安装 +pkg-config --modversion opencv4 +pkg-config --modversion eigen3 +pcl_version # 如果pcl-tools安装成功 + +# 检查ROS 2包 +ros2 pkg list | grep -E "cv_bridge|pcl|tf2" + +# 生成已安装依赖报告 +echo "=== RTABMAP依赖安装报告 ===" > rtabmap_deps.txt +echo "OpenCV: $(pkg-config --modversion opencv4)" >> rtabmap_deps.txt +echo "PCL: $(pcl_version 2>/dev/null || echo 'N/A')" >> rtabmap_deps.txt +echo "Boost: $(rpm -q boost-devel)" >> rtabmap_deps.txt +echo "Qt5: $(rpm -q qt5-qtbase-devel)" >> rtabmap_deps.txt +echo "ROS2 packages: $(ros2 pkg list | wc -l)" >> rtabmap_deps.txt +``` + +### 3.2 源码编译依赖 + +在openEuler RISC-V平台上,部分关键依赖需要通过源码编译安装。本节将详细说明VTK和GTSAM的编译过程。 + +#### 3.2.1 编译FLANN + +FLANN (Fast Library for Approximate Nearest Neighbors) 是PCL的核心依赖,提供快速最近邻搜索功能。由于系统包不完整,需要源码编译。 + +```bash +# 进入依赖编译目录 +cd ~/rtabmap_deps + +# 下载FLANN源码 +git clone https://github.com/flann-lib/flann.git +cd flann +git checkout 1.9.2 # 使用稳定版本1.9.2 + +# 创建构建目录 +mkdir build && cd build + +# 配置编译选项 +cmake .. \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr/local \ + -DBUILD_CUDA_LIB=OFF + +# 编译 +make -j$(nproc) + +# 安装 +sudo make install +sudo ldconfig +``` + +#### 3.2.2 编译PCL + +```bash +# 进入依赖编译目录 +cd ~/rtabmap_deps + +# 下载PCL源码 +git clone https://github.com/PointCloudLibrary/pcl.git +cd pcl +git checkout pcl-1.12.1 # 使用稳定版本 + +# 创建构建目录 +mkdir build && cd build + +# 配置编译选项 +cmake .. \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr/local \ + -DFLANN_ROOT=/usr/local \ + -DVTK_DIR=/usr/local/lib64/cmake/vtk-9.2 \ + -DWITH_VTK=ON \ + -DWITH_PNG=ON \ + -DWITH_PCAP=ON \ + -DBUILD_visualization=ON \ + -DCMAKE_CXX_FLAGS="-march=rv64gcv" + +# 编译 +make -j$(nproc) + +# 安装 +sudo make install +sudo ldconfig + +# 验证安装 +ls -la /usr/local/include/pcl*/pcl/surface/vtk_smoothing/ +ldconfig -p | grep pcl | head -5 +``` + +#### 3.2.3 编译VTK + +VTK (Visualization Toolkit) 是rtabmap GUI功能的核心依赖,提供3D可视化支持。 + +```bash +# 创建工作目录 +mkdir -p ~/rtabmap_deps && cd ~/rtabmap_deps + +# 下载VTK源码(使用稳定版本9.2.6) +wget https://www.vtk.org/files/release/9.2/VTK-9.2.6.tar.gz +tar -xzf VTK-9.2.6.tar.gz +cd VTK-9.2.6 + +# 创建构建目录 +mkdir build && cd build + +# 配置编译选项 +cmake .. \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr/local \ + -DVTK_GROUP_ENABLE_Qt=YES \ + -DVTK_MODULE_ENABLE_VTK_GUISupportQt=YES \ + -DVTK_QT_VERSION=5 \ + -DBUILD_SHARED_LIBS=ON \ + -DVTK_WRAP_PYTHON=OFF \ + -DVTK_USE_CUDA=OFF \ + -DVTK_ENABLE_REMOTE_MODULES=OFF + +# 编译(根据CPU核心数调整-j参数) +make -j$(nproc) + +# 安装 +sudo make install +sudo ldconfig +``` + +![vtk编译成功](./image/image-1.png) +(上述是将qemu控制台映射到ubuntu控制台方便操作截图,并非ubuntu截图) + +#### 3.2.4 编译GTSAM + +GTSAM (Georgia Tech Smoothing and Mapping) 提供先进的因子图优化算法。 + +```bash +# 返回工作目录 +cd ~/rtabmap_deps + +# 下载GTSAM源码(使用4.2版本) +wget https://github.com/borglab/gtsam/archive/refs/tags/4.2.tar.gz +tar -xzf 4.2.tar.gz +cd gtsam-4.2 + +# 创建构建目录 +mkdir build && cd build + +# 配置编译选项 +cmake .. \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr/local \ + -DGTSAM_BUILD_TESTS=OFF \ + -DGTSAM_BUILD_EXAMPLES_ALWAYS=OFF \ + -DGTSAM_BUILD_UNSTABLE=OFF \ + -DGTSAM_USE_SYSTEM_EIGEN=ON \ + -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF \ + -DGTSAM_WITH_TBB=ON + +# 编译 +make -j$(nproc) + +# 安装 +sudo make install +sudo ldconfig +``` + +#### 3.2.5 源码编译g2o + +```bash +# 编译g2o +cd ~/rtabmap_deps +git clone https://github.com/RainerKuemmerle/g2o.git +cd g2o +git checkout 20230223_git # 使用稳定版本 + +mkdir build && cd build +cmake .. \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr/local \ + -DBUILD_WITH_MARCH_NATIVE=OFF \ + -DG2O_USE_CUDA=OFF + +make -j$(nproc) +sudo make install +sudo ldconfig +``` +![g2o编译成功](./image/image.png) +(上述是将qemu控制台映射到ubuntu控制台方便操作截图,并非ubuntu截图) + +#### 3.2.6 从源码编译SuiteSparse +```bash +cd ~/rtabmap_deps +git clone https://github.com/DrTimothyAldenDavis/SuiteSparse.git +cd SuiteSparse +git checkout v7.11.0 + +cmake .. \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr/local \ + -DBUILD_STATIC_LIBS=ON \ + -DBUILD_SHARED_LIBS=ON \ + -DSUITESPARSE_USE_CUDA=OFF \ + -DSUITESPARSE_USE_OPENMP=ON + +make -j$(nproc) +sudo make install +``` + +#### 3.2.7 验证安装 + +```bash +# 验证VTK +ls -la /usr/local/lib64/libvtk* | head -5 +ls -la /usr/local/lib64/cmake/vtk*/VTKConfig.cmake 2>/dev/null + +# 验证GTSAM +ls -la /usr/local/lib64/libgtsam* | head -5 +find /usr/local -name "GTSAMConfig.cmake" 2>/dev/null + +# 验证库链接 +ldconfig -p | grep -E "vtk|gtsam" | head -10 +``` + +## 四、RTABMAP编译安装 + +### 4.1 编译RTABMAP核心库 + +#### 4.1.1 获取源码 + +```bash +# 创建工作目录 +cd ~ +mkdir -p rtabmap_ws && cd rtabmap_ws + +# 克隆rtabmap核心库源码 +git clone https://github.com/introlab/rtabmap.git +cd rtabmap + +# 检出稳定版本 +git checkout 0.22.1-humble +``` + +#### 4.1.2 配置编译选项 + +```bash +# 设置环境变量 +export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64:$LD_LIBRARY_PATH +export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/local/lib64/pkgconfig:$PKG_CONFIG_PATH +export CMAKE_PREFIX_PATH=/usr/local:$CMAKE_PREFIX_PATH + +# 创建并进入构建目录 +mkdir build && cd build + +# 简化配置 - 只关闭确定不可用的功能 +cmake .. \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr/local \ + -DCMAKE_PREFIX_PATH="/usr/local;/usr/local/lib64/cmake" \ + -DPCL_DIR=/usr/local/share/pcl-1.12 \ + -DVTK_DIR=/usr/local/lib64/cmake/vtk-9.2 \ + -DFLANN_ROOT=/usr/local \ + -DG2O_ROOT=/usr/local \ + -DGTSAM_DIR=/usr/local/lib/cmake/GTSAM \ + -DFLANN_KDTREE_MEM_OPT=ON +``` + +#### 4.1.3 编译安装 + +```bash +# 编译(根据系统性能调整并行数) +make -j$(nproc) + +# 安装 +sudo make install + +# 更新动态库缓存 +sudo ldconfig +``` + +#### 4.1.4 验证核心库安装 + +```bash +# 检查安装的库文件 +ls -la /usr/local/lib*/librtabmap* | head -5 + +# 检查可执行文件 +ls -la /usr/local/bin/rtabmap* + +# 测试运行(如果编译了APP) +rtabmap --version + +# 检查cmake配置文件 +find /usr/local -name "RTABMapConfig.cmake" 2>/dev/null +``` + +### 4.2 编译RTABMAP ROS包 + +#### 4.2.1 创建ROS工作空间 + +```bash +# 创建colcon工作空间 +cd ~ +mkdir -p rtabmap_ros_ws/src && cd rtabmap_ros_ws/src + +# 克隆rtabmap_ros源码 +git clone https://github.com/introlab/rtabmap_ros.git + +# 返回工作空间根目录 +cd ~/rtabmap_ros_ws +git checkout 0.22.0-humble + +``` + +#### 4.2.2 解决ROS依赖 + +```bash +# source ROS环境 +source /opt/ros/humble/setup.bash + +# 如果rosdep失败,手动安装可能缺失的包 +sudo dnf install -y \ + ros-humble-stereo-msgs \ + ros-humble-nav2-msgs \ + ros-humble-image-pipeline +``` + +#### 4.2.3 编译ROS包 + +```bash +# 设置环境变量指向rtabmap核心库 +export RTABMap_DIR=/usr/local/lib/cmake/rtabmap +export CMAKE_PREFIX_PATH=/usr/local:$CMAKE_PREFIX_PATH + +# 使用colcon编译 +colcon build \ + --cmake-args \ + -DCMAKE_BUILD_TYPE=Release \ +``` + + +#### 4.3.2 测试验证 + +```bash +Requirements: + Download rosbag: + * demo_mapping.db3: https://drive.google.com/file/d/1v9qJ2U7GlYhqBJr7OQHWbDSCfgiVaLWb/view?usp=drive_link + +Example: + + SLAM: + $ ros2 launch rtabmap_demos robot_mapping_demo.launch.py rviz:=true rtabmap_viz:=true + + Rosbag: + $ ros2 bag play demo_mapping.db3 --clock +``` + +![robot_mapping_demo](./image/robot_mapping_demo.png) + + + + + + + + + + +