ROS2机器人从仿真到实机部署 - 第1节

1. ROS2概述与环境搭建

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”,这个动作可能需要几秒钟,期间你可以查询进度,也可以中途取消。

动作本质上是由三个话题和一个服务组成的:一个话题用于发送目标,一个话题用于发布反馈,一个话题用于发布结果,还有一个服务用于取消动作。嗯,听起来复杂,但用起来很顺手。

ROS2 核心通信机制 节点 (Node) 节点 (Node) 话题 (Topic) 话题 (Topic) 服务 (Service) 服务 (Service) 动作 (Action) 发布/订阅 异步通信 同步通信 节点 话题 服务 动作

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环境就搭建好了。别急着关终端,多跑几个示例熟悉一下。下一节咱们会正式开始写代码,到时候这些基础概念都会用上。