Docker部署ROS2 Humble与RTAB-Map视觉SLAM
本文介绍了在Jetson Orin Nano上通过Docker配置ROS2 Humble及视觉SLAM环境的完整流程。具体包括:构建集成ROS2、OpenCV和SLAM依赖的镜像;安装RealSense驱动与ROS接口;编译并配置RTAB-Map进行3D建图。文中详细提供了Dockerfile和关键命令,并说明了深度图像话题的选择对建图效果的影响,便于环境部署与迁移。
·
1. 硬件设备
jetson orin nano super 8g
2. 镜像生成和容器创建
2.1 拉取容器
#拉取ubuntu22.04的镜像
docker pull ubuntu:22.04
2.2 基于ubuntu22.04创建dockfile
# Ubuntu 22.04 + ROS2 Humble Desktop + OpenCV 4.5.x (apt) + opencv-contrib + 视觉SLAM常用依赖
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive \
TZ=Etc/UTC \
LANG=en_US.UTF-8 \
LC_ALL=en_US.UTF-8 \
ROS_DISTRO=humble
SHELL ["/bin/bash", "-c"]
# 0) 基础:更新 + 时区/locale
RUN apt-get update && apt-get install -y --no-install-recommends \
tzdata locales \
&& locale-gen en_US en_US.UTF-8 \
&& update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 \
&& rm -rf /var/lib/apt/lists/*
# 1) 基础工具(尽量把开发/调试/网络/压缩/终端常用的都装上,含 tmux)
RUN apt-get update && apt-get install -y --no-install-recommends \
# 基础系统/证书/仓库工具
ca-certificates \
apt-transport-https \
software-properties-common \
gnupg \
gnupg2 \
lsb-release \
sudo \
# Shell / 终端
bash-completion \
tmux \
less \
nano \
vim \
# 常用命令行工具
curl \
wget \
git \
rsync \
openssh-client \
unzip \
zip \
xz-utils \
p7zip-full \
file \
tree \
jq \
ripgrep \
fd-find \
# 构建工具链
build-essential \
pkg-config \
cmake \
ninja-build \
ccache \
# 调试/诊断
gdb \
gdbserver \
strace \
ltrace \
valgrind \
lsof \
psmisc \
# 网络排障
iproute2 \
iputils-ping \
net-tools \
dnsutils \
tcpdump \
# Python 基础
python3 \
python3-pip \
python3-venv \
python3-dev \
&& rm -rf /var/lib/apt/lists/*
# 2) ROS 2 APT 源(Humble / Jammy)
RUN add-apt-repository universe \
&& curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \
| gpg --dearmor -o /usr/share/keyrings/ros-archive-keyring.gpg \
&& echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] \
http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo ${UBUNTU_CODENAME}) main" \
> /etc/apt/sources.list.d/ros2.list
# 3) ROS2 Humble Desktop + 开发工具链
RUN apt-get update && apt-get upgrade -y \
&& apt-get install -y --no-install-recommends \
ros-humble-desktop \
ros-dev-tools \
python3-rosdep \
python3-colcon-common-extensions \
python3-vcstool \
&& rm -rf /var/lib/apt/lists/*
# 4) rosdep 初始化
#RUN rosdep init || true && rosdep update
# 5) OpenCV 4.5.x + opencv-contrib(Ubuntu 22.04 默认 4.5.4 系列)
RUN apt-get update && apt-get install -y --no-install-recommends \
libopencv-dev \
libopencv-contrib-dev \
python3-opencv \
&& rm -rf /var/lib/apt/lists/*
# 6) 视觉 SLAM 常用依赖(后续你自己源码编译 rtabmap / orbslam / vins / svo 等)
RUN apt-get update && apt-get install -y --no-install-recommends \
# 线代/数值/优化
libeigen3-dev \
libatlas-base-dev \
libopenblas-dev \
liblapack-dev \
libtbb-dev \
libgoogle-glog-dev \
libgflags-dev \
libsuitesparse-dev \
libceres-dev \
# 常用数据与配置
libyaml-cpp-dev \
libsqlite3-dev \
# 点云/传感器常用
libpcl-dev \
libusb-1.0-0-dev \
# OpenGL / GUI / Pangolin 常用依赖
libgtk-3-dev \
libgl1-mesa-dev \
libglu1-mesa-dev \
libglew-dev \
libegl1-mesa-dev \
libglfw3-dev \
libx11-dev \
libxi-dev \
libxrandr-dev \
libxinerama-dev \
libxcursor-dev \
libxxf86vm-dev \
# OpenCV 可视化模块(有的项目会用)
libopencv-viz-dev \
&& rm -rf /var/lib/apt/lists/*
# 7) 入口脚本:自动 source ROS 环境
RUN cat >/ros_entrypoint.sh <<'EOF'
#!/usr/bin/env bash
set -e
source /opt/ros/${ROS_DISTRO}/setup.bash
exec "$@"
EOF
RUN chmod +x /ros_entrypoint.sh
ENTRYPOINT ["/ros_entrypoint.sh"]
CMD ["bash"]
2.3 编译dockfile
#u22-humble-opencv45:latest 镜像的名字(可自己改成自己的)
sudo docker build --no-cache -t u22-humble-opencv45:latest -f Dockerfile .
2.4 创建容器
其中 -v 参数将 Jetson 主机上的 /home/jetson/ros2-slam-docker/ros2_ws 目录(即您的 ROS 2 工作空间)实时映射到容器内部的 /app/project/ros2_ws 路径,实现两者文件的双向同步;同时,通过 -w 参数将容器内的工作目录直接设置为这个被映射的路径,使得您进入容器或执行任何命令时都会默认在此工作空间内进行操作(根据自己的路径设置)
sudo docker run -it \
--name ros2-opencv4.5-release \
--runtime=nvidia \
--net=host \
--ipc=host \
--privileged \
--device /dev/dri \
-e DISPLAY=$DISPLAY \
-e QT_X11_NO_MITSHM=1 \
-e NVIDIA_VISIBLE_DEVICES=all \
-e NVIDIA_DRIVER_CAPABILITIES=graphics,display,utility,compute \
-e __GLX_VENDOR_LIBRARY_NAME=nvidia \
-v /tmp/.X11-unix:/tmp/.X11-unix:rw \
-v /dev/bus/usb:/dev/bus/usb \
-v /sys:/sys:ro \
-v /run/udev:/run/udev:ro \
-v /home/jetson/ros2-slam-docker/ros2_ws/zon_rtab_mab:/workspace/zon_rtab_mab \
-v /home/jetson/RTAB-Map:/root/Documents/RTAB-Map \
-w /workspace/zon_rtab_mab \
u22-humble-opencv45:latest \
bash
创建好容器后,在容器中运行:
#容器里运行
rosdep init || true
rosdep update
3. 依赖安装
3.1 librealense编译
apt-get update
apt-get install -y git cmake build-essential pkg-config \
libusb-1.0-0-dev libssl-dev libgtk-3-dev \
libglfw3-dev libgl1-mesa-dev libglu1-mesa-dev \
udev v4l-utils
apt-get update
apt-get install -y libcurl4-openssl-dev
cd ~
git clone https://github.com/IntelRealSense/librealsense.git
cd librealsense
git fetch --tags
git checkout v2.57.3
mkdir -p build && cd build
cmake .. -DFORCE_RSUSB_BACKEND=ON -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Releasemake
make -j$(nproc)
make install
ldconfig
如果编译中出现因为sudo报错的,解决方法如下:
#:做一个“sudo 兼容占位” 代码里有sudo 但是在容器里 不需要(或者改代码)
cat >/usr/bin/sudo <<'EOF'
#!/bin/sh
exec "$@"
EOF
chmod +x /usr/bin/sudo
./scripts/setup_udev_rules.sh
udevadm control --reload-rules
udevadm trigger
检查是否安装好:
#/workspace/ros2_ws/zon_ORBSLAM/ORB_SLAM3_zong/ORB_SLAM3_yuan/librealsense/build/ 下运行
#在自己编译的路径build里运行
./Releasemake/rs-enumerate-devices | head -n 40
3.2 realsense-ros编译
#安装依赖 容器里完成
apt update
apt install -y \
git cmake build-essential pkg-config \
python3-colcon-common-extensions \
libusb-1.0-0-dev \
libglfw3-dev libgtk-3-dev \
libssl-dev \
ros-humble-diagnostic-updater \
libeigen3-dev \
libx11-xcb1 libxcb1 libxcb-xinerama0 libxcb-icccm4 libxcb-image0 \
libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-shape0 \
libxcb-sync1 libxcb-xfixes0 libxcb-xkb1 libxkbcommon-x11-0 \
libgl1-mesa-glx libgl1-mesa-dri mesa-utils
#源码下载(我这是在宿主机上完成的,源码的下载)
cd ~/ros2-slam-docker/ros2_ws/zon_rtab_mab/realsense_ws
#把realsense-ros 放到一个明确的 src 目录里(避免 colcon 找不到包)
#创建一个/realsense_ws/src 把realsense-ros放在src里面
mkdir -p src && cd src
git clone https://github.com/IntelRealSense/realsense-ros.git
cd realsense-ros
git checkout ros2-development
#容器里
#如果出现fatal: detected dubious ownership in repository at #'/workspace/ros2_ws/zon_ORBSLAM/ORB_SLAM3_zong/ORB_SLAM3_yuan/realsense-ros' To add an #exception for this directory, call: git config --global --add safe.directory 进行下面的操#作 然后再 git checkout ros2-development
#git config --global --add safe.directory #/workspace/zon_rtab_mab/realsense-ros
#源码编译(容器里)在/workspace/zon_rtab_mab/realsense_ws里运行编译
colcon build \
--install-base /opt/realsense_ws/install \
--cmake-args -DCMAKE_BUILD_TYPE=Release#
#每次开新容器 运行
source /opt/ros/humble/setup.bash
source /opt/realsense_ws/install/setup.bash
#验证
ros2 launch realsense2_camera rs_launch.py enable_color:=true enable_depth:=false
4. rtabmap编译
#装依赖
apt update
# RTAB-Map 常用优化后端与稀疏线性代数
apt install -y \
libg2o-dev \
libsuitesparse-dev \
libceres-dev
# 可选:如果你还想要 GTSAM(apt 有时没有或版本不匹配)
apt install -y libgtsam-dev || true
apt update
apt install -y \
build-essential cmake git pkg-config \
libeigen3-dev libsuitesparse-dev \
libopencv-dev \
libceres-dev
#上面依赖安装有些会报错,不要管,直接下面的步骤
#(我是在宿主机上下载源码,然后容器链接宿主机上的路径,在容器中编译)
git clone https://github.com/introlab/rtabmap.git rtabmap
cd rtabmap/build
cmake ..
make -j4
make install
ldconfig
5.rtabmap-ros编译
#依赖安装
apt update
apt install -y ros-humble-pcl-ros
apt install -y ros-humble-pcl-conversions ros-humble-tf2-eigen
apt update
apt install -y \
ros-humble-octomap-msgs \
ros-humble-grid-map-ros
#宿主机上下载源码
git clone https://github.com/introlab/rtabmap_ros.git
cd rtabmap_ros
git checkout ros2
#安装nav2 容器里
apt install -y ros-humble-navigation2 ros-humble-nav2-bringup
#编译 单线程编译,多线程,我的设备内存不够
colcon build --symlink-install \
--executor sequential \
--parallel-workers 1 \
--cmake-args \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_FLAGS="-O2 -g0"
6. 运行
6.1 运行指令
# 1) 环境设置 第一个是ros2 第二个是相机 第三个是rtbamap-ros
source /opt/ros/humble/setup.bash
source /opt/realsense_ws/install/setup.bash
source /workspace/zon_rtab_mab/rtabmap_ws_src/src/install/setup.bash
# 2) 启动相机(D435i 常用)
source /workspace/zon_rtab_mab/realsense_ws/install/setup.bash
ros2 launch realsense2_camera rs_launch.py \
enable_color:=true \
enable_depth:=true \
align_depth.enable:=true
#3)rtabmap启动, depth_topic:=/camera/camera/aligned_depth_to_color/image_raw 设置成这个,当#前也可以设置成 depth_topic:=/camera/camera/depth/image_rect_raw,都可以运行 就是建图的好坏,#depth_topic:=/camera/camera/aligned_depth_to_color/image_raw建图好点(网上说的)
ros2 launch rtabmap_launch rtabmap.launch.py \
rgb_topic:=/camera/camera/color/image_raw \
depth_topic:=/camera/camera/aligned_depth_to_color/image_raw \
camera_info_topic:=/camera/camera/color/camera_info \
rgbd_sync:=true \
approx_sync:=true \
qos:=2 \
frame_id:=camera_link \
visual_odometry:=true \
rtabmap_args:="--delete_db_on_start" \
rtabmap_viz:=true \
rviz:=false
一键启动文件(不带imu):
#!/usr/bin/env bash
set -euo pipefail
############################################
# 可按需修改的路径(按你的实际情况)
############################################
ROS_SETUP="/opt/ros/humble/setup.bash"
# 你的 realsense_ws overlay(你现在用的是这个)
REALSENSE_SETUP="/workspace/zon_rtab_mab/realsense_ws/install/setup.bash"
# 如果你有 rtabmap_ros overlay(有就填;没有就留空)
RTABMAP_SETUP="/workspace/zon_rtab_mab/rtabmap_ws_src/install/setup.bash"
# 数据库保存路径
DB_PATH="/workspace/zon_rtab_mab/maps/my_map.db"
############################################
# 自动 source 环境(注意:source ROS 前要临时关闭 -u)
############################################
set +u
source "$ROS_SETUP"
if [ -f "$REALSENSE_SETUP" ]; then
source "$REALSENSE_SETUP"
fi
if [ -f "$RTABMAP_SETUP" ]; then
source "$RTABMAP_SETUP"
fi
set -u
mkdir -p "$(dirname "$DB_PATH")"
############################################
# Ctrl+C 时清理子进程
############################################
PIDS=()
cleanup() {
echo ""
echo "[INFO] Stopping launched processes..."
for pid in "${PIDS[@]:-}"; do
if kill -0 "$pid" 2>/dev/null; then
kill -INT "$pid" 2>/dev/null || true
fi
done
sleep 1
for pid in "${PIDS[@]:-}"; do
if kill -0 "$pid" 2>/dev/null; then
kill -TERM "$pid" 2>/dev/null || true
fi
done
}
trap cleanup EXIT INT TERM
############################################
# 1) 启动 RealSense
############################################
echo "[INFO] Launching RealSense..."
ros2 launch realsense2_camera rs_launch.py \
enable_color:=true \
enable_depth:=true \
align_depth.enable:=true \
> /tmp/realsense_launch.log 2>&1 &
PIDS+=("$!")
# 等待相机 topic 出现
echo "[INFO] Waiting for /camera/camera topics..."
for i in {1..60}; do
if ros2 topic list | grep -q "^/camera/camera/color/image_raw$"; then
break
fi
sleep 0.5
done
############################################
# 选择 depth topic:优先 aligned_depth_to_color
############################################
DEPTH_TOPIC="/camera/camera/depth/image_rect_raw"
if ros2 topic list | grep -q "^/camera/camera/aligned_depth_to_color/image_raw$"; then
DEPTH_TOPIC="/camera/camera/aligned_depth_to_color/image_raw"
fi
echo "[INFO] Using depth topic: ${DEPTH_TOPIC}"
############################################
# 2) 启动 RTAB-Map
############################################
echo "[INFO] Launching RTAB-Map..."
ros2 launch rtabmap_launch rtabmap.launch.py \
rgb_topic:=/camera/camera/color/image_raw \
depth_topic:="${DEPTH_TOPIC}" \
camera_info_topic:=/camera/camera/color/camera_info \
rgbd_sync:=true \
approx_sync:=true \
qos:=2 \
frame_id:=camera_link \
visual_odometry:=true \
rtabmap_args:="--delete_db_on_start" \
database_path:="${DB_PATH}" \
rtabmap_viz:=true \
rviz:=false \
> /tmp/rtabmap_launch.log 2>&1 &
PIDS+=("$!")
############################################
# 前台等待
############################################
echo "[INFO] Started. Logs:"
echo " - /tmp/realsense_launch.log"
echo " - /tmp/rtabmap_launch.log"
echo "[INFO] Press Ctrl+C to stop."
wait
运行:
#在该一键启动文件路径上,最好和rtbamap 在一个路径上
./start_rtabmap_rgbd.sh
一键启动文件(带imu):
#!/usr/bin/env bash
set -euo pipefail
############################################
# 可按需修改的路径(按你的实际情况)
############################################
ROS_SETUP="/opt/ros/humble/setup.bash"
# 你的 realsense_ws overlay(你现在用的是这个)
REALSENSE_SETUP="/workspace/zon_rtab_mab/realsense_ws/install/setup.bash"
# 如果你有 rtabmap_ros overlay(有就填;没有就留空)
RTABMAP_SETUP="/workspace/zon_rtab_mab/rtabmap_ws_src/install/setup.bash"
# 数据库保存路径
DB_PATH="/workspace/zon_rtab_mab/maps/my_map.db"
# 日志文件
RS_LOG="/tmp/realsense_launch.log"
IMU_LOG="/tmp/imu_filter_madgwick.log"
RTAB_LOG="/tmp/rtabmap_launch.log"
############################################
# 自动 source 环境(注意:source ROS 前要临时关闭 -u)
############################################
set +u
source "$ROS_SETUP"
if [ -f "$REALSENSE_SETUP" ]; then
source "$REALSENSE_SETUP"
fi
if [ -f "$RTABMAP_SETUP" ]; then
source "$RTABMAP_SETUP"
fi
set -u
mkdir -p "$(dirname "$DB_PATH")"
############################################
# Ctrl+C 时清理子进程
############################################
PIDS=()
cleanup() {
echo ""
echo "[INFO] Stopping launched processes..."
for pid in "${PIDS[@]:-}"; do
if kill -0 "$pid" 2>/dev/null; then
kill -INT "$pid" 2>/dev/null || true
fi
done
sleep 1
for pid in "${PIDS[@]:-}"; do
if kill -0 "$pid" 2>/dev/null; then
kill -TERM "$pid" 2>/dev/null || true
fi
done
}
trap cleanup EXIT INT TERM
############################################
# 1) 启动 RealSense(RGB-D + IMU)
############################################
echo "[INFO] Launching RealSense (RGB-D + IMU)..."
: > "$RS_LOG"
ros2 launch realsense2_camera rs_launch.py \
enable_color:=true \
enable_depth:=true \
align_depth.enable:=true \
enable_gyro:=true \
enable_accel:=true \
unite_imu_method:=2 \
> "$RS_LOG" 2>&1 &
PIDS+=("$!")
############################################
# 等待相机 topics 出现
############################################
echo "[INFO] Waiting for camera topics (/camera/camera/color/image_raw and /camera/camera/imu)..."
for i in {1..80}; do
if ros2 topic list | grep -q "^/camera/camera/color/image_raw$" \
&& ros2 topic list | grep -q "^/camera/camera/imu$"; then
break
fi
sleep 0.25
done
if ! ros2 topic list | grep -q "^/camera/camera/color/image_raw$"; then
echo "[ERROR] /camera/camera/color/image_raw not found. Check $RS_LOG"
exit 1
fi
if ! ros2 topic list | grep -q "^/camera/camera/imu$"; then
echo "[ERROR] /camera/camera/imu not found. Check $RS_LOG"
exit 1
fi
############################################
# 选择 depth topic:优先 aligned_depth_to_color
############################################
DEPTH_TOPIC="/camera/camera/depth/image_rect_raw"
if ros2 topic list | grep -q "^/camera/camera/aligned_depth_to_color/image_raw$"; then
DEPTH_TOPIC="/camera/camera/aligned_depth_to_color/image_raw"
fi
echo "[INFO] Using depth topic: ${DEPTH_TOPIC}"
############################################
# 2) 启动 IMU 融合(Madgwick)
############################################
echo "[INFO] Launching imu_filter_madgwick (/camera/camera/imu -> /rtabmap/imu)..."
: > "$IMU_LOG"
ros2 run imu_filter_madgwick imu_filter_madgwick_node --ros-args \
-p use_mag:=false \
-p publish_tf:=false \
-p world_frame:="enu" \
-r /imu/data_raw:=/camera/camera/imu \
-r /imu/data:=/rtabmap/imu \
> "$IMU_LOG" 2>&1 &
PIDS+=("$!")
# 等待 /rtabmap/imu 出现
echo "[INFO] Waiting for /rtabmap/imu..."
for i in {1..80}; do
if ros2 topic list | grep -q "^/rtabmap/imu$"; then
break
fi
sleep 0.25
done
if ! ros2 topic list | grep -q "^/rtabmap/imu$"; then
echo "[ERROR] /rtabmap/imu not found. Check $IMU_LOG"
exit 1
fi
############################################
# 3) 启动 RTAB-Map(带 IMU)
############################################
echo "[INFO] Launching RTAB-Map..."
: > "$RTAB_LOG"
ros2 launch rtabmap_launch rtabmap.launch.py \
rgb_topic:=/camera/camera/color/image_raw \
depth_topic:="${DEPTH_TOPIC}" \
camera_info_topic:=/camera/camera/color/camera_info \
rgbd_sync:=true \
approx_sync:=true \
qos:=2 \
frame_id:=camera_link \
visual_odometry:=true \
odom_topic:=/rtabmap/odom \
imu_topic:=/rtabmap/imu \
wait_imu_to_init:=true \
rtabmap_args:="--delete_db_on_start" \
database_path:="${DB_PATH}" \
rtabmap_viz:=true \
rviz:=false \
> "$RTAB_LOG" 2>&1 &
PIDS+=("$!")
############################################
# 前台等待
############################################
echo "[INFO] Started. Logs:"
echo " - RealSense : $RS_LOG"
echo " - IMU Filter: $IMU_LOG"
echo " - RTAB-Map : $RTAB_LOG"
echo "[INFO] Press Ctrl+C to stop."
wait
运行:
./start_rtabmap_rgbd_imu.sh
6.2 运行结果

版权声明: 辛苦码字不易,转载请注明原文出处和作者信息,谢谢理解!
欢迎分享与交流,但拒绝任何形式的商业转载或洗稿。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)