跳转至

ROS2入门

本指南将帮助你快速上手 ROS2,包括安装、配置和基本使用。

1.1 安装ROS2

系统要求: Ubuntu 22.04, Ubuntu 24.04。

1.1.1 明确你的系统版本

使用下面的命令明确你安装的 Linux 系统和系统版本。

lsb_release -a
系统 版本 版本代号 对应的 ROS2 版本
Ubuntu 20.04 Focal Fossa (focal) Foxy
Ubuntu 22.04 Jammy Jellyfish(jammy) Humble
Ubuntu 24.04 Noble Numbat(noble) Jazzy Jalisco

关于这个表格,我想补充以下几点说明:

  1. Ubuntu 20.04 (Focal Fossa) 确实对应 ROS2 Foxy 版本。
  2. Ubuntu 22.04 (Jammy Jellyfish) 通常对应 ROS2 Humble 版本。
  3. Ubuntu 24.04 (Noble Numbat) 是最新的 LTS 版本,目前还没有明确对应的 ROS2 固定版本。它可能会使用 ROS2 的 Rolling 版本,这是一个持续更新的版本。

1.1.2 更新软件库并确保已经安装了 locale

更新软件

sudo apt update
sudo apt -y upgrade

确保安装了 locale:

locale  # 检查已安装的 locale
sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8

1.1.3 添加 ROS2 源

首先,确保启用了 Ubuntu Universe 软件库:

sudo apt install software-properties-common
sudo add-apt-repository universe

然后,添加 ROS 2 GPG 密钥:

sudo apt update && sudo apt install curl gnupg2 -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg

接下来,将软件源添加到您的软件源列表:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

更新 apt 缓存:

sudo apt update

1.1.4 安装 ROS 2 软件包。

您可以选择 桌面安装(推荐) 或者 基础安装

桌面安装(推荐):包含 ROS、RViz、示例和教程。

# 20.04
sudo apt install ros-foxy-desktop
# 22.04
sudo apt install ros-humble-desktop
# 24.04
sudo apt install ros-jazzy-desktop

基础安装:包含通信库、消息包、命令行工具。没有 GUI 工具。

# 20.04
sudo apt install ros-foxy-ros-base
# 22.04
sudo apt install ros-humble-ros-base
# 24.04
sudo apt install ros-jazzy-ros-base

安装 colcon :

sudo apt install python3-colcon-common-extensions

1.1.5 设置环境变量

每次打开新的 shell 时设置环境变量:

# 对于 20.04
source /opt/ros/foxy/setup.bash
# 对于 22.04
source /opt/ros/humble/setup.bash
# 对于 24.04
source /opt/ros/jazzy/setup.bash

你可以把它添加到你的 ~/.bashrc 或者 ~/.zshrc 中,这样每次启动一个终端就会自动加载 ROS2。

1.2 配置开发环境

1.2.1 本地安装 ROS2 和 VS Code

  1. 安装 VS Code 使用Microsoft的官方仓库安装VS Code:
sudo apt-get install wget gpg
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
sudo install -o root -g root -m 644 packages.microsoft.gpg /etc/apt/trusted.gpg.d/
sudo sh -c 'echo "deb [arch=amd64,arm64,armhf signed-by=/etc/apt/trusted.gpg.d/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list'
rm -f packages.microsoft.gpg
sudo apt install apt-transport-https
sudo apt update
sudo apt install code
  1. 配置 VS Code 的 ROS2 插件 - 打开 VS Code - 转到扩展页面(Ctrl+Shift+X) - 搜索并安装以下插件:
    • ROS
    • C/C++
    • Python

1.2.2 使用 VS Code Remote 远程连接

如果您已经在远程服务器上安装了ROS2,可以使用VS Code的Remote-SSH插件进行远程开发:

  1. 在本地VS Code中安装Remote-SSH插件

  2. 按下F1,输入”Remote-SSH: Connect to Host…”,然后输入远程服务器的SSH连接信息

  3. VS Code将打开一个新窗口连接到远程服务器

  4. 在远程VS Code中安装ROS、C/C++和Python插件

  5. 打开远程服务器上的ROS2工作空间,开始开发

1.2.3 使用 Docker 安装 ROS2

  1. 安装 Docker: 官方教程

  2. 拉取 ROS2 Docker 镜像

    docker pull osrf/ros:jazz-desktop
    

  3. 运行 ROS2 容器

    docker run -it --name ros2_dev osrf/ros:jazz-desktop
    

  4. 在容器中安装开发工具

    apt update && apt install -y vim wget
    

  5. 使用 VS Code 的 Remote-Containers 插件连接到 Docker 容器 - 安装 Remote-Containers 插件 - 按 F1,输入 “Remote-Containers: Attach to Running Container…” - 选择之前创建的 ROS2 容器 - VS Code 将在容器内打开一个新窗口

  6. 在容器内的 VS Code 中安装 ROS、C/C++ 和 Python 插件

1.3 第一个ROS2程序: Hello World

1.3.1 创建ROS2工作空间

  1. 打开一个新的终端窗口

  2. 创建工作空间目录:

mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
  1. 构建空工作空间:
colcon build
  1. 设置环境变量:
source install/setup.bash

1.3.2 创建一个简单的Publisher包

  1. 进入src目录:
cd ~/ros2_ws/src
  1. 使用ros2 pkg create命令创建一个新的包:
ros2 pkg create --build-type ament_python py_pubsub
  1. 进入新创建的包目录:
cd py_pubsub
  1. py_pubsub目录下创建一个新文件publisher_member_function.py
