当前位置: 首页 > news >正文

论文笔记(四十六)RobotGPT: Robot Manipulation Learning From ChatGPT

xx

RobotGPT: Robot Manipulation Learning From ChatGPT

  • 文章概括
  • 摘要
  • I. 介绍
  • II. 相关工作
  • III. 方法论
    • A. ChatGPT 提示机器人操作
    • B. 机器人学习
  • IV. 实验
    • A. 衡量标准
    • B. 实验设置
    • C. 模拟实验
    • D. 真实机器人实验
    • E. AB测试
  • V. 结论

文章概括

引用:

@article{jin2024robotgpt,title={Robotgpt: Robot manipulation learning from chatgpt},author={Jin, Yixiang and Li, Dingzhe and Yong, A and Shi, Jun and Hao, Peng and Sun, Fuchun and Zhang, Jianwei and Fang, Bin},journal={IEEE Robotics and Automation Letters},year={2024},publisher={IEEE}
}
Jin, Y., Li, D., Yong, A., Shi, J., Hao, P., Sun, F., Zhang, J. and Fang, B., 2024. Robotgpt: Robot manipulation learning from chatgpt. IEEE Robotics and Automation Letters.

原文:https://ieeexplore.ieee.org/abstract/document/10412086/
代码、数据和视频:暂无


系列文章:
请在 《 《 文章 》 》 专栏中查找


摘要

我们提出了 RobotGPT,这是一个用于机器人操纵的创新决策框架,它将稳定性和安全性放在首位。由 ChatGPT 生成的执行代码无法保证系统的稳定性和安全性。ChatGPT 可能会对同一任务给出不同的答案,从而导致不可预知性。这种不稳定性阻碍了将 ChatGPT 直接集成到机器人操纵回路中。虽然将温度设置为 0 可以产生更一致的输出,但可能会导致 ChatGPT 失去多样性和创造性。我们的目标是利用 ChatGPT 在机器人操纵中解决问题的能力,训练出一个可靠的代理。该框架包括有效的提示结构和稳健的学习模型。此外,我们还引入了衡量任务难度的指标,以评估 ChatGPT 在机器人操纵中的表现。此外,我们还在模拟和真实环境中对 RobotGPT 进行了评估。与直接使用 ChatGPT 生成代码相比,我们的框架显著提高了任务成功率,平均成功率从 38.5% 提高到 91.5%。因此,与直接使用 ChatGPT 作为任务规划器相比,利用 ChatGPT 作为专家来训练 RobotGPT 是一种更稳定的方法。

索引词条——人工智能机器人、从演示中学习、操纵规划。


I. 介绍

大型语言模型(LLM)在各种任务中都取得了令人瞩目的成就,包括但不限于文本生成、机器翻译和代码合成。最近,越来越多的工作[1]、[2]试图将 LLM 纳入机器人系统。之前的工作表明,LLM 能够以零点方式进行机器人系统规划。然而,迄今为止,还没有任何研究能够全面探讨 LLM 能够解决哪些任务。

此外,LLM 的快速发展也对人机交互(HRI)产生了重大影响。人机交互研究涉及更广泛的领域,如虚拟现实、智能空间等。为了提高面向用户的普及率,让人们更舒适、更方便地使用机器人,自然交互是关键技术之一。目前,自然语言交互的探索已经取得了一些进展[3],但也存在很多不足。

然而,在使用场景的通用性和语言模型的理解方面仍略显不足。最近出现的 ChatGPT 提高了人们对语言模型的期望。ChatGPT 凭借其强大的代码模型生成能力和会话灵活性,在各种语言模型中脱颖而出,展现了惊人的理解能力,让用户能以更自然的方式与机器人进行交互。现有的代表作品利用 ChatGPT 生成可直接部署在机器人上的代码,事先描述任务目标和 ChatGPT 可用的函数库,然后利用 ChatGPT 操纵不同的机器人执行功能,如无人机导航、机器人在连续循环反馈后用自然语言抓取物体等。ChatGPT 能够从自然对话中解析用户意图,并从自然对话中生成解决问题的代码,这揭示了 ChatGPT 在机器人领域应用的巨大潜力[1]。

