为了账号安全,请及时绑定邮箱和手机立即绑定

ROS 2 悠灵 GUI-Docker 容器:一步一步指南

使用Docker可以简化基于ROS2(机器人操作系统2)的开发过程,创建一个隔离且可重复的环境。通过使用Docker,您可以确保不同机器之间的环境一致性,避免版本冲突,并便于协作。使用Docker可以让开发和部署过程变得更加流畅,尤其是在处理像ROS2这样的软件时,这种软件需要精确的版本控制和特定的依赖项。在这篇文章中,我们将一步步教你如何用一组文件来定义并设置自定义的ROS2 Docker容器。

ROS2 是一个强大的框架,用于开发机器人系统,但它附带有众多依赖项和陡峭的学习曲线。这种复杂性使得 Docker 成为管理 ROS2 环境的理想选择。使用 Docker 可确保开发团队的每个人都在相同的配置下运行,从而减少调试时间并避免因环境差异而可能出现的意外问题。按照本指南操作后,你将拥有一个强大且可重复的 ROS2 开发环境,可以轻松地与他人共享并重复使用。

前提条件

在我们开始之前,请确保已经在您的系统上安装了Docker软件。您可以在Docker的官方网站上按照安装指南进行安装。如果是Ubuntu用户,可以按照下面的步骤安装Docker。

  1. 更新现有的软件包列表:运行以下命令来更新系统软件包列表:
sudo apt update(更新软件包列表)

2. 安装必要的前提条件:安装必要的前提条件,以便 apt 可以通过 HTTPS 访问存储库

安装一些必要的软件包,包括 apt-transport-https, ca-certificates, curl 和 software-properties-common:
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

3. 添加Docker官方的GPG密钥: 运行以下命令来添加GPG密钥:

使用curl命令从指定URL下载GPG密钥并使用sudo权限将其解密保存到指定路径:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

4\. **设置稳定的 Docker 仓库:** 将 Docker apt 仓库添加到您的源列表中.
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

注:上述命令用于将Docker仓库添加到APT源列表中。

5\. **再次更新包列表,包括 Docker 仓库:** 再次运行更新命令以包含 Docker 仓库:

例如,您可以运行以下命令:

sudo apt-get update

sudo apt update
更新软件包列表的命令

(注:以上命令用于更新软件包列表)

6\. **安装 Docker:** 使用如下命令安装 Docker。
sudo apt install -y docker-ce
这行命令用于安装Docker社区版。使用`sudo`命令以超级用户权限执行,`apt`是一个包管理器,`-y`自动确认安装过程中出现的任何提示。

如果你想安装了 Docker 后免用 sudo 权限来使用 Docker,可以按照以下步骤来使用 Docker:

1. **创建 Docker 组:** 创建 Docker 组来管理访问。运行:

