模拟-与-现实协同训练:基于视觉机器人操控的简单方法

news2025/4/18 21:13:48

25年3月来自 UT Austin、Nvidia、UC Berkeley 和纽约大学的论文“Sim-and-Real Co-Training: A Simple Recipe for Vision-Based Robotic Manipulation”。

大型现实世界机器人数据集在训练通才机器人模型方面拥有巨大潜力,但扩展现实世界人类数据收集既耗时又耗资源。模拟在补充大规模数据方面潜力巨大,尤其是随着生成式人工智能和自动化数据生成工具的最新进展,这些工具能够实现机器人行为数据集的可扩展创建。然而,仅在模拟环境中训练策略并将其迁移到现实世界通常需要大量的人力来弥合现实差距。一个引人注目的替代方案,是使用模拟和现实世界数据集的混合数据对策略进行协同训练。最近的初步研究表明,与使用有限量现实世界数据训练的策略相比,这种策略可以显著提高策略的性能。然而,业界对模拟和现实世界协同训练缺乏系统的理解,以及如何将模拟数据的优势应用于真实机器人学习。本研究提出一种方法用于利用模拟数据解决基于视觉的机器人操作任务。通过全面的实验,在各种模拟和现实世界数据集上验证协同训练策略,从而得出这一方法。

跨不同环境和任务进行泛化的能力,是实现通才机器人系统的关键一步。机器人基础模型 [1]–[3] 的最新进展(在网络规模的视觉语言数据集和机器人特定数据集的混合上训练)已展示出跨域泛化的巨大潜力。大型现实世界机器人数据集 [4]、[5] 体现了这种多样性,是重要的数据来源。尽管取得了这些进展,但在实现可靠的现实世界部署方面仍然存在挑战。为了弥补这一差距,最近人们在收集更大规模的真实机器人数据集方面做出了多项努力 [1]、[6]。这些工作展示了数据驱动方法在获得多功能机器人技能方面的潜力。然而,它们涉及相当大的成本、时间和可扩展性挑战,而且仅扩展现实世界的数据收集是否足以训练通用机器人模型仍不清楚。

行为克隆 [26] 是一种广泛采用的方法,用于从演示数据 [27]–[37] 中学习机器人策略。在该框架下,策略经过训练,能够根据演示数据集中提供的真实状态-动作对来预测动作。该方法已广泛应用于机器人操控任务 [38]–[49]。然而,它在实际应用中的成功通常取决于能否获得大量高质量的演示数据,而这些数据的收集成本可能高得令人望而却步。

模拟是一种有前途的替代方法,可以缓解大型模型的数据匮乏。近年来,生成式人工智能工具的激增使得在模拟环境中自动生成资产、场景和任务成为可能,所有这些都可以通过高保真物理模拟器和逼真的渲染器 [7]、[8] 来实现。此外,自动化数据生成工具可以应用于这些模拟环境,以最少的人力投入合成大量多样化、高质量的机器人轨迹 [9]–[12],从而为通用操作策略提供海量训练数据。然而,使用模拟数据的方法必须处理现实差距,因为模拟中的视觉效果和物理效果与现实世界并不完全一致。先前的模拟-到-现实策略迁移方法,通常依赖于对模拟进行大量调整以匹配现实世界 [13]–[17],或精心随机化一组特定的模拟参数 [18]–[22]。这些方法可能需要大量的人力投入。

模拟-到-现实迁移一个引人注目的替代方案,是直接在模拟和现实世界数据的混合上共同训练策略。近期研究 [7]、[23]、[24] 中的初步结果表明,与单独使用真实数据相比,以这种方式整合模拟数据可以显著提升策略性能。此外,模拟-真实协同训练可能不需要模拟与现实之间高度的一致性,而模拟-真实迁移通常需要这种一致性,这使得它成为一种以最少的人力投入挖掘大型合成数据集潜力的有前景策略。尽管前景光明,但业界对这一策略以及如何将模拟数据的优势应用于真实机器人学习,缺乏系统的理解。目前尚不清楚模拟数据与真实数据究竟有多大差异,以及哪种类型的数据集混合和组合才是理想的。

