目标不是讲概念,而是让你在 Jetson(或同类 Linux + ROS2 Humble + Qt6)上,按同样架构把六轴 EtherCAT 控起来:B03 占主站,Web/TUI 只做 FIFO 客户端。
0. 本专栏你将学会什么
读完并跟着做,应能得到:

1. 仓库与目录(先克隆到同一父目录)
假设根目录:
export RHU_ROOT=~/rhu_tools # 按你的实际路径改
cd "$RHU_ROOT"
ls ASD_D3_B03 yiyou-ecan-test
| ASD_D3_B03/ | Qt6/ROS2 框架 + 进程内主站 |
| yiyou-ecan-test/ | Web / TUI / 应急 daemon / 写齿轮工具 |
| docs/csdn-六电机专栏/ | 本系列文稿与配图 |
硬约束(全文第一条): 同一 EtherCAT 网口,同一时刻只允许一个主站进程——要么 B03_dev,要么 rhu_multi_pos_daemon,绝不并存。
2. 硬件与软件前提(对照检查)
2.1 硬件(示意拓扑)
Jetson EtherCAT 口(例:enP8p1s0)
└─ CU1128(部分从站 SKIP PDO)
├─ PH M5 / M6
└─ RHU M4..M1
你必须知道:
- 网口名:ip -br link 看哪块接电机总线;
- 从站能否被扫描(链路灯、carrier=1);
- 是否已有进程占着主站:pgrep -ax B03_dev; pgrep -ax rhu_multi_pos_daemon。
2.2 软件清单
| OS | Ubuntu 20.04/22.04 + Jetson Linux 亦可 |
| ROS2 | Humble(/opt/ros/humble) |
| Qt | 6.x,qmake 用 /usr/lib/qt6/bin/qmake(不要系统默认 Qt5) |
| 意优 SDK | include/ + lib/(libeu_ethercat.so 等) |
| Python | 3.8+(Web/TUI 用标准库即可) |
| 权限 | 主站通常需要 sudo |
把 SDK 放到 B03 侧(或设环境变量):
# 方式 A:符号链接到工程默认位置
mkdir -p "$RHU_ROOT/ASD_D3_B03/third_party/eyou_ethercat_sdk"
# 将厂商包的 include、lib 链到上述目录
# 方式 B:运行/编译时指定
export B03_EYOU_SDK_ROOT=/path/to/eyou_ethercat_phu_sdk
3. 30 分钟「空跑」验收路径(先通链路再谈细节)
下面命令按顺序执行;任一步失败先停,对照文末排障。
步骤 A:编译消息包 + B03
source /opt/ros/humble/setup.bash
cd "$RHU_ROOT/ASD_D3_B03/RosMsg_dev"
./build_ros_msg.sh
source "$RHU_ROOT/ASD_D3_B03/RosMsg_dev/install/setup.bash"
mkdir -p "$RHU_ROOT/ASD_D3_B03/build-B03_dev"
cd "$RHU_ROOT/ASD_D3_B03/build-B03_dev"
/usr/lib/qt6/bin/qmake ../B03_dev/B03_dev.pro
make -j"$(nproc)"
ls -l ./B03_dev
步骤 B:改网口配置
编辑 ASD_D3_B03/B03_dev/config/b03_dev.ini:
[motor_sdk]
ifname=enP8p1s0 ; ← 改成你的 EtherCAT 网口
motor_config_yaml=rhu_motors.yaml
cycle_ms=2
enable_fifo_server=true
cmd_fifo=/tmp/rhu_multi_pos_cmd
status_file=/tmp/rhu_multi_pos_status.jsonl
default_rpm=0.05
allow_endpoint_plan_stub=true
确认同目录有 rhu_motors.yaml。
步骤 C:清旧主站 → 起 B03
sudo pkill -9 rhu_multi_pos_daemon 2>/dev/null || true
sudo pkill -9 B03_dev 2>/dev/null || true
export LD_LIBRARY_PATH="$RHU_ROOT/ASD_D3_B03/third_party/eyou_ethercat_sdk/lib:${LD_LIBRARY_PATH:-}"
cd "$RHU_ROOT/ASD_D3_B03/build-B03_dev"
sudo -E env LD_LIBRARY_PATH="$LD_LIBRARY_PATH" ./B03_dev
成功迹象(日志大致出现):
- eth_initDLL 成功 / 从站数量合理;
- 各轴 CSP 使能;
- 出现 FIFO / status 路径提示;
- ls -l /tmp/rhu_multi_pos_cmd /tmp/rhu_multi_pos_status.jsonl 存在。
步骤 D:不启 Web,先用 CLI 点动一根轴
另开终端:
# 读状态最后一行
tail -1 /tmp/rhu_multi_pos_status.jsonl | python3 -m json.tool
# 小角度点动(先确认软限内!)
python3 – <<'PY'
from pathlib import Path
import sys
sys.path.insert(0, str(Path.home() / "rhu_tools/yiyou-ecan-test/python"))
from rhu_motion_client import RhuMotionClient
c = RhuMotionClient()
print(c.status("M1"))
c.goto_deg("M1", 2.0, rpm=0.05) # 角度按你现场改小
print(c.wait_until_idle("M1", 60))
PY
步骤 E:ROS 侧冒烟(可选)
source /opt/ros/humble/setup.bash
source "$RHU_ROOT/ASD_D3_B03/RosMsg_dev/install/setup.bash"
ros2 topic list | grep b03
ros2 topic echo /b03/joint_states –once
向 /b03/joint_targets 发目标时,务必落在 b03_dev.ini 的 min/max_angle_deg 内(第 07 篇细讲)。
4. 两条控制路径(复刻时脑子里要有这张图)
路径 1(正式机器人层)
ROS → B03Application → MotorSdkAdapter → EyouMultiPosMaster → EtherCAT
路径 2(人机旁路)
Web/TUI/CLI → FIFO JSONL → MotorFifoServer(在 B03 内)→ 同一主站
路径 1 不经过 FIFO。路径 2 不能 自己再 eth_initDLL。
5. 专栏怎么读(按学习顺序)
| 01(本文) | 环境齐、B03 能起、FIFO 能点动 |
| 02 | 会清互斥、懂为何不能双主站 |
| 03 | 知道改代码只动哪几个函数 |
| 04 | 理解主站如何进进程、如何编链接 |
| 05 | 自己写/改 FIFO 客户端 |
| 06 | 搭 Web 技术栈(实现向) |
| 07 | 软限/齿轮/rpm 调对 |
| 08 | 固化部署与文档边界 |
6. 本篇排障速查
| qmake 抱怨 Qt5 / 缺模块 | 用 /usr/lib/qt6/bin/qmake,检查 qt6-base-dev |
| 链接找不到 eu_ethercat | SDK lib 是否到位;B03_EYOU_SDK_ROOT |
| 运行缺 .so | LD_LIBRARY_PATH + sudo -E(别丢环境变量) |
| eth_initDLL 失败 | 网口名、carrier、是否已有主站 |
| FIFO 不出现 | enable_fifo_server=true;Initialize 是否失败提前退出 |
| 点动无反应 | status 里 enabled/moving;软限;default_rpm 是否过小 |
下一篇专门练:**如何确认「只有一个主站」,以及双主站时怎么救场。

