ROS学习——(一)ROS总体架构

对于第一次接触ros的初学者来说,首先一个问题应该是ros究竟是什么,所谓的机器人操作系统究竟由什么,接下来将由整个系统的结构开始我们的学习。
(我的笔记更倾向于大致梗概的分点记录,对于详细连续的知识可能看技术手册会更好)

ROS架构

    • 分层视图
    • 核心组件
    • ROS文件系统
      • 1. 工作空间(catkin workspace)顶层
      • 2. ROS 包(package)
    • `CMake` 的基本概念和作用:
    • `catkin` 的作用:
      • `catkin` 与 CMake 的关系:

分层视图

可以将 ROS 的核心功能大致分为 三层四层 来理解(并非官方严格定义,只是便于系统化理解):

  1. 基础层(操作系统 & 驱动)

    • 处于 Linux 内核 / 操作系统 层以及硬件驱动层,例如:
      • Ubuntu (或其他 Linux 发行版),其上提供了常见的 POSIX 接口;
      • 硬件驱动、传感器驱动、外设接口等。
    • 这层主要负责与真实硬件打交道,向上提供系统调用、网络协议栈(TCP/UDP)、文件系统等基础服务。
  2. 核心通信层(ROS Master & Client Libraries)

    • ROS Master(roscore)
      • 负责节点注册、话题命名、服务名解析等,充当“节点发现/目录服务”。
      • 不直接转发 所有消息,而是让节点之间通过点对点连接进行数据流动。
    • Client Libraries
      • 诸如 roscpp(C++ 版)、rospy(Python 版)、roslisp 等,为节点与 Master 交互、话题/服务通信提供 API 封装;
      • 这一层为开发者隐藏了网络编程细节,并提供了统一的消息序列化/反序列化接口。
  3. 功能节点层(Nodes & Packages)

    • 功能节点(Node)
      • 每个节点对应一个 独立进程,完成单一功能(如激光雷达数据采集、SLAM、路径规划、控制器等);
      • 彼此通过 Topic、Service、Action 进行数据交换或远程调用。
    • Packages
      • ROS 里将相关节点、消息类型、配置文件、脚本等,按功能打包成独立的 software package;
      • 包管理依赖关系(如 roscpp, std_msgs 等)。
  4. 工具/应用层(Tools & Utilities)

    • catkin:用于构建、依赖管理;
    • roslaunch:启动/管理多个节点;
    • rvizrqt 等可视化、调试、监控工具;
    • rosbag:数据记录与回放;
    • tf:坐标变换系统等。
    • 这些工具帮助开发者在 上层 处理可视化、数据录制、可视化调试和项目管理等工作。

核心组件

如果说分层结构是一层一层楼,那么核心组件就是大楼中实行各个事务的人以及单位

  1. ROS Master (roscore)

    • ROS 系统的“中心登记处”(Service Registry),负责管理/记录各个节点的名字、话题(Topic)、服务(Service)等信息。
    • 当节点想要建立连接(比如发布或订阅一个话题)时,需要先向 Master 注册并查询对方的地址。
    • 一般通过命令 roscore 来启动,会包含 rosmasterrosoutparameter server 三部分。
  2. ROS Node(节点)

    • ROS 应用中的最小执行单位,每个独立的进程都是一个节点。
    • 节点通常只负责单一功能(单一职责),多个节点相互协作完成复杂任务。
    • 在 C++/Python 代码中,通过 ros::init 初始化一个节点,再由 ros::NodeHandle 与 Master 进行注册通信。
  3. Parameter Server(参数服务器)

    • 由 Master 管理的一个共享字典,用于存储和检索参数。
    • 可以使用命令 rosparam set/get 或者 API(C++/Python)来读写这些参数。
  4. Topic(话题)

    • ROS 中最常用的数据通信机制:基于 发布-订阅(Publish-Subscribe) 模型的消息流。
    • 一个节点可以发布某个话题(并指定消息类型),另一个节点可以订阅相同的话题,从而接收消息。
    • 例如:激光雷达节点发布 /scan 话题,SLAM 节点订阅 /scan 进行数据处理。
  5. Service(服务)

    • 类似远程过程调用(RPC)的通信机制:基于 请求-响应(Request-Reply)。
    • Service Server 等待请求,一旦接收到请求,就处理并返回响应。
    • 例如:平时可能有一个节点提供 add_two_ints 服务,客户端给它发两个整数,它返回加和结果。
  6. Action(动作)

    • 处理 长时间异步任务 的一种机制:可以在执行过程中提供反馈和取消操作。
    • 例如:移动机器人规划路径到某个目标点需要一定时间,就可以用 Action 来处理这类需要 持续跟踪 状态的任务。

