人形机器人混合总线控制网络:EtherCAT与冗余CAN/CANFD的工程实践
2026/9/7 12:25:03 网站建设 项目流程

做机器人控制这些年,我最大的感受是:单一总线包打天下的时代早就过去了。尤其是人形机器人,整机几十个关节要同步跑,身上还挂满了IMU、力矩传感器、温感、电池管理、急停回路,同时头顶的视觉、激光雷达还在不断往工控机灌数据——这种情况下,如果只押注一种总线,要么同步精度不够,要么线束重到走不动路,要么一旦主链路出点问题整机就瘫。

所以我们在实际样机里采用了一套“冗余双CAN/CANFD + CANWeb + 千兆以太网 + EtherCAT”的混合控制网络。听起来东西很多,其实分工非常明确:EtherCAT管关节的实时同步,双CAN/CANFD管安全降级和慢速数据采集,CANWeb把传统CAN节点接进以太网做运维监控,千兆以太网作为整个系统的主干和管理面。这篇文章把每一层为什么这么选、具体怎么落地、联调时踩过哪些坑,一次性讲清楚。适合正在做机器人控制器架构选型、EtherCAT主从站开发、或者想改造传统CAN设备的嵌入式工程师参考。

1. 为什么人形机器人需要一张“混合总线”控制网络

1.1 先看清人形机器人控制系统的真实负载

人形机器人的控制需求,粗略可以分成三类。第一类是关节驱动,一条腿光髋、膝、踝就六七个自由度,整机少说20到40个伺服关节,控制周期通常要1kHz甚至更高,而且关节之间需要严格同步,否则走路的姿态就会抖。这类数据包不大,一个关节周期可能就几十个字节,但对实时性和同步精度极其敏感。

第二类是慢速传感器和安全逻辑。身体各处的温度、电流、电压、按钮、限位开关、电子皮肤、电池管理,这类数据采样周期往往只要10Hz到100Hz,但节点数量非常多、分布分散。它们对实时性要求不高,却要求布线简单、抗干扰强、成本低。

第三类是感知数据。相机、激光雷达、麦克风阵列,一路信号就是几十到几百Mbps的吞吐量,对带宽要求高,对实时同步的要求反而不像关节那么苛刻。

这三类负载放到一起,你会发现很难用一种总线同时满足:CAN/CANFD带宽不够带不起视觉,EtherCAT虽然实时性好但节点越多对线缆和连接器要求越高,千兆以太网带宽大却缺乏硬实时同步机制。所以最合理的做法,不是让一种总线包办一切,而是让每种总线去做自己最擅长的事。

1.2 三条链路各自擅长什么

EtherCAT的核心优势是分布式时钟,从站之间同步精度可以做到亚微秒级别。它采用“主站发帧、从站在报文飞过时原地读写”的方式,一个以太网帧就能覆盖几十个从站,非常适合关节这种“大量节点、小数据、高同步”的场景。

CAN和CANFD则是工业现场的老牌选手。CAN的物理层是差分信号,抗干扰能力强,线缆要求低,而且有成熟的仲裁机制,天然支持多主通信。CANFD在CAN基础上把数据段波特率提升到5Mbps甚至更高,单帧最多64字节,正好覆盖那些“周期不快但点位多”的传感器。更重要的是,CAN总线可以很自然地做成双套冗余,这一点在安全链路上价值极高。

千兆以太网在这里扮演的是“主干道”角色。它连接工控机、运动控制卡、视觉模块、网管交换机,带宽充裕,还能运行EtherCAT协议本身——EtherCAT本质上是跑在以太网帧里的,所以千兆网口既能做普通TCP/IP通信,也能被实时扩展层接管做EtherCAT主站。

1.3 冗余双CAN/CANFD在这套体系里承担“第二道防线”

有人会问:既然EtherCAT这么强,为什么还要保留CAN?我的回答是:EtherCAT链路一旦出问题,主控和所有关节之间就完全失联了。

实际样机调试时发生过一次很典型的故障:EtherCAT主站所在进程因为某个驱动异常导致网卡中断处理不及时,整条链路上的关节模组瞬间全部进入看门狗超时,机械臂直接卸力。还好我们在关节之外单独拉了一条双CAN总线,专门接急停回路、使能信号和电池管理系统。主链路挂了之后,双CAN依然在工作,至少能保证机器人进入安全停止状态,而不是自由落体。

这就是冗余双CAN/CANFD存在的意义:它不负责跑高性能运动控制,它负责在关键时刻给系统留一条“能救命的路”。

2. 冗余双CAN/CANFD架构的工程细节

2.1 双CAN冗余的两种实现思路