在这封信中,我们对 ChatGPT 在机器人操纵领域的应用进行了深入研究。我们的目标是推动 ChatGPT 在机器人领域的实际应用。通过 ChatGPT,我们实现了一个将环境和任务转化为自然语言的框架。随后,ChatGPT 生成具体的行动指令代码,用于训练代理 RobotGPT,使其充分利用 ChatGPT 的问题解决能力。机器人可以间接地使用自然语言与外界互动,从而设计合理的动作序列并实现相应的功能(如拾取和放置)。我们还对与 ChatGPT 的对话提出了一些建议,即如何构建提示语,以便 ChatGPT 能更准确、更深入地理解。此外,我们还指出了这种交互的局限性和安全风险,以及解决问题的简单思路。总的来说,我们的主要贡献如下:
\quad 1) 我们探索了一种带有自我纠正模块的有效提示结构,并在不同难度的任务上进行了实验,以探索 ChatGPT 在机器人任务上的能力边界。
\quad 2) 我们为 ChatGPT 在机器人领域的应用提出了一个新颖的框架。我们的系统并不直接执行 ChatGPT 生成的代码。相反,我们采用一个代理来学习 ChatGPT 生成的规划策略,从而提高系统的稳定性。虽然微调可以提高精度[4],但训练数据很难获得。

II. 相关工作

  1. 用于机器人技术的 LLMs: 通过语言控制机器人能为非专家带来更自然的交互[5]。使用语言控制机器人需要考虑稳定性和通用性 [4]。有关这一问题的文献很多,总体上分为高级解释(如语义解析、规划)[6]和低级策略(如基于模型、模仿学习或强化学习)[7]。大型语言模型(LLM)具有强大的通用智能能力。与此同时,用于机器人的大型语言模型也受到了广泛关注[8]。与我们的研究工作相关的典型文献如下。[9]提出 LLMs 可以有效地将高层任务分解为中层计划,而无需任何进一步的训练。[2]基于 LLMs 构建几何可行计划。 [10]使用价值函数来评估 LLMs 生成的每一步,并选择最佳轨迹。[11] 基于 LLMs 建立系统,学习特定人的偏好。[4] 使用 LLMs 生成以机器人为中心的程序。然而,LLMs 输出的稳定性仍值得探索。
  2. 机器人学习: 为了利用机器人与现实世界交互的能力,机器人学习已成为研究热点[12]。当状态包括图像时,深度学习推进了机器人学习的发展[13]。机器人学习的算法有很多。不过,基于强化学习和模仿学习的算法仍是主流[14]、[15]。为了比较不同的强化学习算法,人们提出了许多基准。其中,[16]针对的是单一任务(如开门、家具组装、徒手灵巧操作)。[17]、[18] 有各种不同的环境,但缺乏长视距任务。相对全面的基准是 RLBench [19] 和 BulletArm [20]。虽然基准提供了框架,但如何获取机器人学习的数据仍然是个问题。

III. 方法论

ChatGPT 无法解析视觉输入并自行操作机器人。在这封信中,我们利用模拟环境和基于自然语言的机器人应用程序接口来释放 ChatGPT 解决一般问题的能力。因此,我们希望训练有素的代理 RobotGPT 能在任务规划层面吸收 ChatGPT 的知识。值得注意的是,我们的框架很容易扩展到已经拥有所需对象的新模拟环境中。

A. ChatGPT 提示机器人操作

