![如何使用 vcxsrv 检查并确认正确的 opengl 版本(用于 ros2 rviz2)](https://linux22.com/image/1190041/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20vcxsrv%20%E6%A3%80%E6%9F%A5%E5%B9%B6%E7%A1%AE%E8%AE%A4%E6%AD%A3%E7%A1%AE%E7%9A%84%20opengl%20%E7%89%88%E6%9C%AC%EF%BC%88%E7%94%A8%E4%BA%8E%20ros2%20rviz2%EF%BC%89.png)
我有一个远程主机(ubuntu 20.04),
和本地主机(win10 pc,带有 nv rtx3050ti gpu,更新的驱动程序),我vcxsrv
在本地主机上通过(win\cmd
)启动:
vcxsrv.exe -multiwindow -clipboard -wgl -ac
然后使用win\cmd
本地主机,我通过以下方式 ssh 到远程主机:
set DISPLAY=localhost:0.0
ssh -Y username@remote-ip
我不知道为什么它首先需要,set DISPLAY...
但它适用于开始显示某些东西,例如,或者(ros2 的 gui 工具之一)将按预期在本地主机上显示。cmd
ssh -Y
vcxsrv
xclock
rqt
但是当我尝试启动rviz2
(另一个 ros2 的 gui 工具)时,ssh\bash
出现如下错误:
...
[ERROR] [1665571456.729849309] [rviz2]: RenderingAPIException: OpenGL 1.5 is not supported in GLRenderSystem::initialiseContext at /tmp/binarydeb/ros-galactic-rviz-ogre-vendor-8.5.1/.obj-x86_64-linux-gnu/ogre-v1.12.1-prefix/src/ogre-v1.12.1/RenderSystems/GL/src/OgreGLRenderSystem.cpp (line 1201)
...
...
...
terminate called after throwing an instance of 'std::runtime_error'
what(): Unable to c
其中,key-error应该是:
RenderingAPIException: OpenGL 1.5 is not supported in GLRenderSystem
我知道这是与 opengl 版本有关的问题,因此我检查了以下内容,但仍然发现无能为力,如能提供任何帮助我将不胜感激,谢谢:
glxinfo -B
ssh\bash
在本地主机上的ssh 提示符 ( ) 中(使用set DISPLAY...
和ssh -Y
):
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
name of display: localhost:10.0
display: localhost:10 screen: 0
direct rendering: No (LIBGL_ALWAYS_INDIRECT set)
OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: NVIDIA GeForce RTX 3050 Ti Laptop GPU/PCIe/SSE2
OpenGL version string: 1.4 (4.6.0 NVIDIA 512.96)
然后按照一些人的建议,我尝试了ssh\bash
(
export LIBGL_ALWAYS_INDIRECT=1
export MESA_GL_VERSION_OVERRIDE=3.3
然后得到(libGL error
消失)
name of display: localhost:10.0
display: localhost:10 screen: 0
direct rendering: No (LIBGL_ALWAYS_INDIRECT set)
OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: NVIDIA GeForce RTX 3050 Ti Laptop GPU/PCIe/SSE2
OpenGL version string: 1.4 (4.6.0 NVIDIA 512.96)
glxinfo -B
在ssh\bash
(没有set DISPLAY...
和ssh -Y
,只是ssh
):
Error: unable to open display
直接glxinfo -B
在 remote-host( ) 终端中执行ubuntu20.04\bash
:
name of display: :0
display: :0 screen: 0
direct rendering: Yes
Extended renderer info (GLX_MESA_query_renderer):
Vendor: Mesa/X.org (0xffffffff)
Device: llvmpipe (LLVM 12.0.0, 256 bits) (0xffffffff)
Version: 21.0.3
Accelerated: no
Video memory: 31893MB
Unified memory: no
Preferred profile: core (0x1)
Max core profile version: 4.5
Max compat profile version: 3.1
Max GLES1 profile version: 1.1
Max GLES[23] profile version: 3.2
OpenGL vendor string: Mesa/X.org
OpenGL renderer string: llvmpipe (LLVM 12.0.0, 256 bits)
OpenGL core profile version string: 4.5 (Core Profile) Mesa 21.0.3
OpenGL core profile shading language version string: 4.50
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL version string: 3.1 Mesa 21.0.3
OpenGL shading language version string: 1.40
OpenGL context flags: (none)
OpenGL ES profile version string: OpenGL ES 3.2 Mesa 21.0.3
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20
我不太了解 x11/vcxsrv/opengl 的工作原理,但不明白为什么当我directly
在远程主机或ssh
本地主机中检查时 opengl 版本会不同。
由于其他图形用户界面可以按预期显示(xclock
,rqt
的ros2
),但rviz2
的ros2
不能,我认为这是的依赖关系rviz2
,opengl
但为什么以及如何确保适合我的情况/环境的正确的 opengl 版本?
谢谢
答案1
很高兴弄明白了,虽然理论上不清楚但很实用,应该vcxsrv
从local-host
(win10)端(win/cmd
)开始:
vcxsrv.exe -multiwindow -clipboard -nowgl -ac
其中,应使用-nowgl
除-wgl
开头之外的其他内容