【ROS】解决WSL2启动RVIZ2崩溃的问题

问题描述

在WSL2 Ubuntu22上使用ROS2 Hunble时,打开RVIZ2会黑屏崩溃,报错如下:

(base) work@XS-202509292158:~$ rviz2
 dllPath = , dllName = libigdgmm2_w.so.2
 IsWddmLinux = 1, dllWslName = libigdgmm2_w.so.2  flags = 2
 dllPath = , dllName = libigdgmm_w.so.12
 IsWddmLinux = 1, dllWslName = libigdgmm_w.so.12  flags = 2
 dllPath = , dllName = libigdgmm2_w.so.2
 IsWddmLinux = 1, dllWslName = libigdgmm2_w.so.2  flags = 2
 dllPath = , dllName = libigdgmm_w.so.12
 IsWddmLinux = 1, dllWslName = libigdgmm_w.so.12  flags = 2
 dllPath = , dllName = libigdgmm2_w.so.2
 IsWddmLinux = 1, dllWslName = libigdgmm2_w.so.2  flags = 2
 dllPath = , dllName = libigdgmm_w.so.12
 IsWddmLinux = 1, dllWslName = libigdgmm_w.so.12  flags = 2
 dllPath = , dllName = libigdgmm2_w.so.2
 IsWddmLinux = 1, dllWslName = libigdgmm2_w.so.2  flags = 2
 dllPath = , dllName = libigdgmm_w.so.12
 IsWddmLinux = 1, dllWslName = libigdgmm_w.so.12  flags = 2
[INFO] [1769135804.453726633] [rviz2]: Stereo is NOT SUPPORTED
[INFO] [1769135804.453829733] [rviz2]: OpenGl version: 4.2 (GLSL 4.2)
D3D12: Removing Device.
 dllPath = , dllName = libigdgmm2_w.so.2
 IsWddmLinux = 1, dllWslName = libigdgmm2_w.so.2  flags = 2
 dllPath = , dllName = libigdgmm_w.so.12
 IsWddmLinux = 1, dllWslName = libigdgmm_w.so.12  flags = 2
 dllPath = , dllName = libigdgmm2_w.so.2
 IsWddmLinux = 1, dllWslName = libigdgmm2_w.so.2  flags = 2
 dllPath = , dllName = libigdgmm_w.so.12
 IsWddmLinux = 1, dllWslName = libigdgmm_w.so.12  flags = 2
[INFO] [1769135805.965212435] [rviz2]: Stereo is NOT SUPPORTED
Segmentation fault (core dumped)

日志解释

  • dllPath = , dllName = libigdgmm2_w.so.2:WSL2尝试加载Intel显卡的内存管理库,但找不到/版本不匹配;
  • OpenGl version: 4.2 (GLSL 4.2):检测到的OpenGL版本过高,与WSL2的Intel驱动兼容差,降级到4.1可解决;
  • Segmentation fault (core dumped):硬件渲染驱动访问了非法内存地址,是libigdgmm与D3D12渲染层冲突导致。

解决方法

在WSL2中启动RViz2时,虽然能检测到OpenGL 4.2版本,但因Intel显卡的图形内存管理库(libigdgmm)与WSL2的D3D12渲染层兼容问题,最终触发段错误(Segmentation fault) 崩溃。这是Intel显卡在WSL2下运行RViz2的典型兼容问题,核心解决思路是绕开有问题的硬件渲染、修复库兼容、适配OpenGL版本

步骤1:临时强制软件渲染启动RViz2

段错误的核心是硬件渲染驱动冲突,先通过环境变量强制使用软件渲染(Mesa llvmpipe),绕开Intel显卡的WSL2驱动问题:

# 临时设置环境变量(当前终端生效),强制软件渲染+适配OpenGL版本
export LIBGL_ALWAYS_SOFTWARE=1
export MESA_GL_VERSION_OVERRIDE=4.1
export MESA_GLSL_VERSION_OVERRIDE=410

# 启动RViz2(此时应能正常打开,无段错误)
source /opt/ros/humble/setup.bash
rviz2
  • 若能正常打开RViz2界面,说明硬件渲染是崩溃根源,可继续步骤2将配置永久生效;
  • 若仍崩溃,先执行步骤2修复libigdgmm库。
步骤2:修复Intel libigdgmm库兼容问题

日志中反复出现libigdgmm2_w.so.2/libigdgmm_w.so.12,说明WSL2下Intel显卡的图形内存管理库版本不匹配,需安装/替换兼容版本:

# 1. 安装Intel显卡的WSL2兼容库
sudo apt update && sudo apt install -y intel-media-va-driver-non-free libigdgmm12

# 2. 创建缺失库的软链接(解决WSL2找不到libigdgmm的问题)
sudo ln -s /usr/lib/x86_64-linux-gnu/libigdgmm.so.12 /usr/lib/x86_64-linux-gnu/libigdgmm_w.so.12
sudo ln -s /usr/lib/x86_64-linux-gnu/libigdgmm.so.12 /usr/lib/x86_64-linux-gnu/libigdgmm2_w.so.2

# 3. 重启WSLg图形服务
sudo systemctl restart dbus
rm -rf /tmp/.X11-unix/*
步骤3:永久配置软件渲染(避免每次手动输环境变量)

若步骤1临时生效,将环境变量写入~/.bashrc,永久启用软件渲染:

# 写入bashrc
echo "export LIBGL_ALWAYS_SOFTWARE=1" >> ~/.bashrc
echo "export MESA_GL_VERSION_OVERRIDE=4.1" >> ~/.bashrc
echo "export MESA_GLSL_VERSION_OVERRIDE=410" >> ~/.bashrc

# 生效配置
source ~/.bashrc

# 重新启动RViz2验证
source /opt/ros/humble/setup.bash
rviz2
步骤4:(可选)降级RViz2的OpenGL渲染级别

若软件渲染后RViz2界面卡顿,可调整RViz2的渲染配置,降低图形负载:

  1. 正常打开RViz2后,点击FilePreferences
  2. Rendering标签页:
    • OpenGL Profile改为Core Profile
    • 取消勾选Use Advanced OpenGL Features
  3. 保存配置(FileSave Config As),下次启动会自动生效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值