最近,人们对使用大型语言模型(如 ChatGPT)通过生成高级动作来直接控制机器人越来越感兴趣。然而,由于以下几个原因,这种方法可能并不合适。首先,ChatGPT 生成的动作可能不安全或不稳定,因为它们没有考虑到机器人的物理约束和限制。 其次,ChatGPT 缺乏对因果关系和时间依赖关系的推理能力,而这对于控制复杂的机器人系统至关重要。因此,我们提出了一种基于机器人学习的替代方法,即用 ChatGPT 生成用于训练机器人的演示。通过充分利用语言模型和机器人学习的优势,我们的目标是开发出更安全、更强大的机器人系统。在本节中,我们将详细介绍与 ChatGPT 交互生成演示的框架。

我们提出了一个与 ChatGPT 交互的框架,它由两部分组成:代码生成和纠错。在代码生成阶段,用户描述任务并提供示例来指导 ChatGPT 的响应。这有助于确保 ChatGPT 生成适当的相关输出,以满足用户的要求。在纠错阶段,运行时错误和任务失败都被认为是正确的。

\quad 1) 提示描述: 有效的提示方法对于提高 ChatGPT 在各个领域的性能至关重要。Vemprala 等人[1]指出了当前为机器人操作提示 LLM 所面临的挑战: 1) 需要对问题进行完整而准确的描述; 2) 允许使用自然语言描述的应用程序接口; 3)偏向答案结构。在本节中,我们将详细介绍用于机器人操作的有效提示方法。我们提出了一种由背景描述对象信息环境信息任务信息示例五个部分组成的提示方法。在背景描述部分,我们描述了环境的基本信息,如环境的目的、布局和相关实体。在对象信息部分,我们列出了所有对象的名称、形状、姿势和其他有用信息,例如它们的属性以及与其他对象的关系。在环境信息部分,我们描述了 ChatGPT 可以用来执行任务的机器人和 API 功能。在任务信息部分,我们给出了 ChatGPT 的具体任务,通常是为给定任务生成 Python 代码。最后,在示例部分,我们提供了一些例子,以便更好地理解环境和 API 的使用。根据 OpenAI 的建议[21],我们在 ChatGPT API 中设置了背景信息和 RobotAPI 信息作为系统信息,以获得令人满意的回复。通过使用这种全面、结构化的提示方法,我们希望提高 ChatGPT 在各种任务和领域中的准确性和效率。

\quad 2) 自我更正: 在生成复杂任务的回复时,ChatGPT 可能偶尔会出现一些小错误或语法错误,需要进行纠正。这封信介绍了一种纠正 ChatGPT 响应的交互式方法。为了采用这种方法,我们首先在模拟器中执行生成的代码并评估结果。
生成的代码将逐行执行,当出现运行时错误时,代码错误捕捉模块将捕捉运行时错误,包括错误信息及其位置。然后,这些数据会被发回 ChatGPT 决策机器人进行进一步分析。在结果为失败的情况下,校正机器人可以根据提示分析失败的潜在原因,并生成回复解释任务失败的原因。最后,原 ChatGPT 决策机器人将根据纠正机器人的失败分析重新生成代码。利用这些反馈,ChatGPT 会修正其响应并生成准确的代码。这一互动过程最多可重复三次。我们的目标是提高 ChatGPT 响应的精确度和可靠性,使其在各个领域的相关性不断增强。

\quad 3) 生成代码评估: 根据 ChatGPT 生成的代码完成的任务应满足要求。为此,一个自动、高效、精确的任务评估模块势在必行。

如图 1 所示,我们使用了一个名为评估机器人的 ChatGPT 来生成评估代码。评估机器人的提示与决策机器人有一些不同。如图 2 所示,提示的结构保持不变,但背景描述和机器人 API 的内容有所不同。评价机器人生成的函数 is_task_success() 将作为判断整个任务是否成功的标准。人类的作用是反复检查生成的评估代码是否正确。如果生成了错误的评估代码,人类将介入进行纠正。这种设计可以最大限度地减轻人类的负担。


