I had the following errors and warnings in a ROS project. They showed up using docker-compose or when running a mere container from the image, which strangely had worked once somehow but then later did not open the RViz anymore:
process[rviz-3]: started with pid  QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root' qt.qpa.screen: QXcbConnection: Could not connect to display Could not connect to any X display.
talker_1 | [Err] [RenderEngine.cc:725] Can't open display: talker_1 | [Wrn] [RenderEngine.cc:93] Unable to create X window. Rendering will be disabled talker_1 | [Wrn] [RenderEngine.cc:293] Cannot initialize render engine since render path type is NONE. Ignore this warning ifrendering has been turned off on purpose. listener_1 | * /nodes/slam_QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root' listener_1 | qt.qpa.screen: QXcbConnection: Could not connect to display listener_1 | Could not connect to any X display. listener_1 | [rviz-2] process has died [pid 64, exit code 1, cmd /opt/ros/melodic/lib/rviz/rviz -d /MYPROJECT/src/MYPROJECT_common/config/config.rviz __name:=rviz __log:=/root/.ros/log/8a57a040-8bf6-11eb-bfa4-0242ac120003/rviz-2.log].
talker_1 | [Err] [CameraSensor.cc:112] Unable to create CameraSensor. Rendering is disabled.
WARNING: Unable to locate/open X configuration file.
WARNING: Unable to parse X.Org version string.
Package xorg-server was not found in the pkg-config search path. Perhaps you should add the directory containing `xorg-server.pc' to the PKG_CONFIG_PATH environment variable No package 'xorg-server' found Option "AllowEmptyInitialConfiguration" "True" added to Screen "Screen0".
ERROR: Unable to write to directory '/etc/X11'.
Because of all of these errors and warnings, it slowly and all of a sudden caught my mind that it might be about that X / X11 :)...
I left my project aside since the errors and warnings could have been caused by the image itself. Instead, I started from scratch, using a general guide with an easy image. I am following Running ROS with GUI in Docker using Windows Subsystem for Linux 2 (WSL2) about how to setup the X server on Windows and use it as the output of the ROS gazebo visualization. In order to automate the setup test and have a better overview, I put it in this Dockerfile:
--- Start of the Dockerfile ---
# Start this Dockerfile by going to the Dockerfile's directory in terminal and enter #docker build -t ros-test . FROM osrf/ros:kinetic-desktop-full #ARG HOSTNAME RUN apt-get update && \ apt-get install -y dbus RUN apt-get install -y mesa-utils libgl1-mesa-glx ENV LIBGL_ALWAYS_INDIRECT=0 # "host.docker.internal" only works in Docker Desktop, on WSL distro, you will need to run with either # your Windows computer name (like "DESKTOP-1234567") or with your Windows computer IP "xxx.xxx.xxx.xxx", for example: # docker run -it --name ros-test -e DISPLAY=xxx.xxx.xxx.xxx:0.0 -e LIBGL_ALWAYS_INDIRECT=0 osrf/ros:kinetic-desktop-full bash ENV DISPLAY=host.docker.internal:0.0 #ENV DISPLAY=$HOSTNAME:0.0 #ENV DISPLAY=DESKTOP-1234567:0.0 #ENV DISPLAY=xxx.xxx.xxx.xxx:0.0 RUN bash -c "echo 'source /opt/ros/kinetic/setup.bash' >> ~/.bashrc; \ source ~/.bashrc"
--- End of the Dockerfile ---
Here are the steps how you could get the Dockerfile working on WSL2, no matter whether you use Docker Desktop or a Linux distro. It is put in tiny steps so that it can be followed by newcomers, I will not shrink it to its core since it might also help someone like this.
# Download vcxsrv from https://sourceforge.net/projects/vcxsrv/ # install # start XLaunch.exe (Desktop link) # choose next (multiple windows, display number -1) # start no client # (check Clipboard, this is checked by default), uncheck "Native opengl", check "Disable access control" # finish without saving the configuration # start container from image with: #docker run -it --name ros-test -e DISPLAY=host.docker.internal:0.0 -e LIBGL_ALWAYS_INDIRECT=0 osrf/ros:kinetic-desktop-full bash #docker run -it --name ros-test -e DISPLAY=xxx.xxx.xxx.xxx:0.0 -e LIBGL_ALWAYS_INDIRECT=0 osrf/ros:kinetic-desktop-full bash #docker run -it --name ros-test -e DISPLAY=DESKTOP-1234567:0.0 -e LIBGL_ALWAYS_INDIRECT=0 osrf/ros:kinetic-desktop-full bash # If the following commands do not work since there is already such a container name, you can #docker stop ros-test #docker rm ros-test # If this is not possible and you are asked to force "(must force)", use #docker rm ros-test -f # before you go on. # since environment variables are set already in the image, you can also start with: # If you use Docker Desktop, `DISPLAY=host.docker.internal:0.0` is standard: #docker run -it --name ros-test -e ros-test bash # If you use a distro on WSL2, you need to find out your IP using ipconfig in Windows PowerShell (Drahtlos-LAN-Adapter WLAN: --> IPv4-Adresse . . . . . . . . . . :): #docker run -it --name ros-test -e DISPLAY=xxx.xxx.xxx.xxx:0.0 ros-test bash # If you use a distro on WSL2, you can also ask for your hostname in Windows PowerShell by entering `hostname` and run it like this: #docker run -it --name ros-test -e DISPLAY=DESKTOP-1234567:0.0 ros-test bash # or if you want to see the content of all directories: #docker run -it --volume :./:./ --name ros-test ros-test bash #docker run -it --volume :./:./ --name ros-test -e DISPLAY=xxx.xxx.xxx.xxx:0.0 ros-test bash #docker run -it --volume :./:./ --name ros-test -e DISPLAY=DESKTOP-1234567:0.0 ros-test bash # If you have already run the container, but the bash is not there, or you want to start a second container in another terminal, use #docker exec -it ros-test bash # If the container is not running, but is already there (`docker ps -a`) start it again. #docker start ros-test #docker exec -it ros-test bash # Open a second terminal with the same container so that you have two bash terminals open. #docker exec -it ros-test bash # In the first terminal: #roscore
And now comes the actual code line in question:
# After roscore has started, start on a second terminal and enter: #gazebo worlds/pioneer2dx.world
gazebo worlds/pioneer2dx.world does not open any window; it is already good that it does not throw any error either. The question remains: How can I test a gazebo visualization (no matter which) in the X11 window with the given image?