准备工作:构建包含TaichiSLAM的Docker镜像
原因: 基础ROS镜像不包含TaichiSLAM的代码,你需要创建一个新的镜像,将TaichiSLAM项目克隆并编译进去。
-
创建一个
Dockerfile文件
创建一个名为Dockerfile的文件,内容如下:FROM osrf/ros:noetic-desktop-fullWORKDIR /root# 安装必要的依赖项 RUN apt-get update && apt-get install -y \git \python3-catkin-tools \python3-osrf-pycommon \build-essential \libboost-all-dev \libeigen3-dev \libopencv-dev \&& rm -rf /var/lib/apt/lists/*# 克隆TaichiSLAM代码 RUN git clone https://github.com/taichi-dev/TaichiSLAM.git# 创建并初始化ROS工作空间 RUN mkdir -p /root/taichi_slam_ws/src RUN mv /root/TaichiSLAM /root/taichi_slam_ws/src/ WORKDIR /root/taichi_slam_ws RUN catkin_make --cmake-args \-DCMAKE_BUILD_TYPE=Release \-DPYTHON_EXECUTABLE=/usr/bin/python3为什么这样做:
Dockerfile定义了如何从基础镜像构建一个新的镜像。这里我们首先安装TaichiSLAM所需的依赖,然后克隆项目代码,并使用catkin_make来编译它。这确保了taichislam_node.py和相关的可执行文件被正确地生成并添加到ROS的路径中。 -
构建Docker镜像
在包含Dockerfile的目录下执行以下命令:docker build -t taichislam-ros:noetic .为什么这样做: 这个命令会根据你定义的
Dockerfile来构建一个名为taichislam-ros:noetic的新镜像。一旦构建完成,这个镜像就包含了所有运行TaichiSLAM所需的环境和编译好的代码。
正式运行:三个终端操作步骤
目标: 在三个独立的终端中,分别启动ROS Master、播放rosbag数据,以及运行TaichiSLAM节点,从而模拟一个完整的SLAM系统运行环境。
步骤:
终端 1:启动 ROS Master
命令:
docker run -it --name taichislam-container --rm --net=host -e DISPLAY -e QT_X11_NO_MITSHM=1 -v /tmp/.X11-unix:/tmp/.X11-unix taichislam-ros:noetic bash -c "source /root/taichi_slam_ws/devel/setup.bash && roscore"
为什么这样做:
docker run ...: 启动一个新容器。--name taichislam-container: 给容器命名,方便后续使用docker exec命令进入。--rm: 容器退出时自动移除,保持环境干净。--net=host: 使用宿主机的网络,这对于ROS在多个容器或宿主机与容器之间通信至关重要。-e DISPLAY -e QT_X11_NO_MITSHM=1 -v /tmp/.X11-unix:/tmp/.X11-unix: 这几行是用来启用图形界面(GUI)的,因为TaichiSLAM的show:=true参数需要显示窗口。taichislam-ros:noetic: 使用我们刚刚构建的、包含TaichiSLAM的镜像。bash -c "...": 在容器内执行一个命令。source /root/taichi_slam_ws/devel/setup.bash: 这是最关键的一步! 它会把taichi_slam_ws工作空间添加到ROS的环境变量中,让ROS能找到taichislam包。roscore: 启动ROS Master,作为所有ROS节点的中心枢纽。
终端 2:播放 rosbag
命令:
docker exec -it taichislam-container bash -c "source /root/taichi_slam_ws/devel/setup.bash && rosbag play --clock -r 1.0 /bags/taichislam-realsense435.bag"
为什么这样做:
docker exec -it taichislam-container: 进入第一个终端中正在运行的容器。source /root/taichi_slam_ws/devel/setup.bash: 同样地,确保ROS路径正确。rosbag play ...: 播放数据包。请确保/bags/taichislam-realsense435.bag路径在容器内是可访问的。如果文件在你的宿主机上,你需要在docker run命令中用-v参数将宿主机的目录映射到容器内,例如:-v /path/on/host:/bags。
终端 3:启动 TaichiSLAM 节点
命令:
docker exec -it taichislam-container bash -c "source /root/taichi_slam_ws/devel/setup.bash && roslaunch taichislam taichislam-d435.launch show:=true"
为什么这样做:
docker exec -it taichislam-container: 进入同一个容器。source ...: 确保ROS路径正确。roslaunch taichislam taichislam-d435.launch show:=true: 运行taichislam包中的taichislam-d435.launch启动文件。因为你已经正确设置了ROS路径,roslaunch现在可以找到taichislam包了,而不是像之前那样报“is not a launch file name”的错误。
你之前的问题
你之前遇到的错误ERROR: cannot launch node of type [taichislam/taichislam_node.py]: taichislam,正是因为你在执行roslaunch之前,没有执行source /root/taichi_slam_ws/devel/setup.bash,导致ROS找不到taichislam这个包。正确的setup.bash文件会把你的工作空间添加到ROS_PACKAGE_PATH环境变量中。
总结
你之前的操作缺少了最关键的一环:将编译好的TaichiSLAM包添加到ROS的环境中。通过构建一个包含编译后代码的镜像,并在每次进入容器或执行命令时都source正确的setup.bash文件,你就能解决这个核心问题。