在这里插入图片描述
图 1. 我们系统的架构。ChatGPT 在其中扮演三个角色,即决策机器人、评估机器人和纠正机器人。操作员指示机器人完成任务,然后根据环境信息和人类指令生成自然语言提示。决策机器人将根据提供的提示生成相应的可执行代码。接下来,生成的代码将被逐行执行。如果出现运行时错误,将向决策机器人提供错误原因和发生错误的代码行,供其修改,直到代码成功运行。然后,可执行代码将由评估机器人生成的评估代码模型进行测试。如果可执行代码无法通过 Eval Code 测试,校正机器人将分析结果失败的潜在原因,并将这些失败原因反馈给决策机器人进行修正。之后,满足评估条件的代码将用于生成演示数据。训练完成后,经过训练的代理就可以完美地部署真正的机器人了。



在这里插入图片描述

图 2. ChatGPT 的提示。


B. 机器人学习

依靠 ChatGPT 执行一般机器人任务并不可靠,因为 ChatGPT 的输出是随机的,这夸大了机器人工作的风险。虽然将温度设置为零可以以降低多样性和创造性为代价产生一致的结果,但也可能导致任务持续失败。为了解决这个问题,我们期望机器人学习机器人策略,吸收 ChatGPT 解决一般任务的知识。在机器人学习方面,我们利用最先进的开源机器人操纵基准和学习框架 BulletArm [20],从 ChatGPT 生成的演示中训练代理。

\quad 1) 行动、状态空间和奖励:由 ChatGPT 支持的专家演示是在模拟环境中生成的,该环境由一个panda robot组成,工作区顶部安装有摄像头。状态空间由自上而下的高度图 H H H、手持图像 I I I 和抓手状态 g ∈ { H O L D I N G , E M P T Y } g∈\{HOLDING,EMPTY\} g{HOLDING,EMPTY} 组成。动作空间包括机器人技能 A s ∈ { P I C K , P L A C E } A_s ∈\{PICK,PLACE\} As{PICK,PLACE} 和目标姿势 A p ∈ A x y θ A_p ∈A^{xyθ} ApAxyθ. 其中, x x x y y y 表示末端执行器的 XY \text{XY} XY 坐标, θ θ θ 表示沿 Z 轴的旋转。奖励设置为稀疏奖励函数,其中,当所有状态-动作对都达到目标状态时,奖励为 1,否则为 0。

\quad 2) 算法: BulletArm [20] 显示,SDQfD [22] 的性能优于 DQN [23]、ADET [24] 和 DQfD[25]。在网络结构方面,Equivariant ASR[14]在所有环境中表现最佳,然后是 Rot FCN[26]和 CNN ASR[22],最后是 FCN[27]。如图 3 所示,本文采用 SDQfD 算法[22],利用等变 ASR 网络[14]完成机器人学习任务。损失函数为 n 步 TD 损失与严格大余量损失之和。


在这里插入图片描述

图 3. 机器人学习网络架构。


IV. 实验

在本节中,我们将在模拟环境和真实环境中对所提系统进行评估。表 I 和图 4 详细描述了我们的实验设置。更具体地说,我们将重点解释以下问题:


在这里插入图片描述



在这里插入图片描述
图4. 我们实验中使用的八个任务。


  1. Robot-GPT能否高效且安全地收集示范数据,并在现实世界中部署,从而缩小模拟与现实之间的差距?

  2. 我们的基于大型语言模型的机器人能否解决手动编码和非大型语言模型未能很好处理的问题?

A. 衡量标准

为了创建一个评分系统,我们考虑以下三个方面:物体数量o、物体类别c以及任务步骤数s。这三个因素是通过对32名机器人和计算机视觉领域的专家和工程师进行调查而确定的,主要影响机器人桌面抓取任务的难度。问卷由两个主要部分组成:第一部分是列出影响机器人操作难度的三个主要因素;第二部分是对本实验的八个场景进行评分。结果如表II所示。


在这里插入图片描述