模拟-到-现实的迁移,一种流行的方法是域随机化 [18]–[22]、[50]、[51],它将可变性引入模拟环境,以训练能够应对模拟与现实差异的策略。然而,域随机化方法可能需要仔细调整,并且需要大量的人力来确定适当的参数随机化范围,从而使策略能够迁移到现实世界。另一种常见方法是通过提高模拟保真度以更紧密地匹配现实世界,从而最大限度地缩小模拟到现实的差距。系统识别 [13]–[17]、[52]–[54] 和数字孪生创建 [55]、[56] 等技术旨在使模拟动态与现实世界条件更紧密地契合。这些方法通常需要大量的人力投入,因此不适用于各种任务和环境。相反,最近的研究使用模拟和现实世界数据的混合来训练现实世界的操作策略 [3],[7],[23],[24],[57],并且表现出比单独使用相同数量的真实数据更好的性能。此外,这些方法中的模拟数据不一定需要与现实世界完全一致,这使得它成为其他方法的一个引人注目的替代方案。

最近的研究 [58]、[59] 强调了数据集组合在机器人学习中的重要性,特别是在理解数据质量和多样性的变化如何影响策略泛化方面 [60]、[61]。Mimi-cLabs [62] 等研究进行了大规模分析,以确定哪些类型的数据可以最大限度地提高机器人数据集的效用并改善下游策略性能。
本研究提出一种简单的方法,用合成模拟数据集补充真实机器人数据集,以促进真实机器人基于视觉的操控策略学习。该工作系统地研究模拟-和-现实的协同训练。用两种具有不同对齐程度的模拟数据源来检验共同训练现实世界策略的有效性:任务-觉察的数字表亲 [25] 和任务不可知的先验模拟,如图所示。

请添加图片描述

假设可以访问在真实环境中收集的机器人轨迹演示,D_real = {ξ_i },N 是其大小。不再仅基于现实世界中的演示来训练策略,而是从模拟环境中获取额外的演示,D_sim = {ξ_i },M 是其大小,通常 M ≫ N。在这两个数据源上训练视觉运动策略 π_θ。

采用先前研究 [7] 中的协同训练公式,其中最小化行为克隆动作损失,α ∈[0,1] 是平衡模拟数据和真实数据相对权重的协同训练比率。在实践中,使用 α 的等效公式,即在每个训练批次中从模拟数据中采样的概率。具体来说,重新加权每个样本 (o_i, a_i),使得在训练批次采样期间,从模拟数据集中提取该样本的概率为 P[(o_i, a_i) ∈ D_sim] = α,而从真实数据集中提取该样本的概率为 P[(o_i, a_i) ∈ D_real] = 1 − α。正如在实验中看到的那样,α 的选择对策略性能至关重要。最终目标是制定基于视觉的操作策略,最大化现实环境中一个或多个下游任务的性能。

D_real 和 D_sim 可以包含来自单个任务或多种任务、具体实施方式和环境的演示轨迹。为了理解构建这些数据集的特定选择如何影响协同训练的成功,有必要将这些数据集分解为一组数据构成因子。假设每个数据集都遵循因子 {Z(1), Z(2), · · · , Z(K)} 的分布,借用近期研究 [62] 中的符号。不假设模拟数据集与真实世界数据集完全一致,即对于某些因子 Z_sim^ (i) 不等同 Z_real^ (i)。尽管存在这些一致性差距,仍希望将模拟领域的知识迁移到现实世界任务中,以学习更有效的策略 π。

