1)代码主体架构

在 ethercat_driver_ros2 仓库中,ethercat_driverethercat_generic_pluginsethercat_interfaceethercat_managerethercat_msgs 等包分工明确,通过依赖和接口调用形成完整的 EtherCAT 与 ROS 2 集成框架。以下是它们之间的调用关系梳理:

1. 核心包功能概述

核心功能
ethercat_driver_ros2元包(meta-package),聚合所有相关子包,方便安装和管理(无具体功能代码)。
ethercat_interface提供 EtherCAT 通信的基础接口和核心逻辑(如主站管理、从站基类、PDO/SDO 基础操作)。
ethercat_driver实现 ros2_control 的 SystemInterface,作为硬件接口桥接 ROS 2 与 EtherCAT 设备。
ethercat_generic_plugins提供通用 EtherCAT 从站插件(如通用从站、CiA402 驱动器),实现具体设备的通信逻辑。
ethercat_manager提供 SDO(异步服务数据对象)通信的 ROS 服务,支持动态读写设备参数。
ethercat_msgs定义 SDO 通信的服务消息类型(SetSdo.srvGetSdo.srv),供 ethercat_manager 使用。

2. 调用关系详解

2.1)ethercat_interface:核心基础层
  • 角色:所有其他包的底层依赖,定义 EtherCAT 通信的基础接口和工具。
  • 核心内容
    • EcSlave 基类:所有 EtherCAT 从站插件的抽象父类,定义了从站初始化、PDO 处理等接口(如 setupSlaveprocessData)。
    • EcMaster 类:封装 IgH EtherCAT Master 的核心操作(如域注册、PDO 读写、主站初始化)。
    • PDO/SDO 基础工具:如 ec_pdo_entry_info_t(PDO 条目定义)、DomainInfo(域管理)等。
  • 被依赖ethercat_driverethercat_generic_pluginsethercat_manager 均直接依赖它提供的接口和工具。
2.2)ethercat_driver:ROS 2 硬件接口层
  • 角色:桥接 ros2_control 与 EtherCAT 设备,是整个框架与 ROS 2 控制栈的接口。
  • 核心逻辑
    • 实现 hardware_interface::SystemInterface,导出 ROS 2 控制所需的 state_interface(状态接口)和 command_interface(命令接口)。
    • 通过 pluginlib 动态加载 ethercat_generic_plugins 中的从站插件(如 GenericEcSlaveEcCiA402Drive)。
    • 调用 ethercat_interface::EcMaster 进行 EtherCAT 主站的初始化和数据读写(read/write 方法)。
  • 依赖与调用
    • 依赖 ethercat_interface:使用 EcMaster 管理主站,使用 EcSlave 接口与从站插件交互。
    • 调用 ethercat_generic_plugins:通过 pluginlib::ClassLoader 加载具体插件,执行插件的 setupSlave 和 processData 方法处理设备数据。
2.3)ethercat_generic_plugins:设备插件层
  • 角色:实现具体 EtherCAT 从站设备的通信逻辑,作为 ethercat_driver 的插件。
  • 核心内容
    • GenericEcSlave:通用从站插件,通过配置文件定义 PDO 映射,适用于大多数标准设备。
    • EcCiA402Drive:针对 CiA402 协议驱动器(如伺服电机)的专用插件,处理电机状态机、控制字 / 状态字等逻辑。
  • 依赖与调用
    • 继承 ethercat_interface::EcSlave 基类,实现其虚函数(如 processData 处理 PDO 数据)。
    • 被 ethercat_driver 加载和调用:ethercat_driver 通过插件接口获取设备数据,并同步到 ROS 2 控制接口。
