问题
Ubuntu从14.04玩到21.04,每次换电脑、重装系统,都要搞一堆ROS安装、cartographer依赖安装等等,很麻烦 😦
而且cartographer_ros官方编译文档里面涉及了rosdep init和rosdep update这两步,对于国内开发者来讲非常不友好。
cartographer很多人用惯了16.04/18.04下的版本,但系统对新的电脑兼容性又不好。导致硬件、系统、软件依赖三者的配合非常难协调,但对于一个算法开发者,为什么要过度关注硬件、系统、软件依赖呢?
解决
某天想到docker可以解决这个问题:
- 不受本机系统影响,新电脑安装兼容性好的系统即可,即使不是Ubuntu(虽然我没测试过,但理论上可行)也无所谓,版本也无所谓。
- 无需花时间经历ROS安装、依赖安装过程,镜像pull下来开箱即用。
使用步骤:
-
docker安装教程:https://yeasy.gitbook.io/docker_practice/install/ubuntu
-
拉取依赖镜像:
- 基于18.04系统安装ros-melodic并安装cartographer/cartographer_ros编译依赖,命令:
docker pull fdko11/ros:bionic-melodic-cartographer
- 基于20.04系统安装ros-noetic并安装cartographer/cartographer_ros编译依赖,命令:
docker pull fdko11/ros:focal-noetic-cartographer
- 基于18.04系统安装ros-melodic并安装cartographer/cartographer_ros编译依赖,命令:
-
拉取后创建容器示例:
PS: 此处若是笔记本,区分独显模式和混合模式。
此处用r9000x 2021R (RTX3060 + 驱动470.82.00)举例:-
混合模式
docker run -it --name="carto" --net=host -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix fdko11/ros:bionic-melodic-cartographer
-
独显直连模式
需要先安装正确的NVIDIA驱动!我习惯使用官网下载的.run安装包安装。还有安装nvidia-docker2,见文档安装nvidia-docker2
启动容器:
docker run -it --name="carto" --net=host -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --runtime=nvidia --device /dev/nvidia0 --device /dev/nvidia-uvm --device /dev/nvidia-uvm-tools --device /dev/nvidiactl fdko11/ros:bionic-melodic-cartographer
如果启动容器时出现
stderr: nvidia-container-cli.real: container error: cgroup subsystem devices not found: unknown
等报错,则还需要修改/etc/nvidia-container-runtime/config.toml
,在里面打开no-cgroups = true
即可。
其中DISPLAY变量和/tmp/.X11目录的挂载是为了可在docker中启动rviz等可视化程序。台式机开发的大佬们请自行测试,应该这两种方法就能覆盖绝大部分情况了。
-
-
容器中开发用户名为carto,密码为123456,有sudo权限,所以进去容器后su到carto用户即可。/home/carto/下已经有一个carto_ws,里面也已经放了cartographer/cartographer_ros的当前最新代码(后续有更新自己git pull即可)
-
需要在容器中手动进行一次abseil库编译安装:
su carto cd /home/carto/carto_ws/abseil-cpp/ mkdir build cd build cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_INSTALL_PREFIX=/usr/local/stow/absl .. sudo ninja install cd /usr/local/stow sudo stow absl
-
然后就可以愉快地进行cartographer/cartographer_ros编译了(使用bionic容器做示范):
su carto cd /home/carto/carto_ws source /opt/ros/melodic/setup.bash catkin_make_isolated --install --use-ninja
完美!
PS:
- 这个容器直接可以用于开发对应ROS版本的包,在里面添加其他的ROS开发包,编译即可,就当是一个系统来用,缺了就一样apt-get install就行。(记得要先apt-get update)
- 可以尝试在创建容器时进行挂载,这样可以使用自己外部的cartographer/cartographer_ros仓库了,也便于在本机系统中管理代码。
- VSCode可以直接连接到容器中进行开发,具体请百度。