双CAN冗余听起来简单,实际上有两种完全不同的做法。

一种是链路冗余,即同一个节点同时挂在两根CAN总线上,正常时两路都收发,收到重复帧就丢弃;当一路总线短路或断开时,另一路自动接管。这种方案对单点故障的防护最好,因为即使一根线被切断,通信也不中断。代价是每个节点需要两颗CAN控制器,或者一颗双CAN控制器(比如STM32H7、F28P65都有双CAN/CANFD模块),硬件成本略高。

另一种是功能分区冗余,即两块独立的MCU各带一条CAN总线,分别负责不同类的功能,比如A路负责关节传感器,B路负责安全IO,两者在逻辑上互为主备。这种方案更灵活,适合复杂系统按功能隔离故障域。

我在人形机器人样机里采用的是“分区冗余为主、链路冗余为辅”的混合方案:动力关节的状态反馈走一条高速CANFD,安全相关IO走独立的低速CAN,两条总线分别由不同的MCU控制,避免单点失效。同时关键节点(比如电池管理、急停控制器)双挂到两条总线上,保证任何一路出问题都不影响这些设备被访问到。

2.2 波特率、采样点和位定时的计算

CANFD的波特率不是随便填的,它分成仲裁段和数据段两个部分。仲裁段负责发送 arbitration 和大部分控制字段,数据传输速率不能设置太高,因为远距离传输时信号反射和线缆延迟都会影响仲裁可靠性,一般取500kbps到1Mbps。数据段负责传输有效数据,线缆质量好、节点距离近时可以跑到5Mbps甚至8Mbps。

实际配置里,我们仲裁段用的是1Mbps,数据段用的是5Mbps。这里有一个容易犯的错:数据段速率太高时,每个节点的位定时参数如果没计算好,就会出现偶发错误帧。

CANFD的位时间由同步段、传播段和相位段组成。以数据段5Mbps、系统时钟40MHz为例,每个位时间分配到8个Tq(Time Quantum),同步段1个Tq,传播段2个Tq,相位段1和相位段2各2个Tq,还剩1个Tq用于寄存器配置时余量。这样采样点大约在75%处,处于比较安全的位置。如果用的是标准CAN,2Mbps以上时建议把采样点调到80%附近,能显著降低总线干扰导致的错帧率。

2.3 冗余切换机制:不能只是物理上“多一根线”

双CAN冗余最容易踩的坑,就是硬件上做了两路,软件却不知道怎么切。

我们最初的做法是:主CAN正常工作,从CAN始终处于静默监听状态,当主CAN连续多个周期没有心跳时,从CAN才接管。听起来没问题,但实际测试时发现一个问题:CAN是总线型拓扑,如果主CAN的收发器本身出了问题,不是“不发送”,而是“持续拉低总线”,那心跳信号会变得时好时坏,超时判定就会误动作。

后来改成双路心跳+双路接收的机制:每个节点周期性在两个CAN通道上都发送健康帧,健康帧里包含节点自身状态字和当前工作模式。接收方只要任一路健康,就认为节点正常;只有当两路都超时,才判定节点离线。同时,发送方要实时检测总线错误计数器(CAN控制器里的TX Error Counter和RX Error Counter),一旦错误计数超过阈值,就主动切换发送通道。这样切换是“有依据的切换”,而不是“猜着切”。

2.4 终端电阻、节点ID和帧ID规划经验

CAN总线终端电阻必须放在物理总线的最远端,而且必须是120欧姆左右,不能省。很多人调试时图省事只在一端接终端电阻,短距离测试看不出问题,一旦线长超过1米,波形反射就会导致偶发UDP(这里口误,应理解为偶发错误帧)和位错误。

节点ID规划上,我习惯按照部位分区:头部设备分配0x01到0x0F,躯干分配0x10到0x1F,左腿0x20到0x2F,右腿0x30到0x3F,臂部0x40到0x5F,安全系统单独占用0x70到0x7F。这样在总线上看ID就能立刻判断是哪个部位的数据,排障效率会高很多。

帧ID的分配则要结合CAN的优先级仲裁机制。CAN的ID越小优先级越高,所以急停帧、安全状态帧必须占据最低的ID段,比如0x001、0x002,绝对不能把普通传感器数据放在比急停还高的优先级上,否则总线拥堵时急停信号反而发不出去,这是安全设计里很基础但也很致命的一点。

3. CANWeb:让传统CAN设备“开口说”以太网

3.1 CANWeb到底解决什么问题

