
人形机器人的通信架构是这两年我身边做整机集成的朋友讨论最多、也最容易拍脑袋踩坑的地方。很多人一上来就问用EtherCAT还是CAN好像选对了唯一一种总线控制系统就稳了。但真把一台机器人从关节模组、传感器到运控板和AI工控机全部联调起来你会很快发现单一总线根本扛不下整机的通信需求。实际工程里更成熟的方案是把冗余双CAN/CANFD现场总线、CANWeb、千兆以太网、EtherCAT这几种不同特性的通信手段分层组合起来各自干各自最擅长的事。这篇文章就围绕这套组合方案把我在人形机器人控制系统里做总线选型、冗余设计、EtherCAT从站调试和整机联调时积累的实操经验拆开讲一讲希望能给正在搭机器人控制架构的同行省点弯路。1. 数据分流与层级拆分为什么一套总线扛不下全部通信需求1.1 人形机器人内部跑着几类脾气完全不同的数据人形机器人跟工业机械臂最大的区别就是它的数据种类和流量密度高出一个量级。我习惯把整机通信数据分成四类来看第一类是关节伺服数据。髋关节、膝关节、踝关节、手臂关节总共几十个自由度控制周期普遍在1kHz到8kHz单帧数据量不大但实时性要求极端严格。发给关节的是目标位置、速度、力矩和使能指令关节返回的是实际位置、速度、电流、温度和报警状态这类数据一帧通常几十个字节但对延迟抖动极其敏感。第二类是感知数据。激光雷达点云、双目相机图像、深度图这类数据单帧就到几百KB甚至几MB带宽需求极大但对实时性的要求反而不像伺服那么苛刻允许几十毫秒的传输时延。第三类是决策与AI数据包括上一级AI模块算出来的目标轨迹、遥操作指令、人机交互信息。这类数据带宽要求高时延要求中等但要保证不丢。第四类是调试与运维数据包括参数整定、日志回传、固件升级。这类数据对实时性几乎没要求但要求跨平台访问方便、吞吐稳定、能够批量操作。四类数据混在一起的时候任何单一总线都会非常尴尬CAN带宽不够跑图像EtherCAT虽然实时性好但拿它传点云很浪费普通以太网又难以保证伺服周期的确定性。所以从需求出发必须分层。1.2 各总线天然对症不同的病把几种总线放在一起对比特性差异其实非常清晰总线类型速率/带宽实时性与同步典型负载CAN最高1Mbps8字节帧硬件优先级仲裁确定性较好几十个关节周期刷新、传感器采集CANFD数据段最高8Mbps64字节帧继承CAN优先级机制帧效率更高数据量稍大的关节/传感器节点CANWeb基于CAN接入以太网/Web非实时面向管理与配置调试监控、参数标定、批量升级EtherCAT100M/1000Mbps分布式时钟DC纳秒级同步运动控制主干、多轴高精度同步千兆以太网1Gbps普通UDP/TCP确定性一般视觉图像、点云、AI计算交换数据这张表基本决定了它们在整机架构里的分工。CAN负责低成本和可靠性优先的节点EtherCAT负责实时联动千兆以太网负责吞吐CANWeb负责让CAN设备上云上平台做调试和产线运维。1.3 我实际采用的五层分工思路在完成数据分类和总线特性对比后我给机器人控制系统定的分层方法是控制骨架层关节数量多、同步要求高的腿部和手臂大关节走EtherCAT末端与传感层小关节、IMU、力传感器、环境传感器走冗余双CAN/CANFD感知决策层相机、激光雷达、AI工控机之间走千兆以太网运维管理层所有CAN设备的调试、参数配置、固件升级走CANWeb网关统一接入跨层时间基准以EtherCAT的DC分布式时钟作为全系统时间同步基准日志时间戳统一对齐。这不是为了追求架构复杂而是每类数据用最合适的手段运送整体可靠性反而比堆一堆同一个协议高得多。2. 冗余双CAN/CANFD关节层不能断的保底链路2.1 为什么很多关节模组没有全换EtherCAT前两年有厂商推过整机全EtherCAT的方案但实际落地并不普遍。原因有几个一是大量国产关节模组本身就是CAN或CANFD接口从模组层面全换EtherCAT需要换驱动板、改协议成本不低二是CAN总线在机器人这种多节点环境下有天然的优先级仲裁能力总线负载控制好以后非常可靠三是很多执行机构并不需要EtherCAT那么高的同步精度用CANFD就能满足。但CAN链路一旦出事后果比EtherCAT掉站更隐蔽。EtherCAT掉站时主站能立刻发现拓扑中断而CAN总线如果只是某根线接触不良、收发器损坏或者总线被干扰表现出来的是偶发丢帧、错误帧、甚至节点静默。关节如果没有收到新指令按旧指令继续运行瞬间就可能把机器人带偏。所以我在关键关节和传感器链路上做的是冗余双CAN/CANFD设计而不是单CAN到底。2.2 双CAN冗余的接线与切换逻辑冗余双CAN的工程实现主要有两种模式。一种是主备模式平时只有主通道在收发数据备用通道在线且持续检测主通道故障后切换另一种是双活模式两个通道同时收发同样的数据接收端按帧序号取优先有效的那个。我在关节层实际用的是双活模式。理由很简单人形机器人的关节控制周期一般是1ms红余切换必须做到亚毫秒级主备模式在切换瞬间的检测和仲裁时间可能吃紧双活模式天然无切换时间问题。具体做法分四步同一个控制周期里把关节指令封装成两帧相同序号的数据分别从CAN0和CAN1发送接收端同时接收两个通道的帧按递增序号和CRC校验决定采用哪一路数据如果某一路连续丢失N帧或者出现大量错误帧就把该通道标记为降级状态不再采用它的数据只让它继续发心跳探测降级通道恢复稳定后重新同步序号再切回双通道接收。这套逻辑听着不复杂但实测中很考验细节。最容易出问题的点在于双通道数据到达时间不完全一致接收端必须以先到且校验通过的帧为准否则序号错位反而造成更多的逻辑错误。我在代码里给每个关节节点加了一个序号窗口允许旧通道的帧在窗口内存在超出窗口直接丢弃避免脏帧污染。2.3 CANFD带来的提升和新的坑在关节数据量变大之后标准CAN的8字节帧确实不够用。比如一个带力传感器的高级关节需要同时回传位置、速度、电流、六维力和温度8字节根本塞不下得拆帧。CANFD把数据段提高到64字节速率最高可以到8Mbps一帧就能装下原来好几帧的内容对于这类节点非常友好。但CANFD速率上去之后工程上出现了一些CAN时代没踩过的坑。最典型的是信号完整性问题。CANFD的数据段速率高对线束的阻抗、分支长度、接插件质量、终端电阻都很敏感。我在一台原型机上遇到过CANFD偶发错误帧查了半天是关节内部线束的一个分支过长形成反射。后来统一要求CANFD走双绞屏蔽线每个节点分支尽量短终端电阻严格按两个60欧或一个120欧配置在物理末端而不是随便在某两个节点上各放一个。双冗余CAN/CANFD有一个额外的布线要求——两条通道尽量分束走线不要贴着大功率电机线。我开始图省事把CAN0和CAN1并排走电机大电流一切换两个通道同时被干扰冗余直接失效。后来把两条通道分开走并加强屏蔽层接地错误帧率才降下来。3. CANWeb给传统CAN加一层看得见、够得着的上位能力3.1 CANWeb到底解决什么问题为什么它不是替代品很多人第一次听到CANWeb会问这是不是用Web替换CAN其实不是。CANWeb本质上是一套把CAN/CANFD现场设备接入以太网和Web组态的通信方法把CAN总线数据映射成可以通过Web、上位机或云平台访问的资源。它解决的核心问题有三个第一传统CAN调试太难受。调试机器人时要看某个关节寄存器的值得接USB-CAN卡装厂商驱动打开专用上位机版本不对还可能连不上。而CANWeb把CAN报文翻译成HTTP、WebSocket或者MQTT这类通用协议浏览器打开就能看。第二参数配置和固件升级需要跨平台操作。人形机器人出厂之前要做参数标定、写入序列号、升级关节固件用传统CAN专用工具逐台操作效率非常低CANWeb网关可以把这些操作批量下发。第三CAN总线本身没有统一的应用层规范CANWeb相当于在CAN物理层和链路层之上提供了一套统一的节点寻址、数据映射和访问接口让整机所有CAN设备的管理方式一致。3.2 典型组网形态和我的实现方式我项目里的CANWeb组网形态是这样的CAN/CANFD关节和传感器节点连接各自的总线每段总线通过一个CANWeb网关接入千兆以太网。网关一方面作为CAN主节点周期性收发报文另一方面把CAN帧ID映射成数据点通过WebSocket或MQTT把数据发布出去。工作人员在上位机浏览器里订阅这些数据点就能实时看到整条CAN总线上所有设备的状态。下发参数时操作者在Web页面改好数值点保存网关把数据点翻译回对应的CANFD帧按优先级插入到CAN总线的发送队列中。这里有两个关键设计一是下行配置帧的优先级要低于实时控制帧避免参数下发那一刻抢占了正常控制周期二是网关要维护一份CAN节点ID与数据点索引的映射表方便机器人换关节模组后快速重新绑定。3.3 也不能把一切交给CANWebCANWeb虽然方便但在人形机器人控制系统里我始终把它放在调试、运维、参数下发这个层面不让它参与实时控制链路。原因很简单CANWeb网关的处理时延和以太网转发时延都不是确定性的一旦控制数据经过它就很难保证严格周期。另外通过CANWeb做固件升级时要格外小心先在单节点上验证升级包和升级时序再批量操作否则一条错误广播可能把整段总线上的关节全部刷进异常状态。我个人觉得CANWeb最大的价值是在量产阶段。机器人整机调试完成后产线上只需要把每台机器人的CANWeb网关接到工装网络通过一个部署在本地的Web服务批量写入校准参数、序列号和出厂测试项一台机器人的总线节点初始化从原来的半小时缩短到几分钟而且操作记录自动留痕。4. EtherCAT运动控制主干网从零搭建实操4.1 主站选型免费开源到商用PLC都有得选EtherCAT在人形机器人里最核心的价值就是做运动控制主干。腿部叫关节的同步性直接决定了机器人能不能稳定行走几个关节之间需要纳秒级同步和微秒级周期这正是EtherCAT的看家本领。主站软件是整个EtherCAT系统里第一个要定的东西。很多人以为主站一定很贵其实免费方案也完全能打主站方案运行平台适用场景能否商用SOEMWindows/Linux自研机器人控制器快速验证EtherCAT链路可以需关注其许可协议IgH EtherCAT MasterLinux嵌入式运控板跑Linux成熟稳定可以用户态/内核态双实现CODESYS多平台IDE基于PLC/PAC的机器人控制器商业授权汇川Easy521 Autoshop汇川PLC快速搭建EtherCAT控制关节模组demo商业授权上手最快如果用PLC方案汇川Easy521配合Autoshop软件控制EtherCAT关节模组是一条很快的路。Autoshop里直接扫描EtherCAT从站、加载ESI文件、配置PDO映射和DC同步不需要自己写主站代码非常适合前期验证关节模组本身好不好用。但整机量产后如果要跟自研运控算法深度集成我还是建议在嵌入式Linux上用IgH或SOEM控制自由度更高。4.2 从站侧SSC生成代码XML决定主站认不认识你做EtherCAT从站时绕不开两个东西SSCSlave Stack Code和XML也从站信息ESI文件。SSC是倍福官方提供的从站协议栈代码生成工具针对不同的从站控制芯片比如LAN9252、AX58100、ET1100生成对应的从站协议栈源码。生成的代码要集成到你的关节模组主控MCU里处理邮箱通信、过程数据对象、状态机转换这些事。很多刚开始做EtherCAT从站的人容易犯一个错——拿SSC生成代码之后直接编译烧录也不管从站控制器的硬件接口有没有真正跑通。我的建议是先做一个小工程用SSC生成最小从站代码搭配芯片官方的评估板把从站调到能上线、能进OP操作状态再谈上层逻辑。从站XML则是描述从站能力的文件。主站在扫描和配置从站时必须加载这个XML里面定义了从站有多少个SMSync Manager通道、PDO里有哪些对象、对象字典怎么分布。如果你买的关节模组是成品厂商会直接提供XML如果是自研从站XML需要自己写或用配置工具生成。实际联调里主站和从站XML不匹配是出现最多的问题比如主站按XML给从站配置PDO从站实际固件里根本没有这个对象就会导致配置失败。4.3 让一个关节模组从站真正动起来的过程从主站角度让一个EtherCAT关节模组转起来大致分五步建立主站和网卡绑定配置EtherCAT周期比如1ms或500us扫描总线拓扑加载各从站的XML主站会逐个读取从站信息并匹配ESI配置过程数据PDO映射把目标位置、目标速度、控制字等变量映射到发送PDO把实际位置、实际速度、状态字映射到接收PDO启动DC分布式时钟让所有从站的时钟同步到主站参考时钟将主站状态从INIT切到PRE-OP再切到SAFE-OP最终进入OP然后下发控制字使能关节给定目标位置/速度。每一步都有对应的调试方法。比如在SOEM里我用一个简单的扫描命令查看每个从站的当前状态和AL状态码如果从站停在PRE-OP进不了SAFE-OP通常就是PDO映射或者邮箱配置有问题AL状态码会直接指向错误原因。如果从站能进OP但一使能就报看门狗超时优先检查DC时钟同步是否开启、周期设置是否跟从站期望一致。4.4 基于F28P65和STM32的EtherCAT节点连接要点热词里F28P65和STM32跟EtherCAT的组合被频繁搜索这两个都是很常见的从站MCU选择。算F28P65的情况它常被用在电机控制、伺服驱动板上。F28P65本身不带完整的EtherCAT从站控制器实际工程里普遍的做法是外接EtherCAT从站控制器芯片比如LAN9252。连接关系是主控MCU通过SPI或并行接口对接LAN9252的从站接口LAN9252再接PHY芯片和RJ45网口。调试时最关键的几个信号是EtherCAT中断引脚SYNC0/SYNC1和DC中断它们决定从站能否在分布式时钟同步信号到来时精确执行电流环或位置环。TI官方有不少C2000 LAN9252的参考设计强烈建议直接照抄评估板原理图的SPI接口和PHY部分别自己重新设计否则光信号完整性就够吃一壶。STM32做EtherCAT从站也是类似的路线常见方案是STM32 LAN9252或者直接用集成ESC的单芯片方案。如果只是学习验证买个现成的STM32 EtherCAT评估板跑通一遍比从头画板效率高太多。我第一次调STM32 LAN9252时卡在SPI数据对齐上后来发现LAN9252的SPI模式和STM32的SPI极性配置必须严格一致参考手册里那一串寄存器配置一个都不能省。4.5 Windows下用Wireshark抓EtherCAT帧来排查问题EtherCAT调试里Wireshark是一个被低估的神器。Windows下抓EtherCAT帧其实很简单几个前提安装Npcap/WinPcap驱动把网卡设为混杂模式然后选择接EtherCAT主站的那块物理网卡抓包。Wireshark对EtherCAT有完整的协议解析不需要做额外解包。抓包能看什么第一看主站是否真的在周期性地发送帧。EtherCAT主站正常工作时会以控制周期不停发送寻址帧如果在抓包结果里什么都抓不到说明主站根本没跑起来。第二看从站是否正确响应。EtherCAT协议在处理完从站读写后会返回工作计数器WKCWireshark里可以展开每个从站报文看WKC的值如果收到的WKC不符合预期说明从站没有正确响应。第三看状态机切换过程中的错误码。从站从INIT到OP每一步都有明确的状态转换指令抓包里能清晰看到主站发的状态机变更请求和从站返回的AL状态。我遇到过一次整条EtherCAT链路偶发抖动的问题最后就是靠Wireshark长抓对比发现的某一次从站在进OP后持续返回一个无效邮箱协议的错误回查从站固件发现是邮箱超时处理逻辑写错了触发概率极低但一旦触发就掉站不抓包根本定位不到。5. 千兆以太网留给视觉点云和AI计算专属的高速巴士5.1 这几种数据必须走千兆以太网人形机器人的视觉感知数据量和AI计算对带宽的吞噬是CAN和EtherCAT完全养不起的。必须走千兆以太网的数据主要有四类深度相机/双目相机的图像流以左右目各1080P、30fps为例裸流就接近2Gbps即便用压缩和ROI截取几百Mbps也很常见激光雷达点云多线雷达一帧可能有几十万到上百万点每个点包含XYZ和反射强度一帧就是几MB遥操作场景的高清视频回传需要低时延大带宽AI推理服务器和运控板之间的目标轨迹、语义地图等中间结果虽然单帧不大但更新频率高累积流量可观。我在这类数据上从来不考虑EtherCAT。EtherCAT的优势是确定性和同步不是带宽。拿它传图像点云就像用高铁运快递每一件都准点但一次能运的件数有限成本还高。千兆以太网的作用是高速巴士一车拉走海量数据对到达时间没那么挑剔。5.2 千兆以太网在机器人系统里容易踩的坑千兆以太网用在办公网络上没什么讲究进了机器人的电磁环境就完全不是一回事了。我项目里踩过的坑包括网线走线离电机动力线太近机器人一运动网卡就频繁报RX错误链路速率直接掉到百兆。后来把网线换成工业级屏蔽线并且跟动力线保持至少10cm间距问题才消停。普通交换机在机器人上不可靠振动和温度一上来偶尔会丢端口。建议选工业级交换机顺便支持VLAN和QoS。UDP广播风暴会挤占控制链路。视觉模块用的自研通信如果对全网做广播EtherCAT虽然有自己的网段不受影响但CANWeb和调试通道会被拖慢。我把千兆网络按功能分成两个VLAN一个VLAN跑视觉和AI数据一个VLAN跑调试运维中间靠路由策略隔离。带宽需要做预算不然到联调后期就乱套了。我用一个非常粗略的公式来估算各相机的分辨率、帧率决定原始带宽乘上压缩比后加总再加上点云带宽和AI交互数据带宽整体不超过900Mbps千兆的90%且要留出突发余量。如果已经超过就要降低帧率、裁剪ROI或者把一路相机改成走USB接口分担而不是盲目堆高带宽设备。5.3 时间同步别忘了以太网侧也要对齐千兆以太网侧的相机点云要给运动控制用的话时间戳必须和EtherCAT的DC时钟对齐。我踩过一个大坑记录的视觉数据和关节数据各自都有时间戳但两个时钟源没有同步过后期做数据回放时关节轨迹和图像画面对不上整整浪费了一周去对齐。后来做法是运控板基于EtherCAT DC时钟生成全局时间戳并通过UDP广播给视觉主机视觉主机收到后把每个点云帧和图像帧打上这个全局时间戳再做对齐。这样后处理时利用每帧本身带的全局时间戳就能精确还原当时的关节状态和感知数据联调效率提高很多。6. 一张可抄作业的整体架构以及联调时最值得复盘的几个坑6.1 文字版的整机通信架构全景把前面几部分合起来我在人形机器人样机上实际采用的通信架构可以这样描述AI大脑层如Jetson或工控机通过两张千兆网卡分离内外网。一张接入视觉传感器和激光雷达通过UDP收点云和图像另一张连接CANWeb网关和调试交换机做参数下发和日志回传。实时控制层运控板上运行EtherCAT主站通过EtherCAT总线挂载腿部和手臂的大关节模组周期1msDC同步使能。实时控制层同时引出两路独立的CAN/CANFD接口形成冗余双通道挂载小关节、IMU和力传感器通道间互为热备。CANWeb网关挂在其中一路CAN总线上把整条CAN链路的设备数据映射成Web数据点供调试上位机、产线工具使用。全局时间源使用EtherCAT DC时钟由实时控制层生成时间戳报文经千兆以太网广播给视觉和调试主机。各总线在这个架构里责任到岗、互不抢道。EtherCAT保证关节同步CAN/CANFD保证传感器末端可靠千兆以太网保证感知数据吞吐CANWeb保证运维效率。6.2 联调阶段最值得复盘的四个问题第一CAN冗余不是接了两根线就有冗余。必须做注入式故障测试——用故障注入器直接短路某一通道观察另一通道能不能在100us内接管通信以及接管瞬间关节的抖动幅度。我见过不少号称做了冗余的机器人故障注入时从站直接静默几百毫秒还不如单CAN来得平稳原因往往是接收端逻辑没有处理好双通道间的竞争条件。第二EtherCAT掉站问题要从从站内部找原因。机型样机阶段腿部EtherCAT从站偶尔掉站重启后恢复。排查时先怀疑线缆换成屏蔽网线、加强接地后仍然偶发。最后是长抓抓包发现掉站前从站返回了邮箱超时错误码定位到从站固件里邮箱处理被一个中断抢占导致超时。这个问题不抓包根本定位不到也提醒我EtherCAT掉站不能只从物理层找协议栈和应用层中断优先级都得仔细审核。第三整机日志时间戳必须统一。刚开始CAN、EtherCAT、视觉各自打各自的时间联调时做数据回放完全对不上。改成全系统以EtherCAT DC时钟为基准之后复杂问题定位效率明显提升尤其是膝关节过载报警和视觉摔倒检测前后相差几十毫秒这类问题有统一时间戳很快就能还原因果关系。第四CANWeb的批处理功能要有限度。量产阶段批量下发参数确实方便但同时给三四十个关节下发参数时网关缓存和CAN总线带宽可能扛不住导致部分关节参数没写进去。后来给下发了任务加了进度回读和超时重发机制并且每批最多同时下发四个节点问题才解决。6.3 选型三问决定每个节点该挂在哪条总线上经历完整机联调之后我总结出一套简单实用的选型方法遇到任何一个新节点先问三个问题这个节点对时延和同步的要求有多严格如果要求微秒级同步挂在EtherCAT如果毫秒级周期就能满足挂在CAN/CANFD即可。它一次传输的数据量到底有多大超过几百字节的周期性数据优先考虑CANFD或千兆以太网如果把EtherCAT当CAN用浪费了它的同步能力还占带宽。这个节点坏了能不能容忍短暂停机核心关节必须挂在有冗余或有明确掉站保护机制的链路上传感器和调试类节点挂在普通通道就够没必要都堆到关键总线上去。这三个问题问完总线分工通常就清晰了控制靠EtherCAT可靠性与经济性靠冗余CAN/CANFD带宽靠千兆以太网运维靠CANWeb。不要被某一种总线很火绑架关键还是每个节点落在最适合它的链路上。我个人的习惯是给机器人新增任何一类节点的时候先写一段最小的验证代码把通信环完整跑通再往整机架构里接。这套分层多总线的架构我沿用了几台机器人样机目前已经没有再为通信架构本身操过心剩下的都是各节点自身的控制算法和机械问题。如果你也在做人形机器人的控制系统不妨照这个分层思路先在试验台上搭一套最小系统验证应该会比直接全盘照搬某一种所谓标准总线方案稳妥得多。