2.4)ethercat_manager 与 ethercat_msgs:SDO 服务层
  • 角色:提供异步 SDO 通信功能,支持动态读写设备参数(非周期性数据)。
  • 核心逻辑
    • ethercat_msgs:定义 SDO 服务消息(SetSdo.srv 用于写入,GetSdo.srv 用于读取)。
    • ethercat_manager:实现 SDO 服务服务器(ethercat_sdo_srv_server),通过 IgH 库的 API 执行 SDO 操作,并使用 ethercat_msgs 定义的服务接口与外部通信。
  • 依赖与调用
    • ethercat_manager 依赖 ethercat_msgs:使用其定义的服务类型处理请求。
    • ethercat_manager 依赖 ethercat_interface(间接):共享 EtherLab 库的接口,与 EtherCAT 主站交互。
    • 其他模块(如 ethercat_driver 或外部节点)可通过调用 ethercat_manager 提供的服务进行 SDO 操作。
2.5)ethercat_driver_ros2:元包聚合
  • 角色:作为元包,依赖所有其他子包(ethercat_driverethercat_interface 等),简化整体安装流程(通过 rosdep 或 apt 安装时自动拉取所有依赖)。

总结

  • 底层核心ethercat_interface 提供所有 EtherCAT 通信的基础接口。
  • ROS 2 桥接ethercat_driver 实现 ros2_control 接口,加载插件并管理数据流转。
  • 设备逻辑ethercat_generic_plugins 实现具体设备的 PDO 处理,作为插件被 ethercat_driver 调用。
  • SDO 通信ethercat_manager 基于 ethercat_msgs 提供 SDO 服务,补充非周期性数据交互。
  • 元包聚合ethercat_driver_ros2 简化整体安装和依赖管理。

3. 功能包1一ethercat_driver

3.1)visibility_control.h

总结:这个文件是共享库开发的 “基础设施”,通过跨平台宏定义确保库的公共接口能被正确访问,同时隐藏内部实现细节。这个头文件 visibility_control.h 的主要作用是跨平台控制共享库(动态链接库)中的符号可见性,确保库的公共接口能被正确导出和导入,同时隐藏内部符号以减少冲突并优化性能。

3.2)ethercat_driver.h  ethercat_driver.cpp

4. 功能包2一ethercat_driver_ros2

在 ROS 2 中,“元包(Meta-package)聚合” 指的是一个特殊的功能包(package),它本身不包含实际的代码或功能实现,而是通过依赖关系将多个相关的子功能包(subpackages)整合在一起,方便用户统一安装、管理和使用整个功能栈。

具体到 ethercat_driver_ros2 这个元包:

  1. 元包的作用从其 package.xml 描述(Meta-package aggregating the ethercat_driver_ros2 packages and documentation)可以看出,它的核心功能是 “聚合” 与 EtherCAT 驱动相关的一系列子包,让用户无需逐个安装每个子组件,只需安装这个元包,就能自动获取其依赖的所有相关功能。

  2. 聚合的子包根据代码库中的结构,这个元包聚合的子包包括:

    • ethercat_driver:核心驱动实现,对接 ros2_control 的硬件接口;
    • ethercat_interface:EtherCAT 通信的基础接口定义;
    • ethercat_msgs:EtherCAT 相关的 ROS 消息和服务定义;
    • ethercat_manager:与 EtherCAT 从站模块交互的组件;
    • 各类插件包(如 ethercat_generic_slaveethercat_generic_cia402_drive):通用或专用 EtherCAT 从站设备的插件实现。
  3. 元包的特点元包自身通常非常精简,例如 ethercat_driver_ros2 的 CMakeLists.txt 仅包含基本的元包声明(ament_package()),没有实际的编译逻辑或代码。它的主要作用是通过 package.xml 中的 <exec_depend> 声明依赖的子包,从而实现 “一键安装整个功能栈” 的效果。

5. 功能包4一ethercat_generic_plugins

5.1)ethercat_generic_slave

5.2)ethercat_generic_cia402_drive

  • 继承基础EcCiA402Drive 继承 GenericEcSlave,复用父类的通用 EtherCAT 从站功能(如 PDO/SDO 配置、同步管理、接口映射)。
  • 扩展特化:子类通过重写 processDatasetupSlave 等函数,添加 CiA402 协议特有的逻辑(如状态机、控制字 / 状态字处理、模式切换)。
  • 调用关系:子类在重写的函数中通过 GenericEcSlave::xxx 显式调用父类方法,实现 “基础功能复用 + 特有逻辑扩展”。generic_ec_slave.cpp 与 generic_ec_cia402_drive.cpp 之间的调用关系基于类继承虚函数重写

