ROS2 学

一、学习

最近开始系统学习 ROS2,主要目的是为后续机器人软件开发和嵌入式方向实习做准备。

计划通过一个完整的移动机器人底盘控制项目,将 Linux、C++、ROS2、STM32、FreeRTOS、串口通信和 PID 控制等知识结合起来。

由于目前没有实际机器人硬件,所以决定先在虚拟机中搭建 ROS2 开发环境,通过模拟程序学习 ROS2 的基本概念和通信机制,后续再逐步接入 STM32。

本次使用的开发环境:

项目配置
主操作系统Windows 11
虚拟机VMware Workstation
Linux 系统Ubuntu 26.04.1 LTS
系统代号Resolute
系统架构x86_64 / amd64
ROS2 版本ROS 2 Lyrical
磁盘容量80GB
软件包镜像阿里云 ROS2 镜像

二、虚拟机环境准备

1. Ubuntu 系统安装

在 Windows 11 上安装 VMware Workstation,通过 Ubuntu 26.04.1 LTS ISO 镜像创建虚拟机。

最开始给虚拟机分配的磁盘空间只有 20GB。考虑到后续需要安装 ROS2、编译工具、C++ 开发环境以及其他机器人开发依赖,决定将虚拟机磁盘扩展至 80GB。

2. 扩展虚拟机磁盘

首先在 VMware 设置中将虚拟硬盘容量扩展到 80GB。

然后进入 Ubuntu,检查磁盘:

lsblk
df -h /

发现虽然虚拟硬盘已经变成 80GB,但 Ubuntu 根分区仍然只有 20GB,因此还需要扩展分区和文件系统。

安装并检查 growpart:

sudo apt update
sudo apt install -y cloud-guest-utils

扩展第二个分区:

sudo growpart /dev/sda 2

扩展 ext4 文件系统:

sudo resize2fs /dev/sda2

最后再次检查:

df -h /

成功将根分区扩展到约 79GB,可用空间约 65GB。

三、安装 ROS2 Lyrical

1. 检查 Ubuntu 环境

首先确认系统版本:

lsb_release -a

查看系统架构:

dpkg --print-architecture

检查字符编码:

locale charmap

本机检查结果:

  • Ubuntu 26.04.1 LTS

  • amd64

  • UTF-8

2. 更新系统并安装基础工具

sudo apt update
sudo apt upgrade -y

安装 curl 和 gnupg:

sudo apt install -y curl gnupg

3. 配置 ROS2 软件源

考虑到直接使用国外软件源可能下载较慢,因此选择国内镜像。

下载 ROS2 官方密钥:

curl -fL --retry 3 \
https://mirrors.tuna.tsinghua.edu.cn/rosdistro/ros.key \
-o /tmp/ros.key

检查密钥指纹:

gpg --show-keys --with-fingerprint /tmp/ros.key

随后配置 ROS2 软件源,使用阿里云镜像。

配置完成后更新软件包索引:

sudo apt update

检查 ROS2 Lyrical Desktop 是否存在可安装版本:

apt-cache policy ros-lyrical-desktop

成功查询到 ROS2 Lyrical 对应的软件包版本。

4. 安装并配置 ROS2

完成软件源配置后安装 ROS2 Lyrical Desktop。

安装完成后,在终端执行:

source /opt/ros/lyrical/setup.bash

检查 ROS2 命令:

ros2 --help

查看 ROS2 发行版:

printenv ROS_DISTRO

输出:

lyrical

至此,ROS2 Lyrical 已经能够正常使用。

四、ROS2 开发工具与 rosdep

ROS2 安装完成,并不意味着所有开发工具都已经准备好。

ROS2 开发还会用到一些辅助工具:

  • rosdep:管理和安装依赖。

  • colcon:构建 ROS2 工作空间。

  • vcstool:管理多个代码仓库。

  • CMake:C++ 项目构建工具。

  • g++:C++ 编译器。

其中 rosdep 主要用于处理项目依赖。

检查 rosdep 版本:

rosdep --version

本次检查得到:

0.27.0

检查默认配置:

ls /etc/ros/rosdep/sources.list.d/

可以看到:

20-default.list

说明已经存在 rosdep 默认源配置。

后续还需要继续检查和完善 colcon、C++ 编译器等开发工具。

五、ROS1 和 ROS2 有什么区别?

今天学习 ROS2 时,首先遇到的一个问题就是:

为什么 ROS1 需要启动 roscore,而 ROS2 不需要?

1. ROS1 的通信机制

ROS1 使用 ROS Master 管理节点注册和发现。

启动 ROS1 程序时,通常需要先执行:

roscore

ROS Master 负责帮助节点发现彼此。

2. ROS2 的通信机制

ROS2 使用 DDS(Data Distribution Service)作为通信中间件。

DDS 提供分布式发现和数据通信机制,节点能够自动发现符合条件的通信参与者,不再需要 ROS1 那样的中心 Master。

因此,ROS2 不需要启动:

roscore

