Я планирую запустить ROS Rviz в docker на удаленном сервере, ожидая, что Rviz GUI отобразится на моем локальном компьютере. Но я не могу сделать это. Любая помощь приветствуется.
Мой образ ROS docker на удаленном сервере основан на образе ros-melodi c -desktop-full (в соответствии с ROS с использованием аппаратного ускорения с Docker , ros-melodi c -desktop-full уже содержит nvidia-docker2). Ниже приведен мой Dockerfile:
FROM osrf/ros:melodic-desktop-full
# strace, xterm, mesa-utils are all for debugging X display. Especially, mesa-utils has glxinfo and glxgear
RUN apt-get update && apt-get install -y xauth strace xterm mesa-utils
# nvidia-container-runtime
ENV NVIDIA_VISIBLE_DEVICES \
${NVIDIA_VISIBLE_DEVICES:-all}
ENV NVIDIA_DRIVER_CAPABILITIES \
${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}graphics
# QT_X11_NO_MITSHM is for running X server and X client on different machines.
ENV QT_X11_NO_MITSHM 1
ENTRYPOINT ["/bin/bash"]
И мой рабочий процесс взят из этого блога: Запуск графического приложения в контейнере Docker на удаленном сервере . По сути, я использую socat в качестве канала для соединения доменного сокета Unix и TCP-порта 60xx (xx - текущее значение $ DISPLAY). Ниже мой рабочий процесс. Сначала я захожу на удаленный сервер, используя ssh -X user@address
. Затем на сервере я выполняю эти команды (docker имя изображения ros-nvidia- gui: 1.0):
DISPLAY_NUMBER=$(echo $DISPLAY | cut -d. -f1 | cut -d: -f2)
socat TCP4:localhost:60${DISPLAY_NUMBER} UNIX-LISTEN:/tmp/.X11-unix/X${DISPLAY_NUMBER} &
export DISPLAY=:$(echo $DISPLAY | cut -d. -f1 | cut -d: -f2)
docker run -it --rm \
-e DISPLAY=${DISPLAY} \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v /home/deq/.Xauthority:/root/.Xauthority \
--hostname $(hostname) \
-e QT_X11_NO_MITSHM=1 \
-e QT_QPA_PLATFORM='offscreen' \
--runtime=nvidia \
--gpus all \
ros-nvidia-gui:1.0
Затем я попадаю в контейнер docker. Когда я запускаю roscore & rviz
в контейнере, выдается следующее исключение :
root@node3:/# rviz
[ INFO] [1587175060.603895335]: rviz version 1.13.7
[ INFO] [1587175060.603985593]: compiled against Qt version 5.9.5
[ INFO] [1587175060.604014712]: compiled against OGRE version 1.9.0 (Ghadamon)
[ INFO] [1587175060.620394536]: Forcing OpenGl version 0.
[ WARN] [1587175068.907551767]: OGRE EXCEPTION(3:RenderingAPIException): Couldn`t open X display :11 in GLXGLSupport::getXDisplay at /build/ogre-1.9-B6QkmW/ogre-1.9-1.9.0+dfsg1/RenderSystems/GL/src/GLX/OgreGLXGLSupport.cpp (line 832)
terminate called after throwing an instance of 'Ogre::RenderingAPIException'
what(): OGRE EXCEPTION(3:RenderingAPIException): Couldn`t open X display :11 in GLXGLSupport::getXDisplay at /build/ogre-1.9-B6QkmW/ogre-1.9-1.9.0+dfsg1/RenderSystems/GL/src/GLX/OgreGLXGLSupport.cpp (line 832)
Aborted (core dumped)
Кажется, что-то не так с библиотекой OpenGL.
Итак, я проверил библиотеку OpenGL в docker. Когда я запускаю glxgears
, на моем локальном компьютере появляются три шестерни. Это говорит о том, что вся X11-forwarding-in- docker -on-a-a-remote-server работает нормально, и OpenGL в docker также хорош.
Затем я проверил glxinfo
и выводит следующее (я только перечисляю строки, связанные с рендерингом, OpenGL, mesa и опущены другие):
name of display: :11
display: :11 screen: 0
direct rendering: Yes
server glx vendor string: SGI
server glx version string: 1.4
client glx vendor string: Mesa Project and SGI
client glx version string: 1.4
GLX version: 1.4
Extended renderer info (GLX_MESA_query_renderer):
Vendor: VMware, Inc. (0xffffffff)
Device: llvmpipe (LLVM 9.0, 256 bits) (0xffffffff)
Version: 19.2.8
Accelerated: no
Video memory: 257669MB
Unified memory: no
Preferred profile: core (0x1)
Max core profile version: 3.3
Max compat profile version: 3.1
Max GLES1 profile version: 1.1
Max GLES[23] profile version: 3.0
OpenGL vendor string: VMware, Inc.
OpenGL renderer string: llvmpipe (LLVM 9.0, 256 bits)
OpenGL core profile version string: 3.3 (Core Profile) Mesa 19.2.8
OpenGL core profile shading language version string: 3.30
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL version string: 3.1 Mesa 19.2.8
OpenGL shading language version string: 1.40
OpenGL context flags: (none)
OpenGL ES profile version string: OpenGL ES 3.0 Mesa 19.2.8
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00
Короче говоря, весь рабочий процесс выглядит нормально, кроме Rviz. Самое непонятное, почему Rviz «форсирует OpenGl версии 0». Я понимаю, что OpenGL от mesa расходится с OpenGL от nvidia, поэтому я также попытался очистить Mesa в контейнере docker, но Rviz автоматически удаляется вместе с ним. Это говорит о том, что Rviz использует только OpenGL от Mesa? Поэтому я также попытался запустить docker только с mesa, то есть, удалив --runtime=nvidia
и --gpus all
в команде docker run
, но выдается то же исключение.
Пожалуйста, предложите мне какую-нибудь помощь! Моя последняя цель - запустить Rviz в docker на удаленном сервере и отобразить GUI на моем локальном компьютере. Мне нужно использовать графический процессор на удаленном сервере для ускорения Rviz, либо Mesa OpenGL, либо Nvidia OpenGL - хорошо. Спасибо!
Редактировать:
Я сузил проблему до Огре. Я последовал исключению Rviz к исходному коду GLXGLSupport :: getXDisplay . Кажется, mXDisplay = XOpenDisplay(displayString);
не так. Затем я искал руководство по XOpenDisplay , и значение «: 11» кажется нормальным. Теперь я в замешательстве.