欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Docker 快速构建 cartographer/cartographer_ros 编译后的开发环境

最编程 2024-03-08 20:40:04
...
【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告

问题

Ubuntu从14.04玩到21.04,每次换电脑、重装系统,都要搞一堆ROS安装、cartographer依赖安装等等,很麻烦 :(

而且cartographer_ros官方编译文档里面涉及了rosdep init和rosdep update这两步,对于国内开发者来讲非常不友好。

cartographer很多人用惯了16.04/18.04下的版本,但系统对新的电脑兼容性又不好。导致硬件、系统、软件依赖三者的配合非常难协调,但对于一个算法开发者,为什么要过度关注硬件、系统、软件依赖呢?

解决

某天想到docker可以解决这个问题:

  1. 不受本机系统影响,新电脑安装兼容性好的系统即可,即使不是Ubuntu(虽然我没测试过,但理论上可行)也无所谓,版本也无所谓。
  2. 无需花时间经历ROS安装、依赖安装过程,镜像pull下来开箱即用。

使用步骤:

  1. docker安装教程:https://yeasy.gitbook.io/docker_practice/install/ubuntu

  2. 拉取依赖镜像:

    1. 基于18.04系统安装ros-melodic并安装cartographer/cartographer_ros编译依赖,命令:docker pull fdko11/ros:bionic-melodic-cartographer
    2. 基于20.04系统安装ros-noetic并安装cartographer/cartographer_ros编译依赖,命令:docker pull fdko11/ros:focal-noetic-cartographer
  3. 拉取后创建容器示例:

    PS: 此处若是笔记本,区分独显模式和混合模式。 此处用r9000x 2021R (RTX3060 + 驱动470.82.00)举例:

    1. 混合模式

      docker run -it --name="carto" --net=host -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix fdko11/ros:bionic-melodic-cartographer
      
    2. 独显直连模式

      需要先安装正确的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即可。 如果启动容器时报错device "/dev/nvidia-uvm": no such file or directory等,执行一次nvidia-modprobe -u -c=0即可解决,可以把这个命令加入到/etc/rc.local文件中。

    其中DISPLAY变量和/tmp/.X11目录的挂载是为了可在docker中启动rviz等可视化程序。台式机开发的大佬们请自行测试,应该这两种方法就能覆盖绝大部分情况了。

  4. 容器中开发用户名为carto,密码为123456,有sudo权限,所以进去容器后su到carto用户即可。/home/carto/下已经有一个carto_ws,里面也已经放了cartographer/cartographer_ros的当前最新代码(后续有更新自己git pull即可)

  5. 需要在容器中手动进行一次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
    
  6. 然后就可以愉快地进行cartographer/cartographer_ros编译了(使用bionic容器做示范):

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

    完美!

PS:

  1. 这个容器直接可以用于开发对应ROS版本的包,在里面添加其他的ROS开发包,编译即可,就当是一个系统来用,缺了就一样apt-get install就行。(记得要先apt-get update)
  2. 可以尝试在创建容器时进行挂载,这样可以使用自己外部的cartographer/cartographer_ros仓库了,也便于在本机系统中管理代码。
  3. VSCode可以直接连接到容器中进行开发,具体请百度。