模拟的一个关键优势是易于数据收集——利用自动合成数据生成工具来生成大型、高质量的模拟数据集,并将它们与较小的真实世界数据集一起用于联合训练。对于模拟中的每个任务,首先收集数十个源人类演示。然后,使用 MimicGen [9] 来大规模生成大型合成轨迹数据集。对于双手机器人和人形机器人,使用 DexMimicGen [10],一种建立在 MimicGen 之上的方法。该过程如下。首先,将这些源演示分割成一系列以物体为中心的片段。然后,(Dex)MimicGen 通过对选定的源演示段应用线性变换并连接这些变换后的段,以形成新的轨迹来生成新的演示。通过利用这些方法,可以使用物理模拟将轨迹的数量增加几个数量级。

目标是开发一种简单的方法,用于在真实机器人和模拟数据上进行协同训练,从而显著提升真实世界的策略性能,相比单纯使用真实数据进行训练。主要关注以下两种场景:
(1) 使用先验的大规模模拟数据进行协同训练。能否将现有的大型先验模拟数据集用作协同训练数据?需要注意的是,这些数据集在视觉特征、任务语义和行为方面通常与现实世界存在显著差异。这里感兴趣的是了解这些数据集在多大程度上能够帮助在学习下游真实世界任务时,即使存在这些域差异。
(2) 使用任务-觉察模拟数据进行协同训练。基于对真实世界任务的了解,可以创建与真实世界任务更加匹配的定制模拟数据集。然而,调整模拟环境以使其与真实世界环境精确匹配是不切实际的。哪些数据构成因素对于模拟环境和真实世界设置之间的协调最为重要?能否放弃完美的协调,从而减少人力投入?

如图所示其工作流程概述,包括真实世界设置、模拟流水线和联合训练程序。

请添加图片描述

真实世界领域

寻求一种能够广泛适用于各种具身、任务和环境的协同训练方案。为此,对两个不同的领域进行全面的研究,每个领域都包含一个独特的机器人具身和不同的任务(如图所示):

请添加图片描述

Panda 厨房。一个真实的厨房环境,由Franka Emika Panda机器人构建。采用DROID桌面硬件配置[6],并进行一些细微的修改。实验三个真实世界任务,并为每个任务收集50个真人演示:
CounterToSinkPnP:将一个物体从柜台移到水槽。此任务包含九个形状各异的物体类别:罐头、杯子、咖啡杯、水瓶、柠檬、大蒜、碗、燕麦棒和梨。
CounterToCabPnP:将一个物体从柜台移到橱柜。此任务包含八个物体类别。
CloseDoor:关闭高架橱柜的门。

人形机器人桌面。一个包含 Fourier GR-1 人形机器人的真实桌面环境。使用一个基于 Mink 的 [63] IK 控制器控制机器人。使用安装在人形机器人头部的第一人称视角 RGB 摄像头。选择三个任务,并为每个任务收集 20 个人类演示。
CupPnP:将杯子从盘子移到桌子上。
MilkPnP:将一盒牛奶从桌子上移到架子的第二层。
Pouring:拿起一个装有乒乓球的杯子,将球倒入桌上的碗中。

该研究立足于现实世界——通过直接评估这些真实任务的策略来比较不同协同训练方法的有效性。

先验与任务无关的模拟数据

利用合成生成的数据来补充真实机器人数据集,以进行策略训练。一种方法是直接与现有的大规模模拟数据集或先验与任务无关的模拟数据集进行联合训练。将先验与任务无关的模拟数据集定义为在创建下游真实世界任务之前存在的任何模拟数据集。为了直接联合训练,使用包含相同机器人实施和动作空间的先验与任务无关的数据集,但这不是严格要求。否则,假设这些数据集涵盖广泛的任务和环境。有兴趣使用这些开箱即用的数据集进行联合训练,而无需花费额外的精力在模拟中设计新任务和收集新数据。这些数据集可能与现实世界的数据存在许多差异,但它们提供一种简单方便的利用模拟数据方法。本文使用以下先验模拟数据集:

