安裝好rk3588 的docker,pull了ros的完整鏡像后,想要啟動rviz但是報錯,下面是我的踩坑記錄
0.原始的啟動鏡像的腳本:
sudo docker run -it --rm --privileged --net=host -e DISPLAY=$DISPLAY --name=my_image_name \-e DISPLAY=$DISPLAY \-v /tmp/.X11-unix/:/tmp/.X11-unix \-v /dev/shm:/dev/shm \-v /home/$USER/ros:/ros_pro \$ARM_IMAGE
1.掛載路徑 /usr/lib/aarch64-linux-gnu、/dev/dri 和 XDG_RUNTIME_DIR等,掛載的原因是因為要使用宿主機的gpu進行渲染。(下面的是錯誤的)
sudo docker run -it --rm --privileged --net=host -e DISPLAY=$DISPLAY --name=my_image_name \-e DISPLAY=$DISPLAY \-v /tmp/.X11-unix/:/tmp/.X11-unix \-v /dev/shm:/dev/shm \-v /home/$USER/ros:/ros_pro \--device=/dev/dri:/dev/dri \-e XDG_RUNTIME_DIR=/run/user/$(id -u) \-v /run/user/$(id -u):/run/user/$(id -u) \-v /usr/lib/aarch64-linux-gnu:/usr/lib/aarch64-linux-gnu \$ARM_IMAGE
其中/usr/lib/aarch64-linux-gnu的掛載是錯誤的,后面會遇到相關的問題
2.docker環境內運行rviz2顯示缺少如下文件
缺少libtinyxml.so.2.6.2
缺少libtinyxml2.so.6
缺少libassimp.so.5
缺少libspdlog.so.1
在宿主機上安裝如下軟件包
sudo apt-get install libtinyxml2.6.2v5 libtinyxml2-6 libassimp5 libspdlog
3.在docker中啟動還是報錯如下
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root
arm_release_ver:g13p0-0leac0,rk_so_ver: 10
Segmentation fault (core dumped)
4.在宿主機上面的錯誤,顯示驅動沒有安裝好
運行指令glxinfo | grep "OpenGL"
報錯如下
Error: couldn't find RGB GLX visual or fbconfig
解決方案
sudo apt-get install --reinstall libgl1-mesa-dri libgl1-mesa-glx libglx-mesa0 mesa-utils
然后重啟!重啟!重啟!
5.重啟后,在宿主機上重新運行glxinfo | grep "OpenGL"還是報錯:
libGL error:failed to create dri screen
libGL error : failed to load driver:rockchip
libGL error:failed to create dri screen
libGL error : failed to load driver:rockchip
但是后面是有一些正確的信息
6.在啟動docker的命令中如果掛在了 /usr/lib/aarch64-linux-gnu:/usr/lib/aarch64-linux-gnu 是無法啟動rviz的
容器里原本的 /usr/lib/aarch64-linux-gnu 是和它自己安裝的系統、ROS、RViz 依賴配套的。
你一掛載,就把它換成了宿主機的版本(Mesa、GL、Qt、OGRE 等版本全換了)。
容器的 ROS2/RViz 可能和宿主機的動態庫版本不兼容 → 程序直接崩潰
所以選擇掛載gpu有關的即可
-v /usr/lib/aarch64-linux-gnu/dri:/usr/lib/aarch64-linux-gnu/dri
正確的啟動容器指令如下
sudo docker run -it --rm --privileged --net=host -e DISPLAY=$DISPLAY --name=my_image_name \-e DISPLAY=$DISPLAY \-v /tmp/.X11-unix/:/tmp/.X11-unix \-v /dev/shm:/dev/shm \-v /home/$USER/ros:/ros_pro \--device=/dev/dri:/dev/dri \-e XDG_RUNTIME_DIR=/run/user/$(id -u) \-v /run/user/$(id -u):/run/user/$(id -u) \-v /usr/lib/aarch64-linux-gnu/dri:/usr/lib/aarch64-linux-gnu/dri \$ARM_IMAGE