原因

自己的ubuntu20.04由于环境原因编译cartographer出现各种问题。
cartographer的依赖比较繁琐,实属有点麻烦。
近期花了点时间学习docker,然后想着可以把一整套环境部署到docker上(按理论来讲可以无视本身乌班图的版本,无需安装ros,直接docker pull)。属实把我香哭了😄

因此,写个记录贴方便我后期用,也可以方便有需要的朋友。

1、在ubuntu物理机或者虚拟机上安装docker。docker的安装教程可以参考docker官网。

2、启动docker后拉取镜像:

  1、基于ros-melodic下安装cartographer编译依赖,命令:

sudo docker pull fdko11/ros:bionic-melodic-cartographer

  2、基于ros-noetic下安装cartographer依赖,命令:

sudo docker pull fdko11/ros:focal-noetic-cartographer

3、拉取镜像成功后,我们可以用sudo docker image确认并查看一下镜像大小

docker搭建sip docker搭建导航页_docker搭建sip

4、利用拉取的镜像创建容器实例:

  此时,按照显卡区分独显直连模式和混合驱动模式。它们的区分在于,独显模式需要配置NVIDIA驱动,安装NVIDIA-docker2。

配置NVIDIA-docker2传送门

启动容器:

sudo 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:focal-noetic-cartographer

  其中DISPLAY变量和/tmp/.X11目录的挂载是为了可在docker中启动rviz等可视化程序。docker中-v 参数表示容器数据卷,参数为宿主机绝对路径:/容器内目录。启动过程中可能会出现报错,根据报错信息自行百度解决

5、容器中切换到carto用户

容器中的开发用户名:carto,密码:123456,在/home/carto/carto_ws路径下存放了cartographer代码。

docker搭建sip docker搭建导航页_官网_02

6、编译安装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

7、进行cartographer编译

su carto
cd /home/carto/carto_ws
source /opt/ros/noetic/setup.bash
catkin_make_isolated --install --use-ninja

8、编译成功后,我们用官方德意志博物馆论文来测试cartographer算法
  我们可以在当前路径(编译空间)下新建文件夹来存放数据集:

mkdir Bagfile
wget -P ./Bagfile https://storage.googleapis.com/cartographer-public-data/bags/backpack_2d/cartographer_pap
source install_isolated/setup.bash
roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=${HOME}/carto_ws/Bagfile/cartographer_paper_deutsches_museum.bag

然后就可以顺利看到在Rviz下cartographer顺利跑起来:

docker搭建sip docker搭建导航页_2d_03

同时,编译过后,可以直接保存当前的容器作为新镜像,下次run起来不必重新再来一次编译过程。