6. 功能包5一ethercat_interface

总结

ec_master.cpp实现了 EtherCAT 主站的核心管理逻辑,基于 IgH EtherCAT Master 库,主要功能包括:

  1. 初始化 EtherCAT 主站,添加并配置从站(PDO/SDO/DC)。
  2. 管理域(Domain)和 PDO 注册,实现过程数据的高效传输。
  3. 提供实时数据更新接口(update/readData/writeData),并调用从站的逻辑处理数据。
  4. 支持实时线程配置和状态监控,确保通信的实时性和可靠性。

结合ec_slave.hpp等头文件,EcSlave作为从站抽象类,由具体设备(如电机驱动器)实现,通过processData处理实际的 PDO 数据读写,实现了主站与从站的解耦。由于ethercat_interface文件夹包含多个文件(头文件和源文件),且你主要提供了ec_master.cpp的内容,下面先围绕ec_master.cpp进行逐行解释,同时结合文件夹内的头文件信息(如ec_master.hppec_slave.hpp等)补充上下文。

7. 功能包6一ethercat_manager

7.1)data_convertion_tools.hpp

data_convertion_tools.hpp(数据转换工具,内容未完全提供,推测功能)

该文件主要定义数据类型转换相关的工具函数和结构体,例如:

  • DataType结构体:描述数据类型(如 "uint8"、"int32")及其字节大小。
  • get_data_type函数:根据字符串(如 "uint16")返回对应的DataType
  • data2buffer函数:将字符串或数值转换为字节缓冲区(用于 SDO 下载)。
  • buffer2data函数:将字节缓冲区转换为数值或字符串(用于 SDO 上传)。
  • 异常类(如SizeException):处理数据大小不匹配等错误

7.2)ec_master_async.hpp

7.3)ec_master_async_io.hpp

定义Ethercat模块信息结构体(用于ioctl调用)

7.4)ethercat_sdo_srv_server.cpp

(SDO 服务服务器实现)

upload-->master.sdo_upload(&data)
download-->master.sdo_download(&data)

整体功能总结

ethercat_manager文件夹的核心功能是提供EtherCAT SDO 服务的 ROS 2 服务器

  1. 通过ethercat_sdo_srv_server节点创建两个 ROS 2 服务:
    • ethercat_manager/get_sdo:读取从站的 SDO 数据(配置参数)。
    • ethercat_manager/set_sdo:向从站写入 SDO 数据(配置参数)。
  2. 底层通过EcMasterAsync类与 EtherLab 驱动交互,实现异步的 SDO 操作(非实时,适合配置阶段)。
  3. data_convertion_tools提供数据类型转换工具,处理 ROS 2 服务消息与 EtherCAT 字节缓冲区之间的转换。

该模块是 EtherCAT 从站配置的重要组件,允许用户通过 ROS 2 服务动态修改从站参数(如电机参数、传感器配置等)。

8)ethercat_msgs

8.1)GetSdo.srv

        int16 master_id
        uint16 slave_position
        uint16 sdo_index
        uint8 sdo_subindex
        string sdo_data_type
        ---
        bool success
        string sdo_return_message
        string sdo_return_value_string
        float64 sdo_return_value

8.2)SetSdo.srv

        int16 master_id
        int16 slave_position
        int16 sdo_index
        int16 sdo_subindex
        string sdo_data_type
        string sdo_value
        ---
        bool success
        string sdo_return_message

9)总结

1. 核心包与元包

  • ethercat_driver_ros2:元包(meta-package),本身不实现功能,仅通过exec_depend聚合其他核心包(ethercat_driverethercat_interface等),作为项目入口的逻辑组合。

