一、ROS2概述与环境搭建
大家好,欢迎来到《基于ROS2的机器人平台搭建实战》课程。
我是你们这门课的老师。做了十几年机器人开发,从ROS1一路摸爬滚打过来。说实话,ROS2刚出来那会儿,我还有点抵触——毕竟ROS1用顺手了嘛。但后来真香了。为什么?今天咱们就聊聊这个话题。
1.1 ROS2的发展历史
ROS(Robot Operating System)最早是2007年斯坦福大学和Willow Garage公司搞出来的。初衷很简单:让机器人开发者别重复造轮子。
ROS1确实很成功。但用久了你会发现,它有一些硬伤:
- 实时性差——机器人要紧急刹车,ROS1还在那慢悠悠地发消息
- 网络依赖重——必须有个中心节点(roscore),它挂了整个系统就瘫了
- 多机器人支持弱——你想让两台机器人协作?嗯,有点麻烦
所以2015年左右,Open Robotics开始搞ROS2。2017年发布了第一个测试版。到了2022年5月,ROS2 Humble正式发布,这也是咱们今天要装的版本。
核心变化:ROS2从ROS1的"中心化架构"变成了"去中心化架构"。说白了,就是每个节点都是独立的,谁也不用依赖谁。
1.2 核心概念:节点、话题、服务、动作
这几个概念是ROS2的基石。我一个个讲,你一个个记。
节点(Node)
节点就是ROS2里的一个进程。比如你有个摄像头驱动,它是一个节点;你有个导航算法,它也是一个节点。节点之间互相通信,协同工作。
我个人习惯,每个功能模块都单独写成一个节点。这样出了问题,只修那个节点就行,不用动整个系统。
话题(Topic)
话题是节点之间传递数据的"通道"。一个节点发布数据到话题上,另一个节点订阅这个话题,就能收到数据。
举个例子:摄像头节点发布图像数据到/camera/image话题上,显示节点订阅这个话题,就能看到画面。
小提示:话题是异步通信。发布者只管发,不管有没有人收。订阅者只管收,不管谁发的。这种设计让系统非常灵活。
服务(Service)
服务是同步通信。客户端发一个请求,服务端处理完返回一个响应。适合那种"你问我答"的场景。
比如:你让机器人抓取一个物体,它抓完了告诉你"抓到了"或者"没抓到"。
动作(Action)
动作是服务的升级版。它支持长时间的任务,还能中途取消或查看进度。
我在项目中遇到过一个场景:让机器人从A点走到B点。用服务的话,你得一直等它走完。用动作的话,你可以边走边看进度,还能随时叫停。
| 通信方式 | 特点 | 适用场景 |
|---|---|---|
| 话题 | 异步、一对多 | 传感器数据、状态信息 |
| 服务 | 同步、请求-响应 | 查询状态、执行简单命令 |
| 动作 | 异步、可取消、可反馈 | 导航、机械臂控制 |
1.3 ROS2与ROS1的区别
你可能会问:既然ROS1用得好好的,为什么要换ROS2?
我列几个关键区别你就明白了:
- 通信协议:ROS1用TCPROS/UDPROS,ROS2用DDS(数据分发服务)。DDS是工业级标准,实时性、可靠性都强得多。
- 去中心化:ROS1需要roscore,ROS2不需要。每个节点直接通过DDS通信。
- 跨平台:ROS1主要支持Linux,ROS2支持Windows、macOS、嵌入式系统。
- 安全性:ROS2内置了加密和权限控制,ROS1基本没有。
- 实时性:ROS2支持实时内核,适合工业机器人、自动驾驶等场景。
注意:ROS1和ROS2不兼容。你不能把ROS1的包直接放到ROS2里用。不过有些工具可以帮你迁移代码。
1.4 在Ubuntu 22.04上安装ROS2 Humble
好,理论讲完了,咱们动手。我假设你用的是Ubuntu 22.04 LTS。如果你用的是其他版本,安装步骤会略有不同。
第一步:设置语言环境
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
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
这里要注意:安装包大小大概2-3GB,取决于你的网络速度。我建议用有线网络,WiFi有时候会断。
节省空间小技巧:如果你不需要可视化工具(比如RViz、Gazebo),可以只安装ros-humble-ros-base,这个包小很多。
第四步:安装开发工具
sudo apt install python3-colcon-common-extensions
sudo apt install python3-rosdep
sudo rosdep init
rosdep update
1.5 配置环境变量
安装完了,但还不能直接用。你需要告诉系统:ROS2在哪。
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
我曾经遇到过一个问题:每次打开新终端都要手动source一遍,特别烦。后来发现是.bashrc文件没配置好。所以这一步千万别省。
避坑指南:如果你同时装了ROS1和ROS2,注意source的顺序。先source ROS1再source ROS2,或者反过来,都会导致冲突。我建议在.bashrc里只source一个版本,另一个用的时候手动source。
1.6 验证安装
装完了,怎么知道好不好使?跑个例子看看。
测试话题通信
打开第一个终端,启动一个发布者节点:
ros2 run demo_nodes_cpp talker
打开第二个终端,启动一个订阅者节点:
ros2 run demo_nodes_py listener
如果看到发布者不断发送"Hello World",订阅者不断收到消息,那就说明安装成功了。
测试服务通信
# 终端1:启动服务端
ros2 run demo_nodes_cpp add_two_ints_server
# 终端2:启动客户端
ros2 run demo_nodes_py add_two_ints_client
客户端会发送两个整数,服务端返回它们的和。你试试看。
验证结果:如果以上两个测试都通过了,恭喜你,ROS2 Humble已经成功安装并配置好了。你可以开始真正的机器人开发了。
本章小结
这一章我们讲了ROS2的发展历程、核心概念、与ROS1的区别,还亲手安装了ROS2 Humble并验证了安装。
说实话,安装这一步看着简单,但很多人会卡在这里。如果你遇到问题,别急。检查一下:
- Ubuntu版本是不是22.04?
- 网络是不是稳定?
- 有没有按照步骤一步步来?
下一章,咱们会深入ROS2的节点和话题编程。到时候你会真正体会到ROS2的威力。
好,今天就到这里。有问题随时问我。
公众号:蓝海资料掘金营,微信deep3321