关于机器人,我之前陆续写了几篇文章。今天再给大家分享一套方案,能用在机器人控制上,底层硬件和软件都有。如果说我以前的文章偏硬件,那这篇就比较偏软件。
文章有一定专业性,不做这块的朋友可能不太好懂。但万一哪天用得上,还是挺有帮助的。建议先收藏,需要的时候再翻出来看看。
01
怎么让机器人看起来更像真人?我觉得很重要的一点就是反应要对。你跟我说一句话,我能接上话,或者做出对应的动作,至少不显得奇怪。
机器人身上有多个关节、很多电机,需要多轴联动。比如跑步,什么时候出左脚、什么时候出右脚、什么时候跑快、什么时候跑慢,早一点晚一点都可能摔倒。
用专业话说就是:每一次控制指令,必须在精确的时间点发出去,不能早也不能晚。说好每1ms发一次,就不能是0.5ms,也不能是1.5ms。节奏一乱,轨迹就抖,多轴同步就对不上。
麻烦的是,现在不少机器人控制器跑的是Linux。Linux本身是个通用系统,要同时照顾网络、文件、界面、后台服务……控制线程只是其中之一。哪怕优先级设到最高,周期说抖就抖。
02
它跟普通以太网最大的区别就一个字:准。普通以太网讲究尽力送到,EtherCAT讲究必须按时送到。工业现场多轴联动,靠的就是这个准字。
那这套东西靠什么跑?靠的是IgH EtherCAT Master这个开源协议栈。它跑在Linux内核空间,直接从驱动层收发报文,不走用户态那一套调度。好处是确定性好,配合分布时钟同步,能做到很精确的周期控制。
对懂行的工程师来说,IgH的好处很直接:能跟分布时钟配合,主站跑在内核里,跟通用以太网驱动搭得很顺,命令行和API也都有。它的抖动水平,直接反映整个实时系统的品质。我们要做的,就是让这个调度中心的心跳,在这个平台上跳得更稳、更准。
03
硬件:
米尔MYD-LR3576核心板,RK3576处理器,4个A72加4个A53,双千兆网口;
4台SV630N伺服驱动器,配汇川MS1H4电机。
软件:
buildroot系统,内核6.1.118打了Preempt-RT补丁;
IgH EtherCAT Master 1.6.0;
主站内部高精度时间戳做测量。

测试口径:
抖动定义就是实际周期减目标周期,正值是超调,负值是滞后;
最大值最小值平均值都是原始数据直接算,没剔启动阶段测量方法:主站自己带了一个高精度时间戳,每个周期开始时记一下,两个起点之间的时间差,就是实际周期时长;
空载和压力测试每组跑30分钟以上,长拷机跑12小时;
压力测试用stress-ng对0到6核施加CPU满载、内存读写、IO压力,同时用hackbench制造调度延迟;
从站是4台SV630N,标准PDO映射,DC同步以第一个支持DC的从站为参考时钟。
测量方法:主站自己带了一个高精度时间戳,每个周期开始时记一下,两个起点之间的时间差,就是实际周期时长。
先看空载。主站配成1ms周期同步速度模式,CPU核7专供主站实时线程,内核锁内存,线程优先级拉满,系统除了串口没其他负载。
连续跑半小时,1ms周期下最大抖动922ns,平均22ns。


ec_stmmac.ko 1000Hz 空载抖动:最大 922ns,平均 22ns
然后切到125微秒周期同步位置模式,也就是每秒8000帧,电机做连续微步定位。这个频率下,ec_stmmac.ko驱动的表现是:最大抖动还是922纳秒,平均22纳秒,执行耗时12.7微秒。
换ec_generic.ko通用驱动的话,125微秒空载下极端抖动正负11.7微秒,平均21.1纳秒,执行耗时26.4微秒,大于1微秒的尖峰只有1次,占比0.054%。
说实话,922纳秒这个数字,放在工业控制场景里已经相当能打了。很多传统方案还在微秒甚至毫秒级别晃悠,亚微秒级的抖动意味着上层轨迹规划有一个非常干净的时钟基准。直观感受就是电机噪音会小很多,多轴同步的精度也会明显提升。
空载好看不稀奇,关键是系统忙起来的时候还能不能稳住。
我启动stress-ng,对0到6核施加满负载,CPU跑满、内存轮番读写、文件系统疯狂IO,同时用hackbench制造大量调度延迟。这种情况下,隔离核7上的EtherCAT实时线程表现如下:

1ms周期压力测试:
ec_stmmac.ko:最大抖动1.63微秒,平均121纳秒,大于1微秒尖峰283次,占比11.58%
ec_generic.ko:极端抖动正负33.7微秒,平均36纳秒,大于1微秒尖峰只有5次,占比0.21%
125微秒周期压力测试:
ec_stmmac.ko:最大抖动1.30微秒,平均57纳秒,大于1微秒尖峰仅1次
ec_generic.ko:极端抖动正负43.5微秒,平均26.3纳秒,大于1微秒尖峰10次,占比0.55%

ec_stmmac.ko 8000Hz 压力测试:最大 1.30μs,平均 57ns
这里有个很有意思的现象。ec_generic.ko在压力下虽然大于1微秒的尖峰很少,但极端抖动值能到正负33.7微秒,说明它偶尔会抽一下大的。而ec_stmmac.ko在8000Hz下只有1次超过1微秒,极值控制在正负1.30微秒,高频场景下优势非常明显。
作为硬件工程师,我的理解是:ec_stmmac.ko是专门针对RK3576的STMMAC千兆网卡做了适配的,在NAPI调度和硬件时间戳上都做了优化,报文收发路径更短更确定。ec_generic.ko通用性强,但走的是通用路径,极端情况下的瞬时抖动就压不住。

