1、ROS2概述与环境搭建:ROS2的历史与设计哲学、ROS2与ROS1的区别、Ubuntu系统安装与配置、ROS2 Humble的安装与验证、ROS2核心概念(节点、话题、服务、动作)初探

1.1 ROS2的诞生:从实验室到工业级的进化

说起ROS2的历史,我得先聊聊它的前身ROS1。ROS1诞生于2007年,那时候斯坦福大学和Willow Garage公司搞了个PR2机器人项目。说实话,ROS1在学术圈火得一塌糊涂,我2015年刚入行时,几乎所有机器人项目都跑在ROS1上。

但问题来了。ROS1有个致命缺陷——它依赖一个叫「roscore」的中心节点。这个节点一旦挂了,整个系统就瘫痪。我在2018年做过一个多机器人协同项目,三台AGV在仓库里跑,结果roscore崩了一次,三台车全停,差点撞上货架。嗯,那次之后我就开始关注ROS2了。

ROS2的设计哲学说白了就八个字:去中心化、实时性、跨平台、安全性。它不再依赖roscore,改用DDS(数据分发服务)作为底层通信。DDS是什么?你可以把它想象成一个超级稳定的快递系统——每个包裹(消息)都有明确的收发地址,而且快递员(DDS中间件)不止一个,谁挂了都不影响整体运转。

核心变化一览:

  • ROS1:中心化架构,依赖roscore,实时性差,仅支持Linux
  • ROS2:去中心化架构,基于DDS,支持实时内核,跨平台(Linux/Windows/macOS)

1.2 ROS2与ROS1的区别:不只是版本号变了

很多新手问我:「老师,ROS2不就是ROS1的升级版吗?」我通常会反问:「你觉得Windows XP和Windows 10的区别大不大?」

区别太大了。我列几个关键点:

对比项 ROS1 ROS2
通信机制 TCPROS/UDPROS(自定义协议) DDS(工业级标准协议)
节点发现 依赖roscore 自动发现(DDS内置)
实时性 不支持 支持(需配置实时内核)
多机器人 复杂,需手动配置 原生支持(DDS的Domain机制)
Python版本 Python 2(已停止维护) Python 3

这里有个避坑指南:千万不要在ROS2里用ROS1的launch文件。我曾经有个同事直接把ROS1的launch文件复制到ROS2项目里,结果折腾了两天没跑起来。ROS2的launch系统完全重写了,改用Python脚本,更灵活但也更讲究写法。

1.3 Ubuntu系统安装与配置:选对版本很重要

ROS2 Humble推荐用Ubuntu 22.04 LTS。我个人习惯用LTS版本,稳定,社区支持时间长。你想想看,如果选了个非LTS版本,半年后系统停止维护,所有依赖都得重装,多折腾。

安装步骤其实不复杂:

  1. 从Ubuntu官网下载22.04 LTS镜像
  2. 用Rufus或balenaEtcher制作启动U盘
  3. 安装时选择「为图形和无线硬件安装第三方软件」
  4. 分区建议:/ 分区50GB以上,swap分区8GB(如果你内存小于16GB)

我的小技巧:安装完成后,先执行 sudo apt update && sudo apt upgrade -y,把系统更新到最新。然后安装一些常用工具:sudo apt install vim git curl wget -y。这些工具后面都会用到。

1.4 ROS2 Humble的安装与验证:一步步来

安装ROS2 Humble,我建议用官方推荐的apt方式。别去源码编译,除非你特别想折腾。源码编译一次至少半小时,而且容易出依赖问题。

打开终端,按顺序执行:

# 设置编码
sudo apt update && 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

# 添加ROS2源
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl -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] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

# 安装ROS2 Humble桌面版
sudo apt update
sudo apt install ros-humble-desktop -y

# 安装开发工具
sudo apt install ros-dev-tools -y

安装完成后,验证一下:

# 打开一个新终端,启动一个talker节点
source /opt/ros/humble/setup.bash
ros2 run demo_nodes_cpp talker

# 再打开另一个终端,启动一个listener节点
source /opt/ros/humble/setup.bash
ros2 run demo_nodes_py listener

如果你看到talker在发「Hello World」,listener在收消息,那就说明安装成功了。

注意:每次打开新终端都要执行 source /opt/ros/humble/setup.bash。我建议把它加到 ~/.bashrc 里:echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc。这样每次打开终端自动加载,省得手敲。

1.5 ROS2核心概念初探:节点、话题、服务、动作

这四个概念是ROS2的基石。我习惯用一个比喻来理解:

  • 节点(Node):就像公司里的员工,各司其职。一个节点负责摄像头数据,另一个节点负责电机控制。
  • 话题(Topic):就像公司里的广播系统。节点A通过话题发布消息,任何感兴趣的节点都可以订阅。比如摄像头节点发布「/camera/image」话题,图像处理节点订阅它。
  • 服务(Service):就像打电话。客户端发起请求,服务端处理并返回结果。比如「/get_pose」服务,你问机器人「你现在在哪?」,它回答「我在(1.2, 3.4)」。
  • 动作(Action):就像派一个长期任务。比如「/navigate_to_pose」动作,你告诉机器人「去厨房」,它一边走一边给你反馈「已走50%」,到了之后告诉你「任务完成」。

我刚开始学的时候,总把服务和动作搞混。后来发现一个规律:服务是同步的,动作是异步的。服务就像你去柜台办业务,必须等结果;动作就像你点外卖,可以边等边干别的。

来个简单的代码示例,创建一个发布者节点:

import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class TalkerNode(Node):
    def __init__(self):
        super().__init__('talker')
        self.publisher = self.create_publisher(String, 'chatter', 10)
        self.timer = self.create_timer(1.0, self.timer_callback)
        self.get_logger().info('Talker节点已启动')

    def timer_callback(self):
        msg = String()
        msg.data = 'Hello, ROS2!'
        self.publisher.publish(msg)
        self.get_logger().info(f'发布: {msg.data}')

def main(args=None):
    rclpy.init(args=args)
    node = TalkerNode()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

这段代码创建了一个叫「talker」的节点,每秒在「chatter」话题上发一条消息。你运行它之后,可以用 ros2 topic echo /chatter 来查看消息内容。

初学建议:先别急着写代码。打开终端,用 ros2 node listros2 topic listros2 service list 这些命令,看看系统里都有什么。ROS2自带了很多示例节点,你可以用 ros2 run demo_nodes_cpp talkerros2 run demo_nodes_py listener 来体验节点通信。先玩熟了,再动手写代码。

好了,第一章的内容就到这里。环境搭好了,概念也了解了,下一章我们开始动手写第一个ROS2程序。