Docker ros2容器中,进行图形化展示rviz2,报错opengl 版本过低

问题描述

使用虚拟机安装ros2容器,在相关配置如下,通过x11服务器和宿主机共享显示模块,最终可以调用rviz2,虽然报错无法获取设备信息,但是可以弹出窗口。如果是linux主机里面运行对应容器的话,直接显示错误opengl版本太低。

docker run -d -it   \
-v /etc/localtime:/etc/localtime:ro   \
-v /tmp/.X11-unix:/tmp/.X11-unix   \
-e DISPLAY=unix$DISPLAY   \
-e GDK_SCALE   \
-e GDK_DPI_SCALE osrf/ros:galactic-desktop

解决过程

查看虚拟机里面容器opengl版本和linux主机里面容器的opengl版本,发现一前者和宿主机相同,后者低于宿主机版本号。为什么同一个Dockerfile镜像查询的Opengl版本不一样呢?因为宿主机的gpu和驱动程序不一样,所以导致opengl版本不一样。如果是这样的话,宿主机应该和容器一致才对。DISPLAY 是一个环境变量,用于指定 X Window 系统显示服务器的地址。而且如果不把DISPLAY传递给容器,也就是容器无法将图形界面图形显示在正确的显示服务器上,使用glxinfo是无法查询容器的opengl信息的。查询资料之后,知道使用glxinfo命令确是通过x11服务器查询的是宿主机上的opengl信息。有些情况下Docker容器版本太低,可能是无法获取宿主机的设备信息,导致只能采用软件渲染的方式来模拟实现opengl,Opengl的版本就会比较低。修改过后的docker 命令如下,增加 --device 参数将设备信息共享给容器,就可以图形化显示rviz2了。

docker run -d -it   \
-v /etc/localtime:/etc/localtime:ro   \
-v /tmp/.X11-unix:/tmp/.X11-unix   \
-e DISPLAY=unix$DISPLAY   \
-e GDK_SCALE   \
-e GDK_DPI_SCALE --device /dev/dri \
osrf/ros:galactic-desktop```

其中宿主机需要配置如下

sudo apt-get update
sudo apt-get install x11-xserver-utils
xhost +

你可能感兴趣的:(docker,容器,linux,ubuntu)