ec_generic.ko 8000Hz 压力测试抖动分布:极端情况到 ±43.5μs,超过1μs的只有10次

125微秒周期位置模式连续跑12小时,模拟车间日夜不关机的场景。

ec_stmmac.ko 8000Hz 长拷机抖动分布:47512 条记录,最大 1.25μs
结果:
0丢帧,主站状态机没发生过一次OP到SAFEOP的异常跳变
DC时间漂移补偿稳定在正负20纳秒以内
抖动统计和1小时测试高度吻合,没有周期性尖峰,也没有缓慢恶化
这个结果说明这套方案不只是能跑,而是能长期稳定跑。对于要从打样走向量产的设备来说,这个底气很重要。
04
如果你能看到这儿,说明你是真爱了,下面是更加专业的知识点,让工程师了解低抖动背后,到底是什么在起作用。
驱动选择是关键
ec_stmmac.ko是米尔专门为RK3576的STMMAC千兆以太网控制器适配的实时驱动。标准Linux网卡驱动用中断模型,响应时间受内核调度器影响,满足不了EtherCAT周期性通信的确定性要求。ec_stmmac.ko在通用MAC驱动基础上,针对Preempt-RT内核做了NAPI调度优化,开了硬件时间戳,把报文收发的时间标记和中断处理延迟压到最低。
ec_generic.ko是通用IgH网卡驱动,兼容性好,但执行效率低。1000Hz下耗时32.3微秒,是ec_stmmac的近3倍。

IgH 驱动栈与 Preempt-RT 内核的关系
内核配置要精细
内核6.1.118-rt36,启用CONFIG_PREEMPT_RT完全内核抢占
CONFIG_HZ=1000提高定时器精度
CONFIG_HIGH_RES_TIMERS=y,CONFIG_NO_HZ_FULL=y针对隔离核关闭无干扰时钟
CONFIG_CPU_ISOLATION=y
bootargs:isolcpus=7 rcu_nocbs=7 nohz_full=7 irqaffinity=0-6
这样隔离核7上几乎不处理内核杂务和中断,全部算力留给EtherCAT实时线程。
应用层四件事
1、mlockall锁定内存,避免缺页延迟;
2、实时线程设SCHED_FIFO优先级99;
3、CPU亲和性绑定,实时线程在核7,日志监控等非实时线程在核0-6;
4、DC同步配置,以第一个支持DC的从站为参考时钟,补偿静态漂移,周期任务与DC信号对齐。

隔离核和非隔离核线程分配——实时线程占着核7,日志、界面都扔到别的核上,互不打扰
05

ec_generic.ko适合:
系统有CPU压力负载,压力下大于1微秒尖峰仅5次,比ec_stmmac的283次少很多
运行频率较低,大概1000Hz左右,执行耗时不是瓶颈
不能容忍偶发性大抖动中断控制流程
用独立PCIe网卡而不是DWMAC内置MAC
ec_stmmac.ko适合:
CPU资源充裕、无压力干扰,抖动低至922纳秒,执行耗时仅11微秒
高频率运行,8000Hz及以上,执行耗时优势明显,压力下表现反而更好
长时间不间断运行,47512条记录仅10次微小超限
对执行效率有要求,每周期能省约20微秒CPU时间

简单说:ec_stmmac.ko性能好效率高,但CPU压力场景下大于1微秒尖峰多;ec_generic.ko慢一些,但低频压力下尖峰少,抗突发干扰好。选哪个看你的实际负载特征和周期要求。
06
1、中断亲和性别马虎
光隔离CPU不够,还得通过/proc/irq/*/smp_affinity把千兆网口中断绑到非隔离核,否则隔离核会被频繁唤醒,前面做的隔离就白费了。
2、实时驱动别用错
通用网卡驱动在RT内核下可能出现锁反转,务必用适配的ec_stmmac驱动。遇到丢帧先检查DMA缓冲区大小和中断合并设置。
3、DC时钟冷启动要等
刚进入OP状态时,驱动系统漂移补偿需要几秒收敛。建议应用层检测DC稳定标志后再开始严格同步的运动指令,别一上来就发。
4、监控别打扰实时线程
实时数据通过共享内存传到非RT核,由非实时核负责存储或网络上报。直接printf或者写磁盘,会引起各种意想不到的延迟。
RK3576内置6 TOPS NPU,双千兆以太网。这套EtherCAT主站方案能满足32轴甚至更多轴的微秒级同步控制,还能无缝融入边缘AI推理。
想象一下,同一块板子上,隔离核跑125微秒高精度运动控制,其余核跑视觉抓拍和缺陷检测。这种运动+视觉实时一体化架构,能大幅简化产线控制器设计,对柔性制造、协作机器人这些领域来说,是个很实用的思路。
米尔MYD-LR3576开发板接口完备,工业级温度范围,本身就可以作为量产核心板直接嵌入设备,缩短产品上市周期。

07
基于MYD-LR3576的RK3576平台,配合Linux Preempt-RT实时内核和IgH EtherCAT Master,可以构建具备工业实时控制能力的EtherCAT主站方案。测试条件下能稳定运行1ms和125微秒控制周期,长时间测试主站状态稳定。
ec_stmmac.ko专用驱动在执行耗时和高频周期场景下优势明显,适合8000Hz等高控制周期应用。ec_generic.ko通用驱动兼容性更好,适合快速验证和通用网卡场景。
实际项目里怎么选,结合周期频率、极端抖动容忍度和开发维护成本来定就行。