Panda 厨房。使用多任务 RoboCasa 数据集 [7]。选择 RoboCasa 是因为它专注于厨房环境、场景和任务种类繁多,并且拥有大量机器人数据。此外,Nasiriany [7] 的初步发现表明,与模拟数据共同训练有助于在现实世界的厨房环境中进行迁移。该数据集包括 24 个任务和 100 个场景中的 72k 个演示;对于每个任务,使用 MimicGen 数据生成系统 [9] 从 50 个源人类演示中生成 3,000 个演示。注:其中三个任务在语义上对应于现实世界任务,但与现实世界设置存在显着差异,包括初始机器人关节位置、控制器参数、物理参数、目标类别和机器人基准位置。

模拟数据和现实世界数据之间的相机对齐差异可能是一个重大差异。通过重渲染模拟演示来解决这一差异,使其与真实世界设置的相机姿态大致匹配。注:这并不代表完美对齐,但正如实验中所证明的那样,它仍然有很大帮助。除了这个简单的后处理操作之外,不会对先验数据做任何其他更改。

人形机器人桌面。为了镜像厨房领域的设置,在 RoboCasa 中创建一个与任务无关的先验数据集,其中包含 10 个任务,涉及一个厨房台面和一个 GR-1 机器人。每个任务都涉及从源容器抓取指定物体并将其放入目标容器(例如,从碗到篮子)。虽然先验的任务和数据集在语义上与真实世界设置相似,但它们是独立开发的,并且涉及许多差异,例如目标类别、视觉纹理、干扰物体和物理参数。这 10 个任务在语义上与现实世界中的任务并不等同——它们涉及不同的源和/或目标容器。使用 DexMimicGen [10](一个基于 MimicGen 构建的、适用于人形机器人和其他双手机器人的数据生成框架)从数十个人类演示中合成机器人轨迹。为每个任务生成 1,000 个演示,总共 10,000 个演示。

构建任务-觉察模拟数据集

前面介绍的任务和数据集可能与现实世界任务存在诸多差异,这可能会限制它们的实用性。或者,可以投入更多精力,在模拟环境中创建与现实世界任务更加契合的自定义任务。创建现实世界任务的完美数字孪生[55]、[56]、[64]副本极具挑战性,需要大量的手动调整、系统识别以及获取相同的3D资产。因此,选择在模拟环境中创建具有相同任务语义(即环境中的目标类别和相同行为)的任务。将这些任务称为任务-觉察的数字表亲。“数字表亲”一词最近由 Dai [25]提出,用来描述与现实世界对应物接近但并非完全一致的模拟环境。对此概念进行更精确的定义扩展:任务-觉察的数字表亲,是一个保留了现实世界任务四个关键要素的模拟数据集:

  1. 相同的机器人和动作空间;
  2. 相同的任务目标——具体来说,相同的成功率检验,以及(如果适用)相同的语言指令;
  3. 相同的物体类别,尽管单个实例的几何形状或纹理可能有所不同;
  4. 相同的环境固定装置类别(例如,厨房台面、桌面、橱柜门)。

如下概述创建这些任务的努力:

Panda 厨房。现实世界中的 Panda 厨房任务已在 RoboCasa 先验数据集中有所体现,但如前面所述,存在一些差异。概述对任务和数据集所做的更改:首先,调整机器人关节的初始状态分布和模拟中的机器人基座位置,以匹配真实环境。此外,将任务中的目标限制为 10 个目标类别的精选列表,其中包含现实世界 CounterToSinkPnP 任务中使用的所有 9 个目标类别。这与先验数据集形成对比,在先验数据集中,提供 66 个可能的目标类别,范围更广。对于每项任务,随后收集 100 个源人类演示。最后,使用 MimicGen 为每个任务生成 10,000 个演示。这与先验数据集形成对比:在每个任务中收集 50 个源人类演示,并使用 MimicGen 为每个任务生成 3,000 个演示。

