docker中可视化rviz
- 背景
- 1. 确定适合的 NVIDIA 驱动版本
- 2. 检查 NVIDIA Container Toolkit 安装
- 2.1 安装 NVIDIA Container Toolkit
- 配置 NVIDIA Runtime
- 重启 Docker
- 验证 NVIDIA Docker 支持
- 验证 OpenGL 和图形支持
- 测试 GUI 应用
- 验证 OpenGL
- lio_sam_rviz-9] process has died
- 确认当前显卡的使用情况
- 1. 切换到 NVIDIA 模式
- 2. 验证 NVIDIA 是否成为主显卡
- 额外检查
- 解决方法
背景
华硕 x556ub电脑,使用NVIDIA GEFORCE 940M 显卡
1. 确定适合的 NVIDIA 驱动版本
运行以下命令以检查 GPU 型号和推荐的驱动版本:
ubuntu-drivers devices
根据输出结果,安装 nvidia-driver-535:
sudo apt update
sudo apt install -y nvidia-driver-535
重启系统
sudo reboot
验证 NVIDIA 驱动是否正常
nvidia-smi
2. 检查 NVIDIA Container Toolkit 安装
2.1 安装 NVIDIA Container Toolkit
distribution=$(. /etc/os-release; echo $ID$VERSION_ID) && \
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - && \
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
输入第一个命令,输出:
用的18.04的源,若修改源为20.04的,会发现有错误,所以就用这个试试
sudo nano /etc/apt/sources.list.d/nvidia-docker.list
源内容为
deb https://nvidia.github.io/libnvidia-container/stable/ubuntu18.04/$(ARCH) /
#deb https://nvidia.github.io/libnvidia-container/experimental/ubuntu18.04/$(ARCH) /
deb https://nvidia.github.io/nvidia-container-runtime/stable/ubuntu18.04/$(ARCH) /
#deb https://nvidia.github.io/nvidia-container-runtime/experimental/ubuntu18.04/$(ARCH) /
deb https://nvidia.github.io/nvidia-docker/ubuntu18.04/$(ARCH) /
更新
sudo apt-get update
安装 NVIDIA Container Toolkit
运行以下命令安装 nvidia-container-toolkit
sudo apt-get install -y nvidia-container-toolkit
配置 NVIDIA Runtime
运行以下命令自动配置 NVIDIA Runtime:
sudo nvidia-ctk runtime configure
输出
重启 Docker
重新启动 Docker 服务以应用更改:
sudo systemctl restart docker
验证 NVIDIA Docker 支持
运行一个支持gpu的镜像:
docker run -it --rm \
--gpus all \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
osrf/ros:melodic-desktop-full bash
在容器内:
nvidia-smi
输出为:
验证 OpenGL 和图形支持
测试 GUI 应用
安装 x11-apps 并运行 xclock 测试 GUI:
apt-get update && apt-get install -y x11-apps
xclock
如果显示一个时钟窗口,说明图形支持正常。
验证 OpenGL
安装 mesa-utils 并运行 glxinfo:
apt-get install -y mesa-utils
glxinfo | grep "OpenGL"
此处报错:(但没直接解决),重启docker,后再按上面验证的步骤进行一遍又显示下面的,不清楚为什么
注意!!!
此处有问题,如果是下面的输出,只是rviz是可以打开的,但我运行lio_sam时则打不开rviz,如下:
lio_sam_rviz-9] process has died
原因是opengl使用的是cpu的核显,正确的是使用GPU
确认当前显卡的使用情况
运行以下命令查看当前显卡使用情况:
xrandr --listproviders
输出
ubuntu2004@ubuntu2004-X556UB: ~$ xrandr --listproviders
Providers: number : 2
Provider 0: id: 0x46 cap: 0x9, Source Output, Sink Offload crtcs: 3 outputs: 4 associated providers: 0 name:modesetting
Provider 1: id: 0x236 cap: 0x0 crtcs: 0 outputs: 0 associated providers: 0 name:NVIDIA-G0
从 xrandr --listproviders 的输出可以看出,你的系统使用了混合显卡配置(NVIDIA Optimus),默认情况下系统可能优先使用集成显卡(modesetting),而不是 NVIDIA GPU(NVIDIA-G0)。以下是详细的解决方法,确保系统能够正确使用 NVIDIA GPU。
1. 切换到 NVIDIA 模式
使用 prime-select 命令将系统切换到使用 NVIDIA GPU 模式:
sudo prime-select nvidia
运行完成后,重启系统:
sudo reboot
2. 验证 NVIDIA 是否成为主显卡
重启后,运行以下命令检查当前模式:
prime-select query
如果输出为 nvidia,说明 NVIDIA GPU 已被启用。
glxinfo | grep "OpenGL"
额外检查
检查 Docker 配置
验证 NVIDIA Runtime 是否已正确配置:
docker info | grep -i runtime
从 docker info | grep -i runtime 的输出可以看到以下关键点:
nvidia runtime 已注册:
输出中显示了 nvidia runtime,说明 NVIDIA Container Toolkit 已正确安装。
默认运行时是 runc:
当前默认的容器运行时是 runc,而不是 nvidia。因此,运行容器时需要手动指定 --gpus all 来启用 GPU 支持。
两条警告:
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled 这些警告与网络配置相关,但不影响 GPU 功能。
解决方法
- 手动指定 GPU 支持
当默认运行时为 runc 时,需要在运行容器时手动启用 GPU 支持。例如:
docker run -it --rm --gpus all \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
osrf/ros:melodic-desktop-full bash