Ethercat_Driver_ROS2-Humble代码解析
1)代码主体架构

在 ethercat_driver_ros2 仓库中,ethercat_driver、ethercat_generic_plugins、ethercat_interface、ethercat_manager、ethercat_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.srv、GetSdo.srv),供 ethercat_manager 使用。 |
2. 调用关系详解
2.1)ethercat_interface:核心基础层
- 角色:所有其他包的底层依赖,定义 EtherCAT 通信的基础接口和工具。
- 核心内容:
EcSlave基类:所有 EtherCAT 从站插件的抽象父类,定义了从站初始化、PDO 处理等接口(如setupSlave、processData)。EcMaster类:封装 IgH EtherCAT Master 的核心操作(如域注册、PDO 读写、主站初始化)。- PDO/SDO 基础工具:如
ec_pdo_entry_info_t(PDO 条目定义)、DomainInfo(域管理)等。
- 被依赖:
ethercat_driver、ethercat_generic_plugins、ethercat_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中的从站插件(如GenericEcSlave、EcCiA402Drive)。 - 调用
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_driver、ethercat_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 这个元包:
-
元包的作用从其
package.xml描述(Meta-package aggregating the ethercat_driver_ros2 packages and documentation)可以看出,它的核心功能是 “聚合” 与 EtherCAT 驱动相关的一系列子包,让用户无需逐个安装每个子组件,只需安装这个元包,就能自动获取其依赖的所有相关功能。 -
聚合的子包根据代码库中的结构,这个元包聚合的子包包括:
ethercat_driver:核心驱动实现,对接ros2_control的硬件接口;ethercat_interface:EtherCAT 通信的基础接口定义;ethercat_msgs:EtherCAT 相关的 ROS 消息和服务定义;ethercat_manager:与 EtherCAT 从站模块交互的组件;- 各类插件包(如
ethercat_generic_slave、ethercat_generic_cia402_drive):通用或专用 EtherCAT 从站设备的插件实现。
-
元包的特点元包自身通常非常精简,例如
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 配置、同步管理、接口映射)。 - 扩展特化:子类通过重写
processData、setupSlave等函数,添加 CiA402 协议特有的逻辑(如状态机、控制字 / 状态字处理、模式切换)。 - 调用关系:子类在重写的函数中通过
GenericEcSlave::xxx显式调用父类方法,实现 “基础功能复用 + 特有逻辑扩展”。generic_ec_slave.cpp与generic_ec_cia402_drive.cpp之间的调用关系基于类继承和虚函数重写
6. 功能包5一ethercat_interface


总结
ec_master.cpp实现了 EtherCAT 主站的核心管理逻辑,基于 IgH EtherCAT Master 库,主要功能包括:
- 初始化 EtherCAT 主站,添加并配置从站(PDO/SDO/DC)。
- 管理域(Domain)和 PDO 注册,实现过程数据的高效传输。
- 提供实时数据更新接口(
update/readData/writeData),并调用从站的逻辑处理数据。 - 支持实时线程配置和状态监控,确保通信的实时性和可靠性。
结合ec_slave.hpp等头文件,EcSlave作为从站抽象类,由具体设备(如电机驱动器)实现,通过processData处理实际的 PDO 数据读写,实现了主站与从站的解耦。由于ethercat_interface文件夹包含多个文件(头文件和源文件),且你主要提供了ec_master.cpp的内容,下面先围绕ec_master.cpp进行逐行解释,同时结合文件夹内的头文件信息(如ec_master.hpp、ec_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 服务器:
- 通过
ethercat_sdo_srv_server节点创建两个 ROS 2 服务:ethercat_manager/get_sdo:读取从站的 SDO 数据(配置参数)。ethercat_manager/set_sdo:向从站写入 SDO 数据(配置参数)。
- 底层通过
EcMasterAsync类与 EtherLab 驱动交互,实现异步的 SDO 操作(非实时,适合配置阶段)。 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_driver、ethercat_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_slave、ethercat_generic_cia402_drive)。 - 依赖
hardware_interface:实现 ROS 2 控制框架的接口(状态 / 命令接口)。
- 依赖
3. 基础接口包 ethercat_interface
- 功能:提供 EtherCAT 通信的底层抽象(主站、从站、PDO/SDO 通信等),封装了 IgH EtherCAT Master 的底层调用。
- 被依赖与调用:
- 被
ethercat_driver依赖:提供从站插件的基类EcSlave和主站控制EcMaster。 - 被插件包(
ethercat_generic_slave、ethercat_generic_cia402_drive)依赖:插件需继承EcSlave实现具体从站功能。 - 被
ethercat_manager间接依赖:ethercat_manager中的EcMasterAsync可能基于其主站通信逻辑。
- 被
4. 消息定义包 ethercat_msgs
- 功能:定义 EtherCAT 相关的服务消息(
SetSdo.srv、GetSdo.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_interface和ethercat_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 通信功能的分层实现。
更多推荐
所有评论(0)