CANWeb不是一个全新的物理层协议,它本质上是在CAN应用层和以太网之间加了一层“网关+对象化数据模型”。你可以把它理解成给传统CAN总线配了一个翻译官:CAN那一侧继续用标准CANFD收发数据,以太网那一侧则向上提供统一的设备访问接口。

在没有CANWeb之前,调试一台人形机器人的传感器节点有多麻烦?你得在工控机上插一个USB-CAN适配器,打开专用的配置软件,一台一台地扫描CAN节点,手动设置波特率、节点ID、报文格式。节点多了以后,每改一个参数都得重新接线下发,效率很低。

而CANWeb的思路是让每个CAN节点拥有一个类似“寄存器地址”的对象标识,网关设备把整个CAN网络扫描到的所有节点、所有数据对象,统一映射成一个可访问的数据列表。通过以太网,工程师可以用网页、SNMP、Modbus TCP甚至OPC UA去读写这些对象,不需要关心底层CAN报文怎么组织。

3.2 在人形机器人里的组网位置

我们在系统中加了一台CANWeb网关设备,它的CAN口连接了双CAN总线的其中一路(用于监测和维护),以太网口则接到了千兆主干交换机上。

这样带来几个直接的好处:

  • 调试传感器节点时,我可以在工控机上打开Web页面,看到每一个CAN节点的在线状态、实时采样数据、固件版本,甚至远程修改节点参数,不需要拎着笔记本电脑钻到机器人底下找调试口。
  • 数据记录方便。CAN总线上的采样数据通过网关汇聚到以太网后,可以直接用Wireshark或者普通的数据记录软件存成PCAP或CSV,分析起来比传统CANalyzer脚本更顺手。
  • 和上层监控软件对接容易。机器人上层的状态监控界面通过Modbus TCP去读CANWeb网关里的对象,就能把电池电压、关节温度这些数据实时显示出来,不需要单独写一套CAN驱动。

3.3 与EtherCAT、千兆以太网的分工

很多人一开始会把CANWeb和EtherCAT搞混,觉得都是“把设备接进以太网”。实际两者的侧重点完全不同。

EtherCAT解决的是“实时控制面”的问题:它要求控制周期确定、同步精度高、报文在设备间飞行时被硬件处理,所有的努力都是为了“不丢帧、不抖动”。

CANWeb解决的是“非实时管理面”的问题:它更关心设备能不能被方便地发现、配置、监控、维护,对实时性要求低很多,但对灵活性、开放性要求高。

在千兆以太网这个主干上,这两者是可以共存的:EtherCAT主站独占一个物理网口或VLAN,保证实时性;CANWeb网关通过普通TCP/IP栈接入另一个VLAN,跑管理流量。两者互不干扰,这也是我们实战中用得比较顺手的一套组合。

4. EtherCAT从零到落地:主站、从站与XML配置

4.1 主站方案如何选:免费开源与商业方案对比

EtherCAT主站的选择,直接决定了开发效率和后期维护成本。做了几轮对比之后,我总结出三种典型路线。

第一种是TwinCAT或CODESYS这类商业方案。它们开箱即用,从站扫描、PDO映射、NC轴控制都是图形化界面,调试效率极高。缺点是需要Windows环境或专用运行平台,授权费用不低,而且对于一些定制化的调度需求,你很难深入底层控制。

第二种是SOEM(Simple Open EtherCAT Master)。这是纯C语言实现的轻量级主站,代码简单,容易移植到嵌入式Linux或者裸机环境。我们的工控机主站就基于SOEM改造,因为它够轻、够透明,出了问题能直接跟到源码里查。

第三种是IgH EtherCAT Master。它在Linux内核态运行,实时性比SOEM的用户态方案更好,适合需要硬实时控制周期的场景。代价是驱动开发复杂,和发行版内核的耦合度高,升级内核时经常要重新编译。

如果只是做功能验证,我个人建议先上SOEM,理由很简单:跑通流程最重要。等你把从站扫描、DC同步、PDO映射都理解透了,再根据实时性需求决定要不要换IgH或者上商业方案。

4.2 主站移植的实际步骤

以SOEM为例,在主控上移植EtherCAT主站的流程大致是这样:

第一步,确认网卡。EtherCAT对网卡有要求,尽量选择Intel I210、I350这类支持独立中断、驱动成熟、发送时间可控的千兆网卡。Realtek的网卡也能跑,但延迟稳定性差一些,高负载时容易出现周期抖动。

第二步,绑定网卡驱动。在Linux下,让EtherCAT主站直接访问网卡设备,而不是走标准网络协议栈。SOEM里会通过AF_PACKET或raw socket方式直接收发帧,所以需要先把该网卡从系统网络管理里摘出来,避免被NetworkManager等工具干扰。

