ROS2 学习笔记(一):Ubuntu 26.04 安装 ROS2 Lyrical,完成第一个通信案例
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
常用命令也有所变化:
| ROS1 | ROS2 |
|---|---|
| roscore | 不需要 |
| rosrun | ros2 run |
| roslaunch | ros2 launch |
| ROS Master | DDS 分布式发现与通信 |
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. 实验结果
两个终端分别运行发布者和订阅者,能够持续看到消息发布与接收。
这说明:
-
ROS2 环境已经能够正常运行。
-
ROS2 节点可以正常启动。
-
发布者能够向 Topic 发布消息。
-
订阅者能够接收对应消息。
-
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,更要真正具备机器人软件开发和整机联调的能力。
更多推荐
所有评论(0)