第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()。
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 ~/.bashrc。
第六步:安装colcon编译工具
ROS2用colcon来编译代码,类似于ROS1的catkin。装一下:
sudo apt install python3-colcon-common-extensions
装完之后,你可以创建一个工作空间试试:
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build
如果编译成功,你会看到 build、install、log 三个文件夹。嗯,到这里环境就搭好了。
好,第一章的内容就到这里。环境搭好了,咱们下一章就可以开始写第一个ROS2节点了。到时候我会手把手带你们写一个发布者-订阅者的例子,让你们真正感受一下ROS2的通信机制。