第三步,扫描从站。主站启动后发送广播帧,总线上的每个EtherCAT从站会返回自己的厂商ID、产品码、站点别名等信息。这一步能看到整条拓扑的基本结构。

第四步,配置PDO映射。从站默认的映射关系未必符合你的控制需求,通常要在主站侧重新指定RxPDO和TxPDO。比如一个关节模组,RxPDO里要放目标位置、速度和力矩前馈,TxPDO里放当前位置、实际速度、电流和状态字。这个过程本质上是把应用层的数据结构对上从站内部的对象字典。

第五步,启动DC同步。分布式时钟是EtherCAT的杀手锏。主站会选择一个参考从站,让所有从站对齐到同一个时间基准。SOEM中通过初始化DC参数完成对齐,完成后从站的同步中断周期就会非常精确地触发。

第六步,跑通状态机。EtherCAT从站的状态机是INIT、PREOP、SAFEOP、OP四个状态,必须依次切换。PREOP阶段可以访问对象字典但还不能执行运动控制,SAFEOP阶段输入有效,OP阶段所有IO和控制都启用。主站要周期性检查所有从站的状态码,任何从站卡在某个状态都会导致整条链路无法进入OP。

4.3 从站侧开发:SSC与ESI/XML文件

如果你的设备不是现成的EtherCAT从站,而是要自己做一个,那就绕不开EtherCAT Slave Code(SSC)和ESI文件。

SSC是倍福提供的一个从站代码生成工具,可以根据你选的从站控制器芯片(比如ET1100、ET1200,或者FPGA里的ESC IP核),自动生成一套从站固件框架。生成时你可以配置支持多少个FMMU、多少个SyncManager、是否支持DC、PDO的默认映射等内容。生成的代码里包括了EEPROM初始化、ESC寄存器读写、应用层接口等基础模块,你要做的就是把关节控制算法或传感器采集逻辑挂进去。

ESI文件(也叫XML文件)是EtherCAT从站的“身份证”。主站扫描到设备后会读取这个XML,里面描述了厂商ID、产品码、对象字典、PDO映射、同步模式、看门狗参数等所有信息。很多从站调试问题都出在XML上:比如PDO方向定义反了、长度字节数不对、SM通道没配对,都会导致主站无法正确识别设备或使能后收发数据错乱。

用STM32加ET1100这类独立ESC芯片做从站时,STM32通过SPI或并行总线访问ESC内部的寄存器,ESC负责所有EtherCAT实时通信,STM32只需要响应SYNC0中断去读过程数据、做控制计算、写回输出即可。TI的F28P65这类带双CAN/CANFD、又能外扩并行接口的MCU,也适合做多协议从站,既能跑EtherCAT,又能同步维护CAN总线数据。

4.4 关节模组接入的常见坑

现在市面上很多一体化关节模组自带EtherCAT从站接口,接入起来相对省事,但也不是插上就能用。我总结出几个高频坑:

XML配置信息不一致。关节模组默认的XML文件里描述的PDO顺序,和模组固件实际发布的顺序一旦对不上,主站配置时不会报错,但运行起来数据全是乱的。所以拿到新模组的第一步,是用主站工具扫描一次,把扫描到的XML内容和厂家给的技术手册逐字段核对。

DC模式没选对。有些模组同时支持DC同步和FreeRun模式,如果主站没有给从站配置DC模式,模组就会按照自己的本地时钟自由运行,时间一长同步精度就会漂移。一定要在初始化时明确设置DC模式,并把这个参数固化到从站EEPROM里。

控制字和状态字的时序。EtherCAT的标准伺服控制流程,要求先通过控制字让驱动器经历“伺服使能”的一系列状态变化,从状态字中读回确认后,才能下发运动指令。很多人直接在OP状态下发位置指令,结果电机不动或者报跟随误差,就是因为没有走完使能和状态确认的握手流程。

看门狗超时设置太短。EtherCAT从站看门狗是防止主站掉线导致从站失控的机制,但如果设置太短,比如低于主站控制周期的2倍,稍微发生一次调度抖动,从站就会误判主站离线,触发急停。

5. 联调实战:Wireshark抓包、故障排查与性能优化

5.1 如何用Wireshark抓EtherCAT报文

EtherCAT不是一个普通应用层协议,它直接承载在以太网帧里,EtherType是0x88A4。所以在Wireshark里,你不需要对网卡抓包,只需要在连接EtherCAT主站和从站的链路上做端口镜像,或者在主站侧用tap方式抓包,然后设置过滤条件eth.type == 0x88a4,就能看到所有的EtherCAT帧。