常用命令也有所变化:

ROS1ROS2
roscore不需要
rosrunros2 run
roslaunchros2 launch
ROS MasterDDS 分布式发现与通信

3. 如何理解 DDS?

可以把机器人系统想象成一家公司:

  • Node:公司的员工。

  • Topic:员工之间的消息频道。

  • DDS:公司的内部通信网络和自动通讯录。

  • ROS2:组织和管理整套机器人软件的框架。

DDS 主要负责节点发现、通信匹配和数据传输。

需要注意,DDS 不是一个网站,也不是一个中心服务器,而是底层通信中间件。

六、ROS2 的几个核心概念

ROS2 中最重要的基础概念包括 Node、Topic、Service 和 Action。

1. Node(节点)

Node 是 ROS2 中的基本功能单元。

例如,一个移动机器人可以包含:

  • 摄像头节点:采集图像。

  • 视觉识别节点:识别障碍物。

  • 电机控制节点:控制电机。

  • 导航节点:规划运动路线。

每个节点负责自己的功能,多个节点组合起来构成完整的机器人系统。

2. Topic(话题)

Topic 是节点之间进行持续数据传输的一种方式。

采用发布者(Publisher)和订阅者(Subscriber)模式。

例如:

摄像头节点不断发布图像数据,视觉识别节点订阅图像数据并进行处理。

3. Service(服务)

Service 采用请求与响应的通信模式。

例如,向机器人发送一个请求:

请求:打开摄像头

机器人处理后返回:

响应:摄像头已打开

适合执行相对简短的请求操作。

4. Action(动作)

Action 适合执行持续时间较长的任务。

例如:

目标:让机器人移动到前方 5 米的位置

机器人在执行过程中可以反馈进度,也可以在适当情况下取消任务。

三种通信方式的区别:

通信方式特点应用场景
Topic持续发布和订阅传感器数据、速度指令
Service请求与响应查询状态、重置参数
Action长时间任务、反馈进度导航、机械臂运动

七、运行 ROS2 第一个通信案例

安装完成后,不能只看命令能否运行,还需要实际测试节点之间能否通信。

ROS2 自带了一些演示程序,其中最经典的就是 Talker 和 Listener。

1. 启动发布者 Talker

打开第一个终端:

source /opt/ros/lyrical/setup.bash

ros2 run demo_nodes_cpp talker

运行后可以看到类似输出:

[INFO] [talker]: Publishing: 'Hello World: 1'
[INFO] [talker]: Publishing: 'Hello World: 2'
[INFO] [talker]: Publishing: 'Hello World: 3'

Talker 节点会不断发布消息。

2. 启动订阅者 Listener

再打开第二个终端:

source /opt/ros/lyrical/setup.bash

ros2 run demo_nodes_py listener

运行后可以看到:

[INFO] [listener]: I heard: [Hello World: 1]
[INFO] [listener]: I heard: [Hello World: 2]
[INFO] [listener]: I heard: [Hello World: 3]

Listener 成功接收到了 Talker 发布的消息。

3. 实验结果

两个终端分别运行发布者和订阅者,能够持续看到消息发布与接收。

这说明:

  1. ROS2 环境已经能够正常运行。

  2. ROS2 节点可以正常启动。

  3. 发布者能够向 Topic 发布消息。

  4. 订阅者能够接收对应消息。

  5. DDS 通信机制能够支持节点之间的数据交换。

至此,完成了 ROS2 的第一个基础通信实验。

八、下一步学习计划

本次学习主要完成了 ROS2 环境搭建、基本概念理解和通信测试。

接下来准备按照实际项目开发的需求继续学习。

阶段学习内容目标
第一阶段Node、Topic、Service、Action理解 ROS2 基本通信机制
第二阶段ROS2 C++ 开发独立编写节点和通信程序
第三阶段Linux 串口编程实现上位机与下位机通信
第四阶段STM32、FreeRTOS、PID实现底层电机控制
第五阶段里程计、TF2、RViz2实现机器人运动状态可视化
第六阶段系统集成完成移动机器人底盘控制系统

最终希望完成一个基于 ROS2 + STM32 的移动机器人底盘控制项目。

即使暂时没有实际硬件,也可以先通过模拟下位机的方式完成 ROS2 上位机开发,逐步验证通信协议、速度控制和状态反馈逻辑。

九、总结

今天最大的收获不仅是成功安装了 ROS2 Lyrical,更重要的是开始理解 ROS2 的整体架构。

从最初不知道为什么 ROS2 不需要 roscore,到理解 DDS 的作用,再到实际运行 Talker 和 Listener,逐渐建立了对 ROS2 节点通信机制的认识。

目前还处于入门阶段,距离独立完成机器人系统开发还有不少知识需要学习。

接下来继续坚持以项目为导向学习,不只停留在会使用命令,而是逐步做到能够独立编写节点、设计通信协议、调试程序并完成系统集成。

学习目标:不仅要学会 ROS2,更要真正具备机器人软件开发和整机联调的能力。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