人形机器人桌面。对于该领域的三个任务,在 RoboCasa 中构建真实世界环境的数字表亲。在每个真实世界任务中,都使用一组固定的目标进行数据收集和评估。然而,在数字表亲中,会从与真实世界任务相同的类别中随机选择目标,以增加模拟演示的多样性。此外,调整机器人的初始姿态和摄像机位置,以紧密复制真实世界的设置。然后,收集 10 个源演示,并使用 DexMimicGen [10] 为每个任务生成 1,000 条轨迹。

训练和评估方案

在研究中,比较使用不同形式的现实世界和模拟数据进行协同训练的效果。对于每个任务,可以访问以下形式的数据:
现实世界数据 (Real):在现实世界中为目标任务收集的演示。
先验模拟数据 (Prior):任务无关模拟数据。
任务-觉察数字表亲数据 (DC):合成模拟数据。

通过在数据上联合训练策略,并在实际任务上评估生成的策略,来比较这些数据集的各种组合。使用 Chi [37] 的扩散策略实现来训练视觉运动策略。该策略以 RGB 图像和机器人本体感受信息作为输入,并生成一系列要执行的动作。训练结束后,会通过多次试验评估该策略,并记录成功率。

训练细节如下。

Panda 厨房。采用 Chi [37] 提出的开源扩散策略实现。使用基于 Transformer 的变型,并结合 ResNet 视觉编码器。该策略采用三个 128 × 170 的图像视图和机器人本体感受信息(末端执行器位置和旋转、夹持器关节值),并输出一个 7 自由度动作,用于增量末端执行器控制和夹持器动作。修改超参,使用更大的 Transformer 网络和更大的 256 批次大小。还添加语言条件,以便于在多样化的多任务数据上进行训练;使用 CLIP 句子编码器对语言进行编码,并在视觉编码器中添加 FiLM 条件层 [71]。将真实数据和模拟数据的默认协同训练比例分别设置为 0.10 和 0.90。这样做是因为拥有的模拟演示数量明显高于真实演示。

对于大小为 B 的训练批次,平均从模拟数据集 D_sim 中提取 α · B 个样本,从真实世界数据集 D_real 中提取 (1−α)·B 个样本。为了实现这一点,重新加权每个数据样本,使得 P[(o_i,a_i) ∈ D_sim] = α 和 P[(o_i,a_i) ∈ D_real] = 1 − α,其中 (o_i, a_i) 表示批次内的观察-动作对。通过首先根据数据集的大小对每个样本的权重进行归一化来实现这一点,然后如果样本属于 D_sim,则将归一化的权重乘以 α,如果属于 D_real,则乘以 1 − α。

人形机器人桌面。由于在要操作的目标方面没有歧义,使用没有语言条件的扩散策略 (DP),并为每个任务训练一个策略。使用 UMI [72] 的 DP 实现,以 Vision Transformers [73] 作为视觉编码器,UNet [74] 作为扩散主干。输入观测包含来自第一人称视角相机的 RGB 图像和关节位置观测。输出动作是手臂和灵巧手的目标关节位置。协同训练比率 α 为 0.9 和 0.99 时效果最佳,其余实验均采用 0.99。

根据实证研究结果,本文提供一系列建议,以帮助从业者从与合成模拟数据共同训练中获益。

任务和场景构成。当与来自任务-觉察数字表亲的模拟数据共同训练时,可以观察到最大的性能提升,其中任务和场景构成与现实世界的设置非常相似。尽管如此,与大量多任务先验模拟数据共同训练 - 尽管任务和场景构成存在差异 - 仍然提供有意义的好处。

目标构成和初始化分布。在模拟数据中合并不同的目标并改变它们的位置有助于将现实世界的策略泛化到未见过的场景。

任务-觉察数字表亲与现实世界之间的对齐。模拟任务必须与现实世界的任务具有相同的定义和成功标准。此外,在模拟和现实世界设置之间保持相似的摄像机视点可以提高性能,尽管不需要完全对齐。

