ROS 2 Humble 部署
本指南介绍如何在 MTT E300 或 Ubuntu 22.04 环境中部署 ROS 2 Humble。完成部署后,你将使用 Turtlesim 和 RQT 练习节点运行、主题查看、服务调用和主题重映射等基础操作。
概念简介
本指南以 ROS 2 Humble 为基础环境,使用 Turtlesim 演示节点、主题和服务,再使用 RQT 以图形化方式调用和调试服务。
- ROS(Robot Operating System):开源生态系统,为机器人应用的构建、部署、运行和维护提供框架、工具和库。相关操作参见环境部署和查看节点、主题、服务和动作。
- Turtlesim:ROS 2 提供的轻量级二维模拟器,用于演示节点、主题和服务等基础机制。相关操作参见使用 Turtlesim。
- RQT:基于 Qt 的 ROS 图形化工具框架,以插件形式提供可视化和调试功能。相关操作参见使用 RQT。
学习目标
完成本指南后,你可以:
- 使用原生安装或 Docker 镜像部署 ROS 2 Humble。
- 启动 Turtlesim,并通过键盘控制乌龟移动。
- 使用命令行工具查看 ROS 2 节点、主题、服务和动作。
- 使用 RQT 调用服务,生成新乌龟并修改画笔属性。
- 使用主题重映射分别控制多只乌龟。
适用对象
本指南适用于 ROS 2 初学者、使用 MTT E300 的开发者,以及在 Ubuntu 22.04 环境中学习 ROS 2 的用户。
前置条件
开始前,请准备以下硬件和软件:
硬件
- MTT E300。
- 符合设备供电要求的电源适配器。
- 可下载安装包的有线或无线网络。
- 键盘、鼠标和显示器,或支持 SSH 的远程主机。
软件
- Ubuntu 22.04 ARM64 Jammy。
- 使用 Docker 镜像时,已安装 Docker Engine,并将当前用户加入
docker用户组。 - 可以访问 ROS 2 软件源及相关资源。
环境部署
你可以使用原生安装或 Docker 镜像部署 ROS 2 Humble。
选择安装方式
- Ubuntu 22.04 主机原生安装:适用于需要长期使用 ROS 2 的场景。
- Docker 镜像:适用于快速体验或需要避免依赖冲突的场景。
方式一:原生安装 ROS 2 Humble
-
创建脚本
install_host_ros_humble.sh#!/bin/bashsudo -vset -eOS_DISTRO="jammy"ROS_DISTRO="humble"APT_SRC="http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports"PIP_SRC="https://pypi.tuna.tsinghua.edu.cn/simple"echo "Starting ROS 2 Humble installation script for Ubuntu ${OS_DISTRO}..."echo "Using additional APT source: ${APT_SRC}"echo "Using PIP source: ${PIP_SRC}"# --- Add Tsinghua Mirror configuration to a separate file ---# This *adds* the mirror, keeping the original system sources intact.TSINGHUA_SOURCES_FILE="/etc/apt/sources.list.d/tsinghua-mirror.list"echo "Adding Tsinghua mirror configuration to ${TSINGHUA_SOURCES_FILE}..."sudo bash -c "cat <<EOL > ${TSINGHUA_SOURCES_FILE}# Added by install script on $(date)# Mirror: ${APT_SRC}# OS: ${OS_DISTRO}deb ${APT_SRC} ${OS_DISTRO} main restricted# deb-src ${APT_SRC} ${OS_DISTRO} main restricteddeb ${APT_SRC} ${OS_DISTRO}-updates main restricted# deb-src ${APT_SRC} ${OS_DISTRO}-updates main restricteddeb ${APT_SRC} ${OS_DISTRO} universe# deb-src ${APT_SRC} ${OS_DISTRO} universedeb ${APT_SRC} ${OS_DISTRO}-updates universe# deb-src ${APT_SRC} ${OS_DISTRO}-updates universedeb ${APT_SRC} ${OS_DISTRO} multiverse# deb-src ${APT_SRC} ${OS_DISTRO} multiversedeb ${APT_SRC} ${OS_DISTRO}-updates multiverse# deb-src ${APT_SRC} ${OS_DISTRO}-updates multiversedeb ${APT_SRC} ${OS_DISTRO}-backports main restricted universe multiverse# deb-src ${APT_SRC} ${OS_DISTRO}-backports main restricted universe multiversedeb ${APT_SRC} ${OS_DISTRO}-security main restricted# deb-src ${APT_SRC} ${OS_DISTRO}-security main restricteddeb ${APT_SRC} ${OS_DISTRO}-security universe# deb-src ${APT_SRC} ${OS_DISTRO}-security universedeb ${APT_SRC} ${OS_DISTRO}-security multiverse# deb-src ${APT_SRC} ${OS_DISTRO}-security multiverseEOL"echo "Added custom APT sources file: ${TSINGHUA_SOURCES_FILE}"# --- End of Tsinghua Mirror addition ---echo "Adding ROS 2 APT repository..."# Add the ROS 2 GPG key (Ensure required packages are installed first)sudo apt install -y curl gnupg lsb-release software-properties-commonsudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpgecho "ROS GPG Key added."# Add the ROS 2 repositoryROS2_SOURCES_FILE="/etc/apt/sources.list.d/ros2.list"echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | sudo tee ${ROS2_SOURCES_FILE} > /dev/ nullecho "Added ROS 2 APT repository file: ${ROS2_SOURCES_FILE}"echo "Configuring PIP source for the current user..."mkdir -p ~/.config/pip # Changed from /root/.pip to user's home configcat <<EOL > ~/.config/pip/pip.conf[global]index-url = ${PIP_SRC}EOLecho "Configured PIP to use ${PIP_SRC} for the current user in ~/.config/pip/pip.conf."echo "Updating package lists after adding new sources..."sudo apt-get updateecho "Installing system dependencies and ROS 2 packages..."# Note: software-properties-common was already installed earlier for ROS repo setupsudo apt-get install -y --fix-missing --allow-downgrades \net-tools vim curl wget tmux build-essential \libicu70=70.1-2 libsqlite3-0=3.37.2-2ubuntu0.3 libzstd1=1.4.8+dfsg-3build1 \libedit-dev libdrm-dev libspdlog-dev sox libsox-fmt-all librapidxml-devsudo apt-get install -y --fix-missing --allow-downgrades \ros-${ROS_DISTRO}-desktop \ros-${ROS_DISTRO}-perception \ros-${ROS_DISTRO}-simulation \ros-${ROS_DISTRO}-desktop-full \ros-${ROS_DISTRO}-rosbridge-suite \ros-${ROS_DISTRO}-ros-ign-gazebo-demos \ros-${ROS_DISTRO}-turtlesimecho "Configuring environment variables in ~/.bashrc..."grep -qxF "source /opt/ros/${ROS_DISTRO}/setup.bash" ~/.bashrc || echo "source /opt/ros/${ROS_DISTRO}/setup.bash" >> ~/.bashrcsource ~/.bashrcecho "------------------------------------------------------------------------"echo "Installation and configuration complete!"echo "NOTE: Added custom APT sources to ${TSINGHUA_SOURCES_FILE}"echo "NOTE: Added ROS 2 APT sources to ${ROS2_SOURCES_FILE}"echo "------------------------------------------------------------------------" -
运行脚本:
bash install_host_ros_humble.sh -
使环境生效:
source ~/.bashrc
方式二:使用 Docker 镜像
-
创建脚本
install_docker_ros_humble.sh#!/bin/bash# --- 配置变量 (可按需修改) ---OS_DISTRO="jammy" # 基础操作系统 (Ubuntu 22.04)ROS_DISTRO="humble" # ROS 2 发行版IMAGE_BASE="${ROS_DISTRO}-ros-base-${OS_DISTRO}" # 基础镜像名称部分IMAGE_NAME="mcconline-cn-beijing.cr.volces.com/m1000/refapps/ros" # 完整镜像仓库/名称IMAGE_TAG="${IMAGE_BASE}" # 镜像标签echo "--- 正在启动 Docker 容器 ---"echo "镜像: ${IMAGE_NAME}:${IMAGE_TAG}"# --- Docker 启动命令 ---# -it: 交互式终端# -d: 后台运行# --privileged: 赋予容器特权 (访问设备需要)# -v /dev:/dev: 挂载设备目录# -e DISPLAY=unix$DISPLAY: 传递 X11 Display 变量以显示 GUI# --net=host: 使用主机网络 (简化网络配置)# -v /usr/local/musa...: (如果需要)挂载特定硬件驱动 (示例)# -v /home/$USER:/home/$USER: 挂载用户主目录 (方便文件共享)# -v /tmp/.X11-unix:/tmp/.X11-unix: 挂载 X11 socket 目录docker run -it -d \--privileged \-v /dev:/dev \-e DISPLAY=unix$DISPLAY \--net=host \-v /usr/local/musa:/usr/local/musa \-v /usr/lib/aarch64-linux-gnu/musa:/usr/lib/aarch64-linux-gnu/musa \-v /usr/lib/aarch64-linux-gnu/dri/musa_dri.so:/usr/lib/aarch64-linux-gnu/dri/musa_dri.so \-v /usr/lib/aarch64-linux-gnu/dri/musa_drv_video.so:/usr/lib/aarch64-linux-gnu/dri/musa_drv_video.so \-v /home/$USER:/home/$USER \-v /tmp/.X11-unix:/tmp/.X11-unix \${IMAGE_NAME}:${IMAGE_TAG}echo "--- 容器已在后台启动 ---"echo "你可以使用 'docker ps' 查看运行中的容器 ID。"echo "使用 'docker exec -it <container_id> /bin/bash' 进入容器的交互式终端。" -
查找容器 ID 并进入容器:
docker ps # 查看运行中的容器 IDdocker exec -it <container_id> /bin/bash # 将 <container_id> 替换为实际 ID
检查和配置环境
完成 环境部署 后,检查 ROS 2 环境并加载环境脚本。以下步骤适用于原生安装和 Docker 镜像。
检查先决条件
- ROS 2 Humble 环境已就绪。
- 可以在主机或 Docker 容器中打开并操作终端。
- 熟悉
cd、ls和mkdir等基本 Linux 命令。
验证 ROS 2 环境
在一个新的终端(或已进入的 Docker 容器终端)中,运行以下命令:
printenv | grep ROS
输出应包含以 ROS_ 开头的环境变量。确认其中包含 ROS_DISTRO=humble,表示 ROS 2 的基本环境变量已加载。
加载 ROS 2 环境脚本
ros2 run、ros2 topic list 等命令依赖 ROS 2 环境变量。每次打开新终端后,都需要加载对应的环境脚本。
根据安装方式加载环境脚本:
-
原生安装或大多数 Docker 镜像:
source /opt/ros/humble/setup.bash -
自定义工作空间:加载工作空间中的
install/setup.bash,例如:# 假设工作空间位于 ~/ros2_wssource ~/ros2_ws/install/setup.bash
后续步骤中,每次打开新终端后,请先执行 source /opt/ros/humble/setup.bash 或加载对应的工作空间脚本。