Robotics StackExchange | Archived questions

ROS environment in Docker with X11

Hi,

This seems to be a fairly complicated thing to do. I want to set up a docker ROS development environment with catkin I am running ubuntu focal as my base environment

I have downloaded the osrf/ros:noetic-desktop-full image and I have been able to successfully run this as a container and perform a catkin_make. I can build projects on it from a container command line

I think I am pretty close to being able to get vscode working on it as well.

however I have not been able to get X11 output on it. I have followed the examples here and here

the problems I am having is when I try and run the docker image and create the container I receive these errors:

docker run -dt --name robot_env --restart unless-stopped -v 'pwd':/root/workspace --device=/dev/dri --volume=/tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY osrf/ros:noetic-desktop-full

e41c569191ad1799917f27384025826b987951de46b12d64a7295d59892aa23c
docker: Error response from daemon: Mounts denied: 
The path /tmp/.X11-unix is not shared from the host and is not known to Docker.
You can configure shared paths from Docker -> Preferences... -> Resources -> File Sharing.
See https://docs.docker.com/ for more info.

and when I remove the volume to /tmp/.X11-unix and try, I receive this error

docker run -dt --name robot_env --restart unless-stopped -v 'pwd':/root/workspace --device=/dev/dri -e DISPLAY osrf/ros:noetic-desktop-full
8ed2a58fb0bdd6c76e9ee6d9022542011d06df24f10cf8a88a1edf1bb0f5a504
docker: Error response from daemon: error gathering device information while adding custom device "/dev/dri": no such file or directory.

Regrading the device issue, it may just be a case of not knowing what the device name is that I need to add

but the /tmp/.X11-unix problem seems like there is something missing on my install? Perhaps this is relevent to windows systems? Permissions? I'm not sure.

I checked and I do have a /tmp/.X11-unix folder so maybe it is permissions?

anyone know how to get X11 output working?

thanks in advance

Asked by karlhm76 on 2022-10-08 22:07:43 UTC

Comments

Are you using focal desktop or server? And are you remotely connecting to the development computer, or direct? VM by any chance?

Asked by PointCloud on 2022-10-09 02:06:35 UTC

I checked and I do have a /tmp/.X11-unix folder so maybe it is permissions?

Have you tried running your command as sudo to see if it was permissions related ?

anyone know how to get X11 output working?

Both these tutorial start with "using rocker". Have you tried using it ? The following works for me: rocker osrf/ros:noetic-desktop-full bash --x11

Asked by marguedas on 2022-10-09 02:19:13 UTC

Hi, everything exists on the same machine running focal desktop clean install. I have installed build-essential and docker only. To connect to the docker container I use docker exec .. bin/bash.

To create the docker container I used the docker run command (without the X11 stuff.)

I believe vscode opens a remote "container" to it, but that's a different thing, and seems to be coincidental nomenclature.

At the moment I would be happy just to get glxgears working from a docker terminal.

(glxgears works fine locally as well.)

Asked by karlhm76 on 2022-10-09 02:19:56 UTC

I'll give rocker a try now and see how I go, thanks.

Asked by karlhm76 on 2022-10-09 02:20:45 UTC

ADE is another option to setup and run a Docker based dev environment with GUI support. There is also a vscode volume available that can be loaded alongside it.

Asked by sgvandijk on 2022-10-09 05:03:02 UTC

@marguedas Thanks for this. I was able to install rocker and running your command got it to build the image, but it seems that it built the image in the default context.

I'll see whether I can get it to build it in the desktop-linux context, but it looks promising.

Asked by karlhm76 on 2022-10-15 22:59:59 UTC

Answers

Ok. It took some doing but I was able to get it to work, at least, glxgears works inside a docker container and renders correctly.

it may not be the best way to get it to work, but it works.

  1. using the suggestion from @marguedas I set up rocker. This needed the additional dependency of python3-distutils to work correctly. To be able to set up rocker I needed to add the ros repos to my base ubuntu install.

  2. I ran the command above for rocker to create the docker image from the osrf/ros:noetic-desktop-full image. I could not solve the problem that rocker creates this image in the default context. I had to change my docker context to the default context prior to running the rocker command otherwise it can not find the image when it runs docker run

  3. The default container created by rocker is no good, but helpfully it does echo the docker run command it uses. So I made another one following advice from here

The final container I created was set up using this command:

docker run --privileged --restart unless-stopped -dt --name robot_env -e DISPLAY -e TERM   -e QT_X11_NO_MITSHM=1   -e XAUTHORITY=/tmp/.dockermsrl4g3x.xauth -v /tmp/.dockermsrl4g3x.xauth:/tmp/.dockermsrl4g3x.xauth   -v /tmp/.X11-unix:/tmp/.X11-unix   -v /etc/localtime:/etc/localtime:ro  -v `pwd`:/root/workspace  7612d078aead

where 7612d078aead is the id of the image created by rocker

Note the --privileged option, this is required to be able to map the /dev/dri to the docker container. There may be a better way, but this works.

this command will also create a volume of my pwd and map it to /root/workspace in my container

I have followed the ROS Wiki and used xhost + to remove permissions to the X server, but I have seen better ways of doing this. For now I just want to get it working.

After setting up this container I am able to connect to it using:

docker exec -it robot_env bash.

Inside the container I am able to run (requires installing mesa-utils):

glxinfo | grep Mesa

and it can find my graphics card (Intel).

glxgears works and is accelerated.

Some things I would like to have but have not been able to figure out yet are:

create the rocker image in my preferred docker context so I can manage it with the docker gui. Its not a huge deal, but it is just a bit nicer when most of the time I simply want to start and stop the container.

Asked by karlhm76 on 2022-10-16 04:29:26 UTC

Comments

Here is link to my repo where I have Docker definitions and start scripts to run Docker ROS apps on the host's XWin server. I mainly use a Linux host, but I also include start scripts for Windows and Mac OS.

Docs in the README.md https://github.com/gentijo/MaqueenBattleBots

Asked by gentijo on 2022-10-16 12:45:33 UTC

Comments