在WSL2(Windows Subsystem for Linux 2)环境中运行ROS的rviz可视化工具时,经常会遇到段错误(Segmentation fault)问题。这个问题的根源在于WSL2的图形系统架构与原生Linux环境的差异,特别是OpenGL和X11的实现方式。
运行rviz时出现以下错误:
展开代码[INFO] [1765460616.843332000]: Forcing OpenGl version 0. Segmentation fault (core dumped)
WSL2的图形架构限制:
OGRE渲染引擎的兼容性:
X11服务器的差异:
在WSL2中,rviz的渲染流程如下:
展开代码rviz应用程序 ↓ OGRE渲染引擎 ↓ GLX (OpenGL Extension to X11) - 创建OpenGL上下文 ↓ Mesa驱动 (软件渲染器 llvmpipe) ↓ X11协议传输 ↓ Windows端的X11服务器 (MobaXterm/VcXsrv/WSLg) ↓ Windows桌面显示
OpenGL版本检测失败:
glGetString(GL_VERSION)GLX上下文创建:
GLX_ARB_create_context)软件渲染 vs 硬件渲染:
run_rviz_wsl2.sh - 通用WSL2脚本适用场景:
核心配置:
bash展开代码export LIBGL_ALWAYS_SOFTWARE=1 # 强制软件渲染
export MESA_GL_VERSION_OVERRIDE=4.5 # OpenGL版本覆盖为4.5
export MESA_GLSL_VERSION_OVERRIDE=450 # GLSL版本覆盖为4.50
export GALLIUM_DRIVER=llvmpipe # 使用llvmpipe驱动
export OGRE_RTT_MODE=Copy # OGRE渲染目标模式
export __GLX_VENDOR_LIBRARY_NAME=mesa # 使用Mesa库
特点:
run_rviz_mobaxterm.sh - MobaXterm专用脚本适用场景:
核心配置(在通用脚本基础上增加):
bash展开代码# 基础配置(与通用脚本相同)
export LIBGL_ALWAYS_SOFTWARE=1
export MESA_GL_VERSION_OVERRIDE=4.5
export MESA_GLSL_VERSION_OVERRIDE=450
export GALLIUM_DRIVER=llvmpipe
export OGRE_RTT_MODE=Copy
export __GLX_VENDOR_LIBRARY_NAME=mesa
# MobaXterm特殊配置
unset LIBGL_ALWAYS_INDIRECT # 禁用间接渲染
export MESA_LOADER_DRIVER_OVERRIDE=llvmpipe # 强制使用llvmpipe驱动
export __GL_SYNC_TO_VBLANK=0 # 禁用垂直同步
export __GL_ALLOW_UNOFFICIAL_PROTOCOL=0 # 禁用非官方协议
关键差异解析:
unset LIBGL_ALWAYS_INDIRECTMESA_LOADER_DRIVER_OVERRIDE=llvmpipe__GL_SYNC_TO_VBLANK=0__GL_ALLOW_UNOFFICIAL_PROTOCOL=0| 特性 | run_rviz_wsl2.sh | run_rviz_mobaxterm.sh |
|---|---|---|
| 适用X11服务器 | WSLg, VcXsrv, 标准X11 | MobaXterm (Moba/X) |
| 环境变量数量 | 6个 | 10个 |
| 间接渲染 | 允许 | 禁用 |
| 驱动强制指定 | 否 | 是 (MESA_LOADER_DRIVER_OVERRIDE) |
| 垂直同步 | 默认 | 禁用 |
| 非官方协议 | 允许 | 禁用 |
| 兼容性 | 通用 | MobaXterm专用 |
| 性能 | 相同(都使用软件渲染) | 相同 |
bash展开代码cd /home/cc/go_ros
./run_rviz_wsl2.sh
bash展开代码cd /home/cc/go_ros
./run_rviz_mobaxterm.sh
如果需要临时测试或调试,可以手动设置:
通用配置:
bash展开代码export LIBGL_ALWAYS_SOFTWARE=1
export MESA_GL_VERSION_OVERRIDE=4.5
export MESA_GLSL_VERSION_OVERRIDE=450
export GALLIUM_DRIVER=llvmpipe
export OGRE_RTT_MODE=Copy
export __GLX_VENDOR_LIBRARY_NAME=mesa
rviz
MobaXterm专用配置:
bash展开代码export LIBGL_ALWAYS_SOFTWARE=1
export MESA_GL_VERSION_OVERRIDE=4.5
export MESA_GLSL_VERSION_OVERRIDE=450
export GALLIUM_DRIVER=llvmpipe
export MESA_LOADER_DRIVER_OVERRIDE=llvmpipe
unset LIBGL_ALWAYS_INDIRECT
export OGRE_RTT_MODE=Copy
export __GLX_VENDOR_LIBRARY_NAME=mesa
export __GL_SYNC_TO_VBLANK=0
export __GL_ALLOW_UNOFFICIAL_PROTOCOL=0
rviz
为了获得最佳兼容性,建议在MobaXterm中配置以下设置:
打开MobaXterm配置:
Settings → Configuration → X11推荐设置:
disabled 或 localhost only
Software
Multiwindow mode 或 Single window mode
重启X11服务器:
bash展开代码xdpyinfo | grep "vendor string"
输出示例:
vendor string: Moba/Xvendor string: The X.Org Foundationvendor string: Microsoft Corporationbash展开代码LIBGL_ALWAYS_SOFTWARE=1 \
MESA_GL_VERSION_OVERRIDE=4.5 \
GALLIUM_DRIVER=llvmpipe \
glxinfo | grep -E "OpenGL version|OpenGL renderer"
期望输出:
展开代码OpenGL renderer string: llvmpipe (LLVM 12.0.0, 256 bits) OpenGL version string: 4.5 (Compatibility Profile) Mesa 21.2.6
bash展开代码xdpyinfo -queryExtensions | grep -i glx
期望输出:
展开代码GLX (opcode: 146, base event: 90, base error: 152)
可能原因:
解决方案:
./check_x11_env.shsudo apt install libgl1-mesa-dri mesa-utils可能原因:
解决方案:
MESA_GL_VERSION_OVERRIDE=4.6~/.rviz/ogre.log原因:
解决方案:
根据X11服务器选择脚本:
run_rviz_mobaxterm.shrun_rviz_wsl2.sh永久配置环境变量:
./setup_rviz_wsl2.sh 将环境变量添加到 ~/.bashrc保持Mesa驱动更新:
bash展开代码sudo apt update sudo apt upgrade libgl1-mesa-dri mesa-utils
使用诊断工具:
./check_x11_env.sh 诊断环境./test_mobaxterm_rviz.sh 测试MobaXterm配置不同的X11服务器对这些扩展的支持程度不同,这就是为什么需要针对不同X11服务器使用不同配置的原因。
WSL2中运行rviz的关键在于:
LIBGL_ALWAYS_SOFTWARE=1MESA_GL_VERSION_OVERRIDE=4.5GALLIUM_DRIVER=llvmpipe通过理解这些技术细节,我们可以为不同的X11服务器环境创建最优的配置方案,确保rviz在WSL2中稳定运行。
同理,gazebo的图形界面运行也需要脚本
为 Gazebo 创建两个启动脚本(WSL2 和 MobaXterm),使用与 rviz 类似的 OpenGL 软件渲染设置。
这些脚本包含:
在 WSL2 中:
展开代码./run_gazebo_wsl2.sh
在 MobaXterm 中:
展开代码./run_gazebo_mobaxterm.sh
带参数运行(例如指定世界文件):
展开代码./run_gazebo_wsl2.sh worlds/empty.world ./run_gazebo_mobaxterm.sh worlds/empty.world
本文作者:cc
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!