在这三个因素中,物体数量对难度的影响最大,因此我们在评分中加大了它的权重。因此,任务难度的评分可以通过以下公式计算:

s c o r e = o + o ∗ c + s (1) score = o + o * c +s \tag{1} score=o+oc+s(1)

得分在0到10之间的任务被视为简单,得分在11到20之间的任务被认为是中等,而得分超过20的任务被定义为困难任务。表II展示了实验中使用的任务及其对应的难度等级。从公式(1)计算的难度与问卷调查获得的主观结果基本一致,除了“装箱”任务,这表明该评估系统具有一般适用性。“装箱”任务的主观结果较简单,是因为未考虑优化放置位置以填满箱子而不让物体掉落。

在接下来的定量实验中,我们将为每个任务生成25个随机场景,并统计成功尝试的数量。

B. 实验设置

图5展示了我们在模拟和现实环境中的实验设置。我们将RGB-D传感器直接安装在工作区上方,以提供场景的清晰高度图。在模拟环境中,机器人依靠PyBullet引擎进行运动控制;而在现实世界中,机器人则使用MoveIt和ros_franka进行运动规划和执行。


在这里插入图片描述
图 5. 实验设置


C. 模拟实验

表III展示了八个实验的定量结果。尽管每次输入相同的提示,生成的代码和输出仍存在显著差异,因为决策机器人的温度设定为1.0。此外,ChatGPT生成的代码可能包含语法或逻辑错误。虽然我们的自我纠正模块可以修正一些语法错误,但在大多数情况下,如果ChatGPT初始生成的代码未能成功,则很难在这个实验中实现成功。


在这里插入图片描述


图6展示了由ChatGPT生成的错误规划导致的三种最常见失败情况。图6(a)显示了由于对任务要求的误解而导致的失败,瓶子摆放任务要求将瓶子整齐地放置在托盘上,而不是随意放置。图6(b)呈现了错误的动作顺序规划,其中机器人在抓取图中叠放的积木。这是不合理的,因为机器人应当抓取尚未堆叠的物体。在图6©中,明显可以看出机器人的放置位置偏离了预期。因此,ChatGPT可以为相同的提示提供不同的解决方案,其中一些是正确的,而另一些则是错误的。这就是我们提出RobotGPT框架作为一种更稳定的方法的原因。


在这里插入图片描述
图 6. ChatGPT 生成的失败任务规划。


图7展示了三个难度等级的成功率。对于ChatGPT,随着任务难度的增加,成功率显著下降,简单、中等和困难任务的成功率分别为0.88、0.39和0.21。相比之下,我们的RobotGPT模型在所有任务级别上都表现出稳健性,平均成功率可达到0.915,表现良好。


在这里插入图片描述

图 7. 三种难度下的成功率


D. 真实机器人实验

RobotGPT的最终目标是利用ChatGPT的智能来帮助解决现实世界的问题。因此,我们在与模拟环境相同的真实环境中部署了训练好的智能体。为了克服模拟与现实之间的差距,原始深度图将通过物体分割和去噪处理进行预处理,然后转换为高度图。此外,为了确保机器人抓取和放置的连续过程,在真实机器人测试中,机器人在抓取动作后不会返回观察位置以捕获新的深度图,而是基于夹持状态从之前的高度图中裁剪出当前高度图。在真实机器人实验中,我们选择了如图8所示的六个场景,每个实验进行了十次。最终,表IV报告了我们的真实机器人测试结果。


在这里插入图片描述

图 8. 真实机器人实验结果。



在这里插入图片描述


从表IV可以看出,执行步骤较少的任务往往成功尝试的次数较多。失败的主要原因并不是由于智能体的错误预测,而是由于在放置过程中精度不足,导致任务失败。因此,探索在闭环循环中使用大型语言模型以实现更精确的任务执行,将是未来值得研究的方向。

E. AB测试

