第1章:ROS基础与环境搭建

各位同学,欢迎来到《ROS多机器人协同系统开发实战》。我是你们这门课的主讲,一个在机器人行业摸爬滚打多年的老工程师。

今天咱们聊点最基础的——ROS的核心概念,以及怎么把环境搭起来。别小看这一步,我见过太多人卡在环境配置上,一卡就是好几天。嗯,咱们先把地基打牢。

1.1 ROS核心概念:节点、话题、服务、动作

ROS说白了,就是一个通信框架。它让机器人里的各个模块能互相说话。你想想看,一个机器人有摄像头、激光雷达、电机、机械臂……如果每个模块都自己搞一套通信协议,那不乱套了?

ROS把这个问题抽象成了几个核心概念。我个人习惯把它们比作一个团队协作的场景,这样好理解。

节点(Node)

节点就是一个个独立的小程序。每个节点只干一件事,比如「摄像头节点」只管拍照,「电机控制节点」只管发指令。我刚开始做项目时,喜欢把所有功能写在一个大程序里,结果改一个地方就得重新编译整个项目,那叫一个痛苦。后来用了ROS节点,每个模块独立开发、独立调试,爽多了。

小提示: 节点之间是松耦合的。一个节点挂了,其他节点还能继续跑。这在机器人现场调试时特别重要——你不会因为一个传感器故障就让整个机器人瘫痪。

话题(Topic)

话题是节点之间通信的「总线」。一个节点往话题上发数据(发布者),另一个节点从话题上读数据(订阅者)。比如摄像头节点往 /camera/image 这个话题上发图像数据,图像处理节点订阅这个话题,拿到图像去做识别。

这里有个关键点:话题是异步的、一对多的。发布者只管发,不管有没有人收。订阅者只管收,不管谁发的。我在项目中遇到过一个问题:两个节点同时往同一个话题发数据,结果订阅者收到的数据乱序了。后来加了时间戳才解决。嗯,这个坑你们以后也会遇到。

服务(Service)

服务是同步的、一对一的通信方式。客户端发一个请求,服务端处理完返回一个响应。比如你让机械臂「移动到位置A」,它得告诉你「移动完成」或者「移动失败」。这种一问一答的场景,用服务最合适。

我个人的经验是:能用话题就别用服务。为什么?因为服务是阻塞的,如果服务端处理慢了,客户端会一直等着。在实时性要求高的场景里,这很危险。

动作(Action)

动作是服务的升级版。它解决了服务的痛点:长时间任务怎么办?比如让机器人从A点导航到B点,这个过程可能要几分钟。用服务的话,客户端得傻等。用动作就不一样了——你可以一边执行任务,一边反馈进度,还能随时取消。

动作有三个核心部分:目标(Goal)、反馈(Feedback)、结果(Result)。我在做AGV调度系统时,所有导航任务都用动作来实现。这样调度中心可以实时看到每台车的进度,还能中途改派任务。

通信方式 特点 适用场景
话题(Topic) 异步、一对多、持续流 传感器数据、状态广播
服务(Service) 同步、一对一、请求-响应 开关控制、参数查询
动作(Action) 异步、可反馈、可取消 导航、机械臂运动

1.2 ROS2与ROS1的区别

很多同学问我:「老师,现在学ROS1还有用吗?」我的回答是:ROS1已经停止更新了,新项目直接用ROS2。但如果你维护的是老项目,ROS1还得会。

ROS2和ROS1最大的区别,说白了就是底层通信换了。ROS1用的是自研的TCPROS/UDPROS,ROS2用的是DDS(数据分发服务)。DDS是工业级的标准,实时性、可靠性都比ROS1强不少。

我列几个关键区别,你们记一下:

  • 去中心化: ROS1有一个Master节点,Master挂了整个系统就瘫了。ROS2没有Master,每个节点自己发现别人。这在多机器人系统里特别重要——你想想,如果Master在机器人A上,机器人B连不上A,整个系统就废了。
  • 跨平台: ROS1主要支持Linux,ROS2支持Windows、macOS、RTOS。我去年在一个ARM芯片上跑ROS2,编译一次通过,这在ROS1时代想都不敢想。
  • 实时性: ROS2支持实时内核,可以保证任务在指定时间内完成。做工业机器人控制,这个功能是刚需。
  • 安全性: ROS2内置了加密和权限控制。ROS1是裸奔的,谁都能订阅你的话题。我在一个工厂项目里,ROS1的网络被隔壁产线的机器人干扰过,数据全乱了。
  • API变化: ROS2的C++ API用了C++11标准,Python API也变了。比如创建节点的方式,ROS1是 ros::init(),ROS2是 rclcpp::init()
核心结论: 如果你从零开始学,直接学ROS2。ROS1的知识可以作为历史背景了解,但不要花太多时间。

1.3 在Ubuntu 22.04上安装ROS2 Humble

好,理论说完了,咱们动手。我选的是Ubuntu 22.04 + ROS2 Humble,这是目前最稳定的组合之一。

安装之前,先确认你的系统版本。打开终端,跑一下:

lsb_release -a

如果显示的是 Ubuntu 22.04 LTS,那就对了。如果是其他版本,建议重装系统。别问我为什么,我在20.04上装Humble踩过坑,依赖冲突搞了两天。

第一步:设置语言环境

ROS2需要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

第二步:添加ROS2源

先装一些工具:

sudo apt install software-properties-common
sudo add-apt-repository universe

然后添加ROS2的GPG密钥和源:

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

第三步:安装ROS2 Humble

我个人建议装桌面版,包含了常用的工具和可视化库:

sudo apt update
sudo apt upgrade
sudo apt install ros-humble-desktop

如果你空间有限,可以装基础版:

sudo apt install ros-humble-ros-base
注意: 安装过程可能会比较久,取决于你的网速。我曾经在客户现场装,网络慢得像蜗牛,等了快一个小时。建议提前准备好网络环境。

第四步:配置环境变量

每次打开终端都要source一下,不然ROS2命令找不到。我建议直接写进 .bashrc

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

第五步:验证安装

跑一个简单的测试,看看ROS2能不能正常工作:

ros2 run demo_nodes_cpp talker

再开一个终端,跑:

ros2 run demo_nodes_py listener

如果你看到talker在发「Hello World」,listener在收,那就说明安装成功了。

避坑指南: 我曾经遇到过一个问题——source了setup.bash,但ros2命令还是找不到。后来发现是终端没有重启。记住,source完要开新终端,或者手动执行 source ~/.bashrc

第六步:安装colcon编译工具

ROS2用colcon来编译代码,类似于ROS1的catkin。装一下:

sudo apt install python3-colcon-common-extensions

装完之后,你可以创建一个工作空间试试:

mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build

如果编译成功,你会看到 buildinstalllog 三个文件夹。嗯,到这里环境就搭好了。

好,第一章的内容就到这里。环境搭好了,咱们下一章就可以开始写第一个ROS2节点了。到时候我会手把手带你们写一个发布者-订阅者的例子,让你们真正感受一下ROS2的通信机制。