最近把自己做的一个工业机器人控制器 SDK 整理开源了,基于 **IgH EtherCAT Master + CiA402 协议**,支持从总线通信到上层运动控制的完整栈。这段时间先分享一下怎么用它简单控制一个伺服电机。

仓库地址:GitHub - twx-web/EtherCAT_Controller: 一个专用于工业上实时控制器,对ethercat伺服电机控制更加简便 · GitHub

## 核心思路

控制一个伺服电机,本质上就是三件事:

1. **建立 EtherCAT 通信**(主站初始化、Domain、PDO 映射)
2. **驱动 CiA402 状态机**(使能 → 就绪 → 运行)
3. **发运动指令**(位置/速度/点动)

SDK 把这套流程封装得比较简单,接口带 SI 单位(弧度),不用自己算脉冲。

## 最小示例(单轴控制)

#include "EthercatMaster.h"
#include "CiA402Motor.h"
#include "axis.h"
#include "joint_unit_converter.h"
#include "RealtimeLoop.h"
#include "MotionCycle.h"
```

初始化与配置:

```cpp
EthercatMaster master;
master.init(0);
master.createDomain();

// 配置从站 PDO(CSP 模式,5 出口 + 5 入口)
CiA402Motor::Offsets offsets;
ec_pdo_entry_reg_t regs[] = {
    {0, 0, VID, PID, 0x6040, 0, &offsets.ctrl_word},
    {0, 0, VID, PID, 0x607A, 0, &offsets.target_position},
    {0, 0, VID, PID, 0x6041, 0, &offsets.status_word},
    {0, 0, VID, PID, 0x6064, 0, &offsets.position_actual},
    // ... 更多映射
    {}
};
// 注册 PDO、添加从站、激活...
master.activate();
```

创建轴并启动实时循环:

```cpp
auto motor = std::make_unique<CiA402Motor>(sc, master.domainData(), offsets);
auto axis = std::make_unique<Axis>("joint1", std::move(motor), converter);

RealtimeLoop rtLoop;
rtLoop.addTask([&]() { axis->realtimeCycle(); });
rtLoop.start();
```

运动控制(NRT 线程投递命令):

```cpp
axis->enable();                          // 使能
axis->moveAbsolute(1.0);                 // 转到 1 rad
axis->moveVelocity(2.0);                 // 以 2 rad/s 速度运行
axis->jogPositive(1.5);                  // 正向点动
axis->disable();                         // 禁能

 

## SDK 特点

- **分层清晰**:`EthercatMaster → CiA402Motor → Axis → AxisGroup`
- **RT/NRT 分离**:实时路径无堆分配、无锁、无日志
- **即用型运动学**:已内置 Delta、SCARA、六轴(ABB/通用)正逆解
- **轨迹规划**:S 曲线、前瞻、PVT 插补、电子齿轮/凸轮
- **全部中文注释**,Doxygen 文档可直接生成

## 为什么开源

做工业控制的门槛其实不低——要搞 IgH、要搞 PDO 映射、要搞实时内核、要搞 CiA402 状态机。我希望把这块做好之后分享出来,让想做运动控制的同学能更快上手,也欢迎各位提 issue 或 PR。
**欢迎 Star、Fork、指正!**

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