ROS2 快速上手:构建下一代机器人应用 – wiki基地

文章标题:ROS2 快速上手:构建下一代机器人应用


I. 引言

在机器人技术飞速发展的今天,高效、可靠的软件开发框架成为了推动创新的关键。Robot Operating System 2 (ROS2) 正是这样一款为下一代机器人应用而设计的开源框架。它不仅继承了ROS1的强大功能,更在分布式、实时性、安全性和跨平台方面进行了全面升级,旨在满足工业级和研究级机器人系统的严苛需求。

本文将带领读者快速入门ROS2,从核心概念到环境搭建,再到第一个应用的开发,逐步揭示ROS2的魅力,助您开启构建智能机器人的旅程。

II. ROS2 核心概念

理解ROS2的核心概念是高效开发的基础。

  • 节点 (Nodes):节点是ROS2中执行计算的最小单元。每个节点都是一个独立的进程,负责执行特定的任务(例如,读取传感器数据、控制电机、路径规划等)。节点之间通过ROS2的通信机制进行协作。

  • 话题 (Topics):话题是ROS2中最常用的匿名发布/订阅通信机制。一个节点可以将消息发布到特定话题上,而另一个或多个节点可以订阅该话题以接收这些消息。这种松耦合的通信方式极大地提高了系统的模块化和灵活性。

  • 服务 (Services):服务提供了一种同步的请求/响应通信模式。当一个节点(客户端)需要从另一个节点(服务端)获取一次性结果时,会发起服务请求,并等待服务端的响应。

  • 动作 (Actions):动作是比服务更复杂的通信模式,用于处理长时间运行的任务。它允许客户端发送目标请求,服务端执行任务,并在此过程中提供周期性的反馈,同时客户端也可以取消正在执行的任务。

  • 参数 (Parameters):参数允许节点在运行时动态地配置其行为。节点可以声明可配置的参数,并在需要时修改它们,而无需重新编译或重启节点。

  • 包 (Packages):包是ROS2代码组织的基本单位,它将相关的节点、库、配置文件和资源文件等封装在一起。ROS2提供了工具来创建、构建和管理包。

  • DDS (Data Distribution Service):DDS 是ROS2底层通信的核心。与ROS1使用TCP/IP不同,ROS2通过DDS实现节点间的发现、连接和数据传输。DDS支持多种质量服务 (QoS) 策略,确保了通信的实时性、可靠性和安全性。

III. 环境搭建

ROS2支持多种操作系统,但为了最佳体验和最广泛的社区支持,我们推荐在Ubuntu LTS版本上进行安装。

A. 系统要求
推荐使用 Ubuntu 22.04 LTS (Jammy Jellyfish) 作为操作系统,并选择 ROS2 Humble Hawksbill 版本,这是一个长期支持版本,具有良好的稳定性和社区支持。

B. 安装ROS2
以下是基于Ubuntu的快速安装步骤:

  1. 添加ROS2 apt仓库
    首先,设置你的系统,允许apt通过HTTPS获取软件包:
    bash
    sudo apt update && sudo apt install curl gnupg lsb-release
    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] http://packages.ros.org/ros2/ubuntu $(source /etc/os-release && echo UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

  2. 安装桌面完整版
    更新apt缓存后,安装包含所有核心工具、库和可视化应用的桌面完整版:
    bash
    sudo apt update
    sudo apt install ros-humble-desktop

    如果您只需要基础环境,可以选择 ros-humble-ros-base

C. 环境配置
每次打开新的终端时,您需要加载ROS2的环境脚本。为了方便起见,建议将其添加到您的 ~/.bashrc (或其他shell的配置文件) 中:
bash
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc

D. 验证安装
安装完成后,您可以通过运行 turtlesim 演示来验证ROS2是否正确安装:
bash
ros2 run turtlesim turtlesim_node
ros2 run teleop_turtle teleop_turtle_node

如果看到一个小乌龟窗口,并且可以通过键盘控制它移动,那么恭喜您,ROS2环境已成功搭建!

IV. 第一个ROS2应用:发布者与订阅者

现在,让我们来创建一个简单的发布者和订阅者节点,体验ROS2的基本通信。

A. 创建工作空间
工作空间是组织ROS2包的目录。
bash
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws

B. 创建ROS2包
我们将创建一个名为 my_robot_pkg 的Python包。
bash
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_python my_robot_pkg

