2、ROS2核心概念与环境搭建:节点、话题、服务、动作;Ubuntu + ROS2 Humble安装与验证

各位同学,欢迎来到第二章。

上一章我们聊了自动驾驶的宏观图景,这一章咱们得落地了。说白了,ROS2就是自动驾驶系统的「骨架」和「神经」。你想想看,一辆车上几十个传感器、控制器,它们之间怎么说话?怎么协调?这就是ROS2要解决的问题。

我个人习惯,学任何框架先搞懂它的核心概念,再动手搭环境。这样出了问题,你知道往哪个方向排查。好,咱们开始。

2.1 ROS2的四个核心概念

ROS2里最基础、最常用的就是这四个东西:节点、话题、服务、动作。我当年刚接触ROS1时,花了整整一周才理清它们的关系。其实没那么复杂,咱们用生活中的例子来理解。

2.1.1 节点(Node)

节点就是一个个独立的「小工人」。每个节点负责一件事。比如一个节点专门读激光雷达数据,另一个节点专门做路径规划。它们各自运行,互不干扰。

为什么用节点? 因为自动驾驶系统太复杂了。如果所有代码写在一个程序里,改一个地方可能崩掉整个系统。拆成节点,哪个节点挂了,重启它就行,不影响其他部分。我在项目中遇到过,某个传感器驱动节点偶尔崩溃,但规划控制节点完全不受影响,这就是节点化的好处。

2.1.2 话题(Topic)

话题是节点之间「广播」数据的通道。一个节点往话题里发数据,其他节点订阅这个话题就能收到。就像电台广播,发射塔只管发,收音机只管收,双方不需要知道对方是谁。

举个例子:激光雷达节点往 /scan 话题发数据,定位节点订阅 /scan 拿到数据做匹配。整个过程是异步的、一对多的。

关键点: 话题是ROS2里最常用的通信方式。适合持续发布的数据,比如传感器数据、控制指令。

2.1.3 服务(Service)

服务是「一问一答」的模式。客户端发一个请求,服务端处理完返回一个响应。适合偶尔调用、需要立即得到结果的场景。

比如:你调用一个服务去「获取当前地图」,发个请求过去,服务端把地图数据返回给你。它不像话题那样持续发,而是你问它才答。

嗯,这里要注意:服务是同步的。客户端发请求后会阻塞等待响应。如果服务端处理慢了,客户端就得等着。所以不适合高频、实时的场景。

2.1.4 动作(Action)

动作是服务的「升级版」。它适合执行时间较长的任务,比如「导航到某个点」。动作有三个特点:

  • 可以发送目标(Goal)
  • 可以反馈进度(Feedback)
  • 可以取消任务(Cancel)

我曾经调试自动驾驶车辆时,发现用服务做路径规划特别别扭——规划要好几秒,客户端一直阻塞着,车辆都停在那不动了。后来换成动作,客户端可以一边等规划结果,一边接收进度反馈,用户体验好多了。

2.2 核心概念关系图

为了让你更直观地理解这四个概念的关系,我画了一张图:

传感器节点 规划节点 控制节点 定位节点 话题 /scan 服务 /get_map 动作 /navigate 节点 话题 服务 动作

从这张图你能看到:传感器节点通过话题发布数据,规划节点订阅话题拿到数据后,通过服务请求地图,再通过动作下发导航指令给控制节点。各司其职,井井有条。

2.3 Ubuntu + ROS2 Humble 安装

概念讲完了,咱们得动手了。ROS2 Humble 是 ROS2 的一个长期支持版本,搭配 Ubuntu 22.04 最稳。我建议你直接用 Ubuntu 22.04,别折腾其他版本,否则各种依赖问题够你喝一壶的。

警告: 如果你用的是 Windows 或 macOS,请安装虚拟机(VMware 或 VirtualBox),然后装 Ubuntu 22.04。双系统也行,但别用 WSL2 跑 ROS2 的图形界面,坑太多。

2.3.1 设置语言环境

先确保你的系统语言是英文,否则 ROS2 编译时可能报编码错误。

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

2.3.2 添加 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 $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
sudo apt update

2.3.3 安装 ROS2 Humble

这里我建议你装桌面版,包含 RViz2 等可视化工具,调试起来方便。

sudo apt install ros-humble-desktop

这个命令会下载大约 1.5GB 的包,网速慢的话可能需要半小时。你可以趁这个时间泡杯茶,或者复习一下前面的概念。

小技巧: 如果你在公司或学校网络受限,可以试试换国内镜像源,比如清华源或中科大源,速度会快很多。

2.3.4 设置环境变量

安装完成后,每次打开终端都要 source 一下 ROS2 的环境,否则找不到命令。

echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc

我个人习惯把这句话加到 .bashrc 里,省得每次手动敲。你想想看,一天开几十次终端,每次都敲一遍,多烦人。

2.4 验证安装

装完了,怎么知道好不好使?咱们跑几个命令验证一下。

2.4.1 检查 ROS2 版本

ros2 --version

如果输出类似 ros2 humble,说明安装成功。

2.4.2 运行小海龟例程

ROS2 自带一个小海龟例程,用来验证核心功能。这是经典中的经典,我当年学 ROS1 时第一个跑的就是它。

打开第一个终端,启动海龟仿真器:

ros2 run turtlesim turtlesim_node

你会看到一个蓝色窗口,中间有一只小海龟。

打开第二个终端,启动键盘控制节点:

ros2 run turtlesim turtle_teleop_key

现在,用键盘的上下左右键控制小海龟移动。能动了,说明节点、话题通信都正常。

2.4.3 查看话题列表

再开第三个终端,看看背后发生了什么:

ros2 topic list

你会看到类似这样的输出:

/turtle1/cmd_vel
/turtle1/pose
/parameter_events
/rosout

其中 /turtle1/cmd_vel 就是键盘节点发布的速度指令话题,海龟节点订阅它来移动。你看,这不就是咱们刚讲的话题通信吗?

验证总结: 小海龟能跑起来,说明你的 ROS2 环境搭建成功了。节点能通信,话题能发布和订阅,核心机制没问题。

2.5 避坑指南

安装过程中,我遇到过不少问题。这里列几个常见的,你遇到了别慌。

  • Python 版本冲突: ROS2 Humble 依赖 Python 3.10,如果你系统默认 Python 是 3.8 或 3.12,可能会报错。用 python3 --version 检查一下。
  • 缺少依赖包: 有时候 ros-humble-desktop 安装失败,是因为某些依赖没装全。试试 sudo apt --fix-broken install 修复。
  • source 后还是找不到命令: 检查 .bashrc 里 source 的路径对不对。我曾经手滑写成了 /opt/ros/humble/setup.bash 少了个斜杠,折腾了半小时。

嗯,这一章的内容就到这。核心概念你理解了,环境也搭好了,下一章咱们就可以开始写第一个 ROS2 节点了。


可可精品资料库