共同训练超参。使用足够大量的模拟数据(理想情况下,比真实世界数据多几个数量级)并仔细调整共同训练比率以优化性能。

虽然对桌面操纵器和人形机器人的多项任务进行了系统研究,但大多数任务都围绕着拾取和放置。将该方法泛化到更广泛的操纵任务,如高精度插入和更长远的任务,还有待未来的研究。

虽然与单纯基于真实机器人数据收集的训练相比,协同训练方法不断提高成功率,但该策略的性能仍然不完美。未来的努力可以在此基础上进一步提高真实世界的性能。

最后,某些真实世界的任务——特别是涉及可变形体和液体的任务——仍然难以准确模拟,这本身就限制了模拟数据的适用性。将这种协同训练策略应用于此类任务是一个挑战。

未来的工作可以探索使用视频生成模型和世界模型 [66]–[68] 生成的协同训练数据来弥补这一差距。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2332435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WRS-PHM电机智能安康系统:为浙江某橡胶厂构筑坚实的生产防线

以行业工况为背景 一、顾客工厂的背景 浙江某橡胶厂以电机为中心生产设备必须连续平稳运行。但由于缺乏有效的故障预警体系,电机故障就像潜伏着的“不定时炸弹”,不但不时地造成生产流程的中断,也使对生产进行管理异常艰难,对持续安全生产提…

将 CrewAI 与 Elasticsearch 结合使用

作者:来自 Elastic Jeffrey Rengifo 学习如何使用 CrewAI 为你的代理团队创建一个 Elasticsearch 代理,并执行市场调研任务。 CrewAI 是一个用于编排代理的框架,它通过角色扮演的方式让多个代理协同完成复杂任务。 如果你想了解更多关于代理…

Spring 的 IoC 和 DI 详解:从零开始理解与实践

Spring 的 IoC和 DI 详解:从零开始理解与实践 一、IoC(控制反转) 1、什么是 IoC? IoC 是一种设计思想,它的核心是将对象的创建和管理权从开发者手中转移到外部容器(如 Spring 容器)。通过这种…

ZYNQ笔记(四):AXI GPIO

版本:Vivado2020.2(Vitis) 任务:使用 AXI GPIO IP 核实现按键 KEY 控制 LED 亮灭(两个都在PL端) 一、介绍 AXI GPIO (Advanced eXtensible Interface General Purpose Input/Output) 是 Xilinx 提供的一个可…

实操(环境变量)Linux

环境变量概念 我们用语言写的文件编好后变成了程序,./ 运行的时候他就会变成一个进程被操作系统调度并运行,运行完毕进程相关资源被释放,因为它是一个bash的子进程,所以它退出之后进入僵尸状态,bash回收他的退出结果&…

Word / WPS 页面顶部标题 段前间距 失效 / 不起作用 / 不显示,标题紧贴页眉 问题及解决

问题描述: 在 Word 或者 WPS 里面,如果不是新的一节,而是位于新的一页首行时,不管怎么设置段前间距,始终是失效的,实际段前间距一直是零。 解决方案: 查询了很多方案均无法解决问题&#xff…

Linux自行实现的一个Shell(15)

文章目录 前言一、头文件和全局变量头文件全局变量 二、辅助函数获取用户名获取主机名获取当前工作目录获取最后一级目录名生成命令行提示符打印命令行提示符 三、命令处理获取用户输入解析命令行执行外部命令 四、内建命令添加环境变量检查和执行内建命令 五、初始化初始化环境…

在 Q3D 中提取汇流条电感

汇流条排简介和设计注意事项 汇流条排是用于配电的金属导体,在许多应用中与传统布线相比具有设计优势。在设计母线排时,必须考虑几个重要的因素: 低电感:高频开关内容会导致无功损耗,从而降低效率电容:管…

MySQL:事务的理解

一、CURD不加控制,会有什么问题 (1)因为,MySQL里面存的是数据,所以很有可能会被多个客户访问,所以mysqld可能一次会接受到多个关于CURD的请求。(2)且mysql内部是采用多线程来完成数…

