本文主要介绍如何使用Docker在Windows和Linux环境中部署并使用ROS,通过Docker Container运行ROS,可以方便我们在一个本地环境中运行多个ROS版本。
更多内容,访问专栏目录获取实时更新。
关于ROS的版本
参考ROS1 Distribution Wiki和ROS2 Distribution Wiki,推荐使用:
- ROS1 Noetic 版本(2020/05发布,支持到2025/05)
- ROS2 Humble版本(2022/05发布,支持到2027/05)
拉取ROS镜像并运行ROS容器
要求阅读者需要具有基础的Docker使用经验
关于ROS的镜像,可以访问Docker Hub查找对应版本的脚本,本文里我们以ROS1 Noetic和ROS2 Humble为例演示。
环境要求
在Windows环境中,需要安装Docker Desktop,并且可以通过命令行执行docker命令:
Linux环境使用的是Ubuntu 22,同样已经提前安装了docker:
拉取镜像
在Windows环境中,需要首先启动Docker Desktop。然后执行下面的脚本,可以拉取ROS1和ROS2的镜像文件:
docker pull osrf/ros:noetic-desktop
docker pull osrf/ros:humble-desktop
执行完成后,通过指令查看已拉取的镜像文件:
docker images
运行容器
docker run --name <container-name> -it <image-name:tag>
上面的指令是运行一个容器,容器名为’container-name’的替换内容,使用’image-name:tag’指定的镜像文件,并运行在交互模式下(-it),指令示例:
docker run --name noetic-gui -it osrf:noetic-desktop
指令运行以后,命令行将会进行到该容器的交互模式下,在Docker Desktop中,能看到当前运行的容器:
运行ROS
当前我们已经启动了ROS Noetic的Docker容器,并进入了交互模式,在命令行中执行roscore
来启动ROS Master (仅针对ROS1版本需要)
如果你也在命令行中看到了上述的内容,说明ROS1运行成功。
Windows中启动另一个命令行,执行下面的命令,进入到一个已启动容器的交互模式:
docker exec -it <container-name> bash
然后执行:
source /opt/ros/noetic/setup.bash
printenv | grep ROS
rostopic list
第一条指令在每启动一个shell时都需要执行一下(除非你将该指令加入到了.bashrc文件中),它能配置你的shell让你获取到ROS的程序和帮助这些程序找到依赖的包。
第二,三条指令分别是查看已安装ROS的环境变量和当前的ROS Topic列表,如果已正确完成了上述步骤,你可以看到下图类似的内容:
Docker容器中的GUI程序
如果我们运行的ROS程序需要打开一些用户交互界面,比如Gazebo,RViz等,在Docker容器中要怎么办呢?
以经典的小乌龟(turtlesim)为例,演示如何在docker容器中使用GUI。
rosrun turtlesim turtlesim_node
我相信执行完上面的指令后你将会得到下面的错误:
这时就需要我们安装XLaunch来实现界面的显示,你可以访问Xming网站获取,或通过SourceForge下载。在安装时基本不许要任何配置,仅注意同时安装XLaunch即可。
安装完成后,启动XLaunch,只需要在下图标注的步骤修改值为0,其他一直点击下一步直至结束
这时在电脑的状态栏里你应该能够看到启动的XServer.
确保XServer正常运行,这时再重新运行Noetic的容器,不过通过下面的指令运行:
docker run --name noetic-gui -e DISPLAY=host.docker.internal:0.0 -it osrf/ros:noetic-desktop
然后运行roscore
并在另一个命令行中重复之前的命令(不要忘记source一下),启动turtlesim
rosrun turtlesim turtlesim_node
我们的小乌龟就正常的显示在桌面上了。
启动另一个命令行,我们来通过键盘上下左右控制小乌龟:
rosrun turtlesim turtle_teleop_key
在Ubuntu中,步骤基本类似,在启动ROS时,建议通过一个bash文件来启动容器,run_noetic_gui.bash:
xhost local:root
XAUTH=/tmp/.docker.xauth
docker run -it \
--name=noetic-gui \
--env="DISPLAY=$DISPLAY" \
--env="QT_X11_NO_MITSHM=1" \
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
--env="XAUTHORITY=$XAUTH" \
--volume="$XAUTH:$XAUTH" \
--net=host \
--privileged \
osrf/ros:noetic-desktop \
bash
echo "Done."
如何访问Docker容器中的文件
在之后的开发中,我们需要创建工作空间并创建自己的工程项目,而当前的ROS运行在Docker容器中,要怎样访问的到呢。
这里推荐使用VisualStudio Code,并安装插件Dev Container
成功安装了插件后,我们就可以通过VS Code打开一个Docker Container的文件目录啦。
至此,我们成功的在Windows或Ubuntu环境下,通过Docker中运行了ROS Noetic,并且能够显示用户界面,并且通过VS Code访问容器中的文件和工程。
如有错误,欢迎留言或来信指正:hbin6358@163.com