在终端中输入以下命令来添加docker组:```
sudo groupadd docker

3. 将您自己添加到Docker组: 以避免在使用Docker命令时需要输入sudo,请将您的<username>替换为您的实际用户名。

    sudo usermod -aG docker <username>  # (将当前用户添加到docker组)

4. 重启: 登出并重新登录,或重启系统以使组更改生效。

5. 测试 Docker 的运行: 确保您可以直接运行 Docker 命令。

运行 docker hello-world: (这是一个示例命令)

建议您对基本的 Docker 命令有一些了解,这会帮助您更容易跟上。对 ROS2 概念有基本了解也会有帮助,但并非必须。

Docker配置文件解析

要创建一个自定义的ROS2 Docker容器,我们将用到以下文件,每个文件都有其特定的作用,在基于Docker的开发环境中。

  • Dockerfile : 定义 Docker 镜像,包括基础镜像、安装的软件包和环境配置。
  • entrypoint.sh :在容器启动时设置环境,确保 ROS2 在启动时已准备好使用。
  • docker_build.sh :自动构建 Docker 镜像的脚本。
  • docker_run.sh :一个运行 Docker 容器并设置适当参数的脚本。
  • .bashrc :自定义容器内的 bash 环境,使其对开发者更加友好。

每一个文件在构建和管理您的ROS2 Docker环境方面都扮演着重要角色。让我们详细地了解一下每一个文件。

Dockerfile

Dockerfile 是我们 Docker 镜像的蓝图文件。它定义了基础镜像的来源,安装必要的依赖,并配置运行环境。以下是 Dockerfile 的主要组成部分,具体如下:

  1. 基础镜像: 这个基础镜像是创建自定义容器的理想起点,因为它包含了所有必要的ROS2组件。使用这个基础镜像可以确保与其他ROS2工具和库的兼容性,从而使集成各种ROS2包和扩展变得更加容易。这还节省了时间,因为基础镜像已经包含了多个必要的ROS2依赖项。
  2. 设置默认用户名: 我们使用一个参数来允许自定义非root用户的用户名。通过设置这个参数,您可以在构建Docker镜像时轻松自定义非root用户名。这个功能特别有用,当多个开发人员在同一项目上工作时,每个开发人员可以创建一个带有他们首选用户名的容器。这也有助于在不同的系统上部署容器,可以将容器用户与本地系统用户匹配,以实现更好的集成。用户还可以通过sudo获得超级用户权限,而无需输入密码,使在开发过程中管理系统级任务变得更加容易。
  3. 安装额外工具: Dockerfile安装了一些基本的开发工具,如gitwgetcurlpython3-pip。这些工具对于开发和管理ROS2包以及访问仓库和安装其他依赖项非常有用。git对于版本控制至关重要,允许您克隆和管理代码仓库。wgetcurl对于下载文件和与Web API交互非常有用。python3-pip用于安装Python包,这些包通常在ROS2开发中需要。software-properties-common可以管理软件仓库,使添加新的包源变得更加容易。最后,ros-dev-tools提供了一些增强ROS2开发体验的实用工具。
  4. 安装Python包: 通过pip安装支持ROS2开发的Python包:这些包对于使用colcon构建ROS2工作空间是不可或缺的。setuptools是一个简化打包和分发Python代码过程的包开发工具。colcon是ROS2的构建工具,而colcon-common-extensionscolcon添加了有用的功能和插件,使构建和管理复杂工作空间变得更加容易。通过安装这些包,我们确保容器具备了处理ROS2包构建的所有必要工具,使开发人员能够轻松编译和运行他们的ROS2节点。
  5. 安装ROS2包: Dockerfile包括安装关键的ROS2包,如ros-humble-desktopros-humble-moveit*等:这些包对于机器人开发至关重要,提供了控制工具、仿真能力和可视化工具。ros-humble-desktop包括核心的ROS2组件以及如Rviz这样的可视化工具,对于开发和调试机器人系统至关重要。ros-humble-control*ros-humble-moveit*提供了高级功能,用于控制机械臂等硬件,使得运动规划和操作任务成为可能。ignition-fortress是一个强大的仿真工具,允许开发人员创建逼真的环境来测试他们的机器人应用程序。通过安装这些包,我们创建了一个多功能环境,能够处理广泛的机器人开发任务。
  6. 创建非root用户: 出于安全考虑,Docker容器不应作为root用户运行。因此,我们创建了一个非root用户:我们使用useradd命令创建了一个具有home目录的新用户,并以bash作为默认shell。我们还在sudoers文件中添加了一条条目,以便用户可以在不输入密码的情况下执行具有超级用户权限的命令。这对于需要提升权限的开发任务特别有用,例如安装新软件或修改系统设置。
  7. 设置用户环境: 我们将一个自定义的.bashrc文件复制到容器中,以自定义shell环境:这个.bashrc文件设置了有用的别名并加载了必要的ROS2设置文件,使开发体验更加顺畅。每当启动新的终端会话时,都会执行.bashrc文件,允许我们定义环境变量、别名和函数,以提高生产力。例如,我们可以为常用的命令如colcon buildros2 launch添加别名,减少键入的数量。我们加载ROS2设置文件,确保所有必要的环境变量都已正确设置,以便支持ROS2开发。通过自定义.bashrc文件,我们创建了一个更高效和用户友好的开发环境。
  8. 入口点脚本: 我们使用一个入口点脚本,以确保每次启动容器时ROS2环境都能正确初始化:entrypoint.sh脚本将加载ROS2设置文件并执行任何提供的命令,使您能够立即开始开发。Dockerfile中的ENTRYPOINT指令指定了启动容器时将执行的脚本。这确保了ROS2环境始终正确设置,无论容器如何运行。CMD指令提供了默认命令(bash),如果未指定其他命令,则将执行该命令。通过使用入口点脚本,我们可以保证容器始终处于准备就绪的状态,使开发人员能够专注于编写和测试他们的代码,而不必担心环境设置。
完整的 Docker 文件
    FROM osrf/ros:humble-desktop-full  

    # 设置环境变量  
    ENV DEBIAN_FRONTEND=noninteractive  
    ENV TZ=UTC  

    # 安装依赖和工具  
    RUN apt-get update && apt-get install -y \  
        git wget curl python3-pip software-properties-common ros-dev-tools \  
        && rm -rf /var/lib/apt/lists/*  

    # 安装Python包  
    RUN pip3 install --no-cache-dir setuptools==58.2.0 colcon-common-extensions  

    # 添加Gazebo仓库  
    RUN wget https://packages.osrfoundation.org/gazebo.gpg -O /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg \  
        && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] http://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/null  

    # 安装ROS2包  
    RUN apt-get update && apt-get install -y \  
        ros-humble-desktop \  
        ros-humble-control* \  
        ros-humble-ros2-control* \  
        ros-humble-moveit* \  
        ros-humble-ros-ign* \  
        ros-humble-joint-state-publisher-gui \  
        ros-humble-kinematics-interface-kdl \  
        ros-humble-rqt-joint-trajectory-controller \  
        ros-humble-rqt* \  
        ignition-fortress \  
        && rm -rf /var/lib/apt/lists/*  

    RUN apt-get update  
    RUN apt-get upgrade -y  

    # 创建非root用户账户  
    RUN useradd -m -s /bin/bash <username> && \  
        echo "<username> ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/<username>  

    # 设置用户环境  
    COPY ./.bashrc /home/<username>/.bashrc  
    RUN chown <username>:<username> /home/<username>/.bashrc  

    # 设置工作目录  
    WORKDIR /home/<username>  

    # 切换到非root用户身份  
    USER <username>  

    RUN rosdep update  

    # 入口点  
    COPY ./entrypoint.sh /entrypoint.sh  
    RUN chmod 755 /entrypoint.sh  
    ENTRYPOINT ["/entrypoint.sh"]  
    CMD ["bash"]

注意:请将上方的脚本中的<username>替换成你想要的容器中的 shell 中的用户名。

启动脚本:

entrypoint.sh 脚本在 Docker 容器每次启动时确保 ROS2 环境正确设置,起着至关重要的作用。以下是其功能描述:

给个解释
  • 源 ROS 安装:脚本首先源位于 /opt/ros/humble/setup.bash 的基础 ROS2 设置文件。这一步至关重要,因为它确保所有 ROS2 环境变量都被正确配置,包括将 ROS2 二进制文件添加到系统路径中并设置其他环境需求。
  • 源工作区:脚本接着检查位于 /home/<username>/<ros2_workspace_directory>/install/setup.bash 的工作区是否存在,并使工作区的设置文件生效。这一步允许工作区的设置文件生效,使工作区中编译的任何包在当前环境中可用。通过检查文件是否存在,脚本确保仅在工作区已被构建的情况下加载,从而避免容器初始化期间出现错误。
  • 执行传递给它执行的任何命令:最后,脚本执行传递给它执行的任何命令(exec "$@")。这是一个重要功能,使容器能够根据运行时提供的内容灵活表现。例如,你可以启动一个 shell,运行一个脚本,或启动一个特定的 ROS2 节点。通过使用 exec,它会用给定的命令替换当前 shell,这有助于更好地处理信号,特别是在 Docker 中。

entrypoint.sh 脚本确保每次 Docker 容器启动时,都能自动准备好与 ROS2 一起工作,无论是启动节点、测试,还是运行开发脚本。这使得开发过程更高效,因为它减少了设置时间,从而提高了工作效率。

完整的 entrypoint.sh 脚本
    #!/bin/bash  

    # 加载 ROS 安装  
    source /opt/ros/humble/setup.bash  

    # ROS2 工作区的目录路径  
    ROS_WS="ros2_workspace"  

    # 如果工作区存在,则加载该工作区的环境设置  
    if [ -f "/home/$USER/$ROS_WS/install/setup.bash" ]; then  
        source "/home/$USER/$ROS_WS/install/setup.bash"  
    fi  

    # 执行传递给脚本的参数  
    exec "$@"

注意:请将上面提到的ROS_WS替换为你的ROS2工作空间路径。

Docker 构建脚本(build script)

docker_build.sh 脚本自动化了构建 ROS2 环境的 Docker 镜像的过程。此脚本通过封装所有必要的构建命令,简化了镜像创建的过程,确保开发人员可以快速生成一致的镜像,而无需手动操作多个命令。

解释
  • 设置镜像名称:脚本定义了一个变量 IMAGE_NAME 来指定正在构建的 Docker 镜像的名称(Dockerfile)。这样便于在需要时更改镜像名称。
  • 构建 Docker 镜像:使用 docker build 命令根据当前目录中的 Dockerfile 构建 Docker 镜像。-t 标志用于使用指定的名称标记镜像。
  • 输出成功消息:构建完成后,脚本输出一条成功消息以表明构建过程已完成。

此脚本使构建环境的过程简单且可重复,确保每个团队成员都能轻松构建相同的开发环境。

完整的 Docker 构建脚本(命令)
    #!/usr/bin/bash  

    # 设置容器名字  
    CONTAINER_NAME="<CUSTOM_ROS2_CONTAINER>"  

    echo "构建 ROS2-Humble 容器"  
    docker build --rm -t $CONTAINER_NAME:latest .  

    echo "构建完成"

注意:请将上面的脚本中的 <CUSTOM_ROS2_CONTAINER> 替换为您自己的ROS2容器。

Docker 运行脚本(run 脚本)

docker_run.sh 脚本用于以正确设置运行 Docker 容器。此脚本确保容器以适当的配置运行,从而使开发启动更加轻松,而无需每次都手动指定 Docker 选项。

    #!/usr/bin/env bash  

    BASH_HISTORY_FILE=${PWD%/*}/.bash_history  
    BASH_RC_FILE=${PWD%/*}/docker/.bashrc  

    CONTAINER_NAME=<CUSTOM_CONTAINER_NAME>  
    DOCKER_USER="<USERNAME>"  

    docker_count=$(docker ps -a | grep CONTAINER_NAME | wc -l)  
    ((docker_count=docker_count+1))  

    XAUTH=/tmp/.docker.xauth_$docker_count  
    sleep 0.1  
    touch $XAUTH  
    # 将 X 权限信息写入 $XAUTH 文件  
    xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -  

    # 为每个 /dev 目录中的设备生成包含所有 --device 选项的字符串  
    device_options=""  
    for device in /dev/*; do  
        if [ -e "$device" ]; then  
            device_options+="--device=$device "  
        fi  
    done  

    docker run -it --rm \  
        --name CONTAINER_NAME-$docker_count \  
        --user $(id -u):$(id -g) \  
        --volume="${PWD%/*}:/home/$DOCKER_USER" \  
        --volume="$BASH_HISTORY_FILE:/home/$DOCKER_USER/.bash_history" \  
        --volume="$BASH_RC_FILE:/home/$DOCKER_USER/.bashrc" \  
        --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \  
        --volume="$XAUTH:$XAUTH" \  
        --env="XAUTHORITY=$XAUTH (X 权限文件)" \  
        --env="DISPLAY" \  
        --env="QT_X11_NO_MITSHM=1" \  
        --workdir="/home/$DOCKER_USER" \  
        $device_options \  
        --net=host \  
        --privileged \  
        CONTAINER_NAME:latest  

    echo "Docker 容器已停止运行。"
脚本解析:
  1. Bash 历史和 .bashrc 路径介绍:
  • BASH_HISTORY_FILE=${PWD%/*}/.bash_history: 这一行定义了 .bash_history 文件的路径,该文件将被挂载到容器内部,有助于在容器运行期间保留 bash 历史记录。

  • BASH_RC_FILE=${PWD%/*}/docker/.bashrc: 这一行定义了容器中使用的 .bashrc 文件的路径。这样可以提高容器内的 bash 环境的可用性。

2. 动态容器命名:

  • docker_count=$(docker ps -a | grep CONTAINER_NAME | wc -l):此命令用于计算现有 CONTAINER_NAME 容器的数量,确保每个新容器名称的独特性。
  • ((docker_count=docker_count+1)):计数加一,为每个新容器分配一个新编号。
  • 这种动态命名有助于在启动多个容器时避免名称冲突。

3. X11 认证设置

  • XAUTH=/tmp/.docker.xauth_$docker_count:为每个容器创建一个用于处理X11转发功能的唯一Xauthority文件。
  • xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -:此命令从主机的显示中获取X11认证令牌并准备在Docker容器内部使用。这使得容器内的图形应用程序可以访问主机上的显示服务器。

4. 安装设备

  • for device in /dev/* 这个循环会把 /dev/ 目录下的所有设备收集起来,并把这些设备选项串成一个字符串。这确保了所有已连接的设备(例如传感器、摄像头等)在 Docker 容器内可用。
  • device_options+="--device=$device ":这行代码把每个在 /dev/ 目录下找到的设备添加到 docker run 命令的设备选项中去。这对于硬件访问特别有用,比如当你需要和机器人组件或 USB 设备进行交互时。

5. 运行Docker容器的命令docker run命令由多个参数构成:

  • -it:此标志允许容器以交互模式运行,并附带一个交互式终端。
  • --rm:此标志确保容器在退出后被移除,保持 Docker 环境的整洁。
  • --name CONTAINER_NAME-$docker_count:容器名称动态生成,确保多个容器可以同时运行而不会发生名称冲突。
  • --user $(id -u):$(id -g):此设置确保容器以当前用户身份运行,避免权限问题。
  • --volume="${PWD%/*}:/home/$DOCKER_USER":将当前工作目录的父目录挂接到容器的 /home/$DOCKER_USER,使您能够在容器内访问本地环境中的文件。
  • --volume="$BASH_HISTORY_FILE:/home/$DOCKER_USER/.bash_history":通过挂接到主机机的 .bash_history 文件到容器中,保持 bash 历史记录在容器会话之间的持久性。
  • --volume="$BASH_RC_FILE:/home/$DOCKER_USER/.bashrc":将主机机的 .bashrc 文件挂接到容器中,确保任何自定义的 shell 配置在使用容器时生效。
  • --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw":此设置将 X11 套接字挂接到容器中,允许 GUI 应用程序与主机的显示界面交互。
  • --volume="$XAUTH:$XAUTH"--env="XAUTHORITY=$XAUTH":这两行确保容器可以与主机的 X 服务器进行身份验证,使图形应用程序能够显示在主机上。
  • --env="DISPLAY"--env="QT_X11_NO_MITSHM=1":这些环境变量设置以确保图形应用程序可以从容器内运行。
  • --workdir="/home/$DOCKER_USER":此设置将容器的工作目录设置为 /home/$DOCKER_USER,这样可以方便访问挂载的文件和环境变量。
  • $device_options:收集到的 --device 选项在此处传递,允许容器访问 /dev/ 中的所有硬件设备。
  • --net=host:此选项使容器使用主机的网络堆栈,在 ROS2 网络和通信中,特别是在多机配置中是必需的。
  • --privileged:此标志授予容器扩展权限,使容器能够访问 USB 端口等硬件设备,这对于机器人系统至关重要。
  • 要运行的 Docker 镜像CONTAINER_NAME:latest:这指定了要运行的 Docker 镜像,在这种情况下是带有 latest 标签的 ndi-needle 镜像。
  • 容器退出时打印的消息echo "Docker container exited.":容器完成运行后,此消息将被打印,以指示容器已经退出。

此自定义 docker_run.sh 脚本允许您轻松启动 ROS2 开发环境,该环境支持图形应用程序和硬件设备。该脚本处理各种重要的任务,比如各种重要的任务,。

  • 动态容器命名:为了防止冲突,允许多个容器实例同时运行。
  • 图形应用程序支持:通过转发 X11 凭证并挂载必要的套接字,可以让如 rvizgazebo 这样的 GUI 应用程序在容器中运行并在主机上显示。
  • 硬件设备访问:脚本会自动发现并挂载硬件设备,使与机器人、传感器及其他外设的交互变得简单。
  • 用户友好:挂载的 .bashrc.bash_history 文件确保你的 shell 环境在容器内既熟悉又可自定义。

这个脚本简化了启动一个功能完备的ROS2的步骤,包含了所有必需的配置,非常适合机器人开发和测试环境。

自定义的 BASHRC 脚本

提供的 .bashrc 文件在定制 ROS2 开发环境方面起着关键作用。它设置了必要的 ROS2 配置,并确保了更高效的 shell 使用体验。此外,该文件启用了有用的别名,使操作更加便捷。自定义的 .bashrc 文件通过以下方式优化了 ROS2 开发工作流程:

  • 自动设置ROS2环境:每次打开终端时,都会自动设置主ROS2环境和您的特定工作空间,从而消除重复的手动命令。
  • 提升易用性:自定义提示符使您更易于区分Docker和主机环境。支持颜色以及方便的别名(如lsgrep命令),使终端输出更易读。
  • 简化ROS2开发:提供的ROS2别名简化了常见的开发任务,例如构建、运行节点、启动模拟、以及与主题、节点和参数进行交互。
  • 轻松导航:会话启动时自动导航到ROS2工作空间,减少了在不同任务间切换时的摩擦,确保您无需额外步骤即可构建、测试或启动节点。
    # .bashrc

    # ROS 源设置文件
    source /opt/ros/humble/setup.bash

    # 默认 ROS2 工作区路径
    ROS2_WS="<DEFAULT_ROS2_WORKSPACE_PATH>"

    if [ -f "/home/$USER/$ROS2_WS/install/setup.bash" ]; then
        source "/home/$USER/$ROS2_WS/install/setup.bash"
    fi
    # 设置提示符为
    PS1='\[\033[01;32m\]\u@docker:\[\033[01;34m\]\w\[\033[00m\]\$ '

    # 启用 ls 的颜色支持并添加一些实用的别名
    if [ -x /usr/bin/dircolors ]; then
        test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
        alias ls='ls --color=auto'
        alias grep='grep --color=auto'
        alias fgrep='fgrep --color=auto'
        alias egrep='egrep --color=auto'
    fi

    # 一些额外的 ls 别名(如)
    alias ll='ls -alF'
    alias la='ls -A'
    alias l='ls -CF'

    # ROS2 别名
    alias cb='colcon build && source install/setup.bash'
    alias cbp='colcon build --symlink-install --packages-select'
    alias cbt='colcon build --symlink-install --packages-select --cmake-_ARGS -DCMAKE_BUILD_TYPE=RelWithDebInfo'
    alias run='ros2 run'
    alias launch='ros2 launch'
    alias topic='ros2 topic'
    alias node='ros2 node'
    alias param='ros2 param'

    # 切换到工作区
    cd /home/$USER/$ROS2_WS
脚本分解:

脚本分解如下:

1. 获取 ROS2 设置文件
  • source /opt/ros/humble/setup.bash: 这条命令执行了 Humble 发行版的 ROS2 设置文件,通过设置必要的环境变量来初始化 ROS2 环境,使其运行。
  • 接下来的一个 if 块会检查工作区的设置文件(/home/$USER/$ROS2_WS/install/setup.bash)是否存在。如果存在,则执行该文件,使工作区中的 ROS2 包可以被使用。这样可以确保每次打开新的终端,工作区都会自动准备好进行开发,而无需手动配置。

2. 自定义命令提示符 :
PS1='\[\033[01;32m\]\u@docker:\[\033[01;34m\]\w\[\033[00m\]\$ ': 这行代码自定义了命令提示符,使其显示用户名、当前目录和标识符@docker,并使用不同的颜色。这种视觉上的变化让你清楚地知道是否在Docker容器内工作,从而降低与主机环境之间的混淆。

3. 颜色支持和 ls 的快捷命令:此功能为 lsgrep 及其变体(如 fgrepegrep)等命令添加了颜色支持,这使得输出更易读,尤其是在处理长文件列表或搜索结果时。ls 的一些额外快捷命令提供了常用的列表任务的快捷方式。

  • ll:以长格式列出所有文件,包括隐藏文件(相当于 -alF)。
  • la:只列出隐藏文件(相当于 -A)。
  • l:以列格式列出文件(相当于 -CF)。

4. ROS2 命令别名 : 本节提供了一些常用的 ROS2 命令快捷键,以便开发人员能更高效地进行开发。

  • cb: 运行 colcon build 并使生成的 setup.bash 文件生效,使构建结果在环境中可用。
  • cbp: 指定名称构建特定的ROS2包。
  • cbt: 使用额外的CMake参数构建选定的包以实现RelWithDebInfo(带有调试信息的优化构建)。
  • run: 运行ROS2节点的快捷方式(相当于ros2 run)。
  • launch: 启动ROS2启动文件的快捷方式(相当于ros2 launch)。
  • topic, node, param: 检查和管理ROS2主题、节点和参数的快捷方式,这减少了输入完整命令名称的需求。

5. 自动切换到工作区 : cd /home/$USER/$ROS2_WS : 这条命令会在你打开新终端时自动导航到ROS2工作区($ROS2_WS)。这确保你每次打开新终端时都能直接进入正确的开发目录,而无需每次都手动切换。

此配置优化了在Docker容器中的开发体验,确保在Docker容器中开发ROS2应用时更高效的工作流程。

基于项目的总体结构的工作区架构

此项目工作区已组织好,以支持使用Docker的ROS2开发环境,确保所有必要的文件和脚本都包含在一个结构化的文件夹层次中。以下是对关键组件及其在整体工作流程中作用的简要说明。

    ROS-FOLDER  
    ├── docker  
    │   ├── docker_build.sh  # 构建Docker镜像的脚本  
    │   ├── Dockerfile  # Docker镜像的配置文件  
    │   ├── docker_run.sh  # 运行Docker容器的脚本  
    │   ├── entrypoint.sh  # Docker容器的入口脚本  
    │   └── .bashrc  # 用户bash环境配置文件  
    ├── .bashrc  # 用户bash环境配置文件  
    ├── .bash_history  # 用户bash命令历史记录  
    └── ros_workspace  # ROS工作空间  
        ├── build  # 编译生成的文件目录  
        ├── install  # 安装配置文件  
        │   ├── setup.bash  # Bash环境配置脚本  
        │   ├── setup.ps1  # PowerShell环境配置脚本  
        │   ├── setup.sh  # Shell环境配置脚本  
        │   └── setup.zsh  # Zsh环境配置脚本  
        ├── log  # 日志文件目录  
        └── src  # 源代码目录  
            ├── pkg_1  # 包1  
            └── pkg_2  # 包2
1. ROS-FOLDER: (ROS文件夹)

顶层目录作为你的项目工作区的根目录,它主要包括两大主要部分,

  • docker/ : 一个用于存放与Docker相关的文件和脚本的文件夹,用于配置和管理ROS2容器。
  • ros_workspace/ : 标准的ROS2工作空间,包含源代码、构建文件、安装脚本以及日志。
2. Docker 文件夹:

该文件夹包含了设置、构建并运行使用Docker的ROS2环境所需的所有必要文件。

  • docker_build.sh : 该脚本自动构建用于 ROS2 开发环境的 Docker 镜像的过程。运行此脚本可确保 Docker 容器包含所有必要的依赖项、库和工具。
  • Dockerfile : 定义了封装您的 ROS2 环境的 Docker 镜像。它指定了基础镜像、安装 ROS2 及其他工具、设置环境变量,并配置系统以在与主机系统隔离的状态下创建开发环境。
  • docker_run.sh : 一个自动化启动 Docker 容器的脚本。它处理挂载卷(如您的工作区和配置文件)、传递设备访问权限以确保硬件兼容性、设置环境变量,并允许 GUI 应用程序在容器内运行。此脚本动态命名容器并管理硬件访问,使运行 ROS2 节点和操作环境更加容易。
  • entrypoint.sh : 每当容器启动时都会执行此脚本,通过调用必要的设置文件来确保 ROS2 环境的正确初始化。它还允许动态传递命令以在容器启动时执行。
  • .bashrc : 一个容器专用的 .bashrc 文件,用于配置容器内的 shell 环境。它调用 ROS2 的设置文件、定义有用的别名,并自定义命令提示符,以提高在容器内开发的效率。
3. 位于docker目录外的.bashrc:

这是位于 ROS-FOLDER 根目录的 .bashrc 文件,与容器内部使用的那个 .bashrc 文件是分开的。此文件可能包含了用户在主机系统上的 shell 自定义设置。当运行 Docker 容器时,容器内部使用的是 docker/ 文件夹中的相关 .bashrc 文件。

4. .bash_history:(bash命令历史记录文件)

此文件包含你在Shell会话中的命令历史记录。它在主机和容器之间共享,让你在不同Docker会话间保留命令历史,从而提高效率,让你可以轻松重运行命令而无需重新输入。

5. ros_workspace/:

这个目录就是你的ROS2工作空间,这里的开发和执行工作主要是ROS2节点。它按照标准的ROS2工作空间结构。

  • 构建文件夹/:此文件夹包含运行 colcon build 命令后生成的二进制文件。它包括运行 ROS2 包所需的全部构建产物。
  • 安装文件夹/:构建完 ROS2 工作区后,install/ 目录包含了最终安装的包及其所需的设置文件。这些设置文件在构建 ROS2 工作区时自动生成,并用于确保运行 ROS2 节点或包时所有相关的环境变量正确设置。
  • 日志文件夹/:此文件夹存储运行和构建 ROS2 包的日志。这对于调试很有用,包含在构建或运行过程中发生的详细信息,帮助你识别任何错误或问题。
  • 源代码文件夹/src 目录是存储你的 ROS2 包(或节点)的地方。你应该在这里编写 ROS2 代码。
整体结构的优点:

这个工作区结构设计是为了分离不同的关注点:

  • Docker的管理docker/ 文件夹中进行,确保在不同机器上有一致的ROS2环境。
  • 开发ROS2工作区 遵循标准的ROS2工作区结构,使开发、构建和执行过程更加顺畅。

通过遵循这种结构,你可以确保Docker和ROS2都被正确配置,并且可以轻松地相互交互,从而提供一个干净且模块化的开发流程。这种组织方式有助于保持良好的可扩展性和可管理性,特别是在处理大型ROS2项目时,这些项目通常包含多个包和依赖项。

总体概述

这篇博客提供了一个全面的指南,使用Docker设置ROS2 Humble环境,强调了容器化在机器人开发中的重要性。Docker提供了一个可重复和隔离的开发环境,避免了诸如依赖冲突和版本不匹配等常见问题,从而使开发更加顺畅。首先,本指南引导你逐步完成配置和启动自定义ROS2 Docker容器的过程。重点介绍了Dockerfile、docker_build.shdocker_run.shentrypoint.sh.bashrc等关键组件,这些组件简化了设置和开发过程。例如,Dockerfile定义了Docker容器的基础镜像和所需安装的软件包。然后,我们将使用docker_build.sh脚本构建Docker镜像,使用docker_run.sh运行Docker容器,并通过entrypoint.sh脚本来执行特定的启动步骤,最后通过.bashrc文件来设置环境变量和命令别名。

主要内容有:

  • Docker 作为一致性解决方案:Docker 确保您的 ROS2 环境在所有机器上完全一致,便于团队协作,同时降低环境差异的风险。
  • 容器化的 ROS2:通过容器化 ROS2,您能更轻松地管理复杂的依赖关系,隔离开发过程与主机机器,同时通过 X11 转发保持对必要硬件和图形界面的访问。
  • 自定义环境:使用自定义的 .bashrc 文件和 ROS2 工作区配置,确保开发环境既方便又高效,配有实用的别名和自动加载设置文件。
  • 轻松自动化:提供了一系列脚本,例如 docker_build.shdocker_run.sh,可以自动化繁琐的设置过程,使构建和运行 Docker 容器变得简单省力。这些脚本会动态地配置容器名称、设备访问权限,并设置必要的卷和环境变量。
  • 标准的 ROS2 开发环境结构:遵循 ROS2 标准的良好组织的开发环境结构确保开发过程清晰、可维护并易于扩展。这种布局使 ROS2 节点的编译和执行变得无缝。

总体来说,本指南演示了如何有效使用Docker进行ROS 2开发,提供了一个可重复、安全且高效的环境,用于机器人系统的开发和测试。

如果这篇文章对你有帮助,请在_Medium_上关注我或者点个关注。如果这篇帖子对你有帮助,请点击下面的👏按钮几下表示支持。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消