增强现实系列—Real-Time Simulated Avatar from Head-Mounte

news/2024/9/22 10:25:56/
<article class="baidu_pl">
article_content" class="article_content clearfix">
arkdown_views prism-atom-one-dark">arker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中一起航行,共同成长,探索技术的无限可能。

🚀 探索专栏:学步_技术的首页 —— 持续学习,不断进步,让学习成为我们共同的习惯,让总结成为我们前进的动力。

🔍 技术导航:

  • 人工智能:深入探讨人工智能领域核心技术。
  • 自动驾驶:分享自动驾驶领域核心技术和实战经验。
  • 环境配置:分享Linux环境下相关技术领域环境配置所遇到的问题解决经验。
  • 图像生成:分享图像生成领域核心技术和实战经验。
  • 虚拟现实技术:分享虚拟现实技术领域核心技术和实战经验。

🌈 非常期待在这个数字世界里与您相遇,一起学习、探讨、成长。不要忘了订阅本专栏,让我们的技术之旅不再孤单!

💖💖💖 ✨✨ 欢迎关注和订阅,一起开启技术探索之旅! ✨✨

文章目录

  • 1. 背景介绍
  • 2. 方法
    • 2.1 预备知识:模拟化身控制
    • 2.2 XR Avatar 的合成数据
    • 2.3 基于头戴式传感器的模拟化身控制
  • 3. 实验
    • 3.1 结果
    • 3.2 消融实验与分析
  • 4. 结论与未来工作

1. 背景介绍

我们提出了 SimXR,一种通过从 AR / VR 头显中获取的信息(包括头显姿态和摄像机数据)来控制模拟化身的方法。由于头戴式摄像机的视角挑战,人类身体经常被截断出视野范围,使得传统基于图像的第一人称姿态估计变得困难。另一方面,头显的姿态提供了关于整体身体运动的有价值信息,但缺乏对手和脚等细节的精细描述。为了将头显姿态与摄像机信息相结合,我们控制一个人形模型来跟踪头显的移动,同时分析输入图像以确定身体的动作。当身体部位可见时,手和脚的动作将由图像引导;当不可见时,物理法则会指导控制器生成合理的运动。

我们设计了一种端到端的方法,该方法不依赖任何中间表示,能够直接从图像和头显姿态映射到人形模型的控制信号。为了训练我们的方法,我们还提出了一个大规模的合成数据集,该数据集使用与市面上可用的 VR 头显(如 Quest 2)兼容的摄像机配置创建,并在现实世界的捕捉中展示了令人鼓舞的结果。为了证明我们框架的适用性,我们还在配备前置摄像头的 AR 头显上进行了测试。
在这里插入图片描述
通过头戴设备(AR / VR 或 XR 头显)捕获的传感器数据流,我们的目标是实时控制一个模拟的人形模型/化身,来跟踪佩戴者的全局3D身体姿势,如图1所示。这可以应用于混合现实中的虚拟化身动画、游戏以及潜在的类人机器人远程操作[20]。

然而,商业头戴设备的传感器套件很少为全身姿态估计而设计。它们的摄像头通常朝向前方(例如 Aria 眼镜 [50])或侧面(例如 Meta Quest [4]),主要用于同时定位与映射(SLAM)和手部追踪。因此,身体在这些摄像头中常常以极端和扭曲的视角出现。

这些挑战引发了对基于视觉的第一人称姿态估计的研究,试图创造更有利的摄像机位置场景(例如直接向下的鱼眼摄像机[5, 52–54, 62, 67]),使更多的身体部位能够被观察到。然而,这些摄像机视角在现实中往往不切实际且难以重现:突出并向下的摄像机可能会超出预算,或破坏产品的美感。由于这些异构摄像机规格没有标准,难以收集大规模数据。使用合成数据[5, 52] 可以在一定程度上缓解这一问题,但现实世界中复现用于渲染的摄像机规格仍然具有挑战性,进一步加剧了从模拟到现实的差距(sim-to-real gap)。

另一条研究路线是使用头部跟踪来推断全身运动。与图像相比,6自由度(DoF)的头显姿态在维度上显著较低,可以很容易地从扩展现实(XR)头显中获取。然而,单凭头显姿态不足以提供全身运动信息,因此先前的研究要么将任务表述为生成式问题[27],要么依赖动作标签[29]来进一步约束解空间。添加 VR 控制器作为输入可以提供手部运动的额外信息,并有助于更稳定地估计全身姿态,但 VR 控制器并非总是可用[3, 8, 40],尤其对于带有前置摄像头的轻量级 AR 眼镜。这些方法主要基于运动学[7, 8, 13, 24],专注于运动估计而未考虑潜在的力。因此,它们容易引发悬浮和穿透问题,特别是因为脚部经常不可见。

为了解决这些问题,物理模拟[57]和环境线索[26]被用来创造合理的足部运动。利用物理法则可以显著提高运动的真实感,并迫使模拟化身采用合理的足部动作。然而,物理引入了类人模型控制的额外挑战——类人模型需要始终保持平衡并跟踪用户运动。大多数基于物理的方法通过强化学习(RL)进行学习,通常需要数百万甚至数十亿次的环境交互。如果每次交互都需要处理原始图像输入,计算成本将非常高。因此,使用视觉和模拟化身的方法通常使用低维中间表示,如预先计算的图像特征[64]或运动学姿态[29, 30, 66]。虽然控制器可以被训练来处理这些中间特征,但这种方法在视觉和控制组件之间造成了脱节,视觉组件在训练期间无法从物理模拟中获得充分反馈。

在这项工作中,我们展示了针对 XR 头显的端到端模拟化身控制框架的可行性。我们的方法,SimXR,直接将输入信号映射到关节驱动信号,而不依赖于中间表示(如身体姿态或2D关键点)。我们关键的设计选择是从预训练的运动模仿器中进行提炼,学习从输入到控制信号的映射,这使得能够有效地从视觉输入中进行学习。由于其简单的设计和学习框架,我们的方法兼容多种智能头显,范围从 VR 护目镜到轻量级 AR 头显(如图2所示)。由于没有适用于商业 VR 头显摄像机配置的数据集,我们还提出了一个大规模的合成数据集(2216k 帧)和一个真实世界数据集(40k 帧)用于测试,并展示了我们的方法可以应用于现实和实时场景。

总结一下,我们的贡献是:(1) 我们设计了一种方法,使用模拟化身通过 XR 头显的图像和头显姿态来估计全局全身姿态(正面 AR 摄像头或侧面 VR 摄像头); (2) 我们展示了通过提炼直接从输入传感器特征到控制信号的端到端控制器的可行性; (3) 我们贡献了包含商业 VR 头显配置的大规模合成和真实世界数据集,以供未来研究使用。
在这里插入图片描述

