ROS2 系统简介

15 阅读7分钟

1. ROS2 概述

ROS2 是机器人操作系统(Robot Operating System)的第二代版本,但严格来说,ROS2 不是操作系统。它本身运行需要依赖Linux、 Windows等操作系统。相比ROS1,它具有以下核心优势:

特性说明
实时性支持实时操作系统(RTOS),满足工业级应用需求
安全性内置DDS安全机制,支持加密通信
多平台支持Linux、Windows、macOS、RTOS等
可扩展性支持多机器人协同、云边端协同
生命周期管理节点状态可管理,便于系统监控和维护

2.ROS2 系统架构总览

graph TB
    subgraph 应用层["应用层 (Application Layer)"]
        A1[节点 Nodes]
        A2[生命周期节点 Lifecycle Nodes]
        A3[组件 Components]
    end

    subgraph 中间件层["中间件层 (Middleware Layer)"]
        B1[客户端库<br/>Client Libraries]
        B2[rcl<br/>C API]
        B3[rmw<br/>Middleware Interface]
    end

    subgraph 通信层["通信层 (Communication Layer)"]
        C1[数据分发服务<br/>DDS]
        C2[RMW Implementation<br/>Fast-DDS / Cyclone DDS / Connext]
    end

    subgraph 操作系统层["操作系统层 (OS Layer)"]
        D1[Linux]
        D2[Windows]
        D3[macOS]
        D4[RTOS]
    end

    A1 --> B1
    A2 --> B1
    A3 --> B1
    B1 --> B2
    B2 --> B3
    B3 --> C1
    C1 --> C2
    C2 --> D1
    C2 --> D2
    C2 --> D3
    C2 --> D4

🔹 节点(Nodes)

节点是ROS2中最基本的执行单元,每个节点负责一个具体的功能模块。

🔹 客户端库(Client Libraries)

ROS2提供多种语言的客户端库:

库名称语言说明
rclcppC++高性能,适合生产环境
rclpyPython快速开发,适合原型验证
rclrsRust内存安全,适合关键系统

rcl是ROS2底层的客户端库,是一个纯C语言库,包含了所有核心功能。rclcpprclpy都是构建在rcl之上的客户端库,rcl是上层语言特定客户端库(如 rclcpprclpy)与ROS2中间件之间的桥梁。除了C++Python外,大多数其他语言的客户端库都由开源社区支持,例如Rust(rclrs)、Node.js(rclnodejs)。


3. ROS2核心概念

  • 工作空间 (Workspace): 开发过程中放置各种开发文件的地方。
  • 功能包(Package): 功能源码的聚集地,用于实现特定机器人功能。
  • **节点(Node): **机器人的工作细胞,是代码编译生成的一个可执行文件。
  • 话题 (Topic): 节点间传递数据的桥梁,周期性传递各功能之间的信息。
  • **服务 (Service): **节点间的“你问我答”,用于某些机器人功能和参数的配置。
  • 通信接口 (Interface): 数据传递的标准结构,规范了机器人的各种数据形态。
  • 参数 (Parameter): 机器人系统的全局字典,可定义或查询机器人的配置参数。
  • 动作 (Action): 完整行为的流程管理,控制机器人完成某些动作。
  • 分布式通信(Distributed Communication): 多计算平台的任务分配,实现快速组网。
  • DDS(Data Distribution Service): 机器人的神经网络,完成数据的高效安全传送。

4.ROS2 通信机制

graph TB
    subgraph 通信模式
        T[话题 Topics]
        S[服务 Services]
        A[动作 Actions]
        P[参数 Parameters]
    end
    
    T --> T1["单向通信<br/>传感器数据流"]
    S --> S1["双向通信<br/>请求-响应"]
    A --> A1["长时间任务<br/>带反馈"]
    P --> P1["节点配置<br/>键值对"]

5.ROS2 机器人开发流程

1.png

6. 工作空间

6.1 工作空间是什么

在ROS 2中,开发者针对机器人的某些功能进行代码开发时,编写的代码、参数、 脚本等文件,需要放置在某个文件夹里进行管理,这个文件夹在ROS 2 系统中叫作工作空间 (Workspace)。

一个典型的 ROS 2 工作空间结构如下图所示

2.png

  • build: 编译空间,用于保存编译过程中产生的中间文件。

  • install: 安装空间,用于放置编译得到的可执行文件、脚本、配置等运行属性的文件。

  • log: 日志空间,用于保存编译和运行过程中产生的各种警告、错误、信息等日志。

  • src: 代码空间,用于放置编写的代码、脚本、配置等开发属性的文件。

    ROS 2机器人开发的大部分操作都是在src 中进行的,编译成功后,执行install 中的可执行 文件,build 和 log 两个文件夹使用相对较少。

6.2 创建并初始化工作空间

1.创建工作空间 创建工作空间的方法有很多,本质就是创建一个文件夹。

mkdir -p learn_ws/src

上述命令是在当前目录下创建learn_ws工作空间并且在该工作空间根目录下创建src文件夹。 2.初始化工作空间

# 进入工作空间根目录
cd learn_ws

# 构建空工作空间(生成build/install/log目录)
colcon build

# 验证生成目录
ls -a

7.功能包

7.1 功能包是什么

