基于现场可编程门阵列的边缘计算中博弈论算法在自动驾驶中的加速
摘要
在自动驾驶领域,自动驾驶汽车之间频繁且不可避免的通信用于感知周围环境。大量数据需要在边缘及时处理,以控制车辆制定合适的策略。对于一组车辆而言,协作策略是必要的,以避免无意的拥堵。然而,对于车辆组之间的竞争与合作却关注较少。本文探讨了采用博弈论进行决策的可能性,以实现自动驾驶汽车之间的双赢。博弈论中的勒姆克‐豪森算法是目前最著名的组合算法,可计算双矩阵博弈的纳什均衡。更重要的是,我们在现场可编程门阵列上实现了勒姆克‐豪森算法,以加速计算过程。我们阐述了解决性能瓶颈的设计挑战以及优化方法。我们在KCU116开发板上实现了勒姆克‐豪森加速器,相较于中央处理器运行获得了约2.4倍的加速比。
关键词 :自动驾驶,现场可编程门阵列加速器,博弈论,Lemke‐Howson,边缘计算
1. 引言
自动驾驶一直是许多汽车制造商、研究人员和技术公司关注的焦点,尽管完全自动驾驶汽车仍处于初级阶段。根据美国国家公路交通安全管理局的定义,完全自动驾驶汽车在各种驾驶场景下的性能应达到人类驾驶员的水平[1]。自动驾驶包含三个主要领域:周围环境感知、决策制定和控制系统。
考虑到驾驶的可靠性和动态情况,决策系统如同人脑一样重要。自动驾驶的两大优势是更高的交通效率和更有效地利用基础设施资源。如果道路上只有一辆车行驶,那么当它需要应对周围环境时,这种情况将变得简单得多。然而,现实中的车辆需要与其它车辆协作,才能高效地完成更复杂的操作[2]。当自动驾驶车辆需要完成相同任务时,竞争不可避免。
假设一组车辆在长距离行驶中具有相同的出发地和目的地,自动驾驶系统可能会推荐多条路径。当所有车辆都选择最优路径时,可能导致该路径出现交通拥堵,而其他路径则处于空闲状态。为了解决这种意外的交通竞争并获得整体效益,将博弈论与决策系统相结合具有重要价值。
博弈论关注的是在结果取决于两个或更多具有冲突或共同目标的智能体所做选择的情况下,决策过程的研究。博弈论的成功已在网络管理、人工智能和信号处理[3, 4]等多个领域得到证实。为了提高认知无线电网络资源分配的性能,在网络中引入竞争机制有助于设计高效分布式算法并帮助认知无线电理解感知环境[5]。博弈论也可用于强化学习,这是机器学习的一个子领域,关注根据来自周围环境的观察反馈系统性地调整智能体的行动[6]。另一方面,自动驾驶汽车可被视为另一种形式的网络。博弈论在自动驾驶汽车的决策系统中具有广阔的应用前景。
由于具有高能效、开发周期短、并行计算和可重构等优势,现场可编程门阵列(FPGA)已被广泛用于加速多种场景中的算法[7, 8]。近年来,大多数神经网络加速器均基于FPGA实现,以实现高吞吐量、低功耗和可移动性[9]。对于目标检测、语音识别和视频处理等实时应用,已设计出多种基于FPGA的神经网络加速器[10, 11, 12]。同样,博弈论在FPGA上的实现也具备类似优势。此外,自动驾驶汽车的边缘计算可减轻云平台在数据聚合和信息分析方面的负载[13]。为缓解网络传输瓶颈,车辆间的直接通信可降低车辆间信息交换的延迟时间。博弈论在FPGA上的实现可通过通信单元轻松与边缘计算相结合。
在某种程度上,现场可编程门阵列(FPGA)适用于边缘计算。Saman等人研究了在现场可编程门阵列与图形处理单元(GPU)之间选择用于边缘计算的适用性。他们指出,现场可编程门阵列具有三个主要优势:提供对工作负载不敏感的吞吐量、能够在细粒度上适应空间和时间并行性,以及更高的能效和热稳定性[14]。通常情况下,现场可编程门阵列的可编程性使其适用于多种算法的实现。
在本文中,我们发现当一组汽车拥有相同的计划任务和环境条件时,自动驾驶可能导致竞争的出现。博弈论有望改进决策系统,以在自动驾驶汽车之间分配计划任务。我们选择博弈论中的勒姆克‐豪森算法来分析其性能和探索硬件实现。然后,我们将该算法在现场可编程门阵列上实现以获得更好的性能,并构建异构平台来测试该加速器。
本工作的主要贡献总结如下:
- 我们最初探索了将博弈论算法应用于自动驾驶决策的可行性。
- 我们通过确定勒姆克‐豪森算法中最耗时的计算部分来分析其并行性。为了充分利用并行性,还研究了基于现场可编程门阵列的勒姆克‐豪森算法的硬件设计挑战。
- 据我们所知,我们将是首个在现场可编程门阵列上实现博弈论算法的团队。这项工作是勒姆克‐豪森算法的首次现场可编程门阵列实现,特别展示了博弈论在自动驾驶中的价值。
本文的其余部分组织如下:第2节介绍了勒姆克‐豪森算法的背景并给出了相关工作。第3节展示了平台和加速器的概述,并对热点分析和硬件设计进行了说明。第4节描述了加速器中各组件的详细设计。实验结果在第5节中给出。第6节总结了本文的工作。
2. 背景与相关工作
2.1 符号和定义
在博弈论中,双矩阵博弈通过两个矩阵来描述,这两个矩阵包含两名参与者(例如玩家1和玩家2)的收益。我们假设玩家1有 m个纯策略标签
当玩家2有 n种策略并用
N={m+ 1, m+ 2,…, m+ n}标记时,玩家1的
收益矩阵表示为 Am×n。类似地,玩家2的收益矩阵为 Bm×n。矩阵 Am×n中的任意元素 aij表示当玩家1采用第 i个纯策略且玩家2采用第 j个纯策略时,玩家1的收益。对于矩阵 Bm×n中的元素 bij,其含义相应相同。此处得到的纳什均衡是一种混合策略,其概率分布表示每个纯策略被采用的可能性[15]。随机向量 x=(x1, x2,…, xm) T,其中
xi ≥ 0且∑m i=1= 1,用于表示玩家1的行动。类似地,我们有 y=(y1, y2,…, yn) T, yj ≥ 0且
∑n j=1= 1用于玩家2。利用这些符号,玩家1采取混合策略的整体期望收益可以通过将 Am×n的所有项加总,并以对应的 x和 y的概率作为权重来计算,可简写为xT Ay。同理,玩家2的期望收益为 xT By。
对于混合策略博弈,始终存在一个纳什均衡。对于任意随机向量 x ′和 y ′,如果存在一对(x, y),并且满足xT Ay ≥ x ′T Ay和 xT By ≥ xT By ′的约束,则获得一个纳什均衡。纳什均衡的含义是,在其他参与者策略固定的情况下,某一参与者采取适当的行动以最大化其收益。如果参与者无法获得最大回报,则没有人愿意改变自己的策略。
等价定义是满足最优反应条件的线性互补约束。
x 是 y 的最优反应,当且仅当对于所有 i ∈ M
和 xi> 0 ⇒(Ay)i= u=max{(Ay)k|k ∈ M}。
y 是 x 的最优反应,当且仅当对于所有 j ∈ N
和 yj > 0 ⇒(xT B)j = v=max{(x T B)k|k ∈ N}。
参与者1的最优反应多面体¯ ¯为 P, 参与者2的最优反应多面体为 Q。
P¯={(x, v) ∈ R M × R)|x ≥ 0, 1 T x= 1, B T x ≤ 1v} (1)
¯ Q={(y, u) ∈ R N × R)|Ay ≤ 1u, y ≥ 0, 1y= 1} (2)
通常使用归一化来简化这些公式,并将多面体转换为多面体。也就是说,
P={x ∈ R M|x ≥ 0, B T x ≤ 1} (3)
Q={y ∈ R N|Ay ≤ 1, y ≥ 0} (4)
以及随机变换
nrml(x)= x/(Σxi) (5)
nrml(y)= y/(Σyj) (6)
2.2. 勒姆克-豪森算法
为了得到纳什均衡,勒姆克‐豪森算法会沿着两个多面体[16]的搜索路径进行搜索。在这两个多面体中的一些顶点对即为纳什均衡。勒姆克‐豪森算法的搜索路径交替地沿多面体P和Q的顶点对(x, y)进行。对于路径中的相邻顶点对,每次仅改变其中一个顶点,而另一个多面体中的顶点保持不变。该路径通常从人工均衡(0,0)开始,最终停止于一个纳什均衡[17]。纳什均衡的顶点对包含除(0,0)外的所有标签。在每一步中,顶点的移动会丢弃一个旧标签并获取一个新标签,这也称为一次主元操作。在开始时,必须选择一个缺失标签以启动主元操作。在后续的主元操作中,通过比较两个列变量的系数,使用最小比值规则来确定应被丢弃的标签。算法的简要描述见算法1。
算法1 勒姆克‐豪森算法
输入:非退化双矩阵博弈 (A, B);
输出:该博弈的一个纳什均衡;
1:初始化表格 P和 Q,以及标签 M和 N。
2:选择缺失标签 k0 ∈ M并令 k=k0。
3:循环:
4:从表格 P中移除标签 k并更新表格 P,得到新的缺失标签 k。
5:如果标签 k== k0,退出循环。
6:否则,从 Q中移除标签 k并更新表格Q,得到新的缺失标签 k。
7:如果标签 k== k0,退出循环。
8:否则,继续循环。
9:输出(nrml(x) nrml(y))并得到纳什均衡。
使用“表格”数据结构并通过引入松弛变量将不等式转化为等式来实现该算法。未被标记的松弛变量称为基变量。
表格由以下三个部分组成,
x ∈ P, s ∈ RN, x ≥ 0, s ≥ 0, BT x+ s= 1 (7)
y ∈ Q, r ∈ RM, y ≥ 0, r ≥ 0, r+ Ay= 1 (8)
这三个部分是收益矩阵、松弛矩阵和常数向量。开始时,松弛矩阵是单位矩阵,常数向量的元素均为 1。
选择一个非基变量进入基(丢弃标签),并通过最小比值检验确定相应的基变量离开基(添加标签)。最小比值检验比较常数向量的系数和剩余表格中某一列向量的系数。接下来是主元操作,更新表格中的每个元素,该操作类似于矩阵行运算。其主要特征是刚离开基的变量决定了下一个进入基的变量。最后,将非基变量设为零,并得到基变量的值。从这些基变量中恢复出纳什均衡。
2.3. 相关工作
协同驾驶在实际道路交通中非常重要,协作车辆可以通过博弈论问题的解决方案进行引导[2]。文献[18]提出了一种基于博弈论的控制策略,通过车与车之间的通信,在道路交叉交通场景中以自组织方式控制车辆,避免碰撞并实现最小成本。然而,复杂模型所需的计算耗时较长。在文章[19],中,作者提出了一种面向车队驾驶的博弈论方法( GT4P),用于城市和高速公路车载自组织网络场景中的视频分发服务。但GT4P在保障视频传输方面的效率仅通过仿真结果得到验证。相比之下,我们将该算法实现在现场可编程门阵列上,以实现计算加速,展示了其在实际应用中的潜力。
另一方面,边缘计算使得数据能够在产生的时间点附近进行处理。由于无需通过网络将数据长距离传输到云,边缘计算减少了延迟,非常适合自动驾驶等场景。[21]的研究提出了一种用于自动驾驶内容分发服务的两级边缘计算架构,以充分利用无线边缘的智能。在接下来的部分中为了以去中心化方式提高车辆的计算能力,论文 [22]提出了一种名为自主车载边缘的框架,用于道路上的边缘计算,并引入了一个工作流以支持车载边缘的自主组织。类似地,我们的工作也实现在边缘端,无需云的参与,以实现实时响应。
FPGA已被用于辅助数据处理和加速自动驾驶。[23]的研究讨论了FPGA在确定性延迟图像采集和自动驾驶系统的处理系统中通过绕过输入数据路径中的中央处理器所起的作用。尽管自动驾驶系统面临许多约束,如性能、可预测性、存储、热管理和功耗,[24]的研究使用了包括FPGA、图形处理单元和专用集成电路在内的三种加速平台来加速机器学习基准算法并降低系统的尾部延迟。
3. 架构概述
3.1. 平台描述
图1 描述了由主机端和FPGA端组成的整个平台的概览。主机端负责生成测试数据,向FPGA卡发送数据并从卡上接收结果。主机与FPGA之间的通信通过PCIe端口使用 AXI4‐Stream(Advanced eXtensible Interface 4‐Stream)协议进行。流通道的数据宽度为256位,可容纳八个浮点值。在FPGA端,实现了Lemke‐Howson加速器以及用于PCIe(外围组件互连快速)IP核的DMA(直接内存访问)子系统[25]。该加速器能够完成算法的全部功能。IP核的DMA模式被配置为通过PCIe桥在主机内存和 FPGA之间来回传输数据。主机上的驱动程序允许发送命令以连接主机与FPGA,并启动数据传输。
3.2. 加速器结构
如图2所示,基于FPGA的加速器设计由几个主要组件构成,分别是数据初始化、数据存储、比值测试、主元过程和均衡归一化。数据存储模块用于存储所有的表格数据和标签数据。由于未使用外部内存,FPGA上的内存资源限制了加速器能够处理的博弈规模。数据初始化模块负责从PCIe接收收益数据,并将这些数据分配到表格的正确位置。此外,该模块还可以初始化表格的其余数据以及标签值。比值测试模块用于在表格中寻找主元值的位置,并输出下一个主元的缺失标签。主元过程模块更新表格中的所有元素,其操作类似于矩阵初等行变换。对于均衡归一化模块,它从最终表格中获取所需数据,并对这些数据进行归一化以计算纳什均衡。
3.3. 计算运行时间分析
有必要分析Lemke‐Howson算法,以确定其运行时间主要消耗在何处,以及存在哪些操作阻碍了性能的提升。原始的Lemke‐Howson算法不具备任何启发式技巧,因此整个计算过程相当直接。为了寻找纳什均衡,该算法从一个固定的人工均衡出发,通过指定的初始主元选择开始,直到所有约束都被满足时结束。通过对该算法的描述可知,主要的算术运算用于寻找主元值、表格更新和概率归一化。特别是,在每次主元过程中都需要更新两个表格中的所有元素。枢轴操作次数也起着重要作用,并且与博弈规模相关。当博弈规模增大时,枢轴操作次数也随之增加。当玩家1有 m种纯策略,玩家2有 n种纯策略时,该算法最多在 2×(mm+n)(mn+n)次主元操作后停止。我们进行了一项实验,以分析枢轴操作运行时间比例与博弈规模之间的依赖关系。
从图3可以看出,该算法最耗时的部分是迭代的主元过程。换句话说,整个算法的执行性能主要由主元过程决定,因为该过程消耗了最多的运行时间。
3.4. 硬件设计分析
勒姆克‐豪森算法是一种迭代算法,因为当前的主元过程未完成并获得缺失标签之前,下一个主元过程无法开始执行。以线性方式对比值测试和主元过程进行流水线处理是不可行的。因此,这两个模块以环形方式连接。在数据存储方面,FPGA硬件平台提供的资源有限,尤其是片上内存。对于该算法,表格的存储占据了FPGA上最多的内存资源。一方面,内存端口数量有限,可能导致无法并行访问数据,从而引起读写拥塞。对于主元过程,表格需要被反复更新,这意味着数据访问频繁。因此,将表格结构进行分区并独立存储是切实可行的。这样可以在算术运算中实现数据的并行访问。此外,应注意分析表格数据结构,减少无用数据,以提高内存利用率。最后,需要注意表格的重复读写以及所有浮点类型的算术运算。必须采用流水线设计,以便从内存中获取操作数、执行运算并将结果存回内存,从而降低延迟。
4. 硬件实现
在本节中,我们将详细描述基线实现的所有组件。然后,为了减少不必要的数据存储,我们在基线实现的基础上提出了一种内存缩减优化,以减少占用的内存。
4.1. 数据初始化和存储
两名参与者的收益数据分别通过两个不同的端口同时进入该模块,以减少数据传输时间。对于每个数据端口,均采用AXI4‐Stream协议与PCIe IP核中DMA子系统的直接内存访问进行通信。所有收益数据的值均为32位宽的浮点类型。端口的位宽为256,因此一次传输可接收8个数据值。一旦完成一次传输,数据便被同时分离为8个值,并全部存储到对应位置的表格。由于个体存储的存在,标签的初始化与收益的初始化相互独立。一旦加速器开始工作,标签的初始化过程即启动。
为了改善数据访问,表格的三个部分被分别存储在内存中。在每次主元操作期间,都会获取表格的所有数据。独立存储允许同时更新表格,从而受益于并行计算。存储形式如图4所示。与将表格整体存储相比,这种方式需要更多的内存访问端口。
4.2. 比值测试
该模块用于生成下一个主元的缺失标签并定位主元值。通过对两个向量的系数进行最小比率比较,并通过除法运算完成。其中一个向量是表格最右侧的值,另一个向量来自表格其余部分的某一列。由于表格的部分存储,这两个向量能够同时预取并加载到流水线除法器中。具有最小比率的主元值的标签即为下一个主元的缺失标签。
4.3. 主元过程
主元操作由于需要对表格中的任意元素进行迭代更新,占据了最多的运行时间。更新一个元素需要四个值参与运算,分别是原始元素、行元素、列元素和主元值。主元值指的是同时位于主元行和主元列中的元素。主元列通过比值测试获得。列元素指的是在主元列中与原始元素具有相同行号的元素。行元素指的是在主元行中与原始元素具有相同列号的元素。在主元操作开始之前,设置线缓冲区1用于存储列元素,同时设置另一个线缓冲区2用于存储行元素除以主元值的结果。在硬件实现中,从表格中将主元行加载到全流水线除法器中,结果存储到对应的线缓冲区2中。在主元操作期间,原始元素和两个线缓冲区中的对应元素被同时加载,原始元素与两个对应元素乘积之差的结果被存储回去。加载、计算和存储操作采用流水线方式设计。该流水线过程如图5所示。
4.4. 均衡归一化
在完成所有主元操作后,表格的最右侧包含了用于恢复纳什均衡的数据。具体而言,标签数组存储了参与者策略的顺序信息,而这些策略的概率则存储在表格对应的最右侧。设置了一个行缓冲区,用于存储根据行动序列重新排列概率后得到的新概率分布。最后,需要进行归一化处理,以将概率限制在零到一之间。该模块还具有采用 AXI4‐Stream协议的输出端口,输出值为浮点类型。
4.5. 内存减少
如我们所见,表格的大小与博弈规模相关。如果博弈规模为 n × n,则表格大小为(2n+ 1) × n。使用所示的勒姆克‐豪森算法所能解决的问题规模受限于FPGA上的内存资源。解决该瓶颈的一个可行方法是将表格以更高效的形式存储。通过对原始算法的详细分析发现,经过主元操作后,表格中的某些元素会变为零。每次主元操作后,主元值的系数变为1,而主元列中非基变量的其他系数则变为零。对于表格中对应位置的基变量,情况恰好相反。这些1和0的值是冗余的,占用了过多的内存。当记录这些值的轨迹时,可以在略微增加算法复杂度的代价下,将表格大小减少至(n+ 1) × n。内存减少的过程如图6所示。
5. 结果与分析
5.1. 实验设置
使用高层次综合设计工具Vivado HLS (v2017.2)完成了Lemke‐Howson算法的硬件设计。该工具支持使用C/C++语言设计加速器,并将相应的RTL设计导出为IP核,可导入到Vivado中。整个平台由多个IP核在Vivado (v2017.2)中进行集成。我们选择的目标FPGA开发板是赛灵思Kintex Ultra‐Scale+ KCU116,该开发板上搭载了axcku5pFPGA芯片。软件实现作为参考,运行在英特尔酷睿 i5‐6500 处理器上。该中央处理器的工作频率为3.20吉赫兹。
为了评估性能,我们使用Gamut生成测试收益数据作为算法的输入。Gamut是一套用于测试博弈论算法的博弈生成器,可为多种博弈类别的实例随机生成大量分布的博弈[26]。在此,应选择 RandomGame类别。当参与者数量设置为两个时,将确保输出具有不同行动规模的随机双矩阵博弈。
5.2. 实验结果
我们首先报告基线和内存减少实现的资源利用率。具体而言,我们综合了多个不同规模的加速器副本,以找出规模与内存利用率之间的关系,以及减少优化的有效性。
资源利用率列于表1中。总体而言,内存减少方法比基线实现使用的资源更少。随着博弈规模的增加,基线实现和内存减少所占用的块RAM切片数量也随之增长。通过分析表1的结果发现,博弈规模与内存之间存在二次关系。该结果与理论分析一致。从两种实现方式的对比角度来看,内存减少可节省一半的内存空间。图7以更全面的方式展示了这一对比。此外,由于电路配置相同,其他资源利用率大致保持不变。当博弈规模为336时,DSP(数字信号处理)的数量显著增加。由于规模较大,高层次综合工具可能会实例化更多的DSP来处理较大的中间值。
目前尚无博弈论算法的硬件FPGA实现,因此通过与软件版本对比来验证加速器的加速比。加速器与基于软件的对应方案的性能比较如表2所示。该软件版本为自主开发,使用C++语言编写,并在Ubuntu操作系统上使用g++进行编译。系统。最终的运行时间是多次运行的平均值。
该加速器在两种实现方案下均可在198兆赫兹的频率下运行。我们使用两种不同的博弈规模测试其性能。当博弈规模设置为48时,基线实现的加速比为2.34,而内存减少的加速比为1.24。当博弈规模设置为64时,基线实现的加速比为2.37,而内存减少的加速比为1.23。基线实现的加速比较内存减少更高。尽管内存减少的性能尚不理想,但它确实比中央处理器耗时更少。两种实现方案之间加速比的差异是由用于处理并行计算所占用的资源不同所致。从表1可以看出,内存减少消耗的资源比基线实现更少。基线实现的内存大小约为内存减少的两倍。此外,该较大的内存被划分为两个独立的存储块,并实例化了更多资源以实现并行计算。由于内存减少,额外添加了逻辑电路以追踪位置变化,从而增加了整体延迟。性能与资源利用率之间存在权衡。
我们应注意,数据传输起着不可或缺的作用。我们获得的测试结果并未剔除传输时间。对于软件实现而言,由于中央处理器频率较高,该时间占比较小。然而,硬件实现的这一时间受限于直接内存访问的频率和通信协议。因此,当考虑传输时,设计的加速器能够实现更好的加速比。
表1:资源利用率
| 资源 | BRAM总计 | DSP总计 | FF总计 | LUT总计 | ||||
|---|---|---|---|---|---|---|---|---|
| 基线 | 减少 | 基线 | 减少 | 基线 | 减少 | 基线 | 减少 | |
| 游戏规模 | ||||||||
| 48 | 44(4%) | 32(3%) | 12 | 6 | 20181 | 17158 | 23671 | 19698 |
| 96 | 88(9%) | 54(5%) | 12 | 6 | 20146 | 17116 | 23697 | 19647 |
| 144 | 176(18%) | 98(10%) | 12 | 6 | 20221 | 17192 | 23722 | 19636 |
| 192 | 436(45%) | 228(23%) | 12 | 6 | 20245 | 17208 | 23796 | 19694 |
| 240 | - | - | 12 | 6 | 20249 | 17212 | 23796 | 19694 |
| 288 | 612(63%) | 316(32%) | 12 | 6 | 20320 | 17284 | 23984 | 19846 |
| 336 | 824(85%) | 422(43%) | 34 | 26 | 21390 | 18206 | 23558 | 19428 |
表2:与中央处理器的性能比较
| 游戏规模 | CPU | 基线实现 | 内存减少 |
|---|---|---|---|
| 48 | 0.920989ms | 0.393086ms(2.34) | 0.744627ms(1.24) |
| 64 | 33.536013ms | 14.138954ms(2.37) | 27.358814ms(1.23) |
6. 结论
在本文中,我们提出了面向自动驾驶边缘计算场景下基于现场可编程门阵列(FPGA)的博弈论算法加速器的设计与实现,据我们所知,这是首个将博弈论算法在FPGA上进行硬件实现的工作。我们的设计始于将博弈论应用于自动驾驶车辆决策系统可行性的分析,自动驾驶是边缘计算的典型应用之一。通过对经典博弈论算法——Lemke‐Howson算法的分析,我们利用FPGA硬件实现中的并行性,提出了相应的加速器设计方案。在满足FPGA芯片特定约束的前提下,提出了一种优化方法以简化存储结构。我们在Xilinx KCU116开发板上实现了该设计,对所提出的加速器进行了验证和性能测试。相较于中央处理器(CPU)上的实现,该加速器的初始加速比达到2.4倍。由于本工作是首次在硬件上实现博弈论算法,我们期望该设计能够为现有的自动驾驶系统研究提供启发,从而实现更优的性能。

9214


被折叠的 条评论
为什么被折叠?