ROS文件系统

1. 工作空间(catkin workspace)顶层

在图中,你可以看到一个名为 catkin workspace 的目录,通常我们会将它命名为 ~/catkin_ws(或者其他名字),里面主要包含以下三个子目录:

  1. src/

    • 存放源码的目录。
    • 任何新建的 ROS 包(如 package1, package2)都放在这里。
    • 只有放在 src/ 下的包才会被 catkin_makecolcon build(在 ROS2 中)识别并编译。
  2. build/

    • catkin_make 或者其他编译命令自动生成,用于存放 中间编译文件(如目标文件、Makefile、CMakeCache 等)。
    • 不需要手动编辑或创建,一旦你执行编译命令,这个文件夹就会自动出现。
    • 如果出了问题,很多时候可以直接删掉它(rm -rf build/)再重新编译。
  3. devel/

    • 同样由编译命令自动生成,用于存放生成后的开发环境(development space),包括可执行文件、库文件以及一些环境脚本(如 setup.bash 等)。
    • 通过 source devel/setup.bash 来让当前终端识别到新编译的包和可执行文件。
    • 一般不需要手动修改里面的内容,都是由编译和安装过程自动生成。

备注:有时还会看到一个 install/ 文件夹(若使用 “install” 模式编译),它是用于将最终构建结果“安装”到该目录下,更便于分发或部署。


2. ROS 包(package)

src/ 下,我们会有若干 ROS 包(如图示的 package1package2)。每个包通常包含以下关键文件/文件夹:

  1. CMakeLists.txt

    • 使用 catkin 构建时的 CMake 配置文件。
    • 里面会调用诸如 find_package(catkin REQUIRED COMPONENTS ...)catkin_package()add_executable() 等 CMake/ catkin 指令来指定如何编译源文件、链接库、安装文件等。
    • 不可或缺:catkin 需要它来知道怎么编译本包。
  2. package.xml

    • 该包的 元信息文件,包含包名、版本号、维护者、依赖关系等。
    • catkin 通过它得知包与其他包(例如 roscpp, std_msgs)之间的依赖关系,也用于 ROS 包索引和安装管理。
    • 不可或缺:所有 ROS 包都必须有 package.xml 才能被识别为合法包。
  3. scripts/ 文件夹

    • 放置 可执行脚本(通常是 Python 脚本 .py 或者 Shell 脚本 .sh)。
    • 在 ROS 中,如果脚本需要直接 rosrun,要保证其具有可执行权限(chmod +x your_script.py),并在 CMakeLists.txt 里通过 catkin_install_python() 或其他方式进行安装。
    • 常用于编写 Python 节点脚本、自动化脚本等。
  4. msg/ 文件夹

    • 放置自定义的 消息类型.msg 文件)。
    • 如果你的包中定义了新的消息结构(例如一个含位置、速度等的自定义消息),就需要在这里写 .msg 文件,并在 CMakeLists.txt 里配置 add_message_files()generate_messages() 等。
  5. srv/ 文件夹

    • 放置自定义的 服务类型.srv 文件)。
    • 如果你的包要定义 Service(请求-响应)的数据结构,就需要在这里写 .srv 文件,并在 CMakeLists.txt 里做相应配置(类似 msg 的流程)。
  6. include/ 文件夹

    • 用于存放 C/C++ 的头文件.h 或者 .hpp),并且一般命名与包同名的子目录,如 include/package2/... 这样的结构,以便在代码中更好地组织和引用。
    • 如果有对外公开的库或接口头文件,一般都放在这里。
  7. src/ 文件夹

    • 放置 源代码(比如 C++ 文件 .cpp)。
    • CMakeLists.txt 中会有 add_executable()add_library() 等命令去编译这个目录下的文件。
    • 也可能会有一些子目录,根据工程规模划分。
  8. launch/ 文件夹

    • 放置 Launch 文件.launch),通常是 XML 格式,用来一键启动多个节点或配置参数。
    • 例如:roslaunch package2 example.launch 可以同时启多个节点,并设置参数或话题重映射。