2. 核心驱动包 ethercat_driver

  • 功能:实现ros2_control的硬件接口(SystemInterface),是连接 ROS 2 与 EtherCAT 从站的核心。
  • 依赖与调用
    • 依赖ethercat_interface:使用其提供的EcMaster(EtherCAT 主站)、EcSlave(从站接口)等基础类(如ethercat_driver.hpp中包含#include "ethercat_interface/ec_slave.hpp")。
    • 依赖pluginlib:通过pluginlib::ClassLoader动态加载具体的 EtherCAT 从站插件(如ethercat_generic_slaveethercat_generic_cia402_drive)。
    • 依赖hardware_interface:实现 ROS 2 控制框架的接口(状态 / 命令接口)。

3. 基础接口包 ethercat_interface

  • 功能:提供 EtherCAT 通信的底层抽象(主站、从站、PDO/SDO 通信等),封装了 IgH EtherCAT Master 的底层调用。
  • 被依赖与调用
    • ethercat_driver依赖:提供从站插件的基类EcSlave和主站控制EcMaster
    • 被插件包(ethercat_generic_slaveethercat_generic_cia402_drive)依赖:插件需继承EcSlave实现具体从站功能。
    • ethercat_manager间接依赖:ethercat_manager中的EcMasterAsync可能基于其主站通信逻辑。

4. 消息定义包 ethercat_msgs

  • 功能:定义 EtherCAT 相关的服务消息(SetSdo.srvGetSdo.srv),用于 SDO(服务数据对象)的读写通信。
  • 被依赖与调用
    • ethercat_manager依赖:ethercat_manager中的服务端(ethercat_sdo_srv_server.cpp)使用这些消息类型实现 SDO 服务(get_sdo/set_sdo)。

5. 管理工具包 ethercat_manager

  • 功能:提供 SDO 读写的 ROS 2 服务端,允许通过服务调用与 EtherCAT 从站进行配置通信。
  • 依赖与调用
    • 依赖ethercat_msgs:使用其定义的服务消息类型。
    • 依赖ethercat_interface(间接):通过EcMasterAsync实现底层 EtherCAT 主站通信(如master.sdo_upload/sdo_download)。

6. 通用插件包

  • ethercat_generic_slave:实现通用 EtherCAT 从站插件,提供基础的 PDO/SDO 映射功能。

    • 依赖ethercat_interface:继承EcSlave并实现setupSlave等接口,被ethercat_driver通过pluginlib动态加载。
  • ethercat_generic_cia402_drive:针对 CiA402 协议的驱动插件(如伺服电机)。

    • 依赖ethercat_interfaceethercat_generic_slave:基于通用从站扩展,实现 CiA402 特定功能(如模式控制、位置 / 速度环),被ethercat_driver加载。

整体调用关系图

plaintext

ethercat_driver_ros2(元包)
├── ethercat_driver(核心驱动)
│   ├── 依赖:ethercat_interface(基础接口)
│   ├── 依赖:pluginlib(加载插件)
│   └── 加载:ethercat_generic_slave、ethercat_generic_cia402_drive(插件)
├── ethercat_interface(底层抽象)
│   ├── 被依赖:ethercat_driver、插件包、ethercat_manager
│   └── 封装:IgH EtherCAT Master底层
├── ethercat_manager(SDO服务)
│   ├── 依赖:ethercat_msgs(消息类型)
│   └── 依赖:ethercat_interface(主站通信)
└── ethercat_msgs(消息定义)
    └── 被依赖:ethercat_manager

核心逻辑:ethercat_driver作为ros2_control接口,通过ethercat_interface提供的抽象加载具体插件(如 CiA402 驱动),实现实时 EtherCAT 通信;ethercat_manager则提供辅助的 SDO 配置服务,依赖ethercat_msgs和底层接口。在ethercat_driver_ros2项目中,各包之间的调用关系主要基于 ROS 2 的依赖管理(package.xml)和代码中的接口引用,核心围绕 EtherCAT 通信功能的分层实现。

Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