C. 编写发布者节点
~/ros2_ws/src/my_robot_pkg/my_robot_pkg 目录下创建一个名为 publisher_node.py 的文件,并添加以下内容:
“`python
import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class SimplePublisher(Node):
def init(self):
super().init(‘simple_publisher’)
self.publisher_ = self.create_publisher(String, ‘chatter’, 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 = f'Hello ROS2 from Python: {self.i}'
    self.publisher_.publish(msg)
    self.get_logger().info(f'Publishing: "{msg.data}"')
    self.i += 1

def main(args=None):
rclpy.init(args=args)
simple_publisher = SimplePublisher()
rclpy.spin(simple_publisher)
simple_publisher.destroy_node()
rclpy.shutdown()

if name == ‘main‘:
main()
修改 `~/ros2_ws/src/my_robot_pkg/setup.py` 文件,在 `entry_points` 中添加:python
entry_points={
‘console_scripts’: [
‘publisher = my_robot_pkg.publisher_node:main’,
],
},
“`

D. 编写订阅者节点
~/ros2_ws/src/my_robot_pkg/my_robot_pkg 目录下创建一个名为 subscriber_node.py 的文件,并添加以下内容:
“`python
import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class SimpleSubscriber(Node):
def init(self):
super().init(‘simple_subscriber’)
self.subscription = self.create_subscription(
String,
‘chatter’,
self.listener_callback,
10)
self.subscription # prevent unused variable warning

def listener_callback(self, msg):
    self.get_logger().info(f'I heard: "{msg.data}"')

def main(args=None):
rclpy.init(args=args)
simple_subscriber = SimpleSubscriber()
rclpy.spin(simple_subscriber)
simple_subscriber.destroy_node()
rclpy.shutdown()

if name == ‘main‘:
main()
修改 `~/ros2_ws/src/my_robot_pkg/setup.py` 文件,在 `entry_points` 中添加:python
entry_points={
‘console_scripts’: [
‘publisher = my_robot_pkg.publisher_node:main’,
‘subscriber = my_robot_pkg.subscriber_node:main’, # Add this line
],
},
“`

E. 编译与运行

  1. 编译工作空间
    回到工作空间根目录并编译:
    bash
    cd ~/ros2_ws
    colcon build

    编译成功后,别忘了 source 一下工作空间的环境:
    bash
    source install/setup.bash

    此步骤在每次打开新终端并希望运行自定义ROS2包时都需要执行。

  2. 运行节点
    打开两个新的终端窗口,分别运行发布者和订阅者:

    终端 1 (发布者):
    bash
    cd ~/ros2_ws
    source install/setup.bash
    ros2 run my_robot_pkg publisher

    终端 2 (订阅者):
    bash
    cd ~/ros2_ws
    source install/setup.bash
    ros2 run my_robot_pkg subscriber

    您将在订阅者终端看到发布者发送的消息,这表明ROS2的发布/订阅通信机制正在正常工作。

V. 进阶主题

掌握了ROS2的基础后,您可以探索更多功能,构建更复杂的机器人应用。

  • 启动文件 (Launch Files):对于包含多个节点和复杂配置的机器人系统,使用Python或XML编写的启动文件 (ros2 launch) 可以方便地一次性启动和管理所有组件。

  • 机器人模型与仿真 (Robot Models and Simulation):结合URDF(统一机器人描述格式)定义机器人模型,并利用Gazebo等仿真环境进行开发和测试,可以在真实机器人部署前验证算法和行为。

  • 可视化工具 (Visualization Tools)

    • RViz2:强大的3D可视化工具,用于显示机器人模型、传感器数据、路径规划等信息。
    • rqt_console:用于查看和过滤ROS2日志消息的图形界面工具。
  • 自定义接口 (Custom Interfaces):当标准消息类型不足以满足需求时,您可以创建自定义的 .msg (消息) 和 .srv (服务) 文件来定义自己的数据结构。

  • ROS1 Bridge:如果您需要与现有的ROS1系统进行交互,ROS1 Bridge 提供了一个通信桥梁,允许ROS1和ROS2节点之间共享消息和服务。

  • 安全性与实时性 (Security and Real-time Capabilities):ROS2在设计之初就考虑了安全和实时性。DDS层提供了加密、认证等安全机制,而其底层实时操作系统的支持则满足了对时间敏感型任务的需求。

VI. 总结与展望

ROS2作为下一代机器人操作系统,凭借其强大的分布式能力、出色的实时性、增强的安全性以及对多种平台和语言的支持,正在成为机器人开发领域的主流选择。它为从研究到工业应用的各类机器人项目提供了坚实的基础。

通过本文的学习,您应该已经掌握了ROS2的核心概念、环境搭建方法以及如何构建第一个ROS2应用。随着您对ROS2的深入探索,将会发现其在构建高度复杂和智能化的机器人系统方面的巨大潜力。加入ROS2社区,共同推动机器人技术的未来!

滚动至顶部