提示:除 CMakeLists.txtpackage.xml 外,其他文件夹(scripts/msg/srv/include/src/launch)可以按需要创建,不是所有包都用得到。具体目录结构会根据项目需求而定。

CMake 是一个跨平台的自动化构建系统工具,旨在简化编译和构建过程,特别是在复杂的软件项目中。CMake 通过定义一个项目的构建规则(通常保存在 CMakeLists.txt 文件中),来自动生成标准的构建文件(如 MakefileVisual Studio 工程文件等)。

在 ROS 中,CMake 也是构建系统的核心工具,catkin 构建系统基于 CMake,并通过生成的 CMakeLists.txt 文件来管理包的构建和依赖关系。

CMake 的基本概念和作用:

  1. 跨平台支持CMake 使得开发者能够在不同的平台上(Linux、Windows、macOS 等)使用相同的构建配置文件。通过 CMake,你可以生成与平台相关的构建文件。例如,在 Linux 上它可以生成 Makefile,在 Windows 上则可以生成 Visual Studio 工程文件。

  2. 简化构建过程CMake 通过自动生成构建文件,简化了手动编写 Makefile 或其他构建文件的工作。开发者只需要编写一个 CMakeLists.txt 文件,CMake 会自动处理不同平台和工具链的差异。

  3. 管理依赖关系CMake 可以检测并管理项目的依赖关系。它能够自动查找外部库、头文件,并确保在构建过程中正确地链接和编译。

  4. 生成构建文件: 运行 CMake 命令会根据项目中的 CMakeLists.txt 文件生成特定平台的构建文件。例如,运行 cmake . 会在当前目录生成 Makefile,然后可以通过 make 命令来编译代码。

catkin 是 ROS (Robot Operating System) 中的一个构建系统,专门用于构建和管理 ROS 包。它是 ROS 2 和 ROS 1 中的标准构建系统。catkin 基于 CMake,因此需要了解 CMake 的基本概念来理解如何使用 catkin

catkin 的作用:

  1. 构建和编译 ROS 包catkin 管理 ROS 包的构建过程,确保依赖关系正确,并生成可执行文件、库、消息、服务等。它可以处理 C++ 和 Python 的源码,并生成相应的可执行文件或库。

  2. 管理 ROS 工作空间catkin 将 ROS 包组织到一个工作空间中,典型的工作空间结构如下:

    ~/catkin_ws/ ├── build/ ├── devel/ ├── src/ └── CMakeLists.txt

    • src/:存放源代码和 ROS 包。
    • build/:存放构建过程中的中间文件。
    • devel/:存放已构建的包文件和工作空间环境。
    • CMakeLists.txt:构建配置文件,指定如何构建工作空间内的包。
  3. 处理依赖catkin 会自动处理包与包之间的依赖关系,确保在构建一个包时,其所依赖的其他包也会被正确构建。

catkin 与 CMake 的关系:

catkin 是基于 CMake 的构建系统,因此 CMakeLists.txt 文件是每个 ROS 包的关键配置文件。catkin 自动生成所需的 CMake 配置,简化了 ROS 包的构建过程。

你可能感兴趣的:(学习,ubuntu,架构)