How google-deepmind/barkour_robot Works
作为商业平台(如波士顿动力公司的Spot)的开源替代品,其核心差异化优势在于它是由顶尖人工智能研究实验室(DeepMind)支持的一个完全开放的蓝图。它专为研究和对标动物级敏捷性而设计,并与现代机器学习训练栈(如MuJoCo/MJX)深度集成,为学术界和研究社区提供了强大的、可定制的实验平台。
Overview
作为商业平台(如波士顿动力公司的Spot)的开源替代品,其核心差异化优势在于它是由顶尖人工智能研究实验室(DeepMind)支持的一个完全开放的蓝图。它专为研究和对标动物级敏捷性而设计,并与现代机器学习训练栈(如MuJoCo/MJX)深度集成,为学术界和研究社区提供了强大的、可定制的实验平台。
一个开源的机器人研究平台,旨在通过提供一套完整的硬件设计、固件、软件和模拟环境,帮助研究人员构建和实验高敏捷性的四足机器人,从而降低先进机器人研究的门槛。
Barkour 是一个极少见的“端到端四足机器人平台开源交付物”:同时给出 CAD、PCB、线束、装配指南以及双核执行器控制固件和 EtherCAT 上位机示例,作为研究与原型平台的性价比极高(见 README.md)。但它并非面向商业量产:硬件/文档资产为非商业许可、固件更新缺乏强安全校验、上位机 EtherCAT 依赖特权与内核模块维护,都会在产品化阶段形成实质性阻碍(见 README.md、bootloader.cc、docs/ethercat_config.md)。因此,建议将其定位为“参考设计与研究基线”,若要商用需投入明确的工程化改造预算与合规重构。
把它当作研究基线使用可以,但若任何商业化目标存在,必须先解决非商业许可与安全更新/运维安全三件事,否则会在合规与现场可靠性上踩雷。
How It Works: End-to-End Flows
从零开始组装一台完整的Barkour机器人
该流程描述了一名工程师或爱好者如何从一堆零散的部件开始,最终组装成一台功能完整的、准备通电的机器人。用户首先需要根据项目提供的顶层物料清单(BOM)采购所有必需的机械件和电子元器件。然后,他们将遵循详细的、图文并茂的子组件组装指南,例如先独立组装12个腿部执行器,并完成腿部连杆的装配。接下来,用户会将主板、电源板等PCB组件安装到机器人的躯干中,并参照电缆接线图将所有组件(执行器、传感器、电池接口)连接起来。最后,安装机器人的头部(无论是固定式还是可动式),完成整个物理组装过程。这个流程的核心是可复现性,确保任何人都能制造出与设计标准一致的物理实体。
- 使用主物料清单采购所有零部件
- 根据指南组装执行器和腿部等子组件
- 在机器人躯干中安装所有PCB电路板
- 使用电缆图纸连接所有组件
- 完成头部和外壳的总装
首次上电、系统配置与验证
这是机器人组装完成后的关键“首次启动”流程。操作员首先需要遵循严格的安全规程(检查急停开关)为机器人接通电源。接着,在作为控制主机的电脑上,按照文档指引安装EtherCAT主站软件,包括编译和加载特定的内核模块。配置完成后,需要将主站服务绑定到一块专用的网卡上。最关键的一步是为总线上的每一个物理电机驱动器分配一个固定的逻辑别名,以确保软件能正确地控制每一个关节。最后,通过命令行工具验证所有驱动器(“从站”)都已成功识别并处于待命状态,标志着机器人已准备好接收控制指令。这个流程是一次性的关键设置,为后续所有软件操作奠定基础。
- 执行安全上电程序
- 在主机电脑上安装和配置EtherCAT软件
- 将物理电机驱动器映射到逻辑关节别名
- 验证所有驱动器都已在总线上正常通信
开发、编译、部署并运行一个新的控制策略
这是研究人员的核心工作循环。首先,研究人员会在自己的电脑上修改C++代码,例如实现一个新的行走或跳跃算法。修改完成后,他们使用项目提供的Bazel构建系统来编译代码,这会为每个执行器的双核处理器生成新的固件二进制文件,并为上位机生成控制程序。接下来,通过固件升级流程,将新编译的固件无线或有线地刷写到所有执行器中。固件更新完成后,研究人员运行他们的上位机控制程序。该程序通过实时EtherCAT通信,以高频率向执行器发送力矩指令并接收传感器数据,从而在物理机器人上验证新算法的效果。这个流程实现了从代码到机器人实际动作的完整闭环。
- 在本地修改固件或主机应用程序的C++代码
- 使用Bazel构建系统编译所有软件
- 将新编译的固件刷写到执行器
- 运行主机应用程序,通过实时循环控制机器人
诊断并恢复无响应的执行器
这是一个典型的维护和故障排查流程。当操作员发现某个关节没有响应时,他们首先通过`ethercat slaves`命令确认是哪个执行器在总线上处于错误状态。首选的恢复方法是尝试软件复位,即运行一个特定的命令行工具,在不关闭机器人电源的情况下远程重启该执行器。如果软件复位无效,则表明可能存在固件损坏。此时,操作员需要启动固件升级程序,将该执行器的闪存完全擦除,并重新刷写一份已知正常的固件。刷写完成后,重启机器人,并再次检查该执行器是否恢复正常通信。这个分级处理的流程旨在以最小的代价和操作复杂度来解决现场问题。
- 在EtherCAT总线上识别出处于错误状态的执行器
- 尝试使用专用工具进行远程软件复位
- 如果软件复位失败,则启动固件更新流程,重新刷写固件
- 重启并验证执行器是否已恢复正常
Key Features
机器人硬件平台与组装
提供制造Barkour机器人所需的完整、开源的硬件规格。这包括可编辑的CAD模型、PCB电路板设计、一份全面的物料清单(BOM)以及详细的、图文并茂的逐步组装说明。其目标是使任何研究人员或实验室都能可靠且可复现地从零开始构建一个物理机器人。整个设计强调模块化(例如,执行器作为独立的子组件),以简化构建过程和后续维护。
- PCB设计与制造包 — 【设计策略】 为了确保设计迭代的灵活性和制造过程的标准化,硬件资产被明确分为两类: 1. **设计源文件**:作为唯一的事实来源,使用行业标准的Altium Designer格式(.PcbDoc, .SchDoc)。所有电气和布局的修改都必须在这些源文件上进行。 2. **制造交付包**:从源文件生成的、供制造商直接使用的标准化文件集(Gerber、NC钻孔文件、贴片坐标文件等)。 【业务逻辑】 - **Step 1: 设计迭代**:工程师在Altium项目中修改原理图(.SchDoc)或PCB布局(.PcbDoc)。 - **Step 2: 版本控制**:将修改后的源文件提交到版本控制系统,以记录所有变更。 - **Step 3: 生成交付物**:设计完成后,从Altium中导出一整套用于制造和组装的文件,并将其存放在项目的“Project Outputs”目录中。 - **Step 4: 交付制造**:将“Project Outputs”目录中的文件(而非源文件)提供给PCB制造商和组装厂。
- 电缆线束设计与图纸 — 【设计策略】 采用“代码即图纸”的思路,使用基于文本的YAML格式(WireViz规范)来定义所有电缆线束的连接关系、连接器型号和线材规格。这种方法将电缆设计从图形绘制软件中解放出来,使其易于版本控制和自动化处理。 【业务逻辑】 - **Step 1: 定义线束**:工程师在YAML文件中,通过文本描述定义一条线束的两个端点、每个端点使用的连接器以及引脚之间的连接关系。 - **Step 2: 复用组件库**:WireViz的组件库(library.yaml)预定义了常用连接器的外观图像,确保生成的图纸风格一致。 - **Step 3: 生成图纸**:使用WireViz工具将YAML源文件渲染成人类可读的PNG或SVG格式的接线图。 - **Step 4: 用于组装**:在组装时,技术人员参考生成的PNG图纸进行线束的制作和连接。
- 分层物料清单(BOM)管理 — 【设计策略】 为了同时满足采购部门的宏观规划和产线的具体装配需求,系统采用两级物料清单(BOM)结构。 【业务逻辑】 - **Step 1: 顶层主BOM**:在项目根目录提供一个CSV格式的主BOM文件,包含构建完整机器人所需的所有元器件(包括机械件、电子件、螺丝等)的总量。这是采购部门进行批量采购的主要依据。 - **Step 2: 单板BOM**:在每个PCB项目的制造交付包中,都包含一个由EDA工具生成的、针对该电路板的详细BOM(Excel格式)。它列出了该板所需元器件的精确型号、封装和贴装位置(参考设计ators)。 - **Step 3: 对账与执行**:采购时参考主BOM进行下单。在SMT贴片或手动焊接时,产线人员参考单板BOM以确保元器件被正确放置。当两者出现不一致时,需要人工介入进行核对确认。
- 逐步机械组装指南 — 【设计策略】 提供一套基于流程图和大量实际照片的模块化组装指南,将复杂的机器人组装过程分解为一系列更小、更易于管理的子任务。 【业务逻辑】 - **Step 1: 流程概览**:首先提供一个高级别的组装流程图,让组装者了解各个子组件(如执行器、腿部连杆、躯干)的装配顺序和依赖关系。 - **Step 2: 子组件组装**:为每个关键子组件(如单个腿部执行器)提供独立的、详细的组装文档。 - **Step 3: 图文并茂**:每个步骤都配有高清的实际照片,清晰地展示了所需零件、安装方向、使用的工具和最终的组装效果。 - **Step 4: 最终总装**:在所有子组件完成后,一份总装指南将指导如何将它们整合为完整的机器人。
执行器固件与控制系统
这是运行在每个执行器双核处理器上的嵌入式软件,是机器人的“神经系统”。它负责管理机器人的所有实时功能,从安全的系统启动、通信协议处理,到高频率的电机力矩控制。固件实现了行业标准的DS402驱动控制接口,执行精确的磁场定向控制(FOC)算法,并支持安全的在线固件升级。整个设计优先考虑安全性、确定性和实时性能。
- 双核安全启动与运行时环境 — 【设计策略】 采用主从核协作的启动模式,确保系统能以可预测和安全的方式初始化。主核(M7)负责配置系统级资源并唤醒从核(M4),从核专职于实时控制任务。 【业务逻辑】 - **Step 1: M7核优先启动**:系统上电后,M7核首先启动。它负责配置关键系统时钟、内存保护单元(MPU)和CPU缓存。 - **Step 2: 共享数据准备**:M7核从特定内存地址读取芯片的唯一ID,并将其复制到两个核都能访问的共享内存区域中,供M4核后续使用。 - **Step 3: M4核唤醒**:M7核完成初始化后,通过硬件信号量(HSEM)机制向处于停止模式的M4核发送一个唤醒信号。 - **Step 4: M4核初始化**:M4核被唤醒后,首先修正其中断向量表(VTOR)的地址,确保中断能被正确处理,然后创建其实时操作系统(FreeRTOS)任务。 - **Step 5: 任务分离**:M4核上的任务负责高频的电机控制和EtherCAT通信,而M7核则可以处理较低优先级的辅助任务。
- 标准化的DS402驱动控制状态机 — 【用户价值】 采用工业控制领域的成熟标准,使机器人执行器能被任何支持CANopen/EtherCAT的上位机软件轻松集成和控制,同时保证操作的安全性。 【设计策略】 严格遵循CiA 402驱动行规,将复杂的电机控制抽象为一个有限状态机。上位机通过发送一个16位的“控制字”来命令状态机在不同状态(如“准备”、“使能”、“故障”)之间切换。 【业务逻辑】 - **Step 1: 解析控制字**:固件接收到上位机的控制字后,根据其特定位的组合(如bit0=Switch On, bit2=Quick Stop, bit3=Enable Operation)解析出用户的意图命令。 - **Step 2: 执行状态转换**:状态机根据当前状态和收到的命令,判断是否是合法的转换。例如,不允許从“关闭”状态直接跳转到“运行”状态,必须先经过“准备”和“使能”状态。 - **Step 3: 执行状态动作**:进入每个状态后,固件会执行相应的硬件操作,例如,在“使能”状态下给电机供电,在“运行”状态下开始接收力矩指令。 - **Step 4: 故障处理**:如果在任何步骤中检测到硬件故障或接收到非法命令,状态机将立即进入“故障”状态,并切断电机电源,确保安全。只有在收到“故障复位”命令后才能恢复。
- 磁场定向控制(FOC)与传感器处理 — 【设计策略】 采用磁场定向控制(FOC)算法,通过数学变换将对三相交流电机的控制简化为对两个直流分量的控制,从而实现对电机力矩的快速、精确响应,这对于高敏捷性运动至关重要。 【业务逻辑】 - **Step 1: 传感器数据采集**:在高频控制循环中,固件读取编码器以获取电机转子位置,并读取分流电阻上的电流以获取三相电流值。 - **Step 2: 坐标变换(Clarke和Park)**:固件使用Clarke变换将三相电流(ABC坐标系)转换为两相正交的静止坐标系(α-β坐标系)。然后,结合转子位置信息,使用Park变换将其转换为与转子磁场同步旋转的坐标系(d-q坐标系)。 - **Step 3: PID控制**:在d-q坐标系中,q轴电流与力矩成正比。一个PID控制器根据上位机发送的目标力矩(换算为目标q轴电流)与当前实际的q轴电流之间的误差,计算出需要施加的d-q轴电压。 - **Step 4: 逆向变换与PWM输出**:计算出的d-q轴电压通过逆Park和逆Clarke变换,转换回三相电压指令,最终通过脉宽调制(PWM)信号驱动电机。
- 双闪存区域(Dual-Bank)安全固件升级 — 【用户价值】 实现在不中断机器人运行的情况下,安全地更新执行器固件。即使更新过程中断电,也不会导致设备“变砖”,因为旧版本固件始终保留。 【设计策略】 利用MCU硬件支持的“双闪存区域”功能。系统运行时从一个区域(例如Bank 1)加载固件,而固件更新则写入另一个空闲的区域(Bank 2)。 【业务逻辑】 - **Step 1: 准备更新**:上位机发送“准备更新”命令,固件收到后开始擦除非活动闪存区域(Bank 2)。此期间,机器人仍正常运行在Bank 1的固件上。 - **Step 2: 流式写入与校验**:固件以小数据块(例如32字节)为单位,接收新的固件镜像。每写入一个数据块,立即读回并与原始数据进行比对,确保写入无误。如果任何一个数据块校验失败,则中止更新。 - **Step 3: 激活新固件**:当整个新固件镜像都成功写入并校验后,上位机发送“激活”命令。固件执行一个简单的完整性检查(如检查镜像起始地址非空),然后设置一个特殊的硬件寄存器,指示MCU在下次复位后从Bank 2启动。 - **Step 4: 重启生效**:当机器人被重启后,硬件会自动从Bank 2加载并运行新的固件,完成升级。
- 异步诊断日志 — 【设计策略】 为了在不影响高频实时控制循环的前提下,能够输出大量的诊断日志,系统实现了一套异步日志记录机制。 【业务逻辑】 - **Step 1: 日志缓冲**:当控制代码中调用日志输出函数时,日志信息并不会立即通过串口发送,而是被快速写入一个内存环形缓冲区中。 - **Step 2: 后台任务发送**:一个独立的、优先级较低的实时操作系统(RTOS)任务,会定期检查该缓冲区。当发现有新的日志时,它负责将日志内容通过串口(UART)发送出去。 - **Step 3: 溢出安全回退**:如果日志产生的速度过快,导致环形缓冲区被写满,系统会自动切换到同步模式。此时,新的日志将阻塞地、直接通过串口发送,以保证关键的错误信息不会丢失,尽管这会暂时影响实时性能。
上位机控制与通信
提供在主机(例如笔记本电脑或机器人板载的NUC)上运行的软件组件,用于与机器人的所有执行器进行通信和控制。它采用工业标准的EtherCAT协议,以实现确定性的、高频率的实时通信。该模块包括详细的主机环境设置指南,以及一个供开发者使用的API库,用于发送控制命令和接收遥测数据。
- 实时EtherCAT主机控制栈 — 【设计策略】 提供一个抽象的、生命周期明确的API,用于管理与EtherCAT总线的交互。该API将一次性的配置阶段与高频的实时循环阶段严格分开,简化了上层控制应用的开发。 【业务逻辑】 - **Step 1: 连接与配置**:应用程序首先调用“连接”函数初始化与EtherCAT总线的通信。然后,为每个需要实时交互的执行器注册其所需的周期性数据(PDO),例如目标力矩和实际位置。 - **Step 2: 启动循环**:调用“启动循环操作”函数,此时主机栈会锁定资源并激活与所有已注册执行器的周期性数据交换。 - **Step 3: 实时控制循环**:在一个由应用程序负责维持的、固定周期的循环中(例如每毫秒一次),依次调用 `PreCycle()`(接收数据)、`WritePdo()`/`ReadPdo()`(读写数据)、`PostCycle()`(发送数据)。 - **Step 4: 停止与断开**:控制结束后,调用“停止循环操作”和“断开连接”函数,以安全地释放资源。
- EtherCAT主机环境配置 — 【用户价值】 为开发者提供一套在标准Linux系统上从零开始搭建EtherCAT主控制环境的明确指引,解决复杂的内核模块和网络配置问题。 【设计策略】 采用基于开源EtherLab Master的方案,通过一系列命令行操作来编译、安装和配置所需的内核模块与用户空间工具。 【业务逻辑】 - **Step 1: 安装依赖**:安装Linux内核头文件和编译工具链。 - **Step 2: 编译与安装**:下载EtherLab Master源码,配置并编译内核模块和用户态库,然后进行安装。 - **Step 3: 绑定网络接口**:修改配置文件,将EtherCAT主站服务绑定到一块专用的物理网卡上(通过MAC地址指定)。 - **Step 4: 配置权限**:设置udev规则,允许非root用户访问EtherCAT设备,方便开发和调试。 - **Step 5: 启动与验证**:启动EtherCAT服务,并使用命令行工具(`ethercat slaves`)来验证是否已成功发现总线上的所有执行器设备。
- 逻辑关节到物理设备的映射 — 【用户价值】 解决机器人上关节的物理接线顺序与软件中逻辑关节名称(如“右前腿膝关节”)不一致的问题,防止因配置错误导致机器人做出危险的错误动作。 【设计策略】 利用EtherCAT的“别名寻址”功能,为每个物理设备(按其在总线上的位置,如0, 1, 2...)分配一个固定的、有意义的数字别名(如1至12)。上层软件始终使用这些逻辑别名来寻址关节。 【业务逻辑】 - **Step 1: 识别物理位置**:使用 `ethercat slaves` 命令查看总线上每个执行器的物理位置索引。 - **Step 2: 查阅映射表**:根据文档提供的物理位置到逻辑别名的映射表。 - **Step 3: 分配别名**:为每个物理位置的设备,使用命令行工具 `ethercat alias -p <物理位置> <逻辑别名>` 来分配别名。 - **Step 4: 验证**:再次运行 `ethercat slaves`,确认所有设备的别名都已正确设置且没有冲突。
- 远程电机驱动器复位工具 — 【用户价值】 当某个执行器在总线上无响应或处于错误状态时,提供一种无需物理接触或关闭整个机器人电源即可尝试恢复的软件手段。 【设计策略】 开发一个独立的小工具,它绕过正常的EtherCAT主站服务,直接通过原始套接字(raw socket)向目标设备发送底层的EtherCAT命令,以触发其硬件复位引脚。 【业务逻辑】 - **Step 1: 停止主站服务**:为避免冲突,必须先停止正在运行的EtherCAT主站服务。 - **Step 2: 授予权限**:由于需要访问网络底层,必须使用 `setcap` 命令为该复位工具授予 `CAP_NET_RAW` 权限。 - **Step 3: 执行复位**:运行该工具,并指定要复位的设备所在的网络接口。 - **Step 4: 重启主站服务**:复位完成后,重新启动EtherCAT主站服务,并检查设备是否已恢复正常。
开发者工具链与构建系统
一套基于Bazel的、全面的跨平台构建系统,用于管理所有软件依赖,并编译用于双核ARM处理器的固件以及主机端的Linux应用程序。其目的是为开发者提供一个可复现的、确定性的方式来构建、测试和打包Barkour生态系统中的所有软件组件。
- 双核固件统一编译 — 【设计策略】 利用Bazel构建系统的“配置转换(transition)”功能,使得同一个源码目标可以根据不同的编译需求(为M4核或M7核编译)应用不同的配置,从而生成两个定制化的产物。 【业务逻辑】 - **Step 1: 定义自定义规则**:创建一个自定义的Bazel规则(例如 `m4_binary`)。 - **Step 2: 应用配置转换**:在这个规则内部,定义一个“转换函数”,该函数会动态修改构建图的配置。例如,为M4核的编译设置特定的CPU型号(`-mcpu=cortex-m4`)、浮点运算单元(FPU)选项,并指定应包含的库(如在M4上包含EtherCAT协议栈,而在M7上不包含)。 - **Step 3: 简化构建命令**:开发者只需在BUILD文件中声明一个目标,然后通过不同的构建命令(如 `bazel build //...:m4.elf` 和 `bazel build //...:m7.elf`),即可从同一份源码生成两个为不同核心优化和配置的二进制文件。
- 跨平台工具链管理 — 【用户价值】 确保团队中所有开发者,无论使用Linux还是macOS,都能使用完全相同版本的编译器和工具进行构建,从而消除“在我机器上可以运行”的问题。 【设计策略】 在Bazel的WORKSPACE文件中,显式声明并配置项目所需的所有工具链及其确切版本。 【业务逻辑】 - **Step 1: 固件工具链**:指定用于编译ARM固件的GCC工具链(`arm-none-eabi-gcc`)的特定版本(例如10-2020-q4),并提供其下载地址。 - **Step 2: 主机工具链**:指定用于编译主机端程序的Clang工具链的特定版本,并通过CIPD(一个二进制包管理工具)进行分发。 - **Step 3: 自动拉取**:当开发者第一次运行Bazel构建时,系统会自动下载并解压这些指定版本的工具链到本地缓存中。 - **Step 4: 确定性构建**:所有后续的编译操作都将使用这些缓存好的、版本固定的工具链,保证了构建结果的确定性。
- 一体化依赖项管理 — 【设计策略】 采用“代码即依赖”的方式,在Bazel的WORKSPACE文件中,将所有外部代码库(如Pigweed、FreeRTOS、STM32 HAL库)作为源码依赖项进行管理,并锁定到特定的Git提交哈希或压缩包URL。 【业务逻辑】 - **Step 1: 声明依赖**:在WORKSPACE文件中,使用 `git_repository` 或 `http_archive` 等规则来声明一个外部依赖,并指定其代码仓库地址和精确的commit ID或sha256校验和。 - **Step 2: 自动获取**:Bazel在构建时会自动克隆或下载这些指定版本的依赖项到共享的缓存目录。 - **Step 3: 封闭式构建(Hermetic Build)**:由于所有依赖项的版本都被锁定,构建过程不再受外部环境变化的影响,实现了高度的可复现性。任何依赖的升级都需要在WORKSPACE文件中进行显式修改。
- ELF到二进制文件的转换与打包 — 【设计策略】 创建一个自定义的Bazel规则,将标准的编译产物(带有调试信息的ELF文件)转换为微控制器烧录所需的原始二进制格式(raw binary)。 【业务逻辑】 - **Step 1: 编译生成ELF文件**:正常的编译流程会生成一个包含代码、数据以及调试符号的ELF格式文件。 - **Step 2: 自定义规则转换**:一个名为 `elf_bin` 的自定义规则被调用,它会从工具链中找到 `objcopy` 工具。 - **Step 3: 执行转换**:该规则使用 `objcopy` 命令,并附带 `-Obinary` 参数,从ELF文件中剥离所有非程序数据,只保留可直接写入闪存的机器码和数据,生成一个 `.bin` 文件。 - **Step 4: 分别使用**:`.elf` 文件可用于支持符号的调试器(如GDB),而 `.bin` 文件则用于生产环境的批量烧录工具。
Core Technical Capabilities
基于Bazel配置转换的确定性多核固件构建
Problem: 如何在一个统一的代码库中,为复杂的双核(Cortex-M4/M7)微控制器进行编译,同时确保每个核心获得截然不同的优化参数、库依赖(例如,EtherCAT协议栈仅在M4上)和实时系统配置,而无需维护两套独立且容易分叉的构建脚本?
Solution: 该项目利用了Bazel构建系统的“配置转换(transition)”特性来解决此问题。\n- Step 1: 定义一个自定义的Bazel规则(如`m4_binary`),该规则内部包含一个转换函数。\n- Step 2: 当Bazel处理到这个规则时,该转换函数会动态地修改应用于其依赖项的构建配置。例如,它会强制设置编译器标志为 `-mcpu=cortex-m4`,并启用一个名为`has_ethercat`的特性标志。\n- Step 3: 在底层库的BUILD文件中,可以根据这些特性标志(如 `select` 语句)来包含或排除特定的源文件或依赖项。\n通过这种方式,开发者可以用一个命令(如`bazel build //...:m4.elf`),让Bazel自动地为M4核应用一套配置;用另一个命令(`bazel build //...:m7.elf`),应用另一套配置,但两者都源自同一份源码,保证了代码的一致性和构建的确定性。
Technologies: Bazel, Bazel Transitions, Cross-Compilation, ARM GCC
Boundaries & Risks: 该方案的实现对开发者的Bazel知识水平要求较高,复杂的转换逻辑被封装在`.bzl`文件中,对于不熟悉Bazel的开发者来说理解和修改的门槛较高。错误的转换逻辑可能导致难以调试的编译错误或运行时问题。
通过CiA DS402标准状态机实现的安全电机控制
Problem: 如何通过网络安全地控制一个大功率的机器人执行器,既要防止因错误指令导致的危险动作(如突然施加最大力矩),又要确保其能与工业标准的控制软件兼容?
Solution: 固件实现了一个严格遵循CiA 402驱动行规的状态机。\n- Step 1: 抽象输入:上位机控制器只需发送一个16位的“控制字”作为指令。\n- Step 2: 状态机解析:固件内的状态机会解析这个控制字的特定比特位,将其翻译成明确的命令,如“开机”、“使能”、“快速停止”或“故障复位”。\n- Step 3: 强制状态转移:状态机逻辑严格限制了状态之间的跳转路径,例如,必须先从“就绪”状态进入“使能”状态,然后才能进入“运行”状态,杜绝了直接从“关机”到“全速运行”的危险操作。\n- Step 4: 故障安全:任何时候检测到硬件故障、或收到不符合当前状态的命令,状态机都会立刻强制进入“故障”状态,并切断电机电源以确保安全。
Technologies: CiA DS402, EtherCAT, CANopen, Finite State Machine
Boundaries & Risks: 此方案的安全性依赖于上位机控制器能正确发送控制字并管理状态。一个行为异常的上位机仍可能引发问题。此外,标准的严格性有时会给实现一些非标准的、高性能的特殊控制模式带来额外的复杂性。
基于双闪存区域的可靠固件更新
Problem: 如何为机器人上的数十个执行器进行固件升级,同时确保在升级过程中(例如,因断电或通信中断)失败时,设备不会被“刷成砖”,从而保证系统的可用性和可维护性?
Solution: 该方案巧妙地利用了现代微控制器普遍支持的双闪存区域(Dual-Bank Flash)硬件特性。\n- Step 1: 在线运行:机器人正常工作时,所有执行器都从一个闪存区域(例如Bank 1)加载并运行固件。\n- Step 2: 写入备用区域:当发起固件更新时,新的固件镜像会被写入到另一个当前未被使用的闪存区域(Bank 2)。此过程是流式的,固件被分成小块写入,并且每写完一块就立刻进行数据校验,保证写入的准确性。在此期间,Bank 1的固件仍在正常运行。\n- Step 3: 原子化切换:当整个新固件镜像被成功写入Bank 2后,上位机发送一个“激活”命令。固件收到后,会设置一个特殊的硬件寄存器,指示MCU在下一次复位后,将启动区域从Bank 1切换到Bank 2。\n- Step 4: 重启生效:在方便的时候对机器人进行重启,硬件会自动从Bank 2加载新的固件。由于切换是硬件层面的原子操作,并且旧固件始终保留在Bank 1,因此升级过程非常安全。
Technologies: Dual-Bank Flash, Firmware Over-The-Air (FOTA), Bootloader
Boundaries & Risks: 激活新固件需要一次重启,因此并非严格意义上的“零停机”更新。最大的风险在于,当前的实现只对新固件做了非常基础的完整性检查,缺乏对整个镜像的加密签名验证。这理论上允许一个被篡改或损坏的镜像被激活。此外,最终的重启操作需要由外部系统来触发。
基于版本控制的可复现硬件制造流程
Problem: 如何确保世界各地的不同研究团队或制造商,能够独立地制造出在物理和电气性能上完全一致的机器人?如何有效管理一套包含CAD模型、PCB设计、电缆图纸和物料清单的复杂硬件设计文件?
Solution: 项目的代码仓库被组织成一个完整的、可交付的制造数据包,并建立了清晰的规范。\n- Step 1: 严格分离源文件与交付物:仓库明确区分了可编辑的“设计源文件”(如用于PCB的Altium项目,用于电缆的WireViz YAML文件)和从源文件生成的、只读的“制造交付物”(如Gerber文件、PNG图纸、贴片文件)。\n- Step 2: 源文件是唯一真理:所有设计变更都必须在源文件上进行,并通过Git进行版本控制,确保所有修改都有迹可循。\n- Step 3: 交付物用于生产:制造商和组装厂只接收和使用“制造交付物”文件夹中的内容。这避免了因工具版本不一致或误操作源文件而导致的生产错误。\n- Step 4: 统一物料清单:一份顶级的物料清单(BOM)提供了采购机器人所有部件的统一入口,简化了采购流程。
Technologies: Altium Designer, Gerber, WireViz, Bill of Materials (BOM)
Boundaries & Risks: 该体系依赖于商业EDA工具(Altium),这可能对没有该软件许可的团队构成壁垒。仓库中没有包含自动化脚本来从源文件重新生成交付物,这意味着可复现性在一定程度上依赖于工程师的手动操作和特定的工具版本。顶层BOM和每个PCB的单板BOM之间可能存在差异,需要人工核对来解决。
Technical Assessment
Business Viability — 2/10 (Community Driven)
研究价值很高,但非商业许可与运维/安全缺口决定了它更像参考平台,不适合直接拿来做商业产品。
该仓库的定位是 DeepMind 发布的研究级四足机器人平台交付物(机械、电气、装配文档、固件与低层控制示例),对高校/研究机构和机器人研发团队有明确需求(见 README.md)。但硬件与多数非软件材料采用 CC BY-NC(非商业)许可,天然限制了直接商业化复用空间;更适合作为“参考设计”和研究基线,而非可直接售卖的产品资产(见 README.md 许可证说明段落)。此外,上位机 EtherCAT 运行依赖内核模块与特权操作,意味着要做成商业产品需额外工程化封装与运维体系(见 docs/ethercat_config.md)。
Recommendation: 若用于内部研发/研究:可直接采用其硬件与固件作为基线,优先在仿真与台架上验证控制链路,再逐步替换为自家安全与运维方案。若考虑商业化:不要直接依赖 CC BY-NC 的硬件/文档资产,建议以“学习/参考”为主并重建可商用的设计与供应链文件。若考虑投资/合作:价值更多在“技术与人才品牌/论文影响力”,而非可直接变现的软件许可或可复用商业 IP。
Technical Maturity — 3/10 (Creative Approach)
工程底座扎实但安全更新与运行时失效保护不足,更适合研究与原型,不宜直接当生产固件。
固件整体呈现出较强的工程化:双核启动协调、FreeRTOS 静态任务、Pigweed 基础设施、EtherCAT 与 DS402 状态机、以及较完整的测试基建与构建系统(见 actuator/firmware/barkour/m4/main_m4.cc、m7/main_m7.cc、common、WORKSPACE)。但若以“量产级机器人/执行器控制器”标准衡量,存在若干关键缺口:固件更新缺少端到端真实性验证(仅做非常弱的空镜像检查),以及上位机周期实时与安全退化策略主要留给调用方实现(见 actuator/firmware/barkour/common/bootloader/bootloader.cc、actuator/ethercat_host/ethercat_host.h)。此外,部分错误处理采取永久阻塞/自旋等方式,现场可恢复性与诊断能力不足(见 m4/main_m4.cc 与 m7/main_m7.cc 的错误处理与等待逻辑)。
Recommendation: 适合场景:研究、实验室原型、算法验证、以及作为 EtherCAT/伺服驱动的参考实现。避免场景:面向外部客户的量产设备、需要合规安全更新/威胁模型的产品、或需要强实时与完备失效保护的机器人。若要走向生产:优先补齐安全更新(签名/版本门控/整镜像校验)、实时循环监控与 failsafe、以及启动与异常恢复策略。
Adoption Readiness — 2/10 (Requires Expertise)
不是即插即用;需要跨硬件、嵌入式与 EtherCAT 的专家团队才能稳定落地。
仓库覆盖硬件制造、装配、上位机 EtherCAT 环境、固件构建与刷写,信息量充足但对团队能力要求高:需要硬件供应链、装配工艺、Linux 内核模块维护、EtherCAT 调试与嵌入式开发的复合能力(见 README.md、docs/ethercat_config.md、hardware/electronics)。上位机侧配置大量依赖特权命令与系统级改动,难以直接“交给非专家操作员”稳定运行(见 docs/ethercat_config.md)。同时,工具链与依赖版本固定,初次拉起会面临较大的环境一致性与下载成本(见 WORKSPACE、.bazelrc)。
Recommendation: 团队准备:至少配备嵌入式固件工程师、EtherCAT/实时 Linux 工程师与硬件工程师,并建立标准化装配与验收流程。部署策略:将 EtherCAT 配置、别名映射、复位工具等封装为受控脚本/服务,降低“手工操作”风险。若希望更易用:增加 CI、提供一键环境引导与默认 Bazel 配置,并把硬件版本选择从改代码升级为构建参数。
Operating Economics — 2/10 (Moderate Cost)
能用但运维偏重,内核模块维护与现场故障恢复会把成本推高。
运行成本主要来自三块:其一,上位机 EtherCAT 依赖内核模块与系统级维护,遇到内核升级需重编译/重装,带来运维停机与人工成本(见 docs/ethercat_config.md)。其二,固件更新与错误处理策略偏“实验室可用”,一旦出现现场故障可能需要更高的人力介入排查与恢复,增加支持成本(见 actuator/firmware/barkour/common/bootloader/bootloader.cc、m4/main_m4.cc、m7/main_m7.cc)。其三,构建系统依赖固定版本工具链与外部依赖下载,首次/清理构建对网络与时间有消耗(见 WORKSPACE)。
Recommendation: 若规模化运行:冻结内核版本或使用受控系统镜像,避免频繁触发 EtherLab 重建;把特权操作收敛到最小范围并做权限隔离。对现场维护:补齐安全更新与健康监测,减少“需要工程师到场”的概率。对构建与交付:增加依赖镜像/缓存与 CI,降低每次环境重建的隐性成本。
Architecture Overview
- 机械与电气设计资产层
- 提供完整的机械 CAD(外部 Onshape 链接)、电子电路与 PCB 工程源文件(以 Altium 为主)以及制造输出(Gerber、钻孔、STEP、贴片坐标、分板 BOM 等),目标是让团队能直接复刻或改版硬件;但对专有 EDA 工具依赖明显(见 hardware/electronics)。
- 嵌入式控制固件层
- 以 STM32H755 双核(M7+M4)为核心,M4 偏实时电机控制与 EtherCAT 从站栈,M7 负责系统启动协调与辅助功能;运行时基于 FreeRTOS,并通过 Pigweed 提供日志、断言与系统初始化等基础设施(见 actuator/firmware/barkour/m4、m7、common)。
- 现场总线与伺服“驱动人格”层
- 在固件侧集成 EtherCAT 从站栈与 CiA DS402 状态机,把上位机的标准控制字/状态字映射为安全的上电、使能、急停与故障处理动作,便于用工业常见协议驱动执行器(见 actuator/firmware/barkour/common/ds402_state_machine.cc 及 M4 EtherCAT 相关目录)。
- 上位机控制与调试工具层
- 提供面向 Linux 的 EtherCAT 主站示例与抽象接口,基于 EtherLab(IgH 主站)实现 PDO 域映射与周期循环接口;并提供电机驱动器复位工具,便于实验室调试与恢复(见 actuator/ethercat_host 与 docs/ethercat_config.md)。
- 固件更新与引导层
- 实现双 Bank 更新流程:先擦除非活动 Bank、分块写入并读回校验、再发起 Bank 交换,下一次复位后启用新镜像;当前实现更偏“可用的研究工具”,而非面向对抗攻击的生产级安全更新(见 actuator/firmware/barkour/common/bootloader)。
- 构建系统与依赖管理层
- 采用 Bazel 统一构建固件与上位机工具,包含 ARM GCC 与主机 Clang 工具链配置,并把 Pigweed、STM32CubeH7、SOES 等作为依赖引入,以获得可复现构建;但工具链版本固定且缺少默认构建配置与 CI(见 WORKSPACE、.bazelrc、actuator/firmware/barkour.bzl)。
Key Strengths
从零复刻四足机器人所需的端到端交付物
少见的“硬件+固件+装配”一体化参考平台,能把机器人项目启动周期大幅缩短。
User Benefit: 团队可以在一个仓库里获得机器人复刻所需的关键资产:机械设计入口、PCB 设计源文件与制造输出、线束图、装配指南以及固件与上位机示例。这显著降低“从论文到硬件”的落地门槛,让研究项目更快进入可重复实验与数据采集阶段(见 README.md 与 docs/、hardware/ 结构)。
Competitive Moat: 这种端到端交付物往往需要长期的硬件迭代、装配经验沉淀、以及软硬件联合调试积累;对竞争者而言不仅是写代码,更是供应链与验证体系的构建,通常需要数月到一年级别投入。
工业级现场总线驱动执行器的参考实现
为多执行器机器人提供了可借鉴的 EtherCAT 控制链路样板。
User Benefit: 通过 EtherCAT 与 CANopen-over-EtherCAT 的对象模型,上位机可以用标准化方式对执行器下发命令并读取遥测数据,降低了自研通信协议的集成风险,尤其适合多关节系统的统一调试与扩展(见 actuator/ethercat_host/ethercat_host.h 与固件侧 EtherCAT/DS402 相关实现)。
Competitive Moat: 把现场总线、PDO 映射、周期循环接口与执行器状态机打通,需要同时理解工业协议与嵌入式实时控制,且要覆盖大量边界情况与调试工具链,复制成本明显高于普通应用代码。
双核控制器启动可靠性与可诊断性的工程样板
把双核启动与中断路由这些“坑”用可读代码固化成了参考答案。
User Benefit: 双核系统常见问题是启动顺序与中断向量配置导致的“偶发不启动/难调试”。该项目展示了由一个核心协调启动、另一个核心等待唤醒,并处理向量表偏移等问题的实践路径,有助于降低硬件 bring-up 难度(见 actuator/firmware/barkour/m4/main_m4.cc、m7/main_m7.cc)。
Competitive Moat: 双核 MCU 的启动与中断路由问题高度平台相关,通常需要反复试错与硬件验证;这类经验性工程资产对后来者具有直接复用价值。
可现场更新的双 Bank 固件升级路径参考
提供了“不断电覆盖式刷机”之外更安全的 MCU 固件更新参考流程。
User Benefit: 提供擦除非活动 Bank、分块写入、读回校验、再切换 Bank 的更新流程,使团队能在不直接覆盖当前运行镜像的情况下进行升级,降低实验阶段的刷写风险(见 actuator/firmware/barkour/common/bootloader/bootloader.cc 与 memory_interface.h)。
Competitive Moat: 在资源受限 MCU 上把更新流程抽象成统一接口并与平台驱动结合,需要对闪存特性、写入对齐、回滚策略与系统重启序列有经验;虽然可复制,但比普通功能开发更费时。
Risks
非商业许可导致无法直接用于商业产品 (Commercial Blocker)
README 明确说明:软件采用 Apache 2.0,但“所有其他材料”采用 CC BY-NC(非商业)许可。这意味着 CAD、PCB、装配文档、线束图等关键制造与交付资产在商业化使用上存在许可限制。
Business Impact: 如果目标是量产/销售机器人或基于该设计提供商业服务,可能直接触发合规风险(无法合法使用或必须重新获取授权/重做资产),导致项目在法务审核阶段被卡死或被迫返工。
固件更新缺少真实性校验可能被恶意或错误镜像“刷死”设备 (Commercial Blocker)
引导程序在启用新镜像前仅检查新 Bank 的两个地址处 32 位字不等于全零或全一,未体现签名验证、版本门控或整镜像哈希校验等机制(见 bootloader.cc 的基础检查与随后执行 Bank 交换)。
Business Impact: 一旦更新链路被误操作、传输损坏或遭遇攻击,设备可能启动失败甚至批量“变砖”,在机器人场景还可能引入安全与责任风险,显著提高现场维护与召回成本。
EtherCAT 运维需要特权操作带来主机安全与误操作风险 (Commercial Blocker)
EtherCAT 安装与运维流程包含大量系统级改动与特权命令(安装/重建内核模块、修改系统目录、设置 udev 规则、为复位工具授予原始网络能力并停启 EtherCAT 服务等)。
Business Impact: 在共享实验室或多操作员环境中,特权工具链会扩大攻击面,也更容易因误操作导致整条总线中断;商业部署通常需要更严格的权限隔离与可审计运维流程,否则难以通过安全评审。
固件写入接口缺少地址边界与分块一致性约束导致刷写不稳定 (Scale Blocker)
更新接口允许传入任意写入地址与长度;底层写入契约是固定 32 字节写入,但更新逻辑仅检查长度非零、且未在该层体现对长度等于 32、对齐、以及地址属于可写区域的硬性限制(写入与校验在同一流程中执行)。
Business Impact: 当刷写工具或传输分包出现异常时,可能发生越界写入或写入/校验长度不一致,导致设备进入难以恢复的状态,制造与现场升级的人工成本会显著上升。
上位机实时循环缺少内建监控与安全降级策略导致运动不稳定风险外溢到应用层 (Scale Blocker)
上位机 EtherCAT 抽象接口要求调用方以稳定周期调用循环前后处理,并强调需要实时性约束,但接口本身不强制调度、无截止时间监控、也未体现当周期抖动/丢周期时的统一 failsafe 行为。
Business Impact: 当系统负载波动、CPU 抢占或 IO 抖动发生时,控制周期不稳可能导致机器人运动质量下降甚至触发故障;如果每个应用各自实现安全逻辑,质量会不一致,扩展到多机部署后支持成本会迅速放大。
专有 EDA 工具依赖导致硬件迭代成本与扩张速度受限 (Scale Blocker)
PCB 工程源文件为 Altium 格式,意味着修改原理图/PCB 与再生成制造输出通常需要 Altium 环境与许可证;仓库未体现替代格式或转换工作流。
Business Impact: 没有 Altium 授权的团队将难以快速改版与排错,硬件迭代需要额外购买工具或外包,影响进度与成本;规模化协作时也更容易形成供应商依赖。
启动与异常路径存在“永久等待/自旋”导致现场不可恢复的停机 (Notable)
双核启动流程包含等待条件与错误处理自旋:M4 会进入低功耗等待被另一核心唤醒;两侧也存在错误处理函数进入无限循环的行为,失败时缺少明确的恢复策略与降级路径。
Business Impact: 当初始化条件不满足或出现硬件边界问题时,设备可能表现为“无响应”,需要人工干预(断电、重刷、硬件检查),拉高实验室排障时间与现场返修概率。
DS402 控制字边沿识别疑似缺陷影响故障复位可靠性 (Notable)
状态机根据控制字生成命令并试图做故障复位的上升沿识别,但实现中对“当前控制字存储值”的更新时机存在不一致迹象,可能导致故障复位命令被重复触发或边沿识别不按预期工作。
Business Impact: 上位机期望一次性故障复位时,设备可能出现反复复位/进入异常状态,导致调试和恢复时间增加,影响机器人可用性。
跨核共享内存缺少一致性与同步约定会引入隐蔽的数据错误 (Notable)
共享内存仅以固定地址常量形式定义,并在启动阶段由一侧写入(例如写入芯片唯一标识),但未体现缓存一致性维护、并发访问同步或协议化握手规则。
Business Impact: 随着共享数据从少量字扩展到状态/遥测结构体,可能出现偶发的“读到旧数据/脏数据”,导致诊断、身份识别或遥测上报出现间歇性错误,排查成本高且影响系统可信度。
异步日志在缓冲耗尽后永久降级为同步输出可能影响实时性 (Notable)
日志系统在缓冲区耗尽时会关闭异步模式并切换为同步输出,且该切换是单向的(溢出后不再自动恢复异步)。这会把日志量与实时性能绑定在一起。
Business Impact: 在高日志量或异常风暴期间,控制环可能因为阻塞式输出而抖动,导致运动质量下降甚至触发故障;现场排障时往往正是日志最密集的时刻,风险更高。
硬件版本选择被固化在编译常量中增加多版本维护成本 (Notable)
构建配置中存在硬件版本、编码器类型、电机类型等硬编码常量,缺少标准化的构建参数化选择机制。
Business Impact: 当存在多个硬件修订或供应链替代器件时,需要改代码或维护分支来生成不同固件,容易造成版本混乱与交付错误,影响扩产与现场维护效率。
工具链版本固定且偏旧会带来长期维护与安全补丁压力 (Notable)
构建依赖固定版本的 ARM GCC(较早发布周期)以及固定标签的主机 Clang 工具链,升级需要手工修改依赖配置,缺少自动更新与验证链路。
Business Impact: 当出现编译器缺陷、安全修复或平台兼容性变化时,升级成本会集中爆发;对长期维护的机器人系统而言,这会增加持续工程成本与发布风险。
缺少默认构建配置导致新团队上手成本与一致性风险增加 (Notable)
根目录的 Bazel 配置文件为空,意味着常用构建参数、默认平台与工具链选择缺少统一入口,新团队容易因参数不一致产生“能编译但行为不同”的问题。
Business Impact: 增加入门成本与跨团队协作摩擦,影响研发效率;在需要可复现交付时也更难固化标准构建流程。
关节别名映射与物理位置不一致易导致错误驱动并引发安全事故 (Scale Blocker)
文档显示 EtherCAT 设备物理总线顺序与逻辑关节编号存在置换关系,需要通过一系列命令手工设置别名;若配置错误会导致控制指令发送到错误关节。
Business Impact: 轻则设备无法工作,重则出现“错误关节动作”造成机构损坏或人员安全风险;在多机、多批次部署时会成为规模化运营的高频事故源。
EtherLab 内核模块升级/重建依赖导致系统更新策略受限 (Notable)
文档明确提示内核升级后可能出现模块不匹配,需要删除并重建 EtherCAT 相关目录再重新安装,表明该依赖对操作系统更新高度敏感。
Business Impact: 降低系统补丁/升级的自动化程度,导致维护窗口与停机成本上升;对长期运行的机器人系统不利。




