我正在尝试创建一个带有ROS安装和模拟设置的docker容器,以简化稍后加入项目的人员的流程。
当我以这种方式运行rviz时,我会很好地在主机上显示rviz窗口,正如本ros教程所预期的那样:sudo docker run -it --env="DISPLAY" --env="QT_X11_NO_MITSHM=1" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" xrf-robot-repo rviz
ROS Master未运行,因此此输出预期为
现在我的问题是,我想在主机网络模式下运行我的容器(--net=host),rviz对话不再显示。以下是我运行的内容:sudo docker run -it --env="DISPLAY" --env="QT_X11_NO_MITSHM=1" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" --net=host xrf-robot-repo rviz
我认为这些错误与gui窗口没有显示无关
我不知道为什么GUI窗口没有显示。我希望在这里得到一些指导。我想这可能与不同的网络模式影响x11转发的工作方式有关,但我不确定如何进一步研究这一点。
以下是我用来构建图像的Dockerfile的样子,以防它可能有所帮助:
FROM osrf/ros:melodic-desktop-full
SHELL ["/bin/bash", "-c"]
RUN apt-get update && apt-get install -y --no-install-recommends
git apt-utils python3-catkin-tools
&& rm -rf /var/lib/apt/lists/*
RUN source ./ros_entrypoint.sh && git clone https://github.com/RumailM/xrf-robot-stack
RUN source ./ros_entrypoint.sh && cd xrf-robot-stack && catkin_init_workspace
RUN apt-get update
ARG DEBIAN_FRONTEND=noninteractive
RUN source ./ros_entrypoint.sh && cd xrf-robot-stack && rosdep install
--from-paths src --ignore-src -r -y
RUN source ./ros_entrypoint.sh && cd xrf-robot-stack && catkin build
我需要使用网络模式的原因是,我希望主机能够与rosmaster节点和容器中的任何其他节点进行通信。我也不知道容器外可能存在哪些节点,以及它们可以在哪些端口上进行通信,所以只转发我将使用的端口的明显答案是行不通的(端口可能在运行时发生变化)。运送大范围的港口似乎也不可行。
感谢您的指导!
您应该将--privileged
选项添加到docker run命令中。这与Qt应用程序和网络主机这个问题有关。我遇到了一个类似的问题,并通过在ROS Answers上关注这个问题得以解决。
为了能够正确运行rviz,我需要docker容器来访问我的显卡驱动程序(NVIDIA)。因此,我需要将-e NVIDIA_VISIBLE_DEVICES=all
、-e NVIDIA_DRIVER_CAPABILITIES=all
和--runtime nvidia
添加到docker run命令中。
这是的最终运行命令
docker run -it --rm
--privileged
--network host
-e NVIDIA_VISIBLE_DEVICES=all
-e NVIDIA_DRIVER_CAPABILITIES=all
--env="DISPLAY"
--env="QT_X11_NO_MITSHM=1"
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw"
--name "$CONTAINER_NAME"
--runtime nvidia
xrf-robot-repo
/bin/bash
希望这能帮助