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 系统环境检查
# 确认系统版本和架构
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 基础开发环境配置
# 更新系统包索引
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基础环境
# 添加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 核心必需依赖
# 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和可视化依赖
# 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集成依赖
# 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 可选功能依赖
# 传感器驱动支持
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 依赖验证
# 验证关键库的安装
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的核心依赖,提供快速最近邻搜索功能。由于系统包不完整,需要源码编译。
# 进入依赖编译目录
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
# 进入依赖编译目录
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可视化支持。
# 创建工作目录
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

(上述是将qemu控制台映射到ubuntu控制台方便操作截图,并非ubuntu截图)
3.2.4 编译GTSAM
GTSAM (Georgia Tech Smoothing and Mapping) 提供先进的因子图优化算法。
# 返回工作目录
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
# 编译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

(上述是将qemu控制台映射到ubuntu控制台方便操作截图,并非ubuntu截图)
3.2.6 从源码编译SuiteSparse
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 验证安装
# 验证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 获取源码
# 创建工作目录
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 配置编译选项
# 设置环境变量
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 编译安装
# 编译(根据系统性能调整并行数)
make -j$(nproc)
# 安装
sudo make install
# 更新动态库缓存
sudo ldconfig
4.1.4 验证核心库安装
# 检查安装的库文件
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工作空间
# 创建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依赖
# 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包
# 设置环境变量指向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 测试验证
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
