1、ROS2概述与环境搭建
大家好,我是你们这门课的老朋友。咱们今天正式开篇,聊聊ROS2。
说实话,我最早接触机器人开发时,用的还是ROS1。那时候觉得这东西真神奇,能把传感器、电机、算法这些零碎的东西串起来。但做着做着就发现,有些地方确实让人头疼——比如实时性不够、多机通信麻烦、系统一崩就全完蛋。后来ROS2出来了,我第一时间就迁移了过去。嗯,今天咱们就把ROS2的来龙去脉和怎么把它装到你的电脑上,一次性讲清楚。
1.1 ROS2的前世今生
ROS,全称Robot Operating System,说白了就是一个给机器人用的“操作系统”。但它不是真正的操作系统,而是一个分布式通信框架。你想想看,一个机器人身上可能有激光雷达、摄像头、机械臂、底盘……这些部件需要互相说话,ROS就是那个“翻译官”。
ROS1在2007年诞生,那时候主要是学术界在用。到了2015年左右,工业界也开始关注。但问题来了——ROS1的设计太“学术”了,它依赖一个叫roscore的中心节点,这个节点一挂,整个系统就瘫痪。我在一个工厂项目里就吃过这个亏,机器人跑到一半,roscore莫名其妙崩了,差点撞到人。从那以后,我下定决心要迁移到ROS2。
ROS2从2015年开始设计,2017年发布第一个正式版。它最大的变化就是去掉了roscore,改用DDS(数据分发服务)作为底层通信。DDS是工业级的标准,天生支持分布式、实时性、可靠性。说白了,ROS2就是给ROS1换了一副“钢筋铁骨”。
核心变化一句话总结:ROS1是“中央集权”,ROS2是“地方自治”。每个节点都是独立的,谁也不用依赖谁。
1.2 核心概念:节点、话题、服务、动作
这四个概念是ROS2的基石。我建议你先把它们刻在脑子里,后面所有内容都围绕它们展开。
1.2.1 节点(Node)
节点就是ROS2里的“最小执行单元”。一个节点可以是一个传感器驱动、一个算法模块、一个控制程序。每个节点都是独立的进程,可以单独启动、停止、崩溃(当然我们不希望它崩溃)。
我个人习惯把节点想象成“人”。比如一个机器人有“摄像头节点”负责看路,“激光雷达节点”负责测距,“路径规划节点”负责想怎么走。这些人通过“话题”和“服务”来交流。
1.2.2 话题(Topic)
话题是节点之间“广播”数据的通道。一个节点可以发布(publish)数据到某个话题,其他节点可以订阅(subscribe)这个话题来接收数据。这是一种异步、一对多的通信方式。
举个例子:摄像头节点不断发布图像数据到/camera/image话题,图像处理节点订阅这个话题,拿到图像做识别。整个过程是流式的,不需要等待回复。
避坑指南:我曾经在调试时发现话题数据收不到,折腾了半天才发现是话题名字拼写错了。ROS2的话题名是区分大小写的,/camera/Image和/camera/image是两个完全不同的话题。切记!
1.2.3 服务(Service)
服务是同步、一对一的通信方式。客户端发送一个请求,服务端处理完后返回一个响应。适合那些需要“一问一答”的场景,比如“请帮我计算一下这个路径”、“请告诉我当前电池电量”。
服务和话题的区别?我打个比方:话题就像你开着收音机听广播,广播台一直在播,你爱听不听;服务就像你打电话问客服,你问一句,客服答一句,你不问他就等着。
1.2.4 动作(Action)
动作是ROS2里比较高级的通信方式。它适合那些耗时较长、可被取消、需要反馈的任务。比如“让机械臂移动到位置A”,这个动作可能需要几秒钟,期间你可以查询进度,也可以中途取消。
动作本质上是由三个话题和一个服务组成的:一个话题用于发送目标,一个话题用于发布反馈,一个话题用于发布结果,还有一个服务用于取消动作。嗯,听起来复杂,但用起来很顺手。
1.3 ROS1与ROS2的区别
很多从ROS1转过来的同学,最关心这个问题。我整理了一个表格,一目了然:
| 对比项 | ROS1 | ROS2 |
|---|---|---|
| 中心节点 | 依赖 roscore | 无中心节点,基于DDS |
| 通信协议 | TCPROS/UDPROS(自定义) | DDS(工业标准) |
| 实时性 | 不支持 | 支持(需配置) |
| 多机通信 | 需要配置网络,较麻烦 | 天然支持,DDS自动发现 |
| 安全性 | 无 | 支持加密和认证 |
| Python版本 | Python 2 | Python 3 |
| 生命周期管理 | 无 | 有(managed node) |
说白了,ROS2就是ROS1的“完全重写版”。如果你是从零开始学,我建议直接学ROS2,别走回头路。如果你有ROS1基础,那迁移起来其实很快——核心概念基本一致,只是API名字变了。
注意:ROS1和ROS2不能直接通信。如果你有遗留的ROS1代码,需要用ros1_bridge这个包来做桥接。我在一个项目中就不得不同时维护两套系统,那滋味……嗯,你懂的。
1.4 在Ubuntu 22.04上安装ROS2 Humble
好,理论讲完了,咱们来点实际的。我推荐使用Ubuntu 22.04 LTS + ROS2 Humble这个组合。Humble是2022年的LTS版本,支持到2027年,稳定可靠。
1.4.1 设置语言环境
先确保你的系统支持UTF-8。打开终端,输入:
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
export LANG=en_US.UTF-8
1.4.2 添加ROS2软件源
ROS2的包不在Ubuntu默认源里,需要手动添加:
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 $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
sudo apt update
个人经验:如果你在国内,下载ROS2包可能会很慢。我建议你换成国内镜像源,比如清华或中科大的。具体方法是在上面的命令中把packages.ros.org换成mirrors.tuna.tsinghua.edu.cn/ros2。速度能快10倍。
1.4.3 安装ROS2 Humble
有两种安装方式:桌面版(推荐)和基础版。桌面版包含图形工具、示例代码等,适合学习和开发。
# 桌面版安装(推荐)
sudo apt install ros-humble-desktop
# 或者基础版(仅核心库)
sudo apt install ros-humble-ros-base
安装过程大概需要5-10分钟,取决于你的网速。嗯,这时候可以去泡杯咖啡。
1.4.4 配置环境变量
安装完成后,每次使用ROS2都需要source一下环境变量。我建议你把它加到.bashrc里,一劳永逸:
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
注意:如果你同时装了ROS1和ROS2,千万别把两个setup.bash都source了,会冲突。我一般是在需要的时候手动source,或者用别名来切换。
1.5 验证安装
装完了,怎么知道好不好使?来,跑几个命令试试:
1.5.1 检查ROS2版本
ros2 --version
如果输出类似ros2 humble,说明安装成功。
1.5.2 运行一个简单的示例
打开两个终端。第一个终端运行:
ros2 run demo_nodes_cpp talker
第二个终端运行:
ros2 run demo_nodes_py listener
你会看到talker在发布“Hello World”消息,listener在接收。这说明你的ROS2环境已经能正常通信了。
1.5.3 使用命令行工具
ROS2提供了一套强大的命令行工具。试试这些:
# 查看所有节点
ros2 node list
# 查看所有话题
ros2 topic list
# 查看话题内容
ros2 topic echo /chatter
小技巧:我平时调试最喜欢用ros2 topic echo和ros2 node info,能快速定位问题。比如节点没启动、话题名字写错、数据类型不匹配,一查就知道。
好了,到这里你的ROS2环境就搭建好了。别急着关终端,多跑几个示例熟悉一下。下一节咱们会正式开始写代码,到时候这些基础概念都会用上。