ROS2 Docker 命令行 环境安装

ROS2 Docker 命令行 环境安装

osrf提供了官方的ros1和ros2的Docker环境https://hub.docker.com/_/ros
在上述地址中查看相关的tutorial。

Docker下载

本地主机环境:MacOS 10.13.6

  1. brew install docker
  2. 在Application中运行docker,此时docker会出现在状态栏中
  3. 可以参考 菜鸟教程-Docker 来进行初步的docker操作

方法一,配置Docker环境,在container中下载git代码

这个方式是我第一次接触Docker方式开发ROS采用的方式,这种方式就是把Docker当成一个虚拟机来使用。缺点当然是没有虚拟机好使,但是资源消耗比虚拟机小太多。

  1. Dockerfile:
    直接从官方镜像生成一个本地镜像:
1
2
3
4
5
6
FROM ros:dashing-ros-core

RUN apt-get update \
&& apt-get install -y python3-colcon-common-extensions \
&& rm -rf /var/lib/apt/lists/* \
&& /bin/bash -c "echo 'source /opt/ros/dashing/setup.bash' >> /root/.bashrc"

保存命名成Dockerfile.
如果没有RUN语句,在后边编译的时候会出现找不到ament-cmake
这个语句可能会出现/bin/sh: 1: /opt/ros/dashing/setup.bash: Bad substitution报错,这是因为你的localhost使用的是sh而不是bash。所以改为setup.sh就可以了

  1. docker build 创建镜像:
    docker build -t myros2:dashing .
    这里注意上下文路径 .不能省略,-t 表示创建镜像的tag名称(全部要求小写)。

  2. 运行成功后:
    ros2-dashing-docker-build

  3. 创建容器,运行命令行工具进入容器
    docker run -it myros2:dashing /bin/bash

  4. 这时容器中已经包含了ros2的最小开发环境,可以在命令行中使用ros2来查看。ros2安装目录位于/opt/ros/dashing

  5. 创建自己的workspace:mkdir -p /home/ros2_ws/src

  6. 在src中clone已经编辑好的cpp_pubsub包。https://github.com/FloodShao/ros2_ws.git (这是我自己按照official tutorial写的)

  7. 编译包,并运行

    1
    2
    3
    4
    5
    6
    7
    8
    当前路径为/home/ros2_ws/
    colcon build cpp_pubsub
    source ./install/setup.bash
    查看ros2是否已经添加包
    ros2 pkg list | grep cpp_pubsub
    运行listener和talker。因为只能开一个命令行工具,所以listener要后台运行
    ros2 run cpp_pubsub listener &
    ros2 run cpp_pubsub talker
  8. 运行结果:

ros2-dashing-docker-node-run

方法二,使用多个container,部署在同一个网络中,每一个container对应一个node

  1. 创建docker image与方法一相同。
  2. 不同的是,并不是在container中下载git源代码(首先,你的container生命周期结束之后,这个代码就不存在了。其次,如果你采用了在Dockerfile中写RUN命令来将代码直接download进文件系统,那么可以,但是代价是你创建的image可能会很大,因为每云运行一次RUN命令,镜像文件就会多加一层。镜像文件应该保证最基本的运行环境,而不应该将代码直接加载)
  3. 将localhost中的目录挂载在container的目录中,通过-v参数,将localhost中绝对路径/<dir>挂载在container中的/workspace
    docker run -it --name talker -v /<dir>:/workspace myros2:dashing /bin/bash
  • 在删除了container之后,挂载的目录并不会消失。
  • 这里使用了–name来命名这个container。
  • 删除这个container可以使用 docker rm /talker
  • 使用-d让container在后台运行
  • 使用docker exec -it /talker /bin/bash进入container环境
  1. 使用launch file来进行node的创建和监控
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #pkg/launch/my_script.launch.py
    import launch
    import launch.actions
    import launch.substitutions
    import launch_ros.actions

    def generate_launch_description():
    return launch.LaunchDescription([

    launch.actions.DeclareLaunchArgument(
    'node_prefix',
    default_value=[launch.substitutions.EnvironmentVariable('USER'), '_'],
    description='Prefix for node names'),
    launch_ros.actions.Node(
    package='cpp_pubsub', node_executable='listener', output='screen',
    node_name=[launch.substitutions.LaunchConfiguration('node_prefix'), 'listener']),
    launch_ros.actions.Node(
    package='cpp_pubsub', node_executable='talker', output='screen',
    node_name=[launch.substitutions.LaunchConfiguration('node_prefix'), 'talker']),
    ])
    同时在CMakelists中添加:
    1
    2
    3
    4
    5
    # Install launch files.
    install(DIRECTORY
    launch
    DESTINATION share/${PROJECT_NAME}/
    )
  2. 进入container之后,colcon build编译。
  3. launch ros2 launch cpp_pubsub my_script.launch.py
    node所有的输出会保存在/root/.ros/log/