touch py_pubsub/publisher_member_function.py
  1. 使用文本编辑器(如VS Code)打开publisher_member_function.py,并添加以下代码:
import rclpy
from rclpy.node import Node

from std_msgs.msg import String


class MinimalPublisher(Node):

    def __init__(self):
        super().__init__('minimal_publisher')
        self.publisher_ = self.create_publisher(String, 'topic', 10)
        timer_period = 0.5  # seconds
        self.timer = self.create_timer(timer_period, self.timer_callback)
        self.i = 0

    def timer_callback(self):
        msg = String()
        msg.data = 'Hello World: %d' % self.i
        self.publisher_.publish(msg)
        self.get_logger().info('Publishing: "%s"' % msg.data)
        self.i += 1


def main(args=None):
    rclpy.init(args=args)

    minimal_publisher = MinimalPublisher()

    rclpy.spin(minimal_publisher)

    minimal_publisher.destroy_node()
    rclpy.shutdown()


if __name__ == '__main__':
    main()
  1. 修改setup.py文件,在entry_points部分添加以下内容:
entry_points={
    'console_scripts': [
        'talker = py_pubsub.publisher_member_function:main',
    ],
},

1.3.3 构建和运行Publisher

  1. 回到工作空间根目录:
cd ~/ros2_ws
  1. 构建包:
colcon build --packages-select py_pubsub
  1. 设置环境变量:
source install/setup.bash
  1. 运行talker节点:
ros2 run py_pubsub talker

你应该会看到类似以下的输出:

[INFO] [minimal_publisher]: Publishing: "Hello World: 0"
[INFO] [minimal_publisher]: Publishing: "Hello World: 1"
[INFO] [minimal_publisher]: Publishing: "Hello World: 2"
...

1.3.4 验证Publisher是否正常工作

  1. 打开一个新的终端窗口

  2. 运行以下命令来查看发布的消息:

ros2 topic echo /topic

你应该会看到类似以下的输出:

data: 'Hello World: 10'
---
data: 'Hello World: 11'
---
data: 'Hello World: 12'
---

这就完成了创建和运行第一个ROS2程序的过程。这个简单的Publisher每隔0.5秒发布一条”Hello World”消息,并带有一个递增的计数器。

如果你想进一步扩展这个例子,可以考虑创建一个相应的Subscriber节点来接收和处理这些消息。这将帮助你更好地理解ROS2中的发布/订阅模式。

1.4 故障排除

在使用ROS2的过程中,你可能会遇到一些常见问题。以下是一些典型问题及其解决方法:

1.4.1 环境变量问题

症状: 运行ROS2命令时出现”Command not found”错误。

解决方法: 1. 确保已经source了ROS2的setup文件:

source /opt/ros/<distro>/setup.bash
<distro>替换为你的ROS2版本(如foxy, humble等)。

  1. 将上述命令添加到你的~/.bashrc文件中,以便每次打开新终端时自动执行:
    echo "source /opt/ros/<distro>/setup.bash" >> ~/.bashrc
    source ~/.bashrc
    

1.4.2 包找不到

症状: 使用ros2 runros2 launch时出现”Package not found”错误。

解决方法: 1. 确保你已经构建了包并source了工作空间:

cd ~/ros2_ws
colcon build
source install/setup.bash

  1. 检查包名是否正确,使用以下命令列出所有可用的包:
    ros2 pkg list
    

1.4.3 节点通信问题

症状: 发布者发布消息,但订阅者没有接收到。

解决方法: 1. 检查发布者和订阅者是否在同一个ROS域(ROS_DOMAIN_ID)中:

echo $ROS_DOMAIN_ID
如果未设置,可以在~/.bashrc中添加:
export ROS_DOMAIN_ID=<some_number>

  1. 使用ros2 topic listros2 topic echo命令检查话题是否正确发布:
    ros2 topic list
    ros2 topic echo /your_topic_name
    

1.4.4 编译错误

症状: 使用colcon build时出现编译错误。

解决方法: 1. 检查是否安装了所有必要的依赖:

rosdep install --from-paths src --ignore-src -r -y

  1. 尝试清理构建文件夹后重新构建:
    rm -rf build install log
    colcon build --symlink-install
    

1.4.5 权限问题

症状: 运行ROS2命令时出现权限错误。

解决方法: 1. 检查文件权限:

ls -l /path/to/your/ros2/workspace

  1. 如果需要,更改文件权限:
    chmod +x /path/to/your/script.py
    

1.4.6 版本兼容性问题

症状: 不同计算机之间的节点无法通信。

解决方法: 1. 确保所有计算机使用相同版本的ROS2:

ros2 --version

  1. 检查消息类型是否一致:
    ros2 interface show <msg_type>
    

1.4.7 网络配置问题

症状: 在多机器设置中,节点无法发现或通信。

解决方法: 1. 检查防火墙设置,确保ROS2使用的端口(通常是7400和7401)是开放的。

  1. ~/.bashrc中设置ROS_LOCALHOST_ONLY变量为0:

    export ROS_LOCALHOST_ONLY=0
    

  2. 确保所有机器都在同一个网络中,并且可以相互ping通。

如果你遇到的问题不在此列表中,建议查阅ROS2官方论坛ROS Answers寻求更多帮助。记录错误信息和你尝试过的解决方法,这将有助于社区成员更好地帮助你解决问题。

参考资料


编辑者: 邓岂 孟世杰 创建时间: 2024-10-07 20:32 修改时间: 2024-10-07 20:32