在 ROS2 中,功能包是组织、构建和分发软件的最小基本单位。可以把它理解为一个包含特定功能(如机器人驱动、感知、路径规划等)的独立文件夹,其中包含了编译、运行和共享所需的所有文件。开发者可以将不同功能的代码划分到不同的功能包中,尽量减少它们之间的耦合关系。

7.2创建功能包

在src目录下创建一个python功能包

# 进入src目录
cd src

#创建python功能包
ros2 pkg create python_pkg --build-type ament_python --license Apache-2.0

#创建C++功能包
ros2 pkg create cpp_pkg --build-type ament_cmake --license Apache-2.0

build-type: 表示新创建的功能包是 C++还是 Python, 如果使用Python, 就是 “ament_python”;如果使用 C++或者 C, 就是 “ament_cmake”。 license:表示开源协议,这里选择Apache-2.0(没有license也可以创建成功,但是会有警告,提示你指定license,所以一般情况还是把这个参数加上)。

7.3功能包结构

1.C++功能包

功能包结构如下图所示

3.png

  • package.xml 文件涵盖了功能包的版权描述,详细阐述了版权所有者、版权年份及版权声明 等关键信息。此外,该文件还列出了功能包所依赖的各种库、工具或资源,包括它们的版本要 求和来源声明,为功能包的正确构建和运行提供了必要的依赖声明信息。

    以cpp_pkg 的 package.xml 为例,其中的内容如下

    <?xml version="1.0"?>
    <?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
    <package format="3">
      <name>cpp_pkg</name>
      <version>0.0.0</version>
      <description>TODO: Package description</description>
      <maintainer email="wanggy@todo.todo">wanggy</maintainer>
      <license>Apache-2.0</license>
    
      <buildtool_depend>ament_cmake</buildtool_depend>
    
      <test_depend>ament_lint_auto</test_depend>
      <test_depend>ament_lint_common</test_depend>
    
      <export>
        <build_type>ament_cmake</build_type>
      </export>
    </package>
    
    
  • CMakeLists.txt文件是定义编译规则的关键文件。由于C++ 代码需要先编译才能运行,因此 在这个文件中,必须详细设置编译的过程和规则,包括指定编译器、编译选项、链接库等,以 确保代码能够正确编译成可执行文件。

    以cpp_pkg 的CMakeLists.txt 为例,其中的内容如下

    cmake_minimum_required(VERSION 3.8)
    project(cpp_pkg)
    
    if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
      add_compile_options(-Wall -Wextra -Wpedantic)
    endif()
    
    #查找ament_cmake包,这是ROS2构建系统的核心包
    find_package(ament_cmake REQUIRED)
    #如果需要手动添加其他依赖项,则可以取消注释并填写
    # find_package(<dependency> REQUIRED)
    
    if(BUILD_TESTING)
      find_package(ament_lint_auto REQUIRED)
      # the following line skips the linter which checks for copyrights
      # comment the line when a copyright and license is added to all source files
      set(ament_cmake_copyright_FOUND TRUE)
      # the following line skips cpplint (only works in a git repo)
      # comment the line when this package is in a git repo and when
      # a copyright and license is added to all source files
      set(ament_cmake_cpplint_FOUND TRUE)
      ament_lint_auto_find_test_dependencies()
    endif()
    
    # 调用ament_package()宏,它设置了包安装的目标和ament相关的一些构建属性
    ament_package()
    
    

    2.Python功能包

    功能包结构如下图所示

4.png

  • package.xml 文件在 Python 功能包中的作用与在C++功能包中相似,不在具体描述。
  • setup.cfg 是 ROS2 构建系统为了兼容 Python 标准打包方式(setuptools)而做出的适配,主要用来解决开发环境与安装环境的路径映射问题。
  • setup.py文件用于描述如何安装和分发该功能包。该文件包含 了功能包的元数据、依赖关系、安装脚本等信息,是构建和安装Python 功能包不可或缺的一部 分。以python_pkg 中的setup.py 为例:
#导入setuptools的find_packages和setup函数
from setuptools import find_packages, setup

#定义包名
package_name = 'python_pkg'

#使用setup函数定义包的安装信息
setup(
    name=package_name,
    version='0.0.0',
    #使用find_packages自动发现包,排除'test'目录
    packages=find_packages(exclude=['test']),
    #定义需要安装的数据文件
    data_files=[
    #数据文件安装到的目录和文件列表
        ('share/ament_index/resource_index/packages',
            ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
    ],
    install_requires=['setuptools'],
    zip_safe=True,
    maintainer='wanggy',
    maintainer_email='wanggy@todo.todo',
    description='TODO: Package description',
    license='Apache-2.0',
    extras_require={
        'test': [
            'pytest',
        ],
    },
    #定义命令行脚本的入口点 
    entry_points={
        'console_scripts': [
        ],
    },
)

7.4 构建功能包

虽然构建功能包的方法多种多样,但核心都是围绕colcon的使用展开。colcon 是一个专为ROS2设计的构建工具,它能够有效地处理功能包中的源代码,并将其构建成可执行文件或库文件,为后续的运行和测试提供必要的支持。

#在工作空间根目录下进行构建
#构建工作空间中的所有包
colcon build

#只构建特定包
colcon build --packages-select [my_package]

#只能构建python包,当你修改过源文件后,不需要colcon build,可直接运行。因为python本身可以直接运行源代码,不需要进行编译。
#有时会导致一些错误,如果经常遇到,请不要使用。
colcon build --packages-select [my_python_pkg] --symlink-install