2. 方法

在每个时间步中,给定由头显捕获的图像 I t I_t argin-right: 0.0785em;">Iargin-left: -0.0785em; margin-right: 0.05em;">t 和6自由度(DoF)姿态 q τ t q_{\tau}^{t} argin-right: 0.0359em;">qargin-left: -0.0359em; margin-right: 0.05em;">argin-right: 0.1132em;">τargin-right: 0.05em;">t,我们的任务是驱动模拟化身以匹配相机佩戴者的全身姿态 q t q_t argin-right: 0.0359em;">qargin-left: -0.0359em; margin-right: 0.05em;">t。我们使用 XR 头显上的单色 SLAM 摄像机,生成尺寸 I t ∈ R V × H × W × C I_t \in \mathbb{R}^{V \times H \times W \times C} argin-right: 0.0785em;">Iargin-left: -0.0785em; margin-right: 0.05em;">targin-right: 0.2778em;">argin-right: 0.2778em;">Rargin-right: 0.05em;">argin-right: 0.2222em;">V×argin-right: 0.0813em;">H×argin-right: 0.1389em;">W×argin-right: 0.0715em;">C 的图像,其中 V V argin-right: 0.2222em;">V 表示视角数量(Aria 眼镜为 2 个视角,Quest 为 4 个), C = 1 C = 1 argin-right: 0.0715em;">Cargin-right: 0.2778em;">=argin-right: 0.2778em;">1 表示单色图像的通道数。身体姿态 q t = ( θ t , p t ) q_t = (\theta_t, p_t) argin-right: 0.0359em;">qargin-left: -0.0359em; margin-right: 0.05em;">targin-right: 0.2778em;">=argin-right: 0.2778em;">(argin-right: 0.0278em;">θargin-left: -0.0278em; margin-right: 0.05em;">t,argin-right: 0.1667em;">pargin-left: 0em; margin-right: 0.05em;">t) 包含所有 J J argin-right: 0.0962em;">J 个关节的 3D 关节旋转 θ t ∈ R J × 6 \theta_t \in \mathbb{R}^{J \times 6} argin-right: 0.0278em;">θargin-left: -0.0278em; margin-right: 0.05em;">targin-right: 0.2778em;">argin-right: 0.2778em;">Rargin-right: 0.05em;">argin-right: 0.0962em;">J×6(使用6D旋转表示法 [68])以及位置 p t ∈ R J × 3 p_t \in \mathbb{R}^{J \times 3} pargin-left: 0em; margin-right: 0.05em;">targin-right: 0.2778em;">argin-right: 0.2778em;">Rargin-right: 0.05em;">argin-right: 0.0962em;">J×3。身体速度 q ˙ 1 : T q˙_{1:T} argin-right: 0.0359em;">q˙argin-left: 0em; margin-right: 0.05em;">1:argin-right: 0.1389em;">T 表示为 q ˙ t = ( ω t , v t ) q˙_t = (\omega_t, v_t) argin-right: 0.0359em;">q˙argin-left: 0em; margin-right: 0.05em;">targin-right: 0.2778em;">=argin-right: 0.2778em;">(argin-right: 0.0359em;">ωargin-left: -0.0359em; margin-right: 0.05em;">t,argin-right: 0.1667em;">argin-right: 0.0359em;">vargin-left: -0.0359em; margin-right: 0.05em;">t),包含角速度 ω t ∈ R J × 3 \omega_t \in \mathbb{R}^{J \times 3} argin-right: 0.0359em;">ωargin-left: -0.0359em; margin-right: 0.05em;">targin-right: 0.2778em;">argin-right: 0.2778em;">Rargin-right: 0.05em;">argin-right: 0.0962em;">J×3 和线速度 v t ∈ R J × 3 v_t \in \mathbb{R}^{J \times 3} argin-right: 0.0359em;">vargin-left: -0.0359em; margin-right: 0.05em;">targin-right: 0.2778em;">argin-right: 0.2778em;">Rargin-right: 0.05em;">argin-right: 0.0962em;">J×3。在整篇论文中,我们使用 ⋅ ^ \hat{·} ^ 表示来自运动捕捉(MoCap)的真实运动,而没有重音符号的符号表示物理模拟中的值。

在第 3.1 节中,我们首先介绍类人模型控制的预备知识。然后,在第 3.2 节中,我们将简要描述我们的合成数据生成管道。第 3.3 节中将详细介绍我们提出的方法 SimXR 以及如何学习这个控制器。

2.1 预备知识:模拟化身控制

与直接回归全身姿态不同,我们使用模拟化身在物理模拟中进行“表演”,并将其状态读出作为姿态估计。遵循目标条件化的强化学习(RL)一般框架,我们的目标是基于头显的输入来获得一个目标条件化策略 π \pi argin-right: 0.0359em;">π,以控制类人模型。该框架被定义为一个马尔可夫决策过程(MDP),由元组 M = ⟨ S , A , T , R , γ ⟩ M = \langle S, A, T, R, \gamma \rangle argin-right: 0.109em;">Margin-right: 0.2778em;">=argin-right: 0.2778em;">argin-right: 0.0576em;">S,argin-right: 0.1667em;">A,argin-right: 0.1667em;">argin-right: 0.1389em;">T,argin-right: 0.1667em;">argin-right: 0.0077em;">R,argin-right: 0.1667em;">argin-right: 0.0556em;">γ 表示,其中包括状态、动作、转移动态、奖励函数和折扣因子。物理模拟确定状态 s t ∈ S s_t \in S sargin-left: 0em; margin-right: 0.05em;">targin-right: 0.2778em;">argin-right: 0.2778em;">argin-right: 0.0576em;">S 和转移动态 T T argin-right: 0.1389em;">T,其中策略计算动作 a t a_t aargin-left: 0em; margin-right: 0.05em;">t

对于类人控制任务,状态 s t s_t sargin-left: 0em; margin-right: 0.05em;">t 包含本体感知 s p t s_p^t sargin-left: 0em; margin-right: 0.05em;">pargin-right: 0.05em;">t 和目标状态 s g t s_g^t sargin-left: 0em; margin-right: 0.05em;">argin-right: 0.0359em;">gargin-right: 0.05em;">t。本体感知定义为 s p t = ( q t , q ˙ t ) s_p^t = (q_t, q˙_t) sargin-left: 0em; margin-right: 0.05em;">pargin-right: 0.05em;">targin-right: 0.2778em;">=argin-right: 0.2778em;">(argin-right: 0.0359em;">qargin-left: -0.0359em; margin-right: 0.05em;">t,argin-right: 0.1667em;">argin-right: 0.0359em;">q˙argin-left: 0em; margin-right: 0.05em;">t),其中包括3D身体姿态 q t q_t argin-right: 0.0359em;">qargin-left: -0.0359em; margin-right: 0.05em;">t 和速度 q ˙ t q˙_t argin-right: 0.0359em;">q˙argin-left: 0em; margin-right: 0.05em;">t。目标状态 s g t s_g^t sargin-left: 0em; margin-right: 0.05em;">argin-right: 0.0359em;">gargin-right: 0.05em;">t 基于任务定义。根据本体感知 s p t s_p^t sargin-left: 0em; margin-right: 0.05em;">pargin-right: 0.05em;">t 和目标状态 s g t s_g^t sargin-left: 0em; margin-right: 0.05em;">argin-right: 0.0359em;">gargin-right: 0.05em;">t,使用奖励 r t = R ( s p t , s g t ) r_t = R(s_p^t, s_g^t) argin-right: 0.0278em;">rargin-left: -0.0278em; margin-right: 0.05em;">targin-right: 0.2778em;">=argin-right: 0.2778em;">argin-right: 0.0077em;">R(sargin-left: 0em; margin-right: 0.05em;">pargin-right: 0.05em;">t,argin-right: 0.1667em;">sargin-left: 0em; margin-right: 0.05em;">argin-right: 0.0359em;">gargin-right: 0.05em;">t) 来通过强化学习(例如 PPO [47])训练策略。如果可以提供参考动作 a ^ t \hat{a}_t a^argin-left: 0em; margin-right: 0.05em;">t(通常由预训练专家提供),我们也可以通过策略蒸馏 [44–46] 来优化策略 π \pi argin-right: 0.0359em;">π

基于物理的运动模仿:运动模仿被定义为控制一个模拟化身以匹配一系列的运动学人类运动 q ^ 1 : T \hat{q}_{1:T} argin-right: 0.0359em;">q^argin-left: -0.0359em; margin-right: 0.05em;">1:argin-right: 0.1389em;">T 的任务。运动模仿器被如下表述:给定下一帧参考 3D 姿态 q ^ t + 1 \hat{q}_{t+1} argin-right: 0.0359em;">q^argin-left: -0.0359em; margin-right: 0.05em;">t+1,策略 π P H C ( a t ∣ s p t , s g − mimic t ) \pi_{PHC}(a_t | s_p^t, s_{g-\text{mimic}}^t) argin-right: 0.0359em;">πargin-left: -0.0359em; margin-right: 0.05em;">argin-right: 0.1389em;">Pargin-right: 0.0813em;">Hargin-right: 0.0715em;">C(aargin-left: 0em; margin-right: 0.05em;">tsargin-left: 0em; margin-right: 0.05em;">pargin-right: 0.05em;">t,argin-right: 0.1667em;">sargin-left: 0em; margin-right: 0.05em;">argin-right: 0.0359em;">gmimicargin-right: 0.05em;">t) 计算关节驱动力 a t a_t aargin-left: 0em; margin-right: 0.05em;">t 以驱动类人模型匹配 q ^ t + 1 \hat{q}_{t+1} argin-right: 0.0359em;">q^argin-left: -0.0359em; margin-right: 0.05em;">t+1。运动模仿的目标状态定义为 s g − mimic t = ( θ ^ t + 1 ⊖ θ t , p ^ t + 1 − p t , v ^ t + 1 − v t , ω ^ t − ω t , θ ^ t + 1 , p ^ t + 1 ) s_{g-\text{mimic}}^t = (\hat{\theta}_{t+1} \ominus \theta_t, \hat{p}_{t+1} - p_t, \hat{v}_{t+1} - v_t, \hat{\omega}_t - \omega_t, \hat{\theta}_{t+1}, \hat{p}_{t+1}) sargin-left: 0em; margin-right: 0.05em;">argin-right: 0.0359em;">gmimicargin-right: 0.05em;">targin-right: 0.2778em;">=argin-right: 0.2778em;">(argin-right: 0.0278em;">θ^argin-left: -0.0278em; margin-right: 0.05em;">t+1argin-right: 0.2222em;">argin-right: 0.2222em;">argin-right: 0.0278em;">θargin-left: -0.0278em; margin-right: 0.05em;">t,argin-right: 0.1667em;">p^argin-left: 0em; margin-right: 0.05em;">t+1argin-right: 0.2222em;">argin-right: 0.2222em;">pargin-left: 0em; margin-right: 0.05em;">t,argin-right: 0.1667em;">argin-right: 0.0359em;">v^argin-left: -0.0359em; margin-right: 0.05em;">t+1argin-right: 0.2222em;">argin-right: 0.2222em;">argin-right: 0.0359em;">vargin-left: -0.0359em; margin-right: 0.05em;">t,argin-right: 0.1667em;">argin-right: 0.0359em;">ω^argin-left: -0.0359em; margin-right: 0.05em;">targin-right: 0.2222em;">argin-right: 0.2222em;">argin-right: 0.0359em;">ωargin-left: -0.0359em; margin-right: 0.05em;">t,argin-right: 0.1667em;">argin-right: 0.0278em;">θ^argin-left: -0.0278em; margin-right: 0.05em;">t+1,argin-right: 0.1667em;">p^argin-left: 0em; margin-right: 0.05em;">t+1),其中包含参考姿态与当前姿态之间的一帧差异,并相对于当前类人模型的方向进行归一化。训练好的运动模仿器可用作教师,并将其运动技能用于下游任务 [11, 31, 35, 59]。我们遵循这一范式,使用一个预训练的基于 RL 的运动模仿器 (PHC [32]) 作为教师,来学习 XR 头显传感器与控制信号之间的映射。

使用头戴式传感器的化身控制:按照上述定义,使用头戴式传感器的自我中心观察来控制模拟化身的任务可以表述为使用控制策略 π S i m X R ( a t ∣ s p t , I t , q τ t + 1 ) \pi_{SimXR}(a_t | s_p^t, I_t, q_{\tau}^{t+1}) argin-right: 0.0359em;">πargin-left: -0.0359em; margin-right: 0.05em;">argin-right: 0.0576em;">Simargin-right: 0.0077em;">XR(aargin-left: 0em; margin-right: 0.05em;">tsargin-left: 0em; margin-right: 0.05em;">pargin-right: 0.05em;">t,argin-right: 0.1667em;">argin-right: 0.0785em;">Iargin-left: -0.0785em; margin-right: 0.05em;">t,argin-right: 0.1667em;">argin-right: 0.0359em;">qargin-left: -0.0359em; margin-right: 0.05em;">argin-right: 0.1132em;">τargin-right: 0.05em;">t+1) 来计算关节动作 a t a_t aargin-left: 0em; margin-right: 0.05em;">t,基于图像 I t I_t argin-right: 0.0785em;">Iargin-left: -0.0785em; margin-right: 0.05em;">t,头显姿态 q τ t + 1 q_{\tau}^{t+1} argin-right: 0.0359em;">qargin-left: -0.0359em; margin-right: 0.05em;">argin-right: 0.1132em;">τargin-right: 0.05em;">t+1,以及类人模型本体感知 s p t s_p^t sargin-left: 0em; margin-right: 0.05em;">pargin-right: 0.05em;">t 以匹配头显佩戴者的身体姿态 q ^ 1 : T \hat{q}_{1:T} argin-right: 0.0359em;">q^argin-left: -0.0359em; margin-right: 0.05em;">1:argin-right: 0.1389em;">T

ar__52">2.2 XR Avatar 的合成数据

由于难以获取配对的运动数据和 XR 摄像头与头显跟踪数据,当真实数据不可用时,我们使用合成数据来训练我们的方法。具体而言,由于没有 Quest 2 的 SLAM 摄像机配置的现有数据,我们创建了一个大规模的合成数据集。我们在 Unity 游戏引擎 [9] 中使用与 Quest 2 头显的精确摄像机位置和内部参数渲染了一个大规模的内部 MoCap 数据集中的人类运动。头显会随着佩戴者的头部运动一起移动,模拟佩戴效果。

我们的运动数据集包含多种多样的姿态,从日常活动到慢跑、伸展、手势、体育运动等,类似于 AMASS [33],但采用与 SMPL [28] 不同的运动结构。在渲染过程中,我们对每一帧随机化服装、光照和背景图像(投射到一个球体上)以实现领域随机化。因此,使用我们合成数据训练的方法可以在训练期间无需额外的基于图像的领域增强,直接应用于现实场景。我们渲染 RGB 图像,然后将它们转换为单色图像。图3显示了我们的合成数据样本。有关更多信息,请参阅补充材料。
在这里插入图片描述

2.3 基于头戴式传感器的模拟化身控制

传感器输入处理:在每一帧,头戴式传感器提供图像 I t + 1 I_{t+1} argin-right: 0.0785em;">Iargin-left: -0.0785em; margin-right: 0.05em;">t+1 和6自由度(DoF)头显姿态 q τ t + 1 q_{\tau}^{t+1} argin-right: 0.0359em;">qargin-left: -0.0359em; margin-right: 0.05em;">argin-right: 0.1132em;">τargin-right: 0.05em;">t+1(这里我们用 t + 1 t+1 targin-right: 0.2222em;">+argin-right: 0.2222em;">1 来表示跟踪的即将到来的姿态/图像)。输入图像 I t + 1 I_{t+1} argin-right: 0.0785em;">Iargin-left: -0.0785em; margin-right: 0.05em;">t+1(包含所有单色视图)首先通过轻量级图像特征提取器 F F argin-right: 0.1389em;">F(例如 ResNet18 [19])进行处理,以计算图像特征: ϕ t = F ( I t + 1 ) \phi_t = F(I_{t+1}) ϕargin-left: 0em; margin-right: 0.05em;">targin-right: 0.2778em;">=argin-right: 0.2778em;">argin-right: 0.1389em;">F(argin-right: 0.0785em;">Iargin-left: -0.0785em; margin-right: 0.05em;">t+1)。所有 V V argin-right: 0.2222em;">V 个摄像机视图共享相同的特征提取器(Siamese 网络)。我们还将所有的批归一化层 [22] 替换为组归一化 [60] 以确保训练的稳定性。

对于 6DoF 头显姿态 q τ t q_{\tau}^{t} argin-right: 0.0359em;">qargin-left: -0.0359em; margin-right: 0.05em;">argin-right: 0.1132em;">τargin-right: 0.05em;">t,我们将其视为一个虚拟“关节”,其中 q τ t + 1 = ( p τ t + 1 , θ τ t + 1 ) q_{\tau}^{t+1} = (p_{\tau}^{t+1}, \theta_{\tau}^{t+1}) argin-right: 0.0359em;">qargin-left: -0.0359em; margin-right: 0.05em;">argin-right: 0.1132em;">τargin-right: 0.05em;">t+1argin-right: 0.2778em;">=argin-right: 0.2778em;">(pargin-left: 0em; margin-right: 0.05em;">argin-right: 0.1132em;">τargin-right: 0.05em;">t+1,argin-right: 0.1667em;">argin-right: 0.0278em;">θargin-left: -0.0278em; margin-right: 0.05em;">argin-right: 0.1132em;">τargin-right: 0.05em;">t+1) 包含头显的全局旋转 θ τ t + 1 \theta_{\tau}^{t+1} argin-right: 0.0278em;">θargin-left: -0.0278em; margin-right: 0.05em;">argin-right: 0.1132em;">τargin-right: 0.05em;">t+1 和平移 p τ t + 1 p_{\tau}^{t+1} pargin-left: 0em; margin-right: 0.05em;">argin-right: 0.1132em;">τargin-right: 0.05em;">t+1。我们使用类人模型的头部来跟踪头显的姿态,通过计算头部关节 q H e a d t q_{Head}^t argin-right: 0.0359em;">qargin-left: -0.0359em; margin-right: 0.05em;">Headargin-right: 0.05em;">t 与头显姿态 q τ t + 1 q_{\tau}^{t+1} argin-right: 0.0359em;">qargin-left: -0.0359em; margin-right: 0.05em;">argin-right: 0.1132em;">τargin-right: 0.05em;">t+1 之间的旋转和平移差异,形成头显姿态特征: ψ t = ( θ H e a d t ⊖ θ τ t + 1 , p H e a d t − p τ t + 1 ) \psi_t = (\theta_{Head}^t \ominus \theta_{\tau}^{t+1}, p_{Head}^t - p_{\tau}^{t+1}) argin-right: 0.0359em;">ψargin-left: -0.0359em; margin-right: 0.05em;">targin-right: 0.2778em;">=argin-right: 0.2778em;">(argin-right: 0.0278em;">θargin-left: -0.0278em; margin-right: 0.05em;">Headargin-right: 0.05em;">targin-right: 0.2222em;">argin-right: 0.2222em;">argin-right: 0.0278em;">θargin-left: -0.0278em; margin-right: 0.05em;">argin-right: 0.1132em;">τargin-right: 0.05em;">t+1,argin-right: 0.1667em;">pargin-left: 0em; margin-right: 0.05em;">Headargin-right: 0.05em;">targin-right: 0.2222em;">argin-right: 0.2222em;">pargin-left: 0em; margin-right: 0.05em;">argin-right: 0.1132em;">τargin-right: 0.05em;">t+1)

然后将图像特征和头显姿态特征与本体感知 s p t s_p^t sargin-left: 0em; margin-right: 0.05em;">pargin-right: 0.05em;">t 连接起来,形成输入一个多层感知器(MLP)以计算关节动作,如图3所示。

在线蒸馏:使用 RL 来控制类人模型需要大量的模拟步骤(例如数十亿次环境交互),我们的早期实验表明,直接使用 RL 训练基于图像的策略是不可行的(见 4.2 节)。这是由于输入和模型尺寸的显著增加(例如四个 120 × 160 的单色图像与 938d 模仿目标 s g − mimic t s_{g-\text{mimic}}^t sargin-left: 0em; margin-right: 0.05em;">argin-right: 0.0359em;">gmimicargin-right: 0.05em;">t),严重减慢了训练步骤。因此,我们选择在线蒸馏,并使用预训练的运动模仿器 PHC π P H C \pi_{PHC} argin-right: 0.0359em;">πargin-left: -0.0359em; margin-right: 0.05em;">argin-right: 0.1389em;">Pargin-right: 0.0813em;">Hargin-right: 0.0715em;">C 通过监督学习来指导我们的策略 π S i m X R \pi_{SimXR} argin-right: 0.0359em;">πargin-left: -0.0359em; margin-right: 0.05em;">argin-right: 0.0576em;">Simargin-right: 0.0077em;">XR。简而言之,我们将样本效率低下的 RL 训练转移到低维状态任务(运动模仿),并为高维图像处理任务使用样本高效的监督学习。这与 PULSE [31] 中提出的过程相似,区别在于 PULSE 为学生和教师使用相同的输入和输出,而我们的输入模态截然不同(图像和头显姿态 vs. 3D 姿态)。

具体来说,我们遵循标准 RL 训练框架来训练我们的姿态估计策略 π S i m X R \pi_{SimXR} argin-right: 0.0359em;">πargin-left: -0.0359em; margin-right: 0.05em;">argin-right: 0.0576em;">Simargin-right: 0.0077em;">XR:对于每个回合,给定配对的自我中心图像 I 1 : T I_{1:T} argin-right: 0.0785em;">Iargin-left: -0.0785em; margin-right: 0.05em;">1:argin-right: 0.1389em;">T、头显姿态 q τ 1 : T q_{\tau}^{1:T} argin-right: 0.0359em;">qargin-left: -0.0359em; margin-right: 0.05em;">argin-right: 0.1132em;">τargin-right: 0.05em;">1:argin-right: 0.1389em;">T 和对应的参考全身姿态 q ^ 1 : T \hat{q}_{1:T} argin-right: 0.0359em;">q^argin-left: -0.0359em; margin-right: 0.05em;">1:argin-right: 0.1389em;">T,首先将类人模型初始化为 q ^ 0 \hat{q}_0 argin-right: 0.0359em;">q^argin-left: -0.0359em; margin-right: 0.05em;">0。然后,策略 π S i m X R ( a t ∣ s p t , I t , q τ t + 1 ) \pi_{SimXR}(a_t | s_p^t, I_t, q_{\tau}^{t+1}) argin-right: 0.0359em;">πargin-left: -0.0359em; margin-right: 0.05em;">argin-right: 0.0576em;">Simargin-right: 0.0077em;">XR(aargin-left: 0em; margin-right: 0.05em;">tsargin-left: 0em; margin-right: 0.05em;">pargin-right: 0.05em;">t,argin-right: 0.1667em;">argin-right: 0.0785em;">Iargin-left: -0.0785em; margin-right: 0.05em;">t,argin-right: 0.1667em;">argin-right: 0.0359em;">qargin-left: -0.0359em; margin-right: 0.05em;">argin-right: 0.1132em;">τargin-right: 0.05em;">t+1) 计算物理模拟的前向动力学的关节驱动力 a t a_t aargin-left: 0em; margin-right: 0.05em;">t。通过在模拟中展开策略,我们获得配对的轨迹 ( s p 1 : T , I 1 : T , q τ 1 : T , q ^ 1 : T ) (s_p^{1:T}, I_{1:T}, q_{\tau}^{1:T}, \hat{q}_{1:T}) (sargin-left: 0em; margin-right: 0.05em;">pargin-right: 0.05em;">1:argin-right: 0.1389em;">T,argin-right: 0.1667em;">argin-right: 0.0785em;">Iargin-left: -0.0785em; margin-right: 0.05em;">1:argin-right: 0.1389em;">T,argin-right: 0.1667em;">argin-right: 0.0359em;">qargin-left: -0.0359em; margin-right: 0.05em;">argin-right: 0.1132em;">τargin-right: 0.05em;">1:argin-right: 0.1389em;">T,argin-right: 0.1667em;">argin-right: 0.0359em;">q^argin-left: -0.0359em; margin-right: 0.05em;">1:argin-right: 0.1389em;">T)。使用真实的参考姿态 q ^ 1 : T \hat{q}_{1:T} argin-right: 0.0359em;">q^argin-left: -0.0359em; margin-right: 0.05em;">1:argin-right: 0.1389em;">T 和模拟的类人模型状态 s p 1 : T s_p^{1:T} sargin-left: 0em; margin-right: 0.05em;">pargin-right: 0.05em;">1:argin-right: 0.1389em;">T,我们可以为我们的预训练模仿器计算每帧的模仿目标 s g − mimic t ← ( s p t , q ^ t + 1 ) s_{g-\text{mimic}}^t \leftarrow (s_p^t, \hat{q}_{t+1}) sargin-left: 0em; margin-right: 0.05em;">argin-right: 0.0359em;">gmimicargin-right: 0.05em;">targin-right: 0.2778em;">argin-right: 0.2778em;">(sargin-left: 0em; margin-right: 0.05em;">pargin-right: 0.05em;">t,argin-right: 0.1667em;">argin-right: 0.0359em;">q^argin-left: -0.0359em; margin-right: 0.05em;">t+1)。然后,使用配对的 ( s p t , s g − mimic t ) (s_p^t, s_{g-\text{mimic}}^t) (sargin-left: 0em; margin-right: 0.05em;">pargin-right: 0.05em;">t,argin-right: 0.1667em;">sargin-left: 0em; margin-right: 0.05em;">argin-right: 0.0359em;">gmimicargin-right: 0.05em;">t),我们通过查询 PHC π P H C ( a P H C t ∣ s p t , s g − mimic t ) \pi_{PHC}(a_{PHC}^t | s_p^t, s_{g-\text{mimic}}^t) argin-right: 0.0359em;">πargin-left: -0.0359em; margin-right: 0.05em;">argin-right: 0.1389em;">Pargin-right: 0.0813em;">Hargin-right: 0.0715em;">C(aargin-left: 0em; margin-right: 0.05em;">argin-right: 0.1389em;">Pargin-right: 0.0813em;">Hargin-right: 0.0715em;">Cargin-right: 0.05em;">tsargin-left: 0em; margin-right: 0.05em;">pargin-right: 0.05em;">t,argin-right: 0.1667em;">sargin-left: 0em; margin-right: 0.05em;">argin-right: 0.0359em;">gmimicargin-right: 0.05em;">t) 来计算参考动作 a P H C t a_{PHC}^t aargin-left: 0em; margin-right: 0.05em;">argin-right: 0.1389em;">Pargin-right: 0.0813em;">Hargin-right: 0.0715em;">Cargin-right: 0.05em;">t。这类似于 DAgger [44],我们使用专家来为学生标注参考动作以供学习。为了更新 π S i m X R \pi_{SimXR} argin-right: 0.0359em;">πargin-left: -0.0359em; margin-right: 0.05em;">argin-right: 0.0576em;">Simargin-right: 0.0077em;">XR,损失函数是:

L = ∥ a P H C − a ∥ 2 2 , \mathcal{L} = \| a_{PHC} - a \|^2_2, Largin-right: 0.2778em;">=argin-right: 0.2778em;">aargin-left: 0em; margin-right: 0.05em;">argin-right: 0.1389em;">Pargin-right: 0.0813em;">Hargin-right: 0.0715em;">Cargin-right: 0.2222em;">argin-right: 0.2222em;">aargin-left: 0em; margin-right: 0.05em;">2argin-right: 0.05em;">2,

使用标准的监督学习。通过这种方式,我们的策略是端到端训练的,其中图像特征提取器 F F argin-right: 0.1389em;">F 和策略网络直接使用 L \mathcal{L} L 的梯度进行更新。学习过程也在算法1中进行了描述。
在这里插入图片描述

3. 实验

类人模型:由于我们提出的合成数据集和公共数据集之间的标注格式不同,我们在实验中使用了两种不同的类人模型,一种用于 Quest VR 头显,另一种用于 Aria AR 眼镜。对于 Aria,我们使用遵循 SMPL [28] 运动学结构的类人模型,采用均值形状。它包含24个关节,其中23个是可驱动的,产生了 R 23 × 3 R^{23 \times 3} argin-right: 0.0077em;">Rargin-right: 0.05em;">23×3 的驱动空间。每个自由度由一个比例导数(PD)控制器驱动,动作 a t a_t aargin-left: 0em; margin-right: 0.05em;">t 指定 PD 目标。对于 VR 数据集,我们使用了具有25个关节(其中24个是可驱动的)的类人模型。用于 SMPL 类人模型的模仿器在 AMASS [33] 数据集上进行训练,而用于内部类人模型的模仿器则在与合成数据集相同的内部动作捕捉数据上训练。

数据集:为了训练我们的控制策略,我们需要与摄像机视图配对的高质量运动数据,因为使用低质量数据训练可能导致模拟角色表现出不良行为。因此,在使用 Quest 头显进行姿态估计时,我们仅在使用大规模内部动作捕捉数据集创建的合成数据上进行训练。我们随机按 8:2 的比例划分数据,得到 1758k 帧用于训练,458k 帧用于测试。为了测试我们方法在现实场景中的性能,我们还收集了包含40k帧的真实世界数据集,记录了三名不同主体。该数据集包含配对的头显姿态、SLAM 摄像机图像和第三人称图像。我们使用第三人称图像通过最新的单目姿态估计方法 [51] 创建伪真实数据。该真实世界数据集包含 VR 场景中常见的日常活动,如手部动作、拳击、踢腿等。对于使用 Aria 眼镜的姿态估计,我们使用了最近提出的 Aria Digital Twin 数据集 (ADT) [36]。ADT 数据集包含使用 MoCap 套装和 3D 场景扫描仪捕获的室内运动序列。在这个数据集中,有 119k 帧数据配对了骨架和 AR 头显传感器输出,并记录在客厅环境中。此数据集仅包含 3D 关键点注释(没有旋转),我们使用类似于 3DSimplify [10, 37] 的过程将 SMPL 身体注释拟合到 3D 关键点上。我们将 ADT 数据集随机划分为训练(94k 帧)和测试(25k 帧)。由于有真实世界的标注数据,我们没有使用合成数据来训练 AR 控制器。

评估指标:我们报告了姿态和基于物理的指标来评估我们的化身性能。我们报告了成功率(Succ),与 UHC [29] 中定义的相同:在模仿期间的每个时间点,头部关节与头显姿态的距离小于 0.5m。对于姿态估计,我们报告设备相对(而不是根相对)的每个关节位置误差(MPJPE) E mpjpe E_{\text{mpjpe}} argin-right: 0.0576em;">Eargin-left: -0.0576em; margin-right: 0.05em;">mpjpe,全局 MPJPE E g-mpjpe E_{\text{g-mpjpe}} argin-right: 0.0576em;">Eargin-left: -0.0576em; margin-right: 0.05em;">g-mpjpe,以及 Procrustes 分析后的 MPJPE E pa-mpjpe E_{\text{pa-mpjpe}} argin-right: 0.0576em;">Eargin-left: -0.0576em; margin-right: 0.05em;">pa-mpjpe。因为 E pa-mpjpe E_{\text{pa-mpjpe}} argin-right: 0.0576em;">Eargin-left: -0.0576em; margin-right: 0.05em;">pa-mpjpe 解决了最佳匹配的缩放、旋转和平移问题,因此更适用于我们的真实世界数据集,其中伪真实姿态的缩放和全局位置存在噪声。为了在两个类人模型之间保持评估的一致性,我们选择了 11 个常见的关节(头部、左右肩、肘、手腕、膝盖、脚踝)来报告关节误差,而不是像之前的工作 [32] 那样评估所有关节。为了测试物理现实感,我们包括了加速度 E acc E_{\text{acc}} argin-right: 0.0576em;">Eargin-left: -0.0576em; margin-right: 0.05em;">acc(mm/帧²)和速度 E vel E_{\text{vel}} argin-right: 0.0576em;">Eargin-left: -0.0576em; margin-right: 0.05em;">vel(mm/帧)误差。

基线方法:我们采用了最新的基于视觉的姿态估计方法 UnrealEgo [5] 作为主要的视觉基线方法。UnrealEgo 使用 U-Net 结构首先从输入图像重建 2D 热图,然后使用自动编码器将 2D 热图提升到 3D 关键点。UnrealEgo 在头显的坐标系中预测 3D 姿态,而不是全局坐标系。为了与基于物理的方法进行比较,我们重新实现了 KinPoly [29] 并添加了图像输入,创建了 KinPoly-v。我们还去除了它对动作标签和外部力的依赖(用 PHC [32] 替代 UHC [29])。KinPoly-v 使用两阶段方法:首先从图像估计全身姿态,然后将其输入到预训练的模仿器中以驱动模拟化身。它使用闭环系统,其中模拟状态被反馈到基于图像的姿态估计器中,使其成为“动态调节”的方法。KinPoly-v 与我们的方法总体结构相同,但使用运动学姿态作为与预训练模仿器通信的中间表示,而不是端到端的方法。

实现细节:我们使用 NVIDIA 的 Isaac Gym [34] 进行物理模拟。所有单色图像在训练和评估期间都被调整为 Aria 和 Quest 头显的 120 × 160 尺寸。所有的 MLPs 都是 6 层的,具有 [2048, 1536, 1024, 1024, 512, 512] 的单元数和 SiLU [14] 激活函数。Quest 和 Aria 的网络结构相同,唯一的区别是图像特征提取器的第一层(处理 2 或 4 个单色图像)。由于输入大小和网络容量的数量级增加(ResNet 18 vs. 6 层 MLPs),即使使用我们的轻量级网络,基于图像的方法与模拟训练相比也大约增加了 10 倍的资源消耗。我们训练 π S i m X R \pi_{SimXR} argin-right: 0.0359em;">πargin-left: -0.0359em; margin-right: 0.05em;">argin-right: 0.0576em;">Simargin-right: 0.0077em;">XR 三天,收集了 0.1B 的环境交互。相比之下,PHC 使用 RL 训练三天收集了约 2B 的环境交互。训练结束后,我们的估计网络和模拟以约 30 FPS 的速度运行。我们在两个类人模型中使用固定的身体形状进行所有评估,因为我们的管道不推断或使用任何身体形状信息。更多实现细节请参阅补充材料。
在这里插入图片描述

3.1 结果

视频结果:由于运动效果在视频中最为明显,更多视觉结果请参阅我们的补充材料。

VR 头显姿态估计:在表2和图4中,我们报告了在合成和现实世界数据集上的结果。我们的方法在物理上可行的全身姿态估计方面,与之前的视觉和视觉+物理方法相比,取得了相当甚至更好的结果。与 UnrealEgo 相比,可以看到 SimXR 使用的参数量级更小,但却实现了更好的姿态估计效果。虽然 UnrealEgo 和 SimXR 都是单帧方法(没有使用时间序列架构),SimXR 具有显著更少的抖动。这是由于物理法则作为强有力的先验,以及模拟状态所提供的固有时间信息所致。需要注意的是,UnrealEgo 在设备坐标系中估计姿态,因此它在 Empjpe 指标上提供了更好的相对头显姿态估计。我们的方法直接在全局坐标系中估计姿态,并未从对齐头部位置中获益(可以从全局 E g-mpjpe E_{\text{g-mpjpe}} argin-right: 0.0576em;">Eargin-left: -0.0576em; margin-right: 0.05em;">g-mpjpe 和局部 E mpjpe E_{\text{mpjpe}} argin-right: 0.0576em;">Eargin-left: -0.0576em; margin-right: 0.05em;">mpjpe 关节误差之间的小差距中看到)。与 KinPoly-v 相比,我们的方法在所有指标上表现更好。在 KinPoly-v 中,模仿器 UHC [29] 使用外部的非物理力来帮助类人模型保持平衡,并且不需要任何参考速度 q ˙ t ^ \hat{q˙_t} argin-right: 0.0359em;">q˙argin-left: 0em; margin-right: 0.05em;">t^ 作为输入。PHC 不使用任何非物理力,并且需要参考速度作为输入,这为 KinPoly-v 增加了额外的难度。因此,KinPoly-v 在合成和现实测试集上表现不佳,显示了两阶段方法的局限性。开放环方法(策略无法访问运动状态)可能在速度估计问题上表现较好,但在运动学和动力学过程中会引入更多的不连续性,正如在 KinPoly [29] 中所示。合成和现实世界性能之间的相对较小差距表明我们的合成数据集在为这一挑战性任务提供起点方面是有效的。
在这里插入图片描述
在这里插入图片描述
AR 头显姿态估计:表3显示了在 ADT 数据集上的测试结果。由于 ADT 数据集的运动复杂性较低,仅包含行走、伸手和日常活动,因此相对简单。然而,从 AR 头显估计姿态更具挑战性,因为视角更加困难,身体大部分时间不可见。因此,UnrealEgo 在数据集上表现较差,无法处理未见的身体部分。我们的方法可以有效利用头部运动,生成合理的全身运动。由于在 VR 头显案例中的类似问题,KinPoly-v 同样表现不佳。为了证明我们方法有效利用了图像输入,表3还包含了我们不使用任何基于视觉输入的头显-only版本。比较第3行(R3)和第4行(R4),我们可以看到基于视觉的输入确实为手部动作提供了有价值的信息。
在这里插入图片描述

3.2 消融实验与分析

在表5中,我们对方法的组成部分在合成测试集上进行了消融实验。比较 R1、R2 和 R5,可以看出每种模态的重要性:视觉信号提供了大部分末端效应器的身体运动信号,而头显引导了身体的根部运动。没有视觉信号时,类人模型的姿态估计效果较差,但仍可实现合理的成功率,因为头显姿态提供了相当多的运动信号(R1)。没有头显姿态信号(R2)时,类人模型很快会失去对头部姿态的追踪。在这种情况下,方法需要同时从图像中执行 SLAM 和姿态估计,这需要特殊架构。比较 R3 和 R5,我们可以看到,使用组归一化代替批归一化提供了一些性能提升。R4 表明,对于不使用蒸馏的基于视觉方法而言,从零开始使用 RL 进行训练需要更高效的算法。
在这里插入图片描述
为了进一步分析我们的姿态估计结果,我们在表4中报告了每个关节的 E pa-mpjpe E_{\text{pa-mpjpe}} argin-right: 0.0576em;">Eargin-left: -0.0576em; margin-right: 0.05em;">pa-mpjpe 值。可以看到,SimXR 和 UnrealEgo 类似,在腕部和脚踝等末端效应器上犯的错误最多。由于使用类人模型追踪头显姿态,SimXR 在头部对齐上表现较差,但在下半身关节(如脚踝)上表现更好。这是因为 SimXR 有效利用了物理作为先验,并能够根据输入信号生成合理的下半身运动。
在这里插入图片描述

4. 结论与未来工作

失败案例:在图5中,我们展示了方法的一些失败案例。作为首批用于根据商业头显的图像观察来控制模拟类人模型的方法之一,在手部未观察到时,它可能会误判手的位置。如果脚部观察模糊(由于衣物颜色、光照等原因),某些踢腿动作也可能被忽略。我们还注意到,在某些情况下,模拟的类人模型的运动可能会滞后于现实世界图像,特别是当手部进入和离开视野时。这可能是因为类人模型表现得比较保守,直到身体部位完全可见才会进行动作。在视频中,我们可以看到类人模型在努力保持平衡时会踉跄并拖动脚部,特别是当头显移动过快时。
在这里插入图片描述
结论:我们提出了 SimXR,用于根据商业 XR 头显的传感器输入来控制模拟化身。我们提出了一个简单而有效的端到端学习框架,通过蒸馏将头显姿态和 XR 头显的摄像机输入映射到类人模型控制信号。为了训练我们的方法并促进未来研究,我们还提出了一个用于训练的大规模合成数据集和一个用于测试的现实世界数据集,均使用标准的现成硬件进行捕捉。仅使用合成数据进行训练,我们的轻量级网络能够以高精度实时控制现实世界数据捕捉中的模拟化身。未来的研究方向包括在训练期间添加辅助损失以提高姿态估计的准确性,结合时间信息,以及使用场景级信息以获得更准确的姿态估计。

🌟 在这篇博文的旅程中,感谢您的陪伴与阅读。如果内容对您有所启发或帮助,请不要吝啬您的点赞 👍🏻,这是对我最大的鼓励和支持。

📚 本人虽致力于提供准确且深入的技术分享,但学识有限,难免会有疏漏之处。如有不足或错误,恳请各位业界同仁在评论区留下宝贵意见,您的批评指正是我不断进步的动力!😄😄😄

💖💖💖 如果您发现这篇博文对您的研究或工作有所裨益,请不吝点赞、收藏,或分享给更多需要的朋友,让知识的力量传播得更远。

🔥🔥🔥 “Stay Hungry, Stay Foolish” —— 求知的道路永无止境,让我们保持渴望与初心,面对挑战,勇往直前。无论前路多么漫长,只要我们坚持不懈,终将抵达目的地。🌙🌙🌙

👋🏻 在此,我也邀请您加入我的技术交流社区,共同探讨、学习和成长。让我们携手并进,共创辉煌!
在这里插入图片描述


http://www.ppmy.cn/news/1528783.html

相关文章

ChatGPT 4o 使用指南 (9月更新)

首先基础知识还是要介绍得~ 一、模型知识&#xff1a; GPT-4o&#xff1a;最新的版本模型&#xff0c;支持视觉等多模态&#xff0c;OpenAI 文档中已经更新了 GPT-4o 的介绍&#xff1a;128k 上下文&#xff0c;训练截止 2023 年 10 月&#xff08;作为对比&#xff0c;GPT-4…

Spring 源码解读:实现自定义注解处理器

引言 注解在现代 Java 编程中扮演了至关重要的角色。无论是简化代码、增强可读性&#xff0c;还是将元数据与业务逻辑分离&#xff0c;注解都让我们的代码更加优雅和灵活。Spring 中大量使用了注解&#xff0c;特别是像 Autowired、Component 等注解&#xff0c;这些背后依赖的…

植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面

一、介绍 植物病害识别系统。本系统使用Python作为主要编程语言&#xff0c;通过收集水稻常见的四种叶片病害图片&#xff08;‘细菌性叶枯病’, ‘稻瘟病’, ‘褐斑病’, ‘稻瘟条纹病毒病’&#xff09;作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算…

使用Maven创建一个Java项目并在repository中使用

JDK环境&#xff1a;1.8.0_371 Maven环境 &#xff1a;Apache Maven 3.6.3 配置完成jdk和mvn后&#xff0c;进入到指定文件夹下执行如下语句&#xff1a; mvn archetype:generate -DgroupIdtop.chengrongyu -DartifactIdCyberSpace -DarchetypeArtifactIdmaven-archetype-quic…

如何用安卓玩Java版Minecraft,安卓手机安装我的世界Java版游戏的教程

安卓手机使用FCL启动器安装我的世界Java版游戏的教程。如何用安卓玩Java版Minecraft 视频教程&#xff1a;https://www.bilibili.com/video/BV1CctYebEzR/ 前言 目前&#xff0c;安卓设备上可以用来运行Java版Minecraft的启动器主要有以下几款&#xff1a; PojavLauncher&a…

网络质量劣化分析:保障业务连续性与网络优化的核心步骤

目录 什么是网络质量劣化&#xff1f; 常见的网络质量劣化表现 网络质量劣化的常见原因 1. 网络设备性能不足或老化 2. 网络配置问题 3. 链路拥塞 4. 外部攻击或恶意流量 案例分析&#xff1a;一次企业内部网络劣化的解决过程 如何防止网络质量劣化&#xff1f; 结语…

git pull的merge和rebase模式

git pull 命令用于将远程仓库的更改拉取到本地仓库&#xff0c;并合并到当前分支中。git pull 默认使用合并&#xff08;merge&#xff09;模式&#xff0c;但也可以选择使用变基&#xff08;rebase&#xff09;模式。 Merge 模式&#xff08;默认模式&#xff09; git pull …

分布式消息中间件kafka

文章目录 什么是kafka?整体架构 kafka核心概念1. 生产者 (Producer)2. 消费者 (Consumer)3. 主题 (Topic)4. 分区 (Partition)5. 经纪人 (Broker)6. 复制 (Replication)7. 消费者组 (Consumer Group)8. 日志段 (Log Segment) 主要功能1. 高吞吐量2. 可靠的消息传递3. 发布/订阅…