ROS 1
引言
ROS 1是ROS的第一代版本,自2010年首个正式发行版Box Turtle发布以来,已成为学术研究和机器人原型开发的事实标准。ROS 1以其成熟的工具链、丰富的软件包和庞大的社区支持著称。尽管ROS 2已逐步成为主流,ROS 1仍然在众多现有项目中发挥着重要作用。
概述
ROS 1最初由Willow Garage公司开发,后由Open Source Robotics Foundation (OSRF) 维护。它主要面向学术研究和单机器人系统的开发,在Ubuntu Linux上有最好的支持。ROS 1的最后一个版本是Noetic Ninjemys(2020年发布),支持至2025年5月。
ROS 1的设计目标是降低机器人软件开发的门槛,通过提供标准化的通信机制、丰富的工具和大量可复用的软件包,使开发者能够快速构建功能丰富的机器人系统。
核心概念
ROS Master
ROS Master是ROS 1架构的核心组件,负责管理节点之间的命名和注册服务。所有节点在启动时都需要向Master注册,Master负责维护节点的查找表,使节点能够相互发现和建立通信。通过roscore命令启动Master。
ROS Master是ROS 1的一个关键特征,同时也是其局限性之一。如果Master崩溃,整个系统的通信将会中断。
节点 (Nodes)
节点是ROS 1中执行计算的基本进程。ROS 1鼓励开发者创建大量小型、功能单一的节点,而不是少量庞大的多功能进程。这种设计使系统具有更好的模块化特性,便于调试和复用。
话题与消息 (Topics & Messages)
话题 (Topics) 是ROS 1中最常用的通信方式,采用发布-订阅 (publish-subscribe) 模式。发布者 (Publisher) 向一个命名话题发送消息,订阅者 (Subscriber) 从该话题接收消息。通信是异步的,发布者和订阅者之间无需知道对方的存在。
消息 (Messages) 是话题传输的数据结构,使用.msg文件定义。常见的消息类型包括:
std_msgs:标准基础类型,如String、Int32、Float64geometry_msgs:几何相关消息,如Twist(速度)、Pose(位姿)sensor_msgs:传感器数据,如Image(图像)、LaserScan(激光扫描)、PointCloud2(点云)nav_msgs:导航相关消息,如Odometry(里程计)、Path(路径)
服务 (Services)
服务 (Services) 提供同步的请求-响应通信机制,使用.srv文件定义请求和响应的数据结构。与话题不同,服务是一对一的通信,适用于需要立即获得结果的场景。
参数服务器 (Parameter Server)
参数服务器 (Parameter Server) 是一个集中式的键值存储系统,允许节点在运行时存储和检索配置参数。参数服务器由ROS Master维护,支持整数、浮点数、字符串、布尔值、列表和字典等数据类型。
catkin构建系统
catkin是ROS 1的官方构建系统,基于CMake开发。它使用工作空间 (workspace) 来组织和编译ROS软件包。
典型的catkin工作空间结构如下:
catkin_ws/
├── src/ # 源代码目录
│ ├── CMakeLists.txt
│ ├── package_1/
│ │ ├── CMakeLists.txt
│ │ ├── package.xml
│ │ └── src/
│ └── package_2/
├── build/ # 编译中间文件
├── devel/ # 开发空间(编译产物)
└── logs/ # 日志文件
常用的catkin命令包括:
catkin_make:编译整个工作空间catkin build:逐包编译(由catkin_tools提供,更灵活)catkin_create_pkg:创建新的ROS软件包
常用工具
ROS 1提供了大量实用的命令行和图形化工具:
- roscore:启动ROS Master、参数服务器和rosout日志节点
- rosrun:运行单个ROS节点,如
rosrun turtlesim turtlesim_node - roslaunch:通过
.launch文件同时启动多个节点并设置参数 - rostopic:查看、发布和监控话题消息
- rosservice:调用和查看ROS服务
- rosparam:获取和设置参数服务器中的参数
- rosbag:记录和回放话题数据,用于数据采集和离线分析
- RViz:三维可视化工具,用于显示传感器数据和机器人模型
- rqt:基于Qt的模块化图形工具,包含rqt_graph(节点关系图)、rqt_plot(数据绘图)、rqt_console(日志查看)等插件
常用软件包
ROS 1拥有数千个社区贡献的软件包,以下是一些最常用的核心包:
| 软件包 | 功能描述 |
|---|---|
navigation |
移动机器人自主导航,包含路径规划、定位和避障 |
moveit |
机械臂运动规划、抓取和操作 |
gmapping |
基于激光雷达的SLAM建图 |
amcl |
自适应蒙特卡洛定位 (Adaptive Monte Carlo Localization) |
tf |
坐标变换管理 |
robot_state_publisher |
发布机器人关节状态到tf树 |
rviz |
三维可视化 |
gazebo_ros |
Gazebo仿真环境的ROS接口 |
image_transport |
图像传输和压缩 |
pcl_ros |
点云库 (Point Cloud Library) 的ROS封装 |
ROS 1版本
| 版本代号 | 发布日期 | Logo | 教程海龟的图标 | 终止维护日期 |
|---|---|---|---|---|
| ROS Noetic Ninjemys (Recommended) | May 23rd, 2020 | ![]() |
![]() |
May, 2025 (Focal EOL) |
| ROS Melodic Morenia | May 23rd, 2018 | ![]() |
![]() |
May, 2023 (Bionic EOL) |
| ROS Lunar Loggerhead | May 23rd, 2017 | ![]() |
![]() |
May, 2019 |
| ROS Kinetic Kame | May 23rd, 2016 | ![]() |
![]() |
April, 2021 (Xenial EOL) |
| ROS Jade Turtle | May 23rd, 2015 | ![]() |
![]() |
May, 2017 |
| ROS Indigo Igloo | July 22nd, 2014 | ![]() |
![]() |
April, 2019 (Trusty EOL) |
| ROS Hydro Medusa | September 4th, 2013 | ![]() |
![]() |
May, 2015 |
| ROS Groovy Galapagos | December 31, 2012 | ![]() |
![]() |
July, 2014 |
| ROS Fuerte Turtle | April 23, 2012 | ![]() |
![]() |
-- |
| ROS Electric Emys | August 30, 2011 | ![]() |
![]() |
-- |
| ROS Diamondback | March 2, 2011 | ![]() |
![]() |
-- |
| ROS C Turtle | August 2, 2010 | ![]() |
![]() |
-- |
| ROS Box Turtle | March 2, 2010 | ![]() |
![]() |
-- |
安装指南
ROS 1通常安装在Ubuntu Linux上,每个ROS 1版本对应特定的Ubuntu版本:
- Noetic:Ubuntu 20.04 (Focal Fossa)
- Melodic:Ubuntu 18.04 (Bionic Beaver)
- Kinetic:Ubuntu 16.04 (Xenial Xerus)
安装的基本步骤包括:配置软件源 (sources.list)、添加密钥 (keys)、通过apt安装ROS、初始化rosdep以及配置环境变量。详细安装教程请参考ROS Wiki安装页面。
ROS 1的局限性
尽管ROS 1在学术领域取得了巨大成功,但随着机器人技术向工业化和商业化发展,其设计上的一些局限性逐渐显现,这也是ROS 2被开发的直接原因:
- 单点故障 (Single Point of Failure):ROS Master是系统的单一故障点,一旦崩溃将导致整个系统通信中断
- 缺乏实时性支持 (No Real-time Support):ROS 1的通信层不支持实时性保障,无法满足工业控制等对时间敏感的应用需求
- 安全性不足 (Lack of Security):ROS 1没有内置的认证和加密机制,不适合部署在开放网络环境中
- 仅支持Linux:ROS 1主要支持Ubuntu Linux,在其他操作系统上的支持有限
- 不支持多机器人系统 (No Native Multi-robot Support):缺乏对多机器人协作场景的原生支持
- 嵌入式支持有限:对资源受限的嵌入式平台支持不够完善
这些局限性促使社区开发了ROS 2,以更好地满足工业级和商业级机器人应用的需求。
本章内容导览
ROS 1 的内容按「先理解概念,再组织工程,最后落到具体子系统」的顺序拆分为以下页面:
| 页面 | 主要内容 |
|---|---|
| ROS 1 | 架构概述、核心概念、发行版、安装与局限性 |
| 工作空间与软件包 | catkin 工作空间、CMakeLists.txt 与 package.xml、rosdep、Overlay |
| 通信机制 | 话题、服务、动作、参数服务器、自定义消息、Nodelet |
| 节点编程 | roscpp 与 rospy 节点模板、回调调度、多线程与生命周期 |
| 坐标变换、启动与数据录制 | TF2、roslaunch XML、rosbag 录制与回放 |
| URDF 机器人建模 | URDF 语法、xacro 宏、与 RViz/Gazebo/MoveIt 的衔接 |
| Navigation Stack | move_base、代价地图、全局与局部规划器、AMCL 定位 |
| 命令与排查速查 | 命令速查表、核心软件包生态、常见问题排查、发行版时间线 |
| ROS 2 | 下一代 ROS 的架构与迁移路径 |
参考资料
- ROS Wiki, ROS Distributions
- ROS/Introduction, ROS Wiki
- catkin/conceptual_overview, ROS Wiki
- ROS/Installation, ROS Wiki
- roscpp Overview, ROS Wiki
- rospy Overview, ROS Wiki
- actionlib, ROS Wiki
- tf2, ROS Wiki
- roslaunch/XML, ROS Wiki
- rosbag/Commandline, ROS Wiki
- rosbag/Code API, ROS Wiki
- URDF/XML/robot, ROS Wiki
- xacro, ROS Wiki
- navigation/Tutorials, ROS Wiki
- dwa_local_planner, ROS Wiki
- amcl, ROS Wiki
- Thrun S, Burgard W, Fox D. Probabilistic Robotics. MIT Press, 2005.
- Fox D, Burgard W, Dellaert F, Thrun S. Monte Carlo Localization: Efficient Position Estimation for Mobile Robots. AAAI, 1999.
- Marder-Eppstein E, Berger E, Foote T, et al. The Office Marathon: Robust Navigation in an Indoor Office Environment. ICRA, 2010.

