python 基础:句子缩写

n int(input()) for _ in range(n):words input().split()result ""for word in words:result word[0].upper()print(result)知识点讲解 input()函数 用于从标准输入(通常是键盘)读取用户输入的内容。它返回的是字符串类型。例如在代码中…

Ruoyi-vue plus 5.2.2 flowble 结束节点异常错误

因业务要求, 我在结束节点的结束事件中,制作了一个归档的事件,来执行一个业务。 始终都会报错, 错误信息 ${archivTemplateListener} did not resolve to an implementation of interface org.flowable.engine.delegate.Execution…

Sublime Text使用教程(用Sublime Text编写C语言程序)

Sublime Text 是一款当下非常流行的文本编辑器,其功能强大(提供有众多的插件)、界面简洁、还支持跨平台使用(包括 Mac OS X、Linux 和 Windows)。 在程序员眼中,Sublime Text 不仅仅是一个文本编辑器&…

【1】k8s集群管理系列--包应用管理器之helm

一、helm概述 Helm核心是模板,即模板化K8s YAML文件。 通过模板实现Chart高效复用,当部署多个应用时,可以将差异化的字段进行模板化,在部署时使用-f或 者–set动态覆盖默认值,从而适配多个应用 helm工作流程&#xf…

Mysql表的操作(2)

1.去重 select distinct 列名 from 表名 2.查询时排序 select 列名 from 表名 order by 列名 asc/desc; 不影响数据库里面的数据 错误样例 : 但结果却有点出乎意料了~为什么会失败呢? 其实这是因为书写的形式不对,如果带了引号,…

智能物联网网关策略部署

实训背景 某智慧工厂需部署物联网网关,实现以下工业级安全管控需求: 设备准入控制:仅允许注册MAC地址的传感器接入(白名单:AA:BB:CC:DD:EE:FF)。协议合规性:禁止非Modbus TCP(端口…

Java学习总结-线程池

线程池是什么? 线程池就是一个可以复用线程的技术。 假若不用线程池的问题:创建新线程开销很大,不能来一个任务就就创建一个新线程。 如何创建线程池对象? 方法一:使用ExecutorService的实现类ThreadPoolExecutor创…

基于CNN-BiLSTM-GRU的深度Q网络(Deep Q-Network,DQN)求解移动机器人路径规划,MATLAB代码

一、深度Q网络(Deep Q-Network,DQN)介绍 1、背景与动机 深度Q网络(DQN)是深度强化学习领域的里程碑算法,由DeepMind于2013年提出。它首次在 Atari 2600 游戏上实现了超越人类的表现,解决了传统…

CVE-2025-29927 Next.js 中间件鉴权绕过漏洞

Next.js Next.js 是一个基于 React 的现代 Web 开发框架,用来构建高性能、可扩展的 Web 应用和网站。 CVE-2025-29927 Next.js 中间件鉴权绕过漏洞 CVE-2025-29927是Next.js框架中的一个授权绕过漏洞,允许攻击者通过特制的HTTP请求绕过在中间件中执行…

数据结构(五)——AVL树(平衡二叉搜索树)

目录 前言 AVL树概念 AVL树的定义 AVL树的插入 右旋转 左旋转 左右双旋 右左双旋 插入代码如下所示 AVL树的查找 AVL树的遍历 AVL树的节点个数以及高度 判断平衡 AVL树代码如下所示 小结 前言 前面我们在数据结构中介绍了二叉搜索树,其中提到了二叉搜…

C++类型转换详解

目录 一、内置 转 内置 二、内置 转 自定义 三、自定义 转 内置 四、自定义 转 自定义 五、类型转换规范化 1.static_case 2.reinterpret_cast 3.const_cast 4.dynamic_cast 六、RTTI 一、内置 转 内置 C兼容C语言,在内置类型之间转换规则和C语言一样的&am…