针对 Ubuntu 24.04 的全新高精度 SLAM 教程
jetson部署:
https://blog.csdn.net/weixin_53776054/article/details/128552701
方案概述:
硬件: Intel RealSense D435i
操作系统: Ubuntu 24.04 LTS
中间件: ROS 2 Jazzy Jalisco
核心算法: ORB-SLAM3 (通过社区支持的 ROS 2 封装)
可视化工具: RViz2
第一步:基础环境搭建 (ROS 2 版本)
1.1 安装 ROS 2 Jazzy Jalisco
在 Ubuntu 24.04 上,安装 ROS 2 非常直接。
调用鱼香一键脚本,安装jazzy
wget http://fishros.com/install -O fishros && . fishros
1.2 安装 Intel RealSense SDK 2.0 (与之前相同)
这个步骤基本不变,Intel 的官方源截至目前(20250705),没有支持apt install。
需要手动编译:
sudo apt update
sudo apt install git libssl-dev libusb-1.0-0-dev pkg-config libgtk-3-dev libglfw3-dev libgl1-mesa-dev build-essential cmake
cd ~ # 回到主目录
git clone https://github.com/IntelRealSense/librealsense.git
cd librealsense
git checkout v2.56.3 #要切换到最新版本才能和jazzy对上
mkdir build && cd build
# 运行 CMake 进行配置。
# -DBUILD_EXAMPLES=true 会同时编译 realsense-viewer 等工具
# -DCMAKE_BUILD_TYPE=Release 是为了获得优化后的高性能版本
cmake ../ -DBUILD_EXAMPLES=true -DCMAKE_BUILD_TYPE=Release
# 开始编译。-j 后面的数字是您CPU的核心数,可以加快编译速度。
# 如果不确定,可以用 `nproc` 命令查看核心数,例如 make -j$(nproc)
make -j4
# 将编译好的库和工具安装到系统中
sudo make install
1.3 安装 RealSense ROS 2 Wrapper
这是第一个重大变化。我们需要安装 ROS 2 版本的封装。
bash
1. 创建一个 ROS 2 工作空间 (colcon workspace)
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src/
2. 克隆 realsense-ros 源码
git clone https://github.com/IntelRealSense/realsense-ros.git
3. 切换到 ROS 2 分支
cd realsense-ros/
git checkout ros2-development # 这是关键!切换到 ROS 2 分支,但是这个分支对LibrealSense要求过高
cd ~/ros2_ws/
4. 安装依赖并编译
rosdep 在 ROS 2 中用法相同
sudo rosdep init #sudo -E rosdep init 如果需要代理,要加-E使代理生效
rosdep update
rosdep install -i --from-path src --rosdistro jazzy -y
使用 colcon 编译,而不是 catkin_make
colcon build --symlink-install
5. 让环境生效
echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc
第二步:编译安装 ORB-SLAM3 (ROS 2 版本)
官方的 ORB-SLAM3 不直接支持 ROS 2。幸运的是,有优秀的社区开发者维护了 ROS 2 的封装。
2.1 安装依赖 (与之前类似)
bash
sudo apt-get update
sudo apt-get install -y build-essential cmake git libgoogle-glog-dev libatlas-base-dev libeigen3-dev
Pangolin 的安装方式不变
cd ~
git clone --recursive https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
./scripts/install_prerequisites.sh recommended
cmake -B build
cmake --build build
sudo cmake --build build --target install
2.2 编译 ORB-SLAM3 及其 ROS 2 封装
我们将使用一个广受好评的社区版本。
bash
最终正确的启动命令
请使用下面这条最完整、最明确的命令:
bash
ros2 launch realsense2_camera rs_launch.py enable_imu:=true enable_gyro:=true enable_accel:=true unite_imu_method:=2
如果还想看点云
如果您还想同时启用点云,那么最终的"全功能"命令是:
bash
ros2 launch realsense2_camera rs_launch.py pointcloud.enable:=true enable_imu:=true enable_gyro:=true enable_accel:=true unite_imu_method:=2
最终方案推荐:Cartographer + AprilTags/ArUco 标记
对于您的需求,Cartographer 是最佳的底层 SLAM 系统,但它需要一个额外的"全局定位层"来满足您的第三个需求。
下面是这个方案的完整架构和原因。
方案架构
这个解决方案分为三个核心组件:
车载 SLAM 系统 (Onboard SLAM System):运行在移动机器人上,负责实时定位和建立/更新局部环境地图。
全局定位与配准系统 (Global Localization & Registration System):利用天花板摄像头,将机器人的局部地图"锚定"到一个全局的、固定的世界坐标系中。
任务规划与执行系统 (Task Planning & Execution System):在全局坐标系下进行任务编排和路径规划。
组件一:车载 SLAM 系统 - 为什么选择 Cartographer?
对于您的前两个需求,Cartographer 是最合适的选择。
需求 1:定位精度
Cartographer 的强项:Cartographer 的核心优势在于其极其鲁棒和精确的定位能力。它通过紧密耦合 IMU 数据和点云数据,并结合一个强大的后端位姿图优化器,能够提供非常平滑、精确且不易丢失的定位结果。对于需要精确执行任务的机器人来说,这种可靠性至关重要。
需求 2:适应动态变化
Cartographer 的处理方式:我们之前讨论过,Cartographer 通过其子图(Submap)机制来处理动态变化。它不会"擦除"旧数据,而是通过不断创建包含最新环境信息的新子图,在最终生成占用栅格地图时,用新的、更一致的数据在概率上"压倒"旧数据。
实际效果:这意味着当您移动家具并持续在区域内操作机器人时,Cartographer 生成的用于导航的 2D 成本地图(Costmap)会逐渐更新,反映出家具的新位置和旧位置的空闲状态。这正是您所需要的"地图刷新"功能,它保证了机器人可以适应环境的渐进式变化。
组件二:全局定位与配准系统 - 如何与天花板摄像头配合?
这是您需求中最关键也最具挑战性的一环。单独的 Cartographer 无法知道它自己建立的 map 坐标系与天花板摄像头的坐标系之间的关系。我们需要一个"共同语言"来连接它们。
最佳实践:使用基准标记 (Fiducial Markers)
最可靠、最精确、最容易实现的方法是使用 AprilTags 或 ArUco 标记。
操作流程:
物理部署:在室内场景中,选择几个位置,将 AprilTag 标记同时粘贴在机器人和天花板摄像头都能清晰看到的地方(例如,墙壁的中下部、固定的机器设备上)。
天花板摄像头节点:
运行一个 ROS 2 节点,让天花板摄像头持续检测视野内的所有 AprilTag。
这个节点会发布每个 Tag 相对于天花板摄像头坐标系 (ceiling_cam_frame) 的位姿。
机器人车载摄像头节点:
您的 D435i 在移动过程中,也会看到这些 AprilTag。
运行一个节点(例如 apriltag_ros),它会发布每个 Tag 相对于D435i 摄像头坐标系 (camera_color_frame) 的位姿。
创建"全局配准节点 (Global Registrar Node)":
这是您需要自己编写的一个核心节点。它的逻辑非常清晰:
订阅:同时订阅来自天花板摄像头和机器人摄像头的 AprilTag 检测结果。
监听 TF:监听由 Cartographer 发布的从 map 到 camera_color_frame 的 TF 变换树。
计算:当两个摄像头都看到同一个 ID 的 AprilTag 时,奇迹发生了。此时我们拥有了两条变换链:
ceiling_cam_frame -> Tag_N
map -> base_link -> camera_color_frame -> Tag_N
通过这两条链,该节点就可以精确计算出从 ceiling_cam_frame 到 Cartographer 的 map frame 的变换关系 (tf_ceiling_to_map)。
发布:这个节点的主要任务就是计算并持续发布 (broadcast) 这个 tf_ceiling_to_map 的 TF 变换。
最终效果:一旦这个配准节点运行起来,您的整个系统就有了一个统一的、全局的 TF 树。天花板摄像头坐标系成为了所有系统的"世界坐标系"。
组件三:任务规划与执行系统 - 如何实现?
有了统一的坐标系,任务编排就变得非常直观了。
用户界面 (UI):您可以创建一个简单的 UI,显示天花板摄像头的实时视频流。
任务下发:当操作员在 UI 的视频流上点击一个点(例如,"去那个桌子旁边"),系统会记录下这个像素坐标 (u, v)。
坐标转换:利用天花板相机的内参,可以将这个像素坐标转换成在 ceiling_cam_frame 下的一个三维目标点。
目标发布:将这个在 ceiling_cam_frame 下的目标点,通过我们刚刚建立的 TF 树,转换到机器人导航系统(如 Nav2)所使用的 map 坐标系下。
路径规划与执行:将转换后的目标点作为导航目标发送给 Nav2。Nav2 会在 Cartographer 生成的(并已动态更新的)地图上规划路径,并控制机器人移动过去。
为什么不选 RTAB-Map 或 VINS-Fusion?
RTAB-Map:是一个强有力的备选方案。它在三维建模和传感器支持方面非常出色。但是,对于需要长期、高可靠性定位的机器人任务,Cartographer 的后端优化和鲁棒性通常被认为略胜一筹。RTAB-Map 的内存管理机制虽然也能处理动态物体,但其核心是为大规模建图设计的,而 Cartographer 的机制更侧重于为定位服务。
VINS-Fusion:完全不适合这个场景。它是一个视觉-惯性里程计 (Odometry) 系统,而非一个完整的建图与定位 (SLAM) 系统。它的目标是提供极致精确的自身运动轨迹,但它生成的地图(稀疏点云)无法直接用于导航和路径规划。
总结
您的需求是一个典型的"全局定位下的机器人自主导航"问题。最佳方案是:
使用 Cartographer 作为机器人的核心 SLAM 系统,因为它提供了无与伦比的定位精度和处理动态环境的鲁棒性。
部署 AprilTag/ArUco 标记作为物理"锚点",这是连接不同坐标系最可靠的方式。
开发一个全局配准节点,利用共享的 AprilTag 来计算并发布从全局(天花板)坐标系到机器人地图坐标系的变换。
在全局坐标系下进行任务规划,将目标点转换到机器人坐标系后,交由标准的导航框架(如 Nav2)执行。
这个架构将各个组件的优势发挥到了极致,是目前工业界和学