- 本文主要面向人形机器人行业的专业人士,正文一万八千字。建议读者先阅读到第3.1.1节(三千四百字),再根据个人判断,决定是否看后续内容。
- 本文由笔者(并非人形机器人业内人士)在多方学习的基础上独立创作。限于检索资料的范围,笔者不声称所述技术思想是本人原创。任何先于本文公开发布的、与本文部分内容相同或相近的技术信息的原创者,享有更优先的知识产权。
- 请读者从实用主义的角度看待本文所述技术思想,若有想法/问题/质疑,欢迎留言、私信、微信交流。
笔者于2023年12月在知乎、CSDN发布了一篇技术文档 -- 《在实用化人形机器人研发流程中深入应用FPGA技术的流程图(基于工信部《人形机器人创新发展指导意见》)》(以下简称《流程图》,并将其在业内广泛传播。文档之中虽然就所涉研发流程给出了具体的描述、丰富的说明,但对于不了解FPGA技术的人形机器人研发团队、相关决策者来说,其表述仍偏于抽象,有可能成为做出实质性决策的主要障碍之一。因此,笔者基于多年来在FPGA应用领域的实践、近年来在机器人领域的学习(没有实践),结合《流程图》的内容,针对实用化人形机器人的控制系统,以深入应用FPGA技术为指导思想做了一个框架设计,提供一个具象化的设计实例、参考技术方案,协助各研发团队及相关决策者了解这一技术思路的价值。进而,笔者希望读者将这个框架设计与《流程图》结合起来进行分析、思考,希望:进一步降低将FPGA深入应用于人形机器人在纯粹技术维度上的门槛;助力更多正在人形机器人领域参与竞争的团队 -- 及时做出实质性决策,及时将更多资源分配到深入应用FPGA技术这一竞争维度。注:本文所说的“深入”应用FPGA,是相对于已有的、将FPGA应用于工业机器人伺服电机的驱动及反馈控制(可能也用于实现关节轨迹点插值)的方案而言的。大约在9年前,采用此类方案的工业机器人产品就已经面世。
1、特斯拉Optimus-Gen2人形机器人的硬件系统配置
设计人形机器人控制系统,最好能有一个现成的机器人本体硬件系统作为基础(如《流程图》中间通道第3个步骤所述)。笔者未曾物理接触过人形机器人,目前在网上能找到的、技术信息最丰富的人形机器人是特斯拉的Optimus-Gen2,本文将基于它的硬件系统展开相关论述。Optimus-Gen2的硬件系统共有52个主动驱动的自由度,每个自由度需要一个电机加以驱动,各部位的电机数量如下表所列(合并参考资料1、2的内容)。基于参考资料1、2中的分析、统计,这些电机分为两类:位于两侧手部的22个空心杯电机,位于其他部位的30个无框力矩电机(分别用于16个旋转关节、14个直线关节)。这两类电机的基本驱动-反馈控制原理都与永磁同步电机类似(参考资料3、4),即,基于SVPWM-逆变器的电机矢量驱动、电流-速度-位置三环嵌套PI控制。所以,在后续的设计、分析中,为简化表述,将这两类电机统称为电机,都采用相同的、基础版本的驱动-控制机构。网上目前找不到Optimus-Gen2的传感器数量统计结果,已经明确具备的有:30个磁致伸缩力传感器,每个无框力矩电机配备1个(参考资料1,结合参考资料2所述,其数量可能略有减少),具体分布见上表;分别位于两侧腕部、踝部的4个一体式六维力/扭矩传感器(参考资料2);至少52个编码器,每个电机至少配备1个,具体分布见图1;进而,笔者估计,为了实现自身平衡,Optimus-Gen2必须感知本体在运动过程中的3D加速度、角速度。所以,安装于躯干内的至少一个IMU(惯性测量单元)是必须的。并且,为了在站立状态下确定脚的位姿(实用化应用场景中的地面未必水平、稳固)从而为各肢节的位姿解算提供更准确的起点,也为了在迈步过程中更好地控制迈出脚的姿态以减轻脚在落地时刻所受的冲击力,每只脚的内部应该配备了一个IMU芯片。为了使双手能执行精确度较高的、依赖于局部位姿感知的任务,或许每个手掌里也配备了一个IMU芯片。同时,考虑到特斯拉在视觉感知技术领域的独特优势,Optimus-Gen2必定装备了至少1个视觉传感器(探测可见光或红外光),并且很可能装备了RGB-D这类能测距(尤其是基于结构光的近场测距,类似于大黄蜂扫车换壳的那种)的视觉传感器,或许还有相应的距离-速度传感器(例如FMCW激光/毫米波雷达)与视觉传感器协同工作。在各电机及其控制系统中,霍尔元件、电流测量、IPM内置的故障报警电路也属于传感器的范畴。另外,监控CPU、FPGA的温度要用到温度传感器,考虑到适应具体的应用场景,Optimus-Gen2可能配备了更多温度传感器。在后续设计中,将有侧重地考虑上述各种传感器的应用。2、深入应用FPGA的人形机器人控制系统设计思路
基本设计思路如《流程图》的注1所述:将人形机器人视为一个多入多出的反馈控制系统,针对实现工信部《人形机器人创新发展指导意见》所要求的以应对真实场景下的复杂环境与任务、应对突发情况为特征的实用化人形机器人功能需求,在基于CPU+软件体系结构的人形机器人控制系统之中涉及多通道并行处理且需精准协同、强实时性(低延迟量+低延迟抖动量,下同)、大运算量、大数据传输量且构成实时性性能瓶颈的环节中导入FPGA。即,FPGA承担所有强实时性的外围任务,使CPU可以专心致志执行强实时性的高层次算法。- 在系统层面,本文以《人形机器人创新发展指导意见》强调的感知-运算-控制(电机驱动)反馈控制回路为主线,运用FPGA作为“胶合逻辑专用户”(参考资料5)的传统艺能,发挥FPGA在数据灵活调度与片内/片间数据高性能传输方面的优势,针对数据传输带宽瓶颈以及传输延迟管理进行全局统筹规划、细节优化(如参考资料9注2第4自然段所述),将FPGA作为连接感知子系统与运算子系统、连接运算子系统与控制子系统的中介,简化芯片间互联,以提高数据传输效率、降低数据传输延迟、减少远距离走线数量、降低数据传输的综合成本,同时尽可能将运算CPU从繁杂的数据传输任务中解脱出来,使其能将更多资源用于完成高层次运算任务。
- 在感知环节,发挥FPGA功能灵活、多个功能低延迟精准协同并行运行、引脚丰富的优势,将其作为管理各种传感器的核心,进而对来自传感器的多路信息进行汇总、预处理,尽可能将运算CPU从繁杂的数据采集任务、初级感知算法任务中解脱出来,使其能将更多资源用于完成高层次运算任务。
- 在运算环节,发挥FPGA内置大量并行运行的运算资源(乘法+加法+累加运算的硬件模块、RAM块、寄存器)且功能极其灵活、用硬件直接实现算法、存储器访问模式高效、运算模块与数据传输模块在芯片内实现紧耦合的优势,将其作为运算CPU的协处理器,分担后者的一部分运算任务,使其能以更好的实时性完成高层次运算任务。
- 在控制环节,发挥FPGA功能灵活、多个功能模块低延迟精准协同并行运行、引脚丰富的优势,将其作为管理各个执行器(当前仅考虑电机)的核心,借用已经很成熟的基于FPGA的伺服电机控制方法,实现高性能的控制子系统。
在表述方式上,本文以 “感知-运算-控制”反馈控制回路为主线,将人形机器人控制系统的软-硬件功能划分为多个子系统-模块,以系统框图的形式分色予以表述,进而以框图为索引,定性描述各子系统-模块的基本功能及彼此之间的协作关系,使读者在深入应用FPGA技术的人形机器人控制系统的功能、结构、运行方式、重要特性等方面获得一个清晰的总体概念。[注:本文将多次提到“体系结构”这个关键词汇,其定义是:为实现所要求的目标、功能而针对组织及硬件进行的设计(参考资料8)。按照笔者的理解,CPU+软件体系结构的核心特征是:单个/少量运算核心以通用的流程依次读取级联映射的多级存储器中的指令与操作数、解码指令并串行执行以实现算法功能;FPGA体系结构的核心特征是:大量分布式硬件资源直接读取单级存储器中的操作数、并行运行、用个性化硬件结构直接实现算法功能。]3、深入应用FPGA的人形机器人控制系统框架设计
如图2所示,以各主要芯片为核心,控制系统在硬件上划分为5个部分:运算CPU(及其最小系统、周边的辅助功能器件,下同)、工控CPU(及其最小系统、周边的辅助功能器件,下同)、躯干内置FPGA及相关的测量-控制器件、双手手掌内置的两片FPGA及各自相关的测量-控制器件。以上主要芯片之间的互联,不需要借助于任何通信协议芯片。空间布置方面,在躯干内,建议将运算CPU与躯干内置FPGA一并布设在背板上,两者之间以PCIe总线、GPIO连线在PCB上布线直连;工控CPU专用一个插卡;30组IPM以及适合集中布置的电机相关器件置于插在背板插槽中的各个插卡上。当然,如果用一块尺寸不超限的、便于向外引线的PCB就能以可接受的器件/飞线互扰而安放所有这些器件,肯定是最理想的方案。进而,基于具体的职能,图中将5个子系统(系统管理、感知、运算、控制、芯片间数据实时传输)按照橙、浅蓝、红、绿、深蓝予以着色,以方便读者理清模块之间的协作关系,降低决策者做出实质性决策在纯粹技术维度上的门槛。3.1.2 基于FPGA解决Optimus-Gen2灵巧手腕部走线困境3.1.2.1 Optimus-Gen2灵巧手腕部的走线困境Optimus-Gen2每只灵巧手包含很多感知、驱动设备,包括,5指指腹的触觉感知器,11个主动自由度(参考资料2)各自对应的IPM+电机+编码器+霍尔传感器+力/力矩传感器,22个电流传感器(2相法测3相,很可能与ADC集成、可以多路共用输出数据线),可能存在的IMU。如果只在躯干设置单一的运算-控制核心,在运算-控制核心与上述器件之间将存在大量导线,即使把IPM置于主控芯片附近、不考虑动力线对信号线的干扰,从IPM到11个手指驱动电机的动力线就有33根;如果将IPM置于手掌内部,则从运算-控制核心到IPM的PWM脉冲信号线就有66根。另外,还应考虑IPM控制/告警、电机抱闸、编码器输出、霍尔传感器输出、力/力矩传感器输出、IMU输出等信号,即使其中一部分可以共用I2C总线(易受干扰),也要再多出来几十根信号线。因此,在实用场景下,如果仅在躯干设置单一的运算-控制核心,则在肩/肘/腕部位的物理空间内(由仿人皮肤及组织包裹、塑形,例如机械姬里的丹妮丽丝)将既汇集多个机械、测量部件又需要穿行大量导线,而且需要分别在这3个部位的3/1/3个自由度上做大幅度的运动,致使线束的外径、刚度、磨损防控需求与走线空间、关节的运动幅度需求产生尖锐的矛盾,各条走线所受周边环境(包括机体内环境)的干扰、彼此之间的串扰也将难以处理,这就是所谓的走线困境。其中,尤以腕部为甚。如图2下半部分的虚线框所示,以位于手掌中的一片FPGA为核心,实现上述运算-控制核心在手掌部位的大部分功能,仅以少量串行差分信号线对实现手掌内置FPGA、躯干内置FPGA之间的强实时性信息交换,再以后者为中介,实现手掌内置FPGA所控制的感知-驱动设备与运算CPU之间的强实时性主线信息(传输在感知-运算-控制这一反馈控制环路主中的信息)交换、与工控CPU之间的非实时性管理信息交换。具体而言,FPGA能并行且灵活地执行大量强实时性、强时序耦合的大运算量任务,并且能提供大量用户I/O引脚,因而可以以15x15mm(CSG324)的本体芯片平面区域占用而独力(不需要外置内存、芯片组)实时执行11个电机的轨迹点插值及其基于SVPWM-逆变器的三环反馈矢量控制算法,并且以点对点的、基于差分信号(抗共模干扰)的高速串行通信实现与躯干内置FPGA的全双工强实时性数据交换,并且为相关感知、驱动信号出入FPGA提供引脚。同时,将配置FPGA所需的串行FLASH(基本上不参与实时运行)挪到下臂空间内,再将11片IPM(典型尺寸12x12mm)、1片IMU(典型尺寸5x4mm,图3中按照7.5x6mm)一并挤进手掌空间内(PCB只能在手掌厚度方向上与11个包含电机-编码器-力/力矩传感器的关节驱动机构重叠放置),单面平面布置如图3(真实比例)所示,其中,手掌内部空间的平面尺寸为78x90 mm。如此,在手腕部位就只需穿行少量串行差分信号线、SPI(FLASH用)线路、电源线、地线,问题得以解决。3.1.2.3 待确认的问题:布线、电磁兼容、散热从手掌内置FPGA引出的数字量信号线有一百多条,可能还需要与IPM的动力线输出线保持距离,IPM动力输出线在PCB上的布线可能会比较宽(不了解具体情况),再加上其他传感器的布线,的确是“螺蛳壳里做道场”的感觉,并且有把腕部的问题转移到手掌的嫌疑。显而易见,电磁兼容问题肯定也会很复杂。甚至,将FPGA、ADC(即使一部分ADC可以集成在FPGA内部)、IPM三者放在一块PCB上,管控电磁兼容的成本是否将非常高甚至根本就不可行?另外,长期工作过程中,如何在局促、密闭的空间内为手掌中的关节驱动机构、IPM、FPGA散热?这也需要在后续工作中深入研究。现实情况有可能是,即使按照3.1.2.2节的方案,在肩部的走线难度仍然非常大。倘若如此,可以考虑将这一布局方式向上拓展,在下臂空间内增设一片FPGA,负责为腕部、肘部的4组IPM-电机-传感器提供强实时性的运算、控制、通信服务。下臂内置FPGA内部模块的设计与手掌内置FPGA类似,电机、IPM数量减为4,取消指端触觉传感器、IMU,对外以全双工高速串行通信方式直连躯干内置FPGA(与手掌内置FPGA共同作为星形拓扑的外围节点),后者的FPGA片间全双工串行直连接口模块的数量由x2改为x4,并且将其中的轨迹点插值-电机控制子系统的数量减为22(=30-4x2)。同理,如果髋部、膝部的走线也存在类似问题,亦可用类似的方式解决:增设的FPGA置于小腿内部空间,负责为踝部、膝部的3组IPM-电机-传感器提供强实时性的运算、控制、通信服务,星形拓扑,相应在躯干内置FPGA中增加FPGA片间全双工串行直连接口模块的数量至x6、减少轨迹点插值-电机控制子系统的数量至16(=22-3x2)。为简化叙述,后续内容将不考虑本节述及的对系统框架的备选更改项。3.1.3 关于内置CPU硬核的FPGA(SOC)目前,以Xilinx的Zynq系列芯片为代表的、内置CPU硬核(通常是双ARM核)的FPGA已经获得比较广泛的应用。将其应用于图2所述系统,可以使运算CPU、管理CPU、躯干内置FPGA集成在一片芯片内,形成一个初级的片上系统(SOC,System On Chip),图2中比较累赘的PCIe总线(通常用于板间经插槽互联)将被AXI之类的片内总线取代,通信体系结构显著化简,通信效率显著提高。更重要的是,内置CPU硬核的FPGA在架构上更接近于工信部《人形机器人创新发展指导意见》强调的“‘感-算-控’一体化的高性能运动控制器”+“具有多模态空间感知、行为规划建模与自主学习等能力的智能芯片”这一终极形态,高端芯片中甚至额外集成了GPU,很适合用作抵达终极形态过程中的中间版本。事实上,以这类芯片为核心的机器人/AGV项目,网上已经能找到不少。本文之所以没有采用这种芯片,不仅因为其在本质上与图2所述架构并无不同,更重要的是,笔者不希望在将FPGA深入应用于人形机器人这一核心主题之下节外生枝。即:对于不熟悉FPGA的人形机器人业内人士来说,把握本文的核心思想、理解其工作机制,这件事本身已经需要在很大程度上转换既有的思路。如果再加上Zynq这类芯片的各种专用表述、附加特征,将显著增大读者的阅读负担,不利于读者理解、把握本文的主旨。所以,本文采用了FPGA与CPU分立的架构,将已经广泛应用的PCIe作为两者之间的主信道。管理子系统的主体部分位于人形机器人的躯干内,其核心是工控CPU,硬件包括CPU、基础外围芯片(例如南桥、内存),运行常规版本的工控软件系统,用于实现非实时的系统管理功能。位于图中左上角的基于世界时时标的同步信号序列的生成与分发模块,实现的是强实时性功能。由于其具备很强的管理属性,也被划归本子系统。工控CPU经I2C总线(采用I2C是为了节省FPGA的I/O引脚)与位于躯干内置FPGA内部的I2C接口模块通信,经后者向系统管理信息汇集调度与分发模块发送系统管理指令信息、从系统管理信息汇集调度与分发模块获取由FPGA内各模块反馈的系统管理所需信息。为避免图面线路繁杂,图2中未示出系统管理信息汇集调度与分发模块与FPGA内其他各模块之间的信息传输通道。与位于躯干内置FPGA内部的系统管理信息汇集调度与分发模块类似,左、右手掌内置FPGA中也设置了这一模块,其功能与前者基本相同,区别在于需要经一对FPGA片间全双工串行直连接口模块与前者通信,实现系统管理用信息在左、右手掌内置FPGA内部各模块与工控CPU之间的往来传输。同理,图2中未示出系统管理信息汇集调度与分发模块与FPGA内各其他模块之间的信息传输通道。运算CPU模块经PCIe总线、位于躯干内置FPGA内部的系统管理信息汇集调度与分发模块、I2C总线实现与工控CPU的连接,以往来传输特定格式的应用层数据帧的形式接受工控CPU的管理。用户IO端口模块挂接在工控CPU的外部总线上,包含网口、管理用射频通信接口、USB端口、TF卡槽、显示器接口、键盘鼠标接口等,用于在用户与人形机器人之间实现非实时的信息交互。人形机器人的实用化,应实现本体与世界时时标的协同运行。例如,它可能需要按时给老人服药、按时带小朋友乘坐民航班机。位于躯干内置FPGA内部的时标建立与保持及系统同步时序管理模块从位于芯片外部的世界时时钟源模块(例如北斗、GPS接收模块或其位于本地的次级子系统)获取世界时时标信息并将其周期性发往系统管理信息汇集调度与分发模块,由后者将其转发给工控CPU、实现整机时标与世界时的同步;以及,经GPIO将世界时时标信息周期性发送给运算CPU。时标建立与保持及系统同步时序管理模块以世界时时标为基准产生人形机器人控制系统所需的各种同步信号序列,发往系统内的各子系统、模块,实现人形机器人动作序列与世界时时标的统一,实现控制系统内部各子模块动作之间的精确同步 – 由于各片FPGA之间形成以躯干内置的FPGA为中心的星形拓扑,没有中间环节,各FPGA内部各模块的各个动作时序的各个时间节点之间的同步精度是深亚微秒级。同时,这一机制也为将人形机器人的动作细节精确同步于世界时钟、适配于高精度实用场景提供了底层技术支持。作为以实用化为设计目标的人形机器人控制系统,必须应对世界时时钟源失效的状况,避免因此影响服务质量甚至造成不良后果(例如在错误的时间服药、错过登机时间)。在卫星信号缺失并且卫星定时次级子系统也工作不正常的情况下,世界时时钟源将失效。此时,除了应由工控CPU经人机接口发出告警信息,时标建立与保持及系统同步时序管理模块必须在故障前世界时时标的基础上基于板载晶振(以及特定的晶振频偏补偿算法)自行保持世界时时标的更新、同步信号序列的发送,即所谓时间保持。为确保人形机器人所提供服务的时效性,时间保持必须满足一定的精度。例如,自行生成的时标在1天内相对于真实卫星时标的误差绝对值曲线的峰值小于0.1秒。并且,当世界时时钟源回复之后,本地保持的世界时时标应以渐变方式(而非跳变方式)恢复与世界时时钟源的同步,以免造成精确定时系统的紊乱。本节所述思想借鉴自智能变电站领域,已有成熟的规范,建议参阅IEC-61850或相关技术文献。感知子系统用于获取本体、环境的信息,为控制系统做决策提供原始数据。图2所示感知设备的厂家已经提供了规范的接口,用于对其进行访问,设备的驱动、信息接收与解算按照数据手册做即可,不予赘述。电机周边的电流检测、编码器、霍尔元件原则上也属于传感器,但由于其功能紧密耦合电机驱动功能且与电机一一对应、配套提供,为使控制子系统看上去功能完整而将这些传感器归入其中。传感器融合是人形机器人控制系统的必备功能,本框架设计将其分为两级:位于FPGA中的多维度传感器信息预处理、传感器融合基层算法模块用于对传感器信息的数据模式进行变换(例如图像的色度空间变换)、从中提取特征信息(例如频谱谱峰的位置、强度),进而实现相对简单、初级的传感器融合算法,高级的传感器融合算法交由运算子系统(图2中标记为红色)执行。同类传感器的初级融合的实例:将多个摄像头所摄视频图像按帧拼接(通常需要基于ORB、SURF之类的图像特征子提取与配对)、形成周边环境的全景视频数据流。异类传感器的初级融合的实例:将摄像头所摄视频图像与激光雷达获取的距离场+速度场点云数据做配准,形成世界时时标下的对周边环境的多维数据描述序列。不论实现传感器信息预处理算法,还是实现传感器融合的初级算法,都应考虑充分运用神经网络(例如CNN、GNN)技术、从传感器输出的原始数据流(及其预处理后的形态)中直接提取高维信息。上述多维数据描述序列(以及其他传感器采集的信息)经由FPGA片内数据调度中心模块、PCIe端点模块、PCIe总线传递给运算CPU,由软件实现传感器融合算法的高级部分,相关任务在第3.4节介绍。上述运算过程涉及大量图像、点云等数据的缓冲,很可能用到容量较大的FPGA片外专用存储器,其中最常用的是DDRx-SDRAM内存芯片,如图2右上角所示。需要特别关注的是,对各感知设备输出信息的采集、预处理、融合(包括由运算CPU执行的高层次融合)操作,都应在世界时时标(见第3.2.3节)之下进行。即,这些数据处理操作都应同步于时标建立与保持及系统同步时序管理模块输出的、同步于世界时时标的、属于本操作的同步信号序列(包括经由FPGA芯片间串行直连接口传输的或者经由运算CPU-GPIO传输的同步信号序列及其衍生信号序列)-- FPGA内部数量极其丰富的、延迟可预知的布线资源为这些信号序列的传输提供了可靠的支持。后续的各子系统中的运算CPU算法的执行、FPGA内部各模块的数据处理操作,也都应以这种方式同步于世界时时标,不再赘述。如果希望像特斯拉那样为Optimus-Gen2自研某些传感器,则需要研发团队深入研究相关传感器中将理/化信息转化为电信号特征的原理、传递函数、数据后处理机制,例如《流程图》注7第2自然段所述技术项:传感器的动态自适应驱动与反馈控制,输出数据的动态自适应预处理(例如针对六维力/加速度传感器输出数据波形的频谱生成与分析+自适应滤波降噪+特征子识别与量化分析进而据此实时反馈调节传感器的工作模式、参数)。一般来说,自研传感器涉及的运算、控制过程,会用到以低延迟实现大运算量算法(若算法构思无误则其运算量大概率与效果正相关)、低延迟的数据传输、精准的时序控制、更多的控制芯片I/O引脚,非常适合用FPGA予以实现。如图2所示,运算子系统由运算CPU模块、位于躯干内置FPGA中的关节运动轨迹点插值模块和运算CPU算法任务协处理模块、分别位于左右手掌内置FPGA中的关节运动轨迹点插值模块这5个模块组成。运算子系统基于感知子系统提供的信息,周期性地完成对环境、本体、工作目标的实时建模,基于所建模型算出下一个轨迹点输出时刻各关节的轨迹点参数,完成各关节的轨迹插值,再将插值结果发往控制子系统中对应于各关节的电机控制通道。运算CPU模块经GPIO定期由时标建立与保持及系统同步时序管理模块获得世界时时标,在这一时标的统一定时之下,与感知子系统、控制子系统的工作时序相配合,划定自己的工作周期,称为运算CPU工作周期。图4是以运算CPU工作周期为核心划分的、人形机器人控制流程中各个步骤的时间关系示意图,以下对照此图介绍运算CPU模块所执行的算法任务及其与前、后数据处理步骤之间的逻辑、时序关系。图4中,时间箭头从上向下,涵盖了3个运算CPU工作周期(编号N~N+2),彩色字体标记的是完成一次反馈控制(感知-运算-控制)的数据处理过程,各彩色字体子系统的字体颜色与图2一致。必须说明的是,图4仅仅是示意图,其中不同列内各单元格在时间维度上的关系,仅表明其逻辑、时序关系谁先谁后,不排除在时间轴上存在部分重叠。例如,不需要等到浅蓝色单元格的传感器信息的接收、解算工作完全结束,针对这些数据的传感器信息预处理乃至传感器融合初级算法就可以部分启动了。3.4.1.2 执行传感器融合上层算法以及对环境、本体、工作目标的实时建模在时标建立与保持及系统同步时序管理模块的统一调度下,运算CPU在图4中运算CPU工作周期N+1的起始时刻,已经借助用于控制PCIe根复合体的DMA控制器从3片FPGA中的多维度传感器信息预处理、传感器融合基层算法模块获得了地球空间坐标下的对环境、本体、工作目标的多维数据描述序列(在运算CPU工作周期N内生成、传输,如图4中浅蓝色字体的单元格内容所示)(见3.3.2节),然后执行传感器融合上层算法,进而从上述描述序列中提取高维信息,完成对环境、本体、工作目标的实时建模,获得三者的实时模型在本周期内的版本。本节所涉算法很复杂,笔者对其细节的理解很少,只知道其运算量极为庞大。在近年来的公开资料中,基于CPU+软件针对其中某个环节(甚至是某个环节中的某项运算),在抽象程度较高的应用场景下的单次运算耗时通常为10ms数量级(请专业人士指正),不能满足实用化需求,尤其是不能满足《人形机器人创新发展指导意见》所提出的应对突发情况的需求。所以,用FPGA提供低延迟的、灵活的运算-数据传输协处理服务(见3.4.1.4、3.4.3节),分担运算CPU的计算压力,必将为本节所涉算法的实用化提供有效的助力。在当前周期的建模完成后,以环境、本体、工作目标的实时模型为基础,执行实时运动规划算法,将当前解算出的任务目标映射为此后一段时间(在最简模式下是一个运算CPU工作周期的时长)内人形机器人的动作过程,再将对这一段动作过程的描述映射为人形机器人的52个关节在此期间的运动轨迹中的一系列分立的(通常是等时间间隔的)轨迹点,在预设的各个轨迹点输出时刻输出52个关节的轨迹点参数(图4中红色字体的运动规划环节),进而将这些参数经PCIe总线发往躯干内置FPGA、经由后者发往左右手掌内置FPGA,由这3片FPGA中的关节运动轨迹点插值模块完成轨迹点插值运算(图4中红色字体的关节运动轨迹点插值环节)(见3.4.2节)。本节所涉算法造成的算力压力与3.4.1.2节类似,不再赘述。3.4.1.4 将运算任务卸载给FPGA中的协处理模块如果3.4.1.2、3.4.1.3节所涉任务的运算量太大,不能在当前的运算CPU工作周期内完成,则需要修改软、硬件任务的划分,将一部分可以规范化、格式化的运算任务从整个运算流程中剥离出来,经PCIe总线交由躯干内置FPGA中的运算CPU算法任务协处理模块予以执行、回传结果(见3.4.3节,图4中未示出),再将回传的结果代入软件运算流程中其所属任务被应用的位置,继续执行相关的高层次算法。在上述“剥离-代入”的过程中,运算CPU所执行的算法应能够允许运算CPU转而执行其他任务,从而实现运算CPU与运算CPU算法任务协处理模块的并行运行,只要这种硬件并行在时间上的收益大于开销(剥离操作、往来传输运算任务及其结果的操作、代入操作),就能降低运算CPU执行整个算法的耗时。在1个运算CPU工作周期内,上述“剥离-代入”的过程可以针对不同的操作数、算法而多次执行。具体移交哪些算法任务、各算法任务在时序上如何调度,需要在《流程图》中间通道的第5个环节予以初步确定,并且在后续环节进行调整。运算CPU算法任务协处理模块执行协处理算法的更多信息,请参阅第3.4.3节。3.4.1.5 深入应用FPGA技术为高层次算法的前沿探索提供助力第3.4.1.2、3.4.1.3节所述高层次算法非常复杂,并且,基于笔者涉猎范围内的资料,其中一些重要环节的原始理论、基础模型、数学形式优化工作都还处在探索之中(请专业人士指正),本文只能就其在深入应用FPGA的控制系统中的位置、与其他模块的关系(尤其是其他模块能为其提供的帮助)做出定性描述。在具体的人形机器人研发过程中,所涉环节的算法可以先移植已有的、相对成熟算法,将其应用于本文所述的控制系统,验证在这一系统下所实现的人形机器人性能相对于既有控制系统的优势,再在后续工作中及时跟随、应用相关理论与算法的最新研究成果。并且,基于本文所述系统所做的验证工作,也很有希望拓展后续理论、算法前沿研究工作的思路,理由是:理论、算法研究必须考虑其硬件可实现性。一旦在实际的人形机器人上验证了深入应用FPGA之后的硬件系统可以在相同的时间段内支持更复杂的算法,今后的理论、算法研究工作就可以考虑一些此前被放弃了的高性能算法 -- 这些算法在CPU+软件体系结构(或现有的、仅在3.5节所述控制子系统中应用FPGA的CPU+软件+FPGA体系结构)下因为太复杂、不能实时执行而被理论、算法的前沿研究者放弃。在控制逻辑上,关节运动轨迹点插值模块共有52个(对应于52个电机),躯干内置FPGA中30个,左、右手内置FPGA中各11个,视需求情况可以考虑在FPGA代码中对模块进行时分复用以减少对片内硬件资源的占用。这52个插值模块经PCIe总线从算法CPU(执行运动规划算法模块)获得各自需处理的轨迹点参数序列,按照预设算法对其进行插值,得到52个插值后轨迹点参数序列(其中相邻轨迹点的时间间隔远小于插值前的、由运动规划算法软件模块获得的相邻轨迹点的时间间隔),发送给控制子系统中各自对应的电机控制通道。鉴于运算CPU所需执行算法(第3.4.1.2、3.4.1.3节)的运算量巨大,且具有强实时性要求,其算力可能不足以在运算CPU工作周期内完成规定的算法任务。因此,本框架设计在FPGA中为运算子系统设置了运算CPU算法任务协处理模块,作为运算CPU的“协处理器”(如《流程图》注2第3自然段所述)。运算CPU在执行高层次算法的过程中,在某些特定步骤,将后续的一些步骤(程序作者知道在一段时间之后才会执行这些步骤,以下称之为后继步骤)中的一部分已知运算内容且已知运算所需操作数的基础/通用运算任务(例如乘法运算、三角函数运算、矩阵运算、解线性方程组)提取出来,以预定义的任务序号+任务代号+任务属性列表+操作数列表的形式打包,经PCIe总线发给运算CPU算法任务协处理模块,由后者调度FPGA内置的几百上千个运算核心(能够以高性能执行类似于乘法+加法+累加运算的可配置硬件模块)以及与之临近的存储、布线硬件资源,以灵活适配于相关运算任务的模式多路并行运行、执行与任务代号对应的运算任务。运算任务完成之后,将运算结果与任务序号打包,经PCIe总线实时回传给运算CPU,运算CPU将这些结果存储,到后继步骤执行时,就可以直接调用这些计算结果。这样,就实现了将高层次算法中的部分基础/通用运算任务卸载到FPGA中执行,实现两者在一定程度上的并行运行,助力运算CPU实时完成高层次传感器融合、内外建模、轨迹规划运算。另外,关于上述被卸载算法中的操作数,还存在两种情况:第一,这些操作数是在后继步骤之前执行的高层次算法步骤中产生的,这种情况应该按照上述方式操作。第二,这些操作数是由FPGA经PCIe总线传递过来的、基于传感器信息由多维度传感器信息预处理、传感器融合基层算法模块、电机位置/转速检测模块产生的。在这种情况下,就可以省略上述将任务代号+任务属性列表+操作数列表打包下传的操作,而是由FPGA按照已知的任务代号+任务属性列表+操作数列表执行这些运算操作(因为位于数据源头、由物理上独立工作的硬件资源执行,这些操作必定能在运算CPU执行上述后继步骤之前执行完毕),完成后将运算结果打包、经PCIe总线实时上传给运算CPU,由后者在执行后继步骤时直接调用。这里所说的专项业务,是指人形机器人控制流程中的、针对某个相对独立的目标的具体业务。由FPGA以协处理器的方式承担专项业务的运算任务,在形式上与执行基础/通用运算任务没有本质区别。之所以将其单独列为一节,是希望不熟悉FPGA的业内人士重视这一思路的可行性、重视其应用对提升人形机器人性能的意义。以下借助人形机器人肢节在足部有可靠支撑状态下的运动学、动力学基础参数实时解算(这是本体动力学建模、运动规划算法的前置任务)的例子,阐述这一思路的应用方法。如图2所示,除了与运算CPU通信的接口之外,运算CPU算法任务协处理模块的数据源还包含52个电机的转动位置、角速度的实时测量结果(双手22个电机的测量结果经FPGA片间全双工串行直连接口模块实时传输给运算CPU算法任务协处理模块),以及来自支撑足IMU的位姿信息。针对某个运动学、动力学参数解算周期(可以是运算CPU工作周期的几分之一或与之相同)对应的上述数据源(称为当前周期数据源),运算CPU算法任务协处理模块以当前周期数据源中的支撑足IMU位姿信息为起点,根据预存在FPGA片内RAM块中的各肢节简化模型(例如仅包括肢节的长度、径向质心位置、质量)的参数,自下而上逐级计算各关节等效中心在3D方向上的位置投影的纵联累加和(类似于工业机器人在基座固定这一前提下的各肢节空间位置、角度的解算),从而算出当前周期数据源对应的人形机器人各肢节的空间位姿参数。同时,如果在上述解算过程中加入当前周期数据源中52个电机的角速度信息,就能自下而上逐级计算各关节的等效中心在3D方向上的速度投影的纵联累加和;进而,基于预存在FPGA片内RAM块中的各肢节的质心位置、质量参数,在各关节位置、速度解算过程中,随同计算得到各肢节的动力学参数。另外,基于上述各肢节的空间位置参数、质心位置,还可以自下而上逐级计算得到各肢节所受重力相对于双足(单足)支撑区域的力矩(姑且称之为重力力矩参数)。最后,将当前解算周期解算得到的各肢节的运动学、动力学、重力学参数经PCIe端口上传给运算CPU,后者就可以不再做上述基础参数解算工作,将更多算力用于对人形机器人本体执行动力学建模的上层算法、从环境及任务约束的角度评估其站立姿态的稳定性(及其发展趋势),进而执行运动规划算法。人形机器人的任何一种专项业务算法,只要面向实用化应用场景,算法内容都必须处理各种实际情况,以第3.4.3.2节的例子为例:其一,如果人形机器人的当前状态是双足支撑,则对于从两个起点开始的、自下而上的运动学--动力学参数解算,在两路解算完成髋部3个自由度的运算、到达骨盆时,对骨盆参数解算的两个结果之间必定存在差异。此时,最简单的处理方法是对两路运算的结果取均值,但这种做法的精度有可能无法满足实用化应用场景的需求的。具体如何确定两路解算结果在被采纳结果中的权重,与很多因素相关。例如,当前双腿姿态的差异对解算误差的影响(承重比例、扭转方向都将影响关节间隙的大小进而影响解算结果的可信度),必定是影响权重的因素之一。其二,从足部支撑点开始向上进行的解算过程,当到达躯干部位时,其对躯干姿态的解算结果,与基于躯干内置IMU输出数据而解算得到的躯干姿态相比,两者同样必定存在差异,同样存在上述权重问题。也就是说,第3.4.3.2节中针对所述例子列出的算法内容,本质上仅仅是一个概略的算法框架,距离实用化还存在很大的差距。严肃地说,这属于“真空球形鸡”方案。同样的情况,也出现在本文对人形机器人所涉其他算法、方案的阐述中,例如,在第1.1节,将无框力矩电机、空心杯电机统称为电机,都采用基础版本的驱动-控制机构,未考虑转速测量的精度与时效性、对电流测量结果的特征提取与滤波等问题;述及IMU时,未考虑其零点漂移、误差累积问题;在第3.1.2.2节,布置芯片时仅考虑了FPGA、IPM、IMU,未考虑其他器件 ……第3.4.3.2节中之所以采用这个方案作为例子,是因为本文阐述的是在人形机器人控制系统中深入应用FPGA技术的框架设计,所强调的是,相关算法的基础部分、主体部分可以在FPGA中予以实现,希望不熟悉FPGA的业内人士了解这一情况,进而深入思考这一技术思路的价值。至于本节所述的、实现过程中的各种具体问题的解决,首先不在本文阐述的范围之内;其次,在具体的解决方案中,FPGA由于其功能灵活性、低延迟的大运算量并行处理能力,很可能也是最适用的底层技术选项。图2中的电机控制采用经典的基于坐标变换+SVPWM+逆变器的电流-速度-位置三环反馈矢量控制方法。本文主要面向机器人行业的专业人士,不再针对其中的具体模块做详细介绍(相关资料在网上有很多)。在图2所述电机控制通道的基础上,实际产品中还必须用到各种附加功能,本文做的是框架设计,对此不予详述。图2中单片FPGA中的绿色模块共同构成一个电机控制算法通道(其中执行运算任务的模块因与本通道其他模块强关联而被包含在本通道内)。这样的算法通道共有52个,躯干内置FPGA中30个,左、右手内置FPGA中各11个,在逻辑上每个IPM-电机组合都对应一个控制算法通道,与关节运动轨迹点插值模块一一对应。视具体情况,可以考虑在FPGA硬件层面对其中的部分模块进行时分复用,以减少资源占用。对于电流-速度-位置三环嵌套PI控制,位于外环的速度、位置环的控制周期远大于位于内环的电流环,可供执行运算的时间比较充裕,因此,在已有的基于CPU+FPGA的工业机器人控制系统中,通常仅在FPGA中实现电流环,而将速度、位置环交由CPU实现。本框架设计中考虑到,运算CPU需要承担的运算量巨大且对运算过程有强实时性要求,还需要经由PCIe端口与FPGA实时交换大量数据(即使借助于DMA控制器,CPU-软件系统也要面向内存读写大量数据),因而在图2中将速度、位置环也合并进FPGA中予以实现,以减少对PCIe端口有效带宽、CPU软-硬件件资源的占用。从实用化的角度看,人形机器人对于静止状态下的结构稳定性有很高的要求,尤其是在执行任务过程中。如果静止状态下正在对目标物体进行支撑(例如抱着个宝宝),就需要严格确保各关节的稳固。基于这一考虑,控制通道中应提供电机抱闸功能。即,各电机控制通道的位置环检测到电机转动到了设定的角度之后,向电机发出抱闸信号,使电机轴稳固锁定在当前角度,确保人形机器人在不需要运动的时段内不动如山。当然,更高层次的安全并非这种抱闸后的固定不动,而是各关节随同实用化外部环境的变化而主动转动,用“接-化”的方式(致敬马老师)消除一部分干扰乃至外部冲击(例如各种演示视频中人形机器人被踹或脚踩障碍物的场景),保持自身整体的相对稳固,确保对任务目标物(宝宝)的保护。进而,在解除抱闸、由静到动的过渡瞬间,大概率不可以一股脑地开闸、加载PWM波形了事。如何精微管控52次解除抱闸与52次启动电机之间的时序关系(即使只有1个电机也存在两种操作时序关系的优化问题),如何设计电机启动过程中的反馈控制微操细节,以实现人形机器人动作启动过程的安全、平稳、平滑,实现被服务人类个体视觉、体感乃至听觉的舒适,有可能成为(或者,已经成为)友商之间比拼性能的重要着力点之一。这种在上层建模、模型分析、运动规划算法的指挥下实现精准的多点时序控制、精微的反馈控制过程优化,正是FPGA的用武之地。这里的“芯片间”是指运算CPU与躯干内FPGA之间、躯干内FPGA与手掌内FPGA之间。PCIe端点模块作为本文所述PCIe总线中的唯一从节点,用于实现躯干内置FPGA与运算CPU之间的通信,PCIe总线的主节点是运算CPU中的PCIe总线根复合体。之所以采用PCIe总线,是因为这是目前最成熟的、最便于集成到现有人形机器人控制系统之中的、可以实现运算CPU与FPGA高速通信的总线。本框架设计中的运算CPU的PCIe总线上只有躯干内置FPGA这一个从设备,所以完全可以设计为板内经PCB布线直连(未来ASIC化时肯定要换成AXI之类的片内总线),以此省下被接插件占用的空间,同时降低高速布线的长度、降低PCB设计难度、优化信号质量。如图2所示,FPGA片内数据调度中心模块,在躯干内置FPGA中是运算CPU经PCIe端点模块与躯干内置FPGA中各模块通信的中介,在手掌内置FPGA中是躯干内置FPGA经PCIe端点模块与手掌内置FPGA中各模块通信的中介,其在这3片FPGA中都是多条数据路径的汇总、转接、分发之处。这个模块所转接的各路数据及其各自的作用,大多数已经在前面各节中介绍过,不再赘述。需要注意的是,必须设计特别的机制,以确保经由手掌内置FPGA的FPGA片内数据调度中心模块发往FPGA内各模块的同步信号与躯干内置FPGA中对应的同步信号之间的时间误差不超过系统设计所要求的门限,以确保手指22个关节的动作过程与其他30个关节的协同程度。FPGA片间全双工串行直连接口模块用于实现躯干内置FPGA与手掌内置FPGA之间的高速、串行、强实时性的点对点直连通信(不需要附加PHY芯片)。最简模式下,每对接口仅需2对传输差分信号的双绞线/印制薄排线(可能需要附加少量驱动电路)。由于是以躯干内置FPGA为中心的、星形拓扑点对点的FPGA直连通信,所以只需由躯干内置FPGA基于世界时时标而以固定的时间间隔向其他FPGA发出特定格式的信号,就能在所有FPGA间实现深亚微秒级精度的时间同步,并且不需要借助任何附加的时钟同步协议(例如1588、EtherCAT分布式时钟),从而既能提高信道带宽利用率,又能简化系统、减少潜在的故障点、节省成本。流程图提供抽象的实施步骤,框架设计提供具体的实施中间结果,两者分别是深入应用FPGA的人形机器人控制系统这一拟议中的研发项目在上述两个维度上的投影,从各自的角度出发,协助读者直观、深入地理解这一技术思想。具体而言,本文所述框架设计是《流程图》中间通道的第5个步骤的执行结果,即:FPGA专家与(人形机器人)系统专家、各子系统专家讨论,分析系统中实时算力需求的时空分布、对各算法通道协同程度的需求,分析在CPU+软件体系结构中原始数据、中间数据、指令信号、状态信息的传输带宽瓶颈、延迟量大/延迟量显著抖动的传输路径,初步确定由CPU+软件、FPGA分别实现哪些算法模块与数据传输通道(即软、硬件任务划分),就考虑机械结构等约束的通信系统设计提供参考意见,就结构、PCB设计提供参考意见。然而,这一框架设计,是笔者在不具备人形机器人从业经验、“单打独斗”的前提下做的,由此导致,以上述及的人形机器人系统专家、各子系统专家的角色缺位。在这种情况下,笔者只能基于自学得到的、关于人形机器人的功能、性能需求及其实现方法的有限信息,对其控制系统的框架,尤其是软、硬件任务在CPU与FPGA之间的划分,做出规划。例如,对于非常重要的、工信部《人形机器人创新发展指导意见》中反复强调的多模态感知,笔者由于对高层次多模态传感器融合算法了解很少,只能在第3.3.2节就传感器信息预处理、初级的传感器融合进行阐述,等到第3.4.1.2节述及高层次多模态传感器融合,就只能笼统地一带而过,只能基于对其算法复杂度的感性认知,假设其中存在适合提取出来、交由FPGA加以协处理的子任务(请专业人士指正),设计了第3.4.1.4、3.4.2、3.4.3节所述方法,以实现对整机反馈控制环路实时性的优化。同样的情况,也存在于对环境、本体、工作目标的实时建模(第3.4.1.2节)、运动规划(第3.4.1.3节)所涉算法的协处理方法的设计过程中。至于《流程图》中间通道第2、3、4个步骤所述的各项工作,这一框架设计就只能基本予以忽略了。4.4 特斯拉人形机器人Optimus-Gen2信息的帮助幸运的是,如本文第1节所述,网上能查到专业网友分析、总结的特斯拉Optimus-Gen2的硬件系统的基本构成(参考资料1、2),也就是《流程图》中间通道第3个步骤所述的“可用做研发基础的人形机器人产品或设计方案的结构、控制系统的信息”,使本文的工作有了一个基本的、可以被专业读者接受的分析对象,不至于完全沦为自说自话的“对空输出”。如果有研发单位认可本文所做的工作,愿意以此为借鉴在人形机器人中深入应用FPGA技术,笔者建议其借鉴《流程图》所述的实施步骤,尤其是,建议借鉴其中由软、硬件人员协作划分各自的任务 – 用MATLAB迭代验证算法功能 – 用HDL实现的方法(见《流程图》左侧的通道)。进而,用基于这一方法得到的结果,替代笔者在本文所述框架设计中对软–硬件任务的划分(例如第3.2.2节对多模态传感器融合算法软-硬件任务的划分)、替代笔者对划归FPGA实现的算法的具体内容(例如第3.4.3.2节逐级解算各肢节运动学、动力学、重力学参数的算法)所做的非专业表述。如很多读者已经想到的,以FPGA性能特征的通用性为基础,本文所述的框架设计,很适合“泛化”应用于人形机器人之外的领域,尤其是,泛化应用于同样基于“多通道传感器融合分析 + 多维度应用场景建模 + 多路电机协同规划、精准协同伺服控制”的领域,例如:AGV(及其与工业机器人的组合体,例如波士顿动力的strech);基于特定传感器机制+高速、高定位精度上/下试件的医疗样品检测系统;电动汽车电机驱动+刹车+悬挂一体化控制系统(第3.5.2节所述的多电机协同启动控制应是其典型需求);燃油汽车发动机油路+喷燃+刹车+悬挂一体化控制系统;多阀门一体化液压伺服驱动系统(阀门伺服驱动最终仍要落实到电机伺服驱动);电力系统广域协同继电保护主保护系统(广域范围内中多个断路器的驱动电机动作曲线的微秒、亚微秒级精准协同);如果这个框架设计在上述某些领域获得实际应用、取得经济效益,大概率将对其在人形机器人领域的实际应用起到促进作用。6、结语:行动最重要
2023年11月,工信部发布《人形机器人创新发展指导意见》,对人形机器人提出了以应对真实场景下的复杂环境与任务、应对突发情况为特征的实用化功能需求,为业内竞争提供了指导方向。实现具备上述特征的实用化功能,必须基于高带宽多模态信息的采集与传输而对环境、任务、控制约束进行建模,必须对机器人本体进行动力学建模,必须在这些模型的共同约束下对几十个关节的运动轨迹进行宏观规划,并且,上述工作必须实时(低延迟量、低延迟抖动量)完成。上述算法的实时执行,对控制系统底层技术提出了前所未有的要求,即,多通道并行处理且需精准协同、强实时性、大运算量、大数据传输量。并且,对这些要求的同时满足,已经显著超越了作为当前人形机器人控制系统主流技术的CPU+软件的性能上限。FPGA相比于CPU+软件,在同时满足上述性能需求的维度上,其在体系结构层面具备显著的优势。在当前以CPU+软件为核心的控制系统中深入应用FPGA(而非仅用于电机驱动),必将显著提升人形机器人产品的性能、显著提升其实用化程度,因而,必将成为人形机器人行业技术竞争的下一个热点。本文所做的工作,就是在这一指导思想下,为业内人士、潜在业内人士提供了一个具象化的设计实例、参考技术方案。本文与《流程图》结合,将有望显著降低这一技术思路的付诸实施在纯粹技术维度上的门槛。现在,对于正在人形机器人行业参与竞争的企业来说,最重要的是:正视CPU+软件体系结构的性能已经不能满足现实需求,正视FPGA对行业技术体系发展的促进作用,将认知付诸行动,果断、及时地投入资源,用底层技术的演进推进人形机器人的实用化,建立属于自己的专利护城河,博取自身在行业竞争中的优势地位。1 任赜宇:Tesla人形机器人Optimus各伺服关节技术拆解2 王兴兴:Gen2更新:Tesla 机器人 Optimus 你没注意到的设计细节?3 面向外骨骼机器人的空心杯电机位置伺服控制研究(图2-6),作者:曾青山,电子科技大学2013年度硕士毕业论文4 一体化关节模组驱控系统关键技术研究(图4-1),作者:焦露,江南大学2023年度硕士毕业论文6 林伟:关于在机器人领域深入应用FPGA技术的一些思考7 林伟:关于在机器人领域深入应用FPGA技术的一些思考(续)8 《计算机体系结构:量化研究方法》(第五版)(第1.3节),作者:John L. Hennessy,David A. Patterson。9 在实用化人形机器人研发流程中深入应用FPGA技术的流程图(基于工信部《人形机器人创新发展指导意见》)(建议下载到PC观看)相关链接:
转载申明:转载本号文章请注明作者和来源,本号发布文章若存在版权等问题,请留言联系处理,谢谢。更多架构相关技术知识总结请参考“架构师全店铺技术资料打包(全)”相关电子书(41本技术资料打包汇总详情可通过“阅读原文”获取)。全店内容持续更新,现下单“架构师技术全店资料打包汇总(全)”一起发送“服务器基础知识全解(终极版)”和“存储系统基础知识全解(终极版)”pdf及ppt版本,后续可享全店内容更新“免费”赠阅,价格仅收249元(原总价399元)。
温馨提示:
扫描二维码关注公众号,点击阅读原文链接获取“架构师技术全店资料打包汇总(全)”电子书资料详情。