ROS学习——(一)ROS总体架构
对于第一次接触ros的初学者来说,首先一个问题应该是ros究竟是什么,所谓的机器人操作系统究竟由什么,接下来将由整个系统的结构开始我们的学习。
(我的笔记更倾向于大致梗概的分点记录,对于详细连续的知识可能看技术手册会更好)
ROS架构
分层视图
可以将 ROS 的核心功能大致分为 三层 或 四层 来理解(并非官方严格定义,只是便于系统化理解):
-
基础层(操作系统 & 驱动)
- 处于 Linux 内核 / 操作系统 层以及硬件驱动层,例如:
- Ubuntu (或其他 Linux 发行版),其上提供了常见的 POSIX 接口;
- 硬件驱动、传感器驱动、外设接口等。
- 这层主要负责与真实硬件打交道,向上提供系统调用、网络协议栈(TCP/UDP)、文件系统等基础服务。
- 处于 Linux 内核 / 操作系统 层以及硬件驱动层,例如:
-
核心通信层(ROS Master & Client Libraries)
- ROS Master(roscore):
- 负责节点注册、话题命名、服务名解析等,充当“节点发现/目录服务”。
- 并 不直接转发 所有消息,而是让节点之间通过点对点连接进行数据流动。
- Client Libraries:
- 诸如
roscpp(C++ 版)、rospy(Python 版)、roslisp等,为节点与 Master 交互、话题/服务通信提供 API 封装; - 这一层为开发者隐藏了网络编程细节,并提供了统一的消息序列化/反序列化接口。
- 诸如
- ROS Master(roscore):
-
功能节点层(Nodes & Packages)
- 功能节点(Node):
- 每个节点对应一个 独立进程,完成单一功能(如激光雷达数据采集、SLAM、路径规划、控制器等);
- 彼此通过 Topic、Service、Action 进行数据交换或远程调用。
- Packages:
- ROS 里将相关节点、消息类型、配置文件、脚本等,按功能打包成独立的 software package;
- 包管理依赖关系(如
roscpp,std_msgs等)。
- 功能节点(Node):
-
工具/应用层(Tools & Utilities)
- catkin:用于构建、依赖管理;
- roslaunch:启动/管理多个节点;
- rviz、rqt 等可视化、调试、监控工具;
- rosbag:数据记录与回放;
- tf:坐标变换系统等。
- 这些工具帮助开发者在 上层 处理可视化、数据录制、可视化调试和项目管理等工作。
核心组件
如果说分层结构是一层一层楼,那么核心组件就是大楼中实行各个事务的人以及单位
-
ROS Master (
roscore)- ROS 系统的“中心登记处”(Service Registry),负责管理/记录各个节点的名字、话题(Topic)、服务(Service)等信息。
- 当节点想要建立连接(比如发布或订阅一个话题)时,需要先向 Master 注册并查询对方的地址。
- 一般通过命令
roscore来启动,会包含rosmaster、rosout、parameter server三部分。
-
ROS Node(节点)
- ROS 应用中的最小执行单位,每个独立的进程都是一个节点。
- 节点通常只负责单一功能(单一职责),多个节点相互协作完成复杂任务。
- 在 C++/Python 代码中,通过
ros::init初始化一个节点,再由ros::NodeHandle与 Master 进行注册通信。
-
Parameter Server(参数服务器)
- 由 Master 管理的一个共享字典,用于存储和检索参数。
- 可以使用命令
rosparam set/get或者 API(C++/Python)来读写这些参数。
-
Topic(话题)
- ROS 中最常用的数据通信机制:基于 发布-订阅(Publish-Subscribe) 模型的消息流。
- 一个节点可以发布某个话题(并指定消息类型),另一个节点可以订阅相同的话题,从而接收消息。
- 例如:激光雷达节点发布
/scan话题,SLAM 节点订阅/scan进行数据处理。
-
Service(服务)
- 类似远程过程调用(RPC)的通信机制:基于 请求-响应(Request-Reply)。
- Service Server 等待请求,一旦接收到请求,就处理并返回响应。
- 例如:平时可能有一个节点提供
add_two_ints服务,客户端给它发两个整数,它返回加和结果。
-
Action(动作)
- 处理 长时间异步任务 的一种机制:可以在执行过程中提供反馈和取消操作。
- 例如:移动机器人规划路径到某个目标点需要一定时间,就可以用 Action 来处理这类需要 持续跟踪 状态的任务。
ROS文件系统
1. 工作空间(catkin workspace)顶层
在图中,你可以看到一个名为 catkin workspace 的目录,通常我们会将它命名为 ~/catkin_ws(或者其他名字),里面主要包含以下三个子目录:
-
src/
- 存放源码的目录。
- 任何新建的 ROS 包(如
package1,package2)都放在这里。 - 只有放在
src/下的包才会被catkin_make或colcon build(在 ROS2 中)识别并编译。
-
build/
- 由
catkin_make或者其他编译命令自动生成,用于存放 中间编译文件(如目标文件、Makefile、CMakeCache 等)。 - 不需要手动编辑或创建,一旦你执行编译命令,这个文件夹就会自动出现。
- 如果出了问题,很多时候可以直接删掉它(
rm -rf build/)再重新编译。
- 由
-
devel/
- 同样由编译命令自动生成,用于存放生成后的开发环境(development space),包括可执行文件、库文件以及一些环境脚本(如
setup.bash等)。 - 通过
source devel/setup.bash来让当前终端识别到新编译的包和可执行文件。 - 一般不需要手动修改里面的内容,都是由编译和安装过程自动生成。
- 同样由编译命令自动生成,用于存放生成后的开发环境(development space),包括可执行文件、库文件以及一些环境脚本(如
备注:有时还会看到一个 install/ 文件夹(若使用 “install” 模式编译),它是用于将最终构建结果“安装”到该目录下,更便于分发或部署。
2. ROS 包(package)
在 src/ 下,我们会有若干 ROS 包(如图示的 package1、package2)。每个包通常包含以下关键文件/文件夹:
-
CMakeLists.txt
- 使用 catkin 构建时的 CMake 配置文件。
- 里面会调用诸如
find_package(catkin REQUIRED COMPONENTS ...)、catkin_package()、add_executable()等 CMake/ catkin 指令来指定如何编译源文件、链接库、安装文件等。 - 不可或缺:catkin 需要它来知道怎么编译本包。
-
package.xml
- 该包的 元信息文件,包含包名、版本号、维护者、依赖关系等。
- catkin 通过它得知包与其他包(例如
roscpp,std_msgs)之间的依赖关系,也用于 ROS 包索引和安装管理。 - 不可或缺:所有 ROS 包都必须有
package.xml才能被识别为合法包。
-
scripts/ 文件夹
- 放置 可执行脚本(通常是 Python 脚本
.py或者 Shell 脚本.sh)。 - 在 ROS 中,如果脚本需要直接
rosrun,要保证其具有可执行权限(chmod +x your_script.py),并在CMakeLists.txt里通过catkin_install_python()或其他方式进行安装。 - 常用于编写 Python 节点脚本、自动化脚本等。
- 放置 可执行脚本(通常是 Python 脚本
-
msg/ 文件夹
- 放置自定义的 消息类型(
.msg文件)。 - 如果你的包中定义了新的消息结构(例如一个含位置、速度等的自定义消息),就需要在这里写
.msg文件,并在CMakeLists.txt里配置add_message_files()、generate_messages()等。
- 放置自定义的 消息类型(
-
srv/ 文件夹
- 放置自定义的 服务类型(
.srv文件)。 - 如果你的包要定义 Service(请求-响应)的数据结构,就需要在这里写
.srv文件,并在CMakeLists.txt里做相应配置(类似msg的流程)。
- 放置自定义的 服务类型(
-
include/ 文件夹
- 用于存放 C/C++ 的头文件(
.h或者.hpp),并且一般命名与包同名的子目录,如include/package2/...这样的结构,以便在代码中更好地组织和引用。 - 如果有对外公开的库或接口头文件,一般都放在这里。
- 用于存放 C/C++ 的头文件(
-
src/ 文件夹
- 放置 源代码(比如 C++ 文件
.cpp)。 - 在
CMakeLists.txt中会有add_executable()、add_library()等命令去编译这个目录下的文件。 - 也可能会有一些子目录,根据工程规模划分。
- 放置 源代码(比如 C++ 文件
-
launch/ 文件夹
- 放置 Launch 文件(
.launch),通常是 XML 格式,用来一键启动多个节点或配置参数。 - 例如:
roslaunch package2 example.launch可以同时启多个节点,并设置参数或话题重映射。
- 放置 Launch 文件(
提示:除
CMakeLists.txt和package.xml外,其他文件夹(scripts/msg/srv/include/src/launch)可以按需要创建,不是所有包都用得到。具体目录结构会根据项目需求而定。
CMake 是一个跨平台的自动化构建系统工具,旨在简化编译和构建过程,特别是在复杂的软件项目中。CMake 通过定义一个项目的构建规则(通常保存在 CMakeLists.txt 文件中),来自动生成标准的构建文件(如 Makefile、Visual Studio 工程文件等)。
在 ROS 中,CMake 也是构建系统的核心工具,catkin 构建系统基于 CMake,并通过生成的 CMakeLists.txt 文件来管理包的构建和依赖关系。
CMake 的基本概念和作用:
-
跨平台支持:
CMake使得开发者能够在不同的平台上(Linux、Windows、macOS 等)使用相同的构建配置文件。通过 CMake,你可以生成与平台相关的构建文件。例如,在 Linux 上它可以生成Makefile,在 Windows 上则可以生成 Visual Studio 工程文件。 -
简化构建过程:
CMake通过自动生成构建文件,简化了手动编写Makefile或其他构建文件的工作。开发者只需要编写一个CMakeLists.txt文件,CMake 会自动处理不同平台和工具链的差异。 -
管理依赖关系:
CMake可以检测并管理项目的依赖关系。它能够自动查找外部库、头文件,并确保在构建过程中正确地链接和编译。 -
生成构建文件: 运行
CMake命令会根据项目中的CMakeLists.txt文件生成特定平台的构建文件。例如,运行cmake .会在当前目录生成Makefile,然后可以通过make命令来编译代码。
catkin 是 ROS (Robot Operating System) 中的一个构建系统,专门用于构建和管理 ROS 包。它是 ROS 2 和 ROS 1 中的标准构建系统。catkin 基于 CMake,因此需要了解 CMake 的基本概念来理解如何使用 catkin。
catkin 的作用:
-
构建和编译 ROS 包:
catkin管理 ROS 包的构建过程,确保依赖关系正确,并生成可执行文件、库、消息、服务等。它可以处理 C++ 和 Python 的源码,并生成相应的可执行文件或库。 -
管理 ROS 工作空间:
catkin将 ROS 包组织到一个工作空间中,典型的工作空间结构如下:~/catkin_ws/ ├── build/ ├── devel/ ├── src/ └── CMakeLists.txtsrc/:存放源代码和 ROS 包。build/:存放构建过程中的中间文件。devel/:存放已构建的包文件和工作空间环境。CMakeLists.txt:构建配置文件,指定如何构建工作空间内的包。
-
处理依赖:
catkin会自动处理包与包之间的依赖关系,确保在构建一个包时,其所依赖的其他包也会被正确构建。
catkin 与 CMake 的关系:
catkin 是基于 CMake 的构建系统,因此 CMakeLists.txt 文件是每个 ROS 包的关键配置文件。catkin 自动生成所需的 CMake 配置,简化了 ROS 包的构建过程。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)