使用Docker可以简化基于ROS2(机器人操作系统2)的开发过程,创建一个隔离且可重复的环境。通过使用Docker,您可以确保不同机器之间的环境一致性,避免版本冲突,并便于协作。使用Docker可以让开发和部署过程变得更加流畅,尤其是在处理像ROS2这样的软件时,这种软件需要精确的版本控制和特定的依赖项。在这篇文章中,我们将一步步教你如何用一组文件来定义并设置自定义的ROS2 Docker容器。
ROS2 是一个强大的框架,用于开发机器人系统,但它附带有众多依赖项和陡峭的学习曲线。这种复杂性使得 Docker 成为管理 ROS2 环境的理想选择。使用 Docker 可确保开发团队的每个人都在相同的配置下运行,从而减少调试时间并避免因环境差异而可能出现的意外问题。按照本指南操作后,你将拥有一个强大且可重复的 ROS2 开发环境,可以轻松地与他人共享并重复使用。
前提条件在我们开始之前,请确保已经在您的系统上安装了Docker软件。您可以在Docker的官方网站上按照安装指南进行安装。如果是Ubuntu用户,可以按照下面的步骤安装Docker。
- 更新现有的软件包列表:运行以下命令来更新系统软件包列表:
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环境方面都扮演着重要角色。让我们详细地了解一下每一个文件。
DockerfileDockerfile 是我们 Docker 镜像的蓝图文件。它定义了基础镜像的来源,安装必要的依赖,并配置运行环境。以下是 Dockerfile 的主要组成部分,具体如下:
- 基础镜像: 这个基础镜像是创建自定义容器的理想起点,因为它包含了所有必要的ROS2组件。使用这个基础镜像可以确保与其他ROS2工具和库的兼容性,从而使集成各种ROS2包和扩展变得更加容易。这还节省了时间,因为基础镜像已经包含了多个必要的ROS2依赖项。
- 设置默认用户名: 我们使用一个参数来允许自定义非root用户的用户名。通过设置这个参数,您可以在构建Docker镜像时轻松自定义非root用户名。这个功能特别有用,当多个开发人员在同一项目上工作时,每个开发人员可以创建一个带有他们首选用户名的容器。这也有助于在不同的系统上部署容器,可以将容器用户与本地系统用户匹配,以实现更好的集成。用户还可以通过
sudo
获得超级用户权限,而无需输入密码,使在开发过程中管理系统级任务变得更加容易。 - 安装额外工具: Dockerfile安装了一些基本的开发工具,如
git
、wget
、curl
和python3-pip
。这些工具对于开发和管理ROS2包以及访问仓库和安装其他依赖项非常有用。git
对于版本控制至关重要,允许您克隆和管理代码仓库。wget
和curl
对于下载文件和与Web API交互非常有用。python3-pip
用于安装Python包,这些包通常在ROS2开发中需要。software-properties-common
可以管理软件仓库,使添加新的包源变得更加容易。最后,ros-dev-tools
提供了一些增强ROS2开发体验的实用工具。 - 安装Python包: 通过
pip
安装支持ROS2开发的Python包:这些包对于使用colcon
构建ROS2工作空间是不可或缺的。setuptools
是一个简化打包和分发Python代码过程的包开发工具。colcon
是ROS2的构建工具,而colcon-common-extensions
向colcon
添加了有用的功能和插件,使构建和管理复杂工作空间变得更加容易。通过安装这些包,我们确保容器具备了处理ROS2包构建的所有必要工具,使开发人员能够轻松编译和运行他们的ROS2节点。 - 安装ROS2包: Dockerfile包括安装关键的ROS2包,如
ros-humble-desktop
、ros-humble-moveit*
等:这些包对于机器人开发至关重要,提供了控制工具、仿真能力和可视化工具。ros-humble-desktop
包括核心的ROS2组件以及如Rviz
这样的可视化工具,对于开发和调试机器人系统至关重要。ros-humble-control*
和ros-humble-moveit*
提供了高级功能,用于控制机械臂等硬件,使得运动规划和操作任务成为可能。ignition-fortress
是一个强大的仿真工具,允许开发人员创建逼真的环境来测试他们的机器人应用程序。通过安装这些包,我们创建了一个多功能环境,能够处理广泛的机器人开发任务。 - 创建非root用户: 出于安全考虑,Docker容器不应作为root用户运行。因此,我们创建了一个非root用户:我们使用
useradd
命令创建了一个具有home目录的新用户,并以bash作为默认shell。我们还在sudoers文件中添加了一条条目,以便用户可以在不输入密码的情况下执行具有超级用户权限的命令。这对于需要提升权限的开发任务特别有用,例如安装新软件或修改系统设置。 - 设置用户环境: 我们将一个自定义的
.bashrc
文件复制到容器中,以自定义shell环境:这个.bashrc
文件设置了有用的别名并加载了必要的ROS2设置文件,使开发体验更加顺畅。每当启动新的终端会话时,都会执行.bashrc
文件,允许我们定义环境变量、别名和函数,以提高生产力。例如,我们可以为常用的命令如colcon build
或ros2 launch
添加别名,减少键入的数量。我们加载ROS2设置文件,确保所有必要的环境变量都已正确设置,以便支持ROS2开发。通过自定义.bashrc
文件,我们创建了一个更高效和用户友好的开发环境。 - 入口点脚本: 我们使用一个入口点脚本,以确保每次启动容器时ROS2环境都能正确初始化:
entrypoint.sh
脚本将加载ROS2设置文件并执行任何提供的命令,使您能够立即开始开发。Dockerfile中的ENTRYPOINT
指令指定了启动容器时将执行的脚本。这确保了ROS2环境始终正确设置,无论容器如何运行。CMD
指令提供了默认命令(bash
),如果未指定其他命令,则将执行该命令。通过使用入口点脚本,我们可以保证容器始终处于准备就绪的状态,使开发人员能够专注于编写和测试他们的代码,而不必担心环境设置。
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 一起工作,无论是启动节点、测试,还是运行开发脚本。这使得开发过程更高效,因为它减少了设置时间,从而提高了工作效率。
#!/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.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.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 容器已停止运行。"
脚本解析:
- 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 凭证并挂载必要的套接字,可以让如
rviz
或gazebo
这样的 GUI 应用程序在容器中运行并在主机上显示。 - 硬件设备访问:脚本会自动发现并挂载硬件设备,使与机器人、传感器及其他外设的交互变得简单。
- 用户友好:挂载的
.bashrc
和.bash_history
文件确保你的 shell 环境在容器内既熟悉又可自定义。
这个脚本简化了启动一个功能完备的ROS2的步骤,包含了所有必需的配置,非常适合机器人开发和测试环境。
自定义的 BASHRC 脚本提供的 .bashrc
文件在定制 ROS2 开发环境方面起着关键作用。它设置了必要的 ROS2 配置,并确保了更高效的 shell 使用体验。此外,该文件启用了有用的别名,使操作更加便捷。自定义的 .bashrc
文件通过以下方式优化了 ROS2 开发工作流程:
- 自动设置ROS2环境:每次打开终端时,都会自动设置主ROS2环境和您的特定工作空间,从而消除重复的手动命令。
- 提升易用性:自定义提示符使您更易于区分Docker和主机环境。支持颜色以及方便的别名(如
ls
和grep
命令),使终端输出更易读。 - 简化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
的快捷命令:此功能为 ls
、grep
及其变体(如 fgrep
和 egrep
)等命令添加了颜色支持,这使得输出更易读,尤其是在处理长文件列表或搜索结果时。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工作空间,包含源代码、构建文件、安装脚本以及日志。
该文件夹包含了设置、构建并运行使用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 的设置文件、定义有用的别名,并自定义命令提示符,以提高在容器内开发的效率。
这是位于 ROS-FOLDER
根目录的 .bashrc
文件,与容器内部使用的那个 .bashrc
文件是分开的。此文件可能包含了用户在主机系统上的 shell 自定义设置。当运行 Docker 容器时,容器内部使用的是 docker/
文件夹中的相关 .bashrc
文件。
此文件包含你在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.sh
和docker_run.sh
、entrypoint.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.sh
和docker_run.sh
,可以自动化繁琐的设置过程,使构建和运行 Docker 容器变得简单省力。这些脚本会动态地配置容器名称、设备访问权限,并设置必要的卷和环境变量。 - 标准的 ROS2 开发环境结构:遵循 ROS2 标准的良好组织的开发环境结构确保开发过程清晰、可维护并易于扩展。这种布局使 ROS2 节点的编译和执行变得无缝。
总体来说,本指南演示了如何有效使用Docker进行ROS 2开发,提供了一个可重复、安全且高效的环境,用于机器人系统的开发和测试。
如果这篇文章对你有帮助,请在_Medium_上关注我或者点个关注。如果这篇帖子对你有帮助,请点击下面的👏按钮几下表示支持。
共同学习,写下你的评论
评论加载中...
作者其他优质文章