Docker 和 ROS 指南#
使用 ROS 创建 Docker 镜像#
首先,如果可以的话,您绝对应该依赖Docker Hub 上预构建的 OSRF ROS 映像
例如,要直接从源获取完整的 ROS Noetic 桌面安装:
docker pull osrf/ros:noetic-desktop-full
Architectures
启动docker容器#
Docker 网络选项有很多,但一种常见的选项是允许容器与主机共享同一网络。
$ docker run -it --net=host osrf/ros:noetic-desktop-full roscore
$ docker run -it --net=host osrf/ros:noetic-desktop-full bash
# rostopic list
/rosout
/rosout_agg
尝试在 3 个单独的终端中运行以下命令,确保通过主机网络启动 Docker 容器。
$ rscore
$ rostopic pub -r 1 /my_topic std_msgs/String '{data: "hello"}'
$ rostopic echo /my_topic
Docker 容器内的图形#
现在我们应该有一个独立的 ROS 开发环境,其中包含一些 TurtleBot3 软件包……但是如果您尝试运行任何带有图形的东西,您会发现这并不能正确运行。根据ROS Wiki,有多种方法可以让图形在 Docker 容器内工作,这对于充满 RViz、rqt 和 Gazebo 等可视化工具的 ROS 工作流程来说至关重要。采用最简单(但最不安全)的方法,即允许 Docker 使用主机的 X11 套接字,我们可以执行以下操作:
export DISPLAY=:0
xhost +
docker run -it --net=host \
--env="DISPLAY" \
--env="QT_X11_NO_MITSHM=1" \
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
--volume="${PWD}":"/catkin_ws":rw \
--name ros-noetic \
osrf/ros:noetic-desktop-full \
bash
docker run -it --rm --name example-ros \
-v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY \
--net=host --privileged osrf/ros:noetic-desktop-full