文章目录
- 写在前面
- 1. 背景描述
- 2. 安装步骤
- 2.1 允许本地机器上的用户或进程连接到 X server
- 2.2 拉取 docker 镜像
- 2.3 使用镜像osrf/ros:melodic-desktop-full创建并运行容器
- 2.4 运行 roscore
- 2.5 运行 rviz
- 参考链接
写在前面
自己的测试环境:
Ubuntu20.04,docker-27.3.1
1. 背景描述
由于测试ROS代码出现不同的环境,但是自己的电脑安装了 Ubuntu20.04,自己电脑只能安装 ROS-Noetic, 但是测试其他代码的时候需要 ROS-Melodic。为了能够最快地搭建ROS-Melodic 的环境,这里借助 docker 实现。
docker 镜像网站中 Open Source Robotics Foundation 已经维护了多个版本的包含ros的系统:https://hub.docker.com/r/osrf/ros,可以根据需要查看
2. 安装步骤
首先确保在本机已经安装好 docker。
2.1 允许本地机器上的用户或进程连接到 X server
下述命令用于在 Linux 系统中修改 X server 的访问控制策略,允许本地机器上的用户或进程连接到 X server,从而允许它们显示图形界面。这个命令通常用于 Docker 容器与宿主机之间的图形界面共享。
sudo xhost +local:
下面是命令的详细解释:
- sudo:以超级用户(root)的权限执行后面的命令。在大多数 Linux 系统中,修改 X server 的访问控制需要 root 权限。
- xhost:X server 的一个实用程序,用于管理哪些用户和主机可以连接到 X server。
- +local::这是一个参数,用于更改 X server 的访问控制列表(ACL)。+local: 表示允许本地机器上的所有用户连接到 X server。
- 在默认情况下,X server 只允许与它在同一终端会话启动的进程连接。如果你尝试从另一个会话(例如,从 Docker 容器内部)启动一个图形界面程序,它将无法连接到 X server,除非你明确允许这样做。
- 执行 sudo xhost +local: 命令后,任何本地用户都可以连接到 X server。这通常是为了允许 Docker 容器内的进程显示图形界面。例如,当你在 Docker 容器中运行一个需要图形界面的应用程序时,你需要确保容器可以访问宿主机的 X server。
2.2 拉取 docker 镜像
使用docker pull
命令拉取包含 ROS-Melodic 的镜像:
docker pull osrf/ros:melodic-desktop-full
等待拉取完毕之后,使用 docker images
验证该镜像是否拉取成功。如果出现类似于下述的结果,说明镜像拉取成功。
2.3 使用镜像osrf/ros:melodic-desktop-full创建并运行容器
docker run -it --gpus all --env="NVIDIA_DRIVER_CAPABILITIES=all" --volume=/tmp/.X11-unix:/tmp/.X11-unix --volume=/dev/dri:/dev/dri --device=/dev/snd --device=/dev/dri --env="DISPLAY=$DISPLAY" --name=ros_melodic_test osrf/ros:melodic-desktop-full
这条指令的解释:
这条 docker run 命令用于启动一个名为 melodic_test 的 Docker 容器,并且针对运行 ROS (Robot Operating System) 桌面完整版镜像进行了一些特定的配置,以支持 GPU 加速和图形界面显示。下面是每个参数的详细解释:
docker run:Docker 命令,用于创建并启动一个新的容器。
-it:两个参数,-i 表示交互模式,保持 STDIN 打开,即使不附加到容器终端;-t 分配一个伪终端,为容器提供一个文本命令行界面。
–gpus all:允许容器访问宿主机上所有的 GPU 设备。这通常需要 NVIDIA Container Toolkit 的支持。
–env=“NVIDIA_DRIVER_CAPABILITIES=all”:设置环境变量,指示 Docker 容器需要完整的 NVIDIA 驱动能力,这通常用于启用 GPU 加速。
–volume=/tmp/.X11-unix:/tmp/.X11-unix:挂载卷,将宿主机的 /tmp/.X11-unix 目录挂载到容器的相同路径,这个目录包含了 X11 服务器的 UNIX 域套接字,用于图形界面的通信。
–volume=/dev/dri:/dev/dri:挂载卷,将宿主机的 /dev/dri 目录挂载到容器的相同路径,这个目录包含了 Direct Rendering Infrastructure (DRI) 设备文件,用于 GPU 硬件的直接访问。
–device=/dev/snd:授予容器访问宿主机的 /dev/snd 设备的权限,这是声卡设备文件,用于音频输入输出。
–device=/dev/dri:再次授予容器访问宿主机的 /dev/dri 设备的权限。这个参数和上面的 --volume 参数一起确保容器可以访问 GPU 设备。
–env=“DISPLAY=$DISPLAY”:设置环境变量 DISPLAY,用于图形界面的显示。这里使用宿主机的 DISPLAY 环境变量值,使得容器内的图形界面程序可以在宿主机上显示。
–name=ros_melodic_test:为容器指定一个名称,这里名称为 ros_melodic_test。
osrf/ros:melodic-desktop-full:指定要使用的 Docker 镜像,这里是 ROS (Robot Operating System) 的 melodic 桌面完整版镜像。
在本机执行docker ps -a
验证是否创建成功,如果出现下列的输出,说明创建成功:
2.4 运行 roscore
以交互命令进入容器:
docker exec -it ros_melodic_test bash
在容器内部执行下列指令配置ros的环境变量,并运行roscore
:
source ./ros_entrypoint.sh
roscore
2.5 运行 rviz
以交互命令进入容器:
docker exec -it ros_melodic_test bash
在容器内部执行下列指令配置ros的环境变量,并运行rviz
:
source ./ros_entrypoint.sh
rviz
# 或者 rosrun rviz rviz
出现rviz界面即视为配置成功。
参考链接
[1] 深圳市进化图灵智能科技有限公司. Docker 安装ros 使用rviz 等等图形化程序 [EB/OL]. https://turingevo.blog.csdn.net/article/details/140425464, 2024-07-14/2024-10-13.