抓包时重点看几个字段:工作计数器(WKC),它表示这个帧里的命令被几个从站成功执行了,如果WKC值和你预期的不一致,说明有从站没有正确响应;从站状态,看它当前停在INIT、PREOP、SAFEOP还是OP;以及是否有CRC错误,CRC错误说明物理链路有干扰或者线缆品质不行。

5.2 常见故障速查表

现象可能原因排查顺序
主站扫描不到从站网卡驱动问题、从站没上电、线缆接触不良先看网卡灯,再测线缆,再查从站供电
从站卡在PREOP进不了OPPDO映射不对、DC初始化失败、从站看门狗超时检查XML和PDO配置,看从站寄存器状态
运行中从站频繁掉线网卡中断优先级不够、控制周期太紧、电源波动抓包看CRC错误,检查电源纹波,放宽周期测试
CAN总线偶发错误帧终端电阻缺失、波特率不匹配、采样点设置不当示波器看波形,逐个节点排除
双CAN冗余切换误动作两路心跳不同步、错误计数器阈值太敏感调大超时冗余时间,关闭误报检测

5.3 一次真实的联调故障:千兆主干上的“掉线迷案”

我们曾经遇到过一个很难查的问题:系统运行十几分钟后,EtherCAT主站莫名其妙报从站丢失,但过几秒又自动恢复。一开始怀疑是网卡过热或者线缆松动,换了一堆硬件也没解决。

最后用Wireshark抓了一段时间的包,发现一个规律:从站丢失发生的时刻,正好和CANWeb网关上报数据的峰值时间重合。再往下查,发现CANWeb网关和EtherCAT主站在同一台交换机上,两者都跑在同一个VLAN里,CANWeb网关的广播数据包虽然不大,但在特定时刻会导致交换机缓冲区短暂拥塞,EtherCAT的周期帧被延迟了一下,从站看门狗就触发了。

问题的根子不在EtherCAT本身,而在网络规划。解决方案是把EtherCAT和CANWeb管理流量划分到不同VLAN,同时给EtherCAT主站网卡配了单独的CPU中断亲和性。改完之后,同样跑几小时都没有再出现过掉线。

这个案例给我的教训很深刻:混合总线架构里,总线的物理隔离和逻辑隔离同样重要。不是接了线就能共享一条网线,尤其是EtherCAT这种对实时性要求极高的协议,必须保证它独占一条“快车道”。

5.4 性能调优的正确顺序

EtherCAT系统出问题,很多人第一反应是改代码、调参数。我的建议是,严格按照“物理层、链路层、应用层”的顺序来排查。

第一步用示波器看EtherCAT物理层信号(也就是以太网差分信号)是否干净,看有没有大幅度衰减、过冲、噪声。如果物理层都不稳定,后面所有软件都是白调。

第二步用Wireshark抓包看链路层,确认帧有没有CRC错误、WKC是否正确、有没有丢帧重传。这能帮你快速定位问题到底出在主站网卡还是从站响应上。

第三步才是看应用层,PDO数据对不对、控制周期抖动大不大、DC同步误差有多少。

我见过一个团队折腾了整整一周,查应用层代码没查出来问题,最后发现是网线用了太长的跳线而且线序不对,导致信号反射严重。所以顺序很重要,别跳步。

6. 一点个人体会:先做减法,再做加法

这套混合总线方案并不是一开始就规划得这么完整,而是在样机迭代过程中一步步加出来的。最早我们也试过只用EtherCAT一种总线带所有设备,结果发现传感器节点成本高得离谱,而且安全逻辑和实时控制挤在同一条链路上,测试起来提心吊胆。后来才把CAN/CANFD重新引入,又因为调试维护太痛苦,才加了CANWeb网关。

如果你现在正在做人形机器人的控制系统选型,我的建议是:先把数据分类这件事做扎实——哪些数据必须高实时、哪些数据只是慢速状态、哪些数据只是调试参数,然后针对每一类去选总线。不要因为EtherCAT火就把所有东西都往它上面塞,也不要因为CAN传统就不愿意用它。

冗余这条线,一定要从一开始就考虑进去。等到机器人真跑起来再想加一套安全链路,结构上会非常被动,因为线束、供电、控制板都成型了,改造代价远大于一开始的规划成本。

最后分享一个小经验:不管用哪种总线,一定要保证每个节点都有唯一的标识和在线状态上报机制,并且把这些状态汇总到一个统一的面板里。人形机器人跟普通设备最大的区别是节点数量多、状态维度杂,你不可能靠一颗CPU轮询每一条总线去判断哪坏了。只有所有链路都能在网管层面被看透,这个系统才算真正可控。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询