1. ROS与环境配置:ROS发展史、核心概念、Ubuntu与ROS Noetic安装、工作空间创建
大家好,我是你们的讲师。今天咱们正式开篇,聊聊ROS与环境配置。说实话,我见过太多初学者一上来就急着写代码,结果环境没配好,卡在编译错误上浪费好几天。所以,咱们先把地基打牢。
1.1 ROS发展史:从实验室到工业界的进化
ROS,全称Robot Operating System,说白了就是一个机器人软件开发框架。它诞生于2007年,斯坦福大学的人工智能实验室。当时做机器人研究,大家各自为战,代码复用率极低。我早期做项目时也深有体会——换个传感器,底层驱动就得重写,太痛苦了。
ROS的出现,就是为了解决这个问题。它提供了一套标准化的通信机制,让不同模块能像搭积木一样组合起来。
- 2007年:ROS原型诞生,由Morgan Quigley等人开发。
- 2010年:Willow Garage公司接手,推出ROS Box Turtle(首个正式发行版)。
- 2012年:ROS Fuerte发布,开始支持更广泛的硬件。
- 2016年:ROS Kinetic Kame发布,成为当时最稳定的版本之一。
- 2020年:ROS Noetic Ninjemys发布,这是最后一个基于Python 2的版本,也是我们今天课程的主角。
- 2022年至今:ROS 2 Humble、Iron等版本陆续推出,全面拥抱工业级应用。
嗯,这里要注意:ROS 1和ROS 2不兼容。我们选Noetic,是因为它生态成熟、资料多,适合入门。我在项目中用Noetic做过好几套自主导航系统,稳定性没得说。
1.2 核心概念:节点、话题、服务
这三个概念,是ROS的基石。你想想看,一个机器人系统有多复杂?传感器、电机、规划器、控制器……如果所有代码都写在一个程序里,那维护起来简直是噩梦。
ROS的做法是:把每个功能模块拆成一个独立的进程,叫“节点”。节点之间通过“话题”或“服务”来通信。
1.2.1 节点(Node)
节点就是可执行文件。比如一个激光雷达驱动是一个节点,一个路径规划器是另一个节点。它们各自运行,互不干扰。
我个人习惯,每个传感器或算法都单独写成一个节点。这样调试时,我可以单独重启某个节点,而不影响整个系统。有一次在项目现场,激光雷达节点突然挂了,我只需要重启它,其他节点照常工作——这就是模块化的好处。
1.2.2 话题(Topic)
话题是节点之间传递数据的“总线”。一个节点可以发布消息到某个话题,另一个节点可以订阅这个话题来接收消息。这是一种异步通信方式,适合传感器数据这种持续更新的信息。
举个例子:激光雷达节点发布话题 /scan,里面包含距离数据。路径规划节点订阅 /scan,拿到数据后做避障。整个过程是“发布-订阅”模式,发布者不知道谁在订阅,订阅者也不知道谁在发布——解耦得干干净净。
重要概念:话题通信是单向的、无连接的。发布者只管发,订阅者只管收,双方不需要握手。
1.2.3 服务(Service)
服务是同步通信,适合“请求-响应”的场景。比如你让机器人抓取一个物体,你需要发送请求,然后等待机器人返回“抓取成功”或“抓取失败”。
我曾经在做一个机械臂项目时,需要调用一个服务来获取当前关节角度。如果用话题,你得一直监听,效率低。用服务,发一次请求,立刻得到响应,干净利落。
| 特性 | 话题(Topic) | 服务(Service) |
|---|---|---|
| 通信方式 | 异步 | 同步 |
| 数据流 | 持续流 | 一次性请求-响应 |
| 典型用途 | 传感器数据、状态信息 | 触发动作、查询参数 |
| 是否阻塞 | 否 | 是(等待响应) |
1.3 Ubuntu与ROS Noetic安装
ROS Noetic官方支持Ubuntu 20.04(Focal Fossa)。我个人建议,别用虚拟机,直接双系统或者用一台干净的Ubuntu机器。虚拟机在实时性上会出问题,尤其是跑激光雷达和运动控制时。
1.3.1 安装Ubuntu 20.04
如果你还没有Ubuntu,去官网下载20.04的ISO镜像。安装时注意几点:
- 分区时,给根目录(/)至少留20GB,但建议50GB以上,因为后面要装很多包。
- 交换分区(swap)设成内存大小的一半或相等,比如8GB内存就设4GB swap。
- 语言选英文,避免路径出现中文乱码问题。
避坑指南:我曾经在安装时选了中文,结果终端里路径显示乱码,编译ROS包时各种报错。后来重装了英文版,一切顺畅。所以,老老实实用英文吧。
1.3.2 安装ROS Noetic
安装过程其实很简单,跟着官方步骤走就行。我帮你整理成最精简的版本:
# 1. 设置sources.list
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
# 2. 设置密钥
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
# 3. 更新软件包索引
sudo apt update
# 4. 安装完整桌面版(包含RViz、rqt等工具)
sudo apt install ros-noetic-desktop-full
# 5. 初始化rosdep
sudo rosdep init
rosdep update
# 6. 设置环境变量
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
# 7. 安装构建工具
sudo apt install python3-rosinstall python3-rosinstall-generator python3-wstool build-essential
安装完成后,可以运行 roscore 测试一下。如果看到类似下面的输出,说明安装成功:
started core service [/rosout]
小技巧:每次打开新终端都要source一下,很麻烦。我习惯把 source /opt/ros/noetic/setup.bash 直接写到 ~/.bashrc 里,一劳永逸。
1.4 工作空间创建
工作空间(Workspace)是存放ROS项目的文件夹。ROS使用catkin编译系统,所以也叫catkin工作空间。
1.4.1 创建catkin工作空间
# 创建文件夹
mkdir -p ~/catkin_ws/src
# 进入src目录
cd ~/catkin_ws/src
# 初始化工作空间
catkin_init_workspace
# 回到根目录
cd ~/catkin_ws
# 编译
catkin_make
编译成功后,你会看到 build 和 devel 两个文件夹。 devel 里存放了编译好的可执行文件和库。
1.4.2 设置工作空间环境变量
每次使用这个工作空间,都需要source一下:
source ~/catkin_ws/devel/setup.bash
同样,我建议把它加到 ~/.bashrc 里:
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
注意:如果你有多个工作空间,后source的会覆盖前面的。所以一般只source一个工作空间,或者用 source 命令手动切换。
1.4.3 验证工作空间
运行 echo $ROS_PACKAGE_PATH,如果看到类似下面的输出,说明工作空间配置成功:
/home/你的用户名/catkin_ws/src:/opt/ros/noetic/share
好了,环境配置到这里就结束了。下一章,咱们会正式写第一个ROS节点,实现一个简单的“Hello World”通信。到时候你会发现,ROS其实没那么神秘。
记住:环境配好了,后面就顺了。别急,慢慢来。