为了调查我们的基于大型语言模型的机器人在解决非大型语言模型方法未能很好处理的问题的能力,我们引入了两个开放式实验,如图9所示。第一个实验是一个整理房间的挑战,要求整理40个定制的家居物品;第二个实验是一个拼单词游戏,旨在使用给定的字母集A-L拼写出最长的单词。此外,我们还邀请人类参与者完成相同的任务。


在这里插入图片描述

图 9. 两个开放式实验


实验协议:我们邀请了十名参与者进行AB测试实验。其中七名参与者具有机器人开发经验,三名参与者有图像处理经验。我们设定了70分钟的时间限制。参与者通过与RobotGPT相同的提示了解开发要求。他们被要求通过编程完成表V中列出的10个任务。每位参与者可以自主决定尝试任务的顺序。


在这里插入图片描述


评估指标:我们通过五个指标评估性能:完成状态(CS),对于人类参与者,我们计算完成的数量;对于RobotGPT,则是是否完成任务;代码质量(CQ)指的是生成代码的评分范围为0到1,由Python静态代码分析工具Pylint进行分析;时间使用(TU)表示从阅读任务要求到在模拟中实现任务所耗费的时间(以秒为单位);外部帮助(EH)指参与者是否在互联网上搜索信息;对于人类测试,CQ、TU和EH表示完成任务的个体数据的平均值。

结果与分析:表V展示了AB测试的结果。与手动编码相比,RobotGPT在代码质量和时间消耗方面均表现出优势,得分分别为0.762和221.8秒,而人类的得分为0.70和554.9秒。只有五名参与者在70分钟内完成所有任务,因此即使对于编程背景强的工程师,通过手动编码生成机器人示范数据也是非常耗时的。

此外,RobotGPT在两个开放式任务——整理房间和拼单词游戏中明显优于人类。这主要得益于大型语言模型的知识库。在整理实验中,RobotGPT将物体分为十组,标签包括厨房用品、水果、零食、媒体、鞋类、办公用品、电子产品、个人护理产品、存储和饮料,耗时412秒,这一结果令人满意。如果物体数量从40增加到400,LLM驱动机器人将展现出更明显的优势。在拼单词游戏中,RobotGPT提供的结果是9个字母的单词“backfield”,而人类的最佳结果是7个字母的单词“blacked”。更重要的是,参与者需要在线搜索信息以完成这两个开放式任务,表明LLM拥有比人类更全面的知识。

V. 结论

在这封信中,我们首先开发了一个有效的提示结构,以增强ChatGPT对机器人环境和需要执行任务的理解。接下来,我们介绍了一个名为RobotGPT的框架,该框架利用ChatGPT的问题解决能力,实现更稳定的任务执行。在实验中,我们建立了一种衡量任务难度的指标,并观察到随着任务难度的增加,ChatGPT的执行成功率下降。相比之下,RobotGPT的任务执行成功率达到了91.5%,展现出更稳定的性能。更重要的是,这一智能体已在现实环境中运行。因此,利用ChatGPT作为专家训练RobotGPT是一种比直接使用ChatGPT作为任务规划者更稳定的方法。此外,AB测试显示,我们的基于大型语言模型的机器人在两个开放式任务中显著优于手动编码,这归功于大型语言模型的大量先验知识库。总体而言,机器人技术与大型语言模型的结合仍处于起步阶段。我们的工作只是初步探索,我们相信未来在这一领域的研究将致力于探索如何在机器人领域合理利用ChatGPT的能力。最近,研究提出了一种从约200个人类示范生成大规模数据集的方法,但仅适用于18个任务。通过结合大型模型扩展人类示范的规模和任务类型将是一个有趣的方向。

相关文章:

论文笔记(四十六)RobotGPT: Robot Manipulation Learning From ChatGPT

xx RobotGPT: Robot Manipulation Learning From ChatGPT 文章概括摘要I. 介绍II. 相关工作III. 方法论A. ChatGPT 提示机器人操作B. 机器人学习 IV. 实验A. 衡量标准B. 实验设置C. 模拟实验D. 真实机器人实验E. AB测试 V. 结论 文章概括 引用: article{jin2024r…...

docker - 镜像操作(拉取、查看、删除)

文章目录 1、docker search --help(用于显示 Docker 搜索命令的帮助信息)2、docker pull(拉取镜像)3、docker images (查看镜像)3.1、docker images --help(用于显示 Docker 镜像管理相关命令的帮助信息)3.…...

如何选择数据库架构

选择合适的数据库架构是一个复杂的过程,它取决于多种因素,包括应用程序的需求、数据量的大小、并发访问量、数据一致性要求、预算以及技术团队的熟悉程度等。以下是一些关键的步骤和考虑因素,帮助你选择合适的数据库架构: 1. 分析…...

Mysql高级篇(中)——锁机制

锁机制 一、概述二、分类1、读锁2、写锁⭐、FOR SHARE / FOR UPDATE(1)NOWAIT(2)SKIP LOCKED(3)NOWAIT 和 SKIP LOCKED 的比较 ⭐、 脏写3、表级锁之 S锁 / X锁(1)总结(2…...

JavaWeb图书借阅系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 login.jsp 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优…...

文档矫正算法:DocTr++

文档弯曲矫正(Document Image Rectification)的主要作用是在图像处理领域中,对由于拍摄、扫描或打印过程中产生的弯曲、扭曲文档进行校正,使其恢复为平整、易读的形态。 一. 论文和代码 论文地址:https://arxiv.org/…...

Vxe UI vue vxe-table vxe-grid 单元格与表尾单元格如何格式化数据

Vxe UI vue vxe-table vxe-grid 单元格与表尾单元格如何格式化数据 查看 github vxe-table 官网 单元格内容格式化 通过 formatter 属性自定义格式化方法 <template><div><vxe-grid v-bind"gridOptions"></vxe-grid></div> </t…...

【百日算法计划】:每日一题,见证成长(021)

题目 栈排序 编写程序&#xff0c;对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据&#xff0c;但不得将元素复制到别的数据结构&#xff08;如数组&#xff09;中。该栈支持如下操作&#xff1a;push、pop、peek 和 isEmpty。当栈为空时&#xff0c;p…...

数据恢复篇:如何恢复几年前删除的照片

您是否曾经遇到过几年前删除了一张图片并觉得需要恢复旧照片的情况&#xff1f;虽然&#xff0c;没有确定的方法可以丢失或删除的照片。但是&#xff0c;借助奇客数据恢复等恢复工具&#xff0c;可以恢复多年前永久删除的照片、视频和音频文件。 注意 – 如果旧数据被覆盖&…...

前端注释规范

1、目的和原则 提高可读性和可维护性 如无必要&#xff0c;无增注释&#xff1b;如有必要&#xff0c;尽量详尽 2、语法 单行注释&#xff1a; // 多行注释&#xff1a; /**/ 3、规范 1、注释符与注释内容之间加一个空格 2、注释行与上方代码间加一个空行 4、Javascript …...

uniapp踩坑 tabbar页面数据刷新了但视图没有更新

问题描述&#xff1a; 有个uni-data-checkbox组件&#xff0c;两个选项&#xff1a;选项1和选项2&#xff08;对应的value值分别为1和2&#xff09;&#xff0c;v-model绑定属性名为value 两个tabbar页面&#xff1a;tab1&#xff0c;tab2。 tab1页面有个逻辑是在onShow中刷新v…...

WebAssembly与WebGPU:游戏开发的新时代

文章目录 WebAssembly简介WebGPU简介Wasm WebGPU 在游戏开发中的优势创建一个简单的WebAssembly模块使用WebGPU绘制一个三角形WebAssembly 的高级特性内存管理异步加载与多线程 WebGPU 的高级特性着色器编程计算着色器 实战案例&#xff1a;创建一个简单的 2D 游戏游戏逻辑设计…...

SAP B1 认证考试习题 - 解析版(二)

前一篇&#xff1a;《SAP B1 认证考试习题 - 解析版&#xff08;一&#xff09;》 题目纯享版合集&#xff1a;《SAP B1 认证考试习题 - 纯享版》 三、采购流程 30. 下列哪个凭证在采购流程中是必须要完成的 A. 采购订单 B. 收货采购订单 C. 应付发票 D. 退货 E. 应付贷…...

《Ubuntu20.04环境下的ROS进阶学习7》

一、使用nav_msgs消息包显示小车轨迹 在我们跑实验的时候通常希望看到小车的轨迹&#xff0c;在ROS1中可以将小车的路径存储在nav_msgs::Path 这种消息类型里&#xff0c;发布出来后使用rviz来显示小车轨迹。 二、了解nav_msgs消息包 那么首先我们要来了解一下nav_msgs这个消息…...

免费视频无损压缩工具+预览视频生成工具

视频无损压缩工具 功能与作用 &#xff1a;视频无损压缩工具是一种能够减少视频文件大小&#xff0c;但同时保持视频质量的工具。它通过先进的编码技术和算法&#xff0c;有效降低视频文件的存储空间&#xff0c;同时保证视频的清晰度和观感。这对于需要分享或存储大量视频内容…...

OIDC9-OIDC集成登录功能(SpringBoot3.0)

1.项目依赖 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <…...

使用Vue.extend( ) 模仿 elementui 创建一个类似 message 消息提示框

提示&#xff1a;记录工作中遇到的需求及解决办法 文章目录 前言一、目录结构二、代码1. 创建 m-Toast.vue 文件2. 创建 global.js 文件3. 在 main.js 文件中导入 global.js 文件4. 在 App.vue 文件中使用 全局方法创建的 组件 前言 在此之前一直不明白Vue.extend( )干什么用的…...

ansible部署二进制mysql 8

1、配置文件 ll /ansible -rw-r--r-- 1 root root 836 Sep 22 12:09 my.cnf -rw-r--r-- 1 root root 810 Sep 22 07:21 mysql.service -rw-r--r-- 1 root root 2731 Sep 22 12:32 mysql.yam2、my.cnf内容 rootbole:/ansible# cat my.cnf [mysql] #设置m…...

【2023工业3D异常检测文献】基于混合融合的多模态工业异常检测方法Multi-3D-Memory (M3DM)

Multimodal Industrial Anomaly Detection via Hybrid Fusion 1、Background 随着3D传感器的发展&#xff0c;最近发布了具有2D图像和3D点云数据的MVTec-3D AD数据集&#xff0c;促进了多模态工业异常检测的研究。 无监督异常检测的核心思想是找出正常表示与异常之间的差异。…...

基于微信小程序的宿舍报修系统的设计与实现(lw+演示+源码+运行)

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对成果信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&am…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

JDK 17 序列化是怎么回事

如何序列化&#xff1f;其实很简单&#xff0c;就是根据每个类型&#xff0c;用工厂类调用。逐个完成。 没什么漂亮的代码&#xff0c;只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...

倒装芯片凸点成型工艺

UBM&#xff08;Under Bump Metallization&#xff09;与Bump&#xff08;焊球&#xff09;形成工艺流程。我们可以将整张流程图分为三大阶段来理解&#xff1a; &#x1f527; 一、UBM&#xff08;Under Bump Metallization&#xff09;工艺流程&#xff08;黄色区域&#xff…...

Java数组Arrays操作全攻略

Arrays类的概述 Java中的Arrays类位于java.util包中&#xff0c;提供了一系列静态方法用于操作数组&#xff08;如排序、搜索、填充、比较等&#xff09;。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序&#xff08;sort&#xff09; 对数组进行升序…...