UniAD 论文学习

news2024/11/23 11:30:56

一、解决了什么问题?

当前的自动驾驶方案大致由感知(检测、跟踪、建图)、预测(motion、occupancy)和规划三个模块构成。

在这里插入图片描述

为了实现各种功能,智驾方案大致包括两种路线。一种是针对每个任务都部署一个模型,该范式能降低各团队间的研发困难度,但由于各个优化目标是孤立的,会引发模块之间信息丢失、错误累加和特征不对齐的问题。另一种是多任务的设计路线,多个任务 heads 共享一个特征提取器,该范式能节省边缘计算平台的资源消耗,并且扩展性强,但会带来“负迁移”的问题。

二、提出了什么方法?

本文认为应该围绕着规划这一最终的目标来设计整体架构,于是提出了 UniAD。UniAD 在一个网络中包括了全栈的自动驾驶任务,它能充分利用各模块的优势,从全局的角度为各 agents 之间的交流提供互补的特征抽象,并且它以统一的 query 接口来连接所有的模块,推动各模块向规划这一目标对齐。

UniAD 遵循一切为规划服务的原则,核心构成就是 query-based 的接口设计,连接各个模块。与经典的边框表征相比,queries 得益于更大的感受野,能减轻上游任务预测所带来的复合错误的影响,而且能灵活地编码和建模 agents 之间的交流。

概览

UniAD 包括四个基于 transformer decoder 的感知与预测模块,以及一个 planner。Queries Q Q Q 将整个流程串联起来,建模驾驶场景中各实例间的不同关系。下图展示了 UniAD 的流程,设计上非常精妙,遵循规划导向的思想。作者探索了感知和预测各模块的作用,充分发挥节点协同优化的优势。

在这里插入图片描述

  • 首先,将多相机图像输入特征提取器,通过 BEVFormer 的 BEV 编码器将透视视角的特征变换为 BEV 特征 B B B

  • 然后在 TrackFormer 中,track queries 从 B B B 中查询各 agents 的信息,进行检测和跟踪。

  • 在 MapFormer 中,map queries 作为道路元素(车道线、间隔物)的语义抽象,并进行 maps 的全景分割。

  • MotionFormer 获取各 agents 和 maps 之间的关系,预测每个 agent 未来的轨迹。在场景里面,各 agent 的行为会彼此影响,所以 MotionFormer 对所有的 agents 做联合预测。

  • OccFormer 以 BEV 特征 B B B 作为 queries,将 agent 的信息作为 keys 和 values,预测未来多步的占用网格图(保留 agents 的 IDs)。

  • 最终,Planner 利用 MotionFormer 给出的自车 query 来预测出规划结果,并让自车远离 OccFormer 预测的被占用区域,以防碰撞发生。

1. 感知:跟踪和建图

TrackFormer

它协同完成检测和多目标跟踪任务,没有不可微的后处理操作。除了目标检测任务用到的检测 queries,它还包含了跟踪用的 track queries。在每一时刻,新初始化的检测 queries 负责检测首次被感知到的 agents,而 track queries 则对之前帧检测到的 agents 持续建模。检测 queries 和 track queies 都是通过关注 BEV 特征 B B B 来获取各 agents 的信息。随着场景的变化,当前时刻的 track queries 通过一个自注意力模块与之前时刻的 queries 进行交流,聚合时域信息,直到相应的 agents 完全消失在画面中。TrackFormer 包括 N N N 层,最终的输出 Q A Q_A QA 提供 N a N_a Na 个有效 agents 的信息,供下游任务使用。除了编码自车周围 agents 的 queries,作者还增加了一个自车 query,显式地建模自车本身,规划模块会用到。

MapFormer

作者基于 2D 全景分割方法 Panoptic SegFormer 设计 MapFormer。将道路元素稀疏地表征为 map queries,编码了位置和结构信息,从而帮助下游的运动预测。本文将车道线、间隔物和人行横道设为 things,将可行驶区域设为 stuff。MapFormer 也有 N N N 层,最后一层的 queries Q M Q_M QM 会输入 MotionFormer 做 agent-map 交流。

2. 预测:运动预测

有了 TrackFormer 和 MapFormer 分别提供的动态 agents 的 queries Q A Q_A QA 和静态图 Q M Q_M QM,MotionFormer 就可以预测所有 agents 未来的多模态运动了,即 top-k 个可能的轨迹。同时,作者将 TrackFormer 中的自车 query 传入 MotionFormer,让自车和其它 agents 产生交流。输出的运动状态表示为 { x ^ i , k ∈ R T × 2 ∣ i = 1 , . . . , N a ; k = 1 , . . . , K } \{\hat{\mathbf{x}}_{i,k} \in \mathbb{R}^{T\times 2}| i=1,...,N_a; k=1,..., \mathcal{K}\} {x^i,kRT×2i=1,...,Na;k=1,...,K},其中 i i i 表示 agent 的索引, k k k 表示轨迹模态的索引, T T T 是预测的长度。

MotionFormer

包括 N N N 层,每层都获取到三种交互关系:agent-agent, agent-map, agent-goal point。对于每个 motion query Q i , k Q_{i,k} Qi,k,它和其它 agents Q A Q_A QA 或地图元素 Q M Q_M QM 的关系可以表示如下:

Q a / m = MHCA ( MHSA ( Q ) , Q A / Q M ) Q_{a/m}=\text{MHCA}(\text{MHSA}(Q), Q_A/Q_M) Qa/m=MHCA(MHSA(Q),QA/QM)

上面的 MHCA \text{MHCA} MHCA MHSA \text{MHSA} MHSA 表示多头跨注意力和多头自注意力。同时,我们也要关注目标点(goal point),优化预测轨迹,本文基于可变形注意力设计了一个 agent-goal point 注意力:

Q g = DeformAttn ( Q , x ^ T l − 1 , B ) Q_g = \text{DeformAttn}(Q, \hat{\mathbf{x}}_T^{l-1}, B) Qg=DeformAttn(Q,x^Tl1,B)

其中 x ^ T l − 1 \hat{\mathbf{x}}_T^{l-1} x^Tl1 是上一层预测轨迹的路径点。 DeformAttn ( q , r , x ) \text{DeformAttn}(q,r,x) DeformAttn(q,r,x) 是可变形注意力,输入为 query q q q、参考点 r r r 和空间特征 x x x。它对参考点周围的空间特征应用稀疏注意力。这样,预测轨迹能进一步感知到路径点周围的环境。

这三种交互关系的建模是同时进行的,然后将生成的 Q a , Q m , Q g Q_a, Q_m, Q_g Qa,Qm,Qg concat 到一起,输入一个 MLP,得到 query context Q c t x Q_{ctx} Qctx。然后将 Q c t x Q_{ctx} Qctx 输入后续的层做优化,或者在最后一层就解码为预测结果。

Motion queries

MotionFormer 每一层的输入 queries 记作 motion queries,包括两个部分:前一层输出的 query context Q c t x Q_{ctx} Qctx 和 query position Q p o s Q_{pos} Qpos Q p o s Q_{pos} Qpos 整合了四重的位置信息:

  • 场景级 anchor I s I^s Is 的位置;
  • agent 级 anchor I a I^a Ia 的位置;
  • i i i 个 agent 的当前位置;
  • 预测的 goal point。

Q p o s = MLP ( PE ( I s ) ) + MLP ( PE ( I a ) ) + MLP ( PE ( x ^ 0 ) ) + MLP ( PE ( x ^ T l − 1 ) ) Q_{pos}=\text{MLP}(\text{PE}(I^s)) + \text{MLP}(\text{PE}(I^a)) + \text{MLP}(\text{PE}(\hat{\mathbf{x}}_0)) + \text{MLP}(\text{PE}(\hat{\mathbf{x}}_T^{l-1})) Qpos=MLP(PE(Is))+MLP(PE(Ia))+MLP(PE(x^0))+MLP(PE(x^Tl1))

这里的正弦位置编码 P E ( ⋅ ) PE(\cdot) PE() 后跟着一个 MLP 用于编码位置点,第一层的 I s I^s Is 设为 x ^ T 0 \hat{\mathbf{x}}_T^0 x^T0。场景级 anchor 代表了全局视角下之前时刻的运动统计,agent 级 anchor 则在局部坐标捕捉可能的意图。它们都通过 k-means 算法对 ground-truth 轨迹的路径点做聚类,从而缩小预测结果的搜索空间。起始点提供每个 agent 的位置编码,而预测出的路径点则作为动态 anchor,逐层不断地优化。

非线性优化

直接从一个不准确的检测位置或偏航角回归 ground-truth 的路径点会产生不真实的轨迹预测,曲率和加速度可能会非常大。于是作者采用了一个非线性平滑方法,来调节目标的轨迹,使它们更加合理。该过程如下:

x ~ ∗ = arg min ⁡ x c ( x , x ~ ) \tilde{\mathbf{x}}^\ast = \argmin_{\mathbf{x}}{c(\mathbf{x}, \tilde{\mathbf{x}})} x~=xargminc(x,x~)

其中 x ~ \tilde{\mathbf{x}} x~ x ~ ∗ \tilde{\mathbf{x}}^\ast x~ 表示 ground-truth 和平滑后的轨迹, x \mathbf{x} x 通过 multiple-shooting 产生,代价函数为:

c ( x , x ~ ) = λ x y ∥ x , x ~ ∥ 2 + λ g o a l ∥ x T , x ~ T ∥ 2 + ∑ ϕ ∈ Φ ϕ ( x ) c(\mathbf{x}, \tilde{\mathbf{x}})=\lambda_{xy}\left\| \mathbf{x}, \tilde{\mathbf{x}} \right\|_2 + \lambda_{goal} \left\| \mathbf{x}_T, \tilde{\mathbf{x}}_T \right\|_2 + \sum_{\phi\in \Phi}{\phi(\mathbf{x})} c(x,x~)=λxyx,x~2+λgoalxT,x~T2+ϕΦϕ(x)

其中, λ x y \lambda_{xy} λxy λ g o a l \lambda_{goal} λgoal 是超参数,动力学函数集合 Φ \Phi Φ 有五项,包括 jerk, curvature, curvature rate, acceleration, lateral acceleration。这个代价函数对目标轨迹起到正则的作用,使其遵守动力学约束条件。目标轨迹优化只在训练时进行,不影响推理。

3. 预测:占用预测

占用网格图是离散化的 BEV 表征,每个格子都有一个置信度,表示该格子是否被占用。占用预测任务用于预测网格图在未来是如何变化的。OccFormer 从两个方面融合了场景级和 agent 级的语义信息:

  • 通过一个精心设计的注意力模块,从密集场景特征学到 agent 级的特征;
  • 对 agent 级特征和密集场景特征做矩阵乘法,输出实例占用。

OccFormer 由 T o T_o To 个序列模块组成, T o T_o To 表示预测的长度。由于占用网格图过于密集,这里的 T o T_o To 通常要小于运动任务中的预测长度 T T T。每个模块的输入包括丰富的 agent 特征 G t G^t Gt 和前一层的状态(密集特征) F t − 1 F^{t-1} Ft1,然后输出 t t t 时刻的状态 F t F^t Ft。为了得到 agent 特征 G t G^t Gt,我们在模态维度对 MotionFormer 的 motion queries 做最大池化,记作 Q X ∈ R N a × D Q_X \in \mathbb{R}^{N_a\times D} QXRNa×D D D D 是特征维度。然后通过一个时域 MLP 将它与上游的 track query Q A Q_A QA 及当前位置编码 P A P_A PA 融合:

G t = MLP ( [ Q A , P A , Q X ] ) , t = 1 , . . . , T o G^t = \text{MLP}([Q_A, P_A, Q_X]), t=1,..., T_o Gt=MLP([QA,PA,QX]),t=1,...,To

[ ⋅ ] [\cdot] [] 表示 concat 操作。对于场景级信息,出于计算效率考虑,BEV 特征 B B B 会缩小到 1 / 4 1/4 1/4 分辨率,作为第一个模块的输入 F 0 F^0 F0。为了进一步节约训练时内存占用,每个模块都遵循下采样-上采样的方式,在中间有一个注意力模块,在 1 / 8 1/8 1/8 大小的特征(记作 F d s t F_{ds}^t Fdst)上进行 pixel-agent 交流

Pixel-agent 交流

在预测未来占用网格图时,Pixel-agent 交流用于统一对场景和 agents 的理解。将密集特征 F d s t F_{ds}^t Fdst 作为 queries,实例级特征作为 keys 和 values 不断更新密集特征。 F d s t F_{ds}^t Fdst 输入一个自注意力层,建模网格间的响应,然后用一个跨注意力层建模 agent 特征 G t G^t Gt 和各网格的特征之间的关系。为了对齐 pixel-agent 的对应关系,作者用一个注意力 mask 来约束跨注意力,每个像素只关注于 t t t 时刻占据它的 agent。密集特征的更新过程如下:

D d s t = MHCA ( MHSA ( F d s t ) , G t , attn_mask = O m t ) D_{ds}^t = \text{MHCA}(\text{MHSA}(F_{ds}^t), G^t, \text{attn\_mask}=O_m^t) Ddst=MHCA(MHSA(Fdst),Gt,attn_mask=Omt)

注意力 mask O m t O^t_m Omt 语义上类似于占用网格图,用一个额外的 agent 级特征和密集特征 F d s t F_{ds}^t Fdst 相乘得到,我们将这个 agent 级特征叫做 mask 特征 M t = MLP ( G t ) M^t = \text{MLP}(G^t) Mt=MLP(Gt)。经过上述交流过程, D d s t D_{ds}^t Ddst 就上采样到了 B B B 1 / 4 1/4 1/4 大小。我们将 D d s t D_{ds}^t Ddst 通过残差连接加到模块输入 F t − 1 F^{t-1} Ft1 上,得到的结果 F t F^t Ft 再输入进下一模块。

实例级占用

它表示的是保留了每个 agent ID 的占用网格图。它可以通过简单的矩阵乘法提取。为了得到 BEV 特征 B (原始大小为 H × W H\times W H×W )的预测占用,场景级特征 F t F^t Ft 通过一个卷积解码器上采样为 F d e c t ∈ R C × H × W F_{dec}^t \in \mathbb{R}^{C\times H\times W} FdectRC×H×W,其中 C C C 是通道维度。

对于 agent 级特征,我们通过另一个 MLP 进一步将粗糙的 mask 特征 M t M^t Mt 更新为占用特征 U t ∈ R N a × C U^t \in \mathbb{R}^{N_a\times C} UtRNa×C。实验表明, U t U^t Ut 要比 G t G^t Gt 带来更优的表现。最终 t t t 时刻的实例级占用表示为:

O ^ A t = U t ⋅ F d e c t \hat{O}_A^t = U^t \cdot F_{dec}^t O^At=UtFdect

4. 规划

不带高精地图的规划一般需要高层级的指令来表示往哪个方向走。作者将原始的导航信号(左转、右转、保持前进)转换为三个可学习的 embeddings,叫做 command embeddings。由于 MotionFormer 的自车 query 已经表达了多模态意图,作者用 command embeddings 补充它,得到 plan query。然后将 plan query 关注到 BEV 特征 B B B,使它感知周围环境,然后将其解码,得到未来的路径点 τ ^ \hat{\tau} τ^

为了避免碰撞,只在推理时基于牛顿法来优化 τ ^ \hat{\tau} τ^

τ ∗ = arg min ⁡ τ f ( τ , τ ^ , O ^ ) \tau^\ast = \argmin_{\tau}{f(\tau, \hat{\tau}, \hat{O})} τ=τargminf(τ,τ^,O^)

其中, τ ^ \hat{\tau} τ^ 是原始的规划预测, τ ∗ \tau^\ast τ 表示优化后的规划,最小化代价函数 f ( ⋅ ) f(\cdot) f() 得到。 O ^ \hat{O} O^ 是经典的二值占用网格图,从 OccFormer 的实例占用预测融合得到。代价函数如下:

f ( τ , τ ^ , O ^ ) = λ c o o r d ∥ τ , τ ^ ∥ 2 + λ o b s ∑ t D ( τ t , O ^ t ) f(\tau, \hat{\tau}, \hat{O}) = \lambda_{coord}\left\| \tau, \hat{\tau} \right\|_2 + \lambda_{obs}\sum_t \mathcal{D}(\tau_t, \hat{O}^t) f(τ,τ^,O^)=λcoordτ,τ^2+λobstD(τt,O^t)

D ( τ t , O ^ t ) = ∑ ( x , y ) ∈ S 1 σ 2 π exp ⁡ ( − ∥ τ t − ( x , y ) ∥ 2 2 2 σ 2 ) \mathcal{D}(\tau_t, \hat{O}^t)=\sum_{(x,y)\in \mathcal{S}} \frac{1}{\sigma \sqrt{2\pi}}\exp(-\frac{\left\| \tau_t - (x,y) \right\|_2^2}{2\sigma^2}) D(τt,O^t)=(x,y)Sσ2π 1exp(2σ2τt(x,y)22)

这里, λ c o o r d , λ o b s \lambda_{coord}, \lambda_{obs} λcoord,λobs σ \sigma σ 是超参数, t t t 是未来时刻的索引。考虑到周围的位置受到 S = { ( x , y ) ∣ ∥ ( x , y ) − τ t ∥ 2 < d , O ^ x , y t = 1 } \mathcal{S}=\left\{ (x,y) | \left\| (x,y)-\tau_t \right\|_2 < d, \hat{O}_{x,y}^t=1 \right\} S={(x,y)(x,y)τt2<d,O^x,yt=1} 的限制, l 2 l_2 l2 代价函数将轨迹拉向原来预测的位置,而碰撞项 D \mathcal{D} D 则将其推离开被占用的网格。

5. 学习

UniAD 训练包括两个阶段。首先协同训练感知部分,即跟踪和建图模块,训练 6 6 6 个 epochs。然后端到端训练感知、预测和规划模块共 20 20 20 个 epochs。

共享匹配

UniAD 包括实例建模,所以在感知和预测任务上,需要将预测结果和 ground-truths 配对。与 DETR 相似,在跟踪和在线建图阶段它使用了二分匹配算法。至于跟踪,检测 queries 的候选框会和新出现的 ground-truth 物体做配对,track queries 的预测则会继承之前帧的配对结果。跟踪模块的匹配结果会在运动和占用节点复用,从而持续地对历史跟踪的 agents 和未来的运动之间做建模。

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

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

相关文章

Go 复合类型之切片类型介绍

Go 复合类型之切片类型 文章目录 Go 复合类型之切片类型一、引入二、切片(Slice)概述2.1 基本介绍2.2 特点2.3 切片与数组的区别 三、 切片声明与初始化3.1 方式一&#xff1a;使用切片字面量初始化3.2 方式二&#xff1a;使用make函数初始化3.3 方式三&#xff1a;基于数组的切…

Spring Boot:自定义注解--annotation

目录 自定义注解的定义和作用范围如何创建自定义注解创建注解接口 如何使用自定义注解进行数据验证创建注解处理器控制器中使用注解 如何为字段添加注解 自定义注解的定义和作用范围 自定义注解可以作用在类、方法、属性、参数、异常、字段或其他注解上。 如何创建自定义注解…

Flask与PyQt结合使用时候,阻塞,界面卡死

一.问题起因 做了个服务端, 使用到了python的PYQT6和Flask, PYQT做的是个简单的设置界面: 但是在点击开始运行, 写入flask run的代码的时候, PYQT界面卡死了 代码如下: # 生产环境模式server make_server(0.0.0.0, ser_port, app)server.serve_forever()app.run() 二.问题产…

力扣第404题 左叶子之和 c++ 递归 与 迭代解法

题目 404. 左叶子之和 简单 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 24示例 2: 输…

【最新技术:grokking】机器学习模型是记忆还是泛化?

Do Machine Learning Models Memorize or Generalize? (pair.withgoogle.com) 机器学习模型是记忆还是泛化&#xff1f; 作者&#xff1a;Adam Pearce、 Asma Ghandeharioun、 Nada Hussein、 Nithum Thain、 Martin Wattenberg 和 Lucas Dixon 2023 年 <> 月 202…

NLP - 数据预处理 - 文本按句子进行切分

NLP - 数据预处理 - 文本按句子进行切分 文章目录 NLP - 数据预处理 - 文本按句子进行切分一、前言二、环境配置1、安装nltk库2、下载punkt分句器 三、运行程序四、额外补充 一、前言 在学习对数据训练的预处理的时候遇到了一个问题&#xff0c;就是如何将文本按句子切分&#…

最新AI智能创作系统源码AI绘画系统/支持GPT联网提问/支持Prompt应用

AI绘图专业设计 不得将程序用作任何违法违纪内容&#xff0c;不要让亲人两行泪 界面部分图解构&#xff1a; 前台show&#xff1a; 前端部署&#xff1a; 安装pm2管理器 点击设置 选择v16.19.1版本-切换版本 再新建一个网站 点击设置 添加反向代理-代理名称随便…

SpringMvc:为什么不能把controller类放到spring容器而必须放到SpringMvc容器?

因为在扫描Handler方法时&#xff0c;只会在SpringMvc容器中去查找bean 定义&#xff0c;不会查找父容器 因此&#xff0c;如果把controller放到Spring容器中直接报404。 而doGetBean方法是会查找子容器的&#xff0c;所以controller中可以注入父容器中的service和dao

设计模式 - 创建型模式考点篇:工厂模式、建造者模式

目录 一、创建型模式 一句话概括 1.1、工厂模式 1.1.1、简单工厂模式&#xff08;非 23 种经典设计模式&#xff09; 概述 案例 1.1.2、静态工厂&#xff08;扩展&#xff09; 1.1.3、工厂方法模式 概念 案例 1.2、建造者模式 1.2.1、概念 1.2.2、案例 1.2.3、建…

Deep learning of free boundary and Stefan problems论文阅读复现

Deep learning of free boundary and Stefan problems论文阅读复现 摘要1. 一维一相Stefan问题1.1 Direct Stefan problem1.2 Inverse Type I1.3 Inverse Type II 2. 一维二相Stefan问题2.1 Direct Stefan problem2.2 Inverse Type I2.3 Inverse Type II 3. 二维一相Stefan问题…

《视觉 SLAM 十四讲》第 7 讲 视觉里程计1 【如何根据图像 估计 相机运动】【特征点法】

github源码链接V2 文章目录 第 7 讲 视觉里程计17.1 特征点法7.1.1 特征点7.1.2 ORB 特征FAST 关键点 ⟹ \Longrightarrow ⟹ Oriented FASTBRIEF 描述子 7.1.3 特征匹配 7.2 实践 【Code】本讲 CMakeLists.txt 7.2.1 使用 OpenCV 进行 ORB 的特征匹配 【Code】7.2.2 手写 O…

windows 2003、2008远程直接关闭远程后设置自动注销会话

1、2003系统&#xff1a; 按开始—运行—输入“tscc.msc”&#xff0c;打开“终端服务配置”。 单击左边窗口的“连接”项&#xff0c;右边窗口中右击“RDP-TCP”&#xff0c;选择“属性”。 单击“会话”项&#xff0c;勾选“替代用户设置”&#xff0c;在“结束已断开的会话”…

C语言中文网 - Shell脚本 - 2

第1章 Shell基础&#xff08;开胃菜&#xff09; 2. Shell是运维人员必须掌握的技能 Linux 运维人员就是负责 Linux 服务器的运行和维护。随着互联网的爆发&#xff0c;Linux 运维在最近几年也迎来了春天&#xff0c;出现了大量的职位需求&#xff0c;催生了一批 Linux 运维培…

远程实时监控管理:5G物联网技术助力配电站管理

配电站远程监控管理系统是基于物联网和大数据处理等技术的一种创新解决方案。该系统通过实时监测和巡检配电场所设备的状态、环境情况、安防情况以及火灾消防等信息&#xff0c;实现对配电站的在线实时监控与现场设备数据采集。 配电站远程监控管理系统通过回传数据进行数据系…

Logback日志框架使用详解以及如何Springboot快速集成

Logback简介 日志系统是用于记录程序的运行过程中产生的运行信息、异常信息等&#xff0c;一般有8个级别&#xff0c;从低到高为All < Trace < Debug < Info < Warn < Error < Fatal < OFF off 最高等级&#xff0c;用于关闭所有日志记录fatal 指出每个…

LSM-Tree笔记

假设Level 0为内存中的Buffer&#xff0c;容量为 B B B&#xff0c;层与层之间的条目数量差 T T T 倍 Tiered Level 1共有 T T T 个runs&#xff0c;每个run的容量均为 B B BLevel 2共有 T T T 个runs&#xff0c;每个run的容量均为 T ⋅ B T\cdot B T⋅BLevel n共有 …

周记学习总结

10.3 今天加载出来了一下歌词&#xff0c;并且画了一下旁边的简单动画&#xff0c;然后画了一下下面的评论&#xff0c;今天主要是看了好多歌词滚动并且让它居中的&#xff0c;一直用的是scrollIntoView这个函数&#xff0c;但是这个函数似乎一直没有用&#xff0c;今天了解了…

多自由度工业机械臂机电系统

经过数百万年的进化创造了最通用和完善的工具——人类手臂。我们现代世界中的一切都得益于这个工具。即使到今天&#xff0c;工业界也没有找到比机器人手臂更多功能的工具来在三维空间中操纵物体&#xff0c;机器人手臂本质上是人类手臂的机电复制品。机器人手臂的多功能性确实…

企业关于低代码的需求——PDM 元数据电子审批流

企业关于低代码的需求 PDM 元数据电子审批流 审批流业务场景是现代企业运营中不可或缺的一环。业务流程从某个特定点开始,然后经过一系列的审批节点,完成流程的审批。这些节点通常由不同级别的人员担任,例如主管、经理、财务、法务和总经理等,每个人都扮演着特定的角色和…

阿里云数据库MongoDB恢复到本地

共两种方式&#xff0c;建议使用第二种的逻辑恢复&#xff0c;比较方便快捷 一、下载物理备份文件 下载的格式是xb的&#xff0c;主要跟实例创建时间有关&#xff0c;2019年03月26日之前创建的实例&#xff0c;物理备份文件格式为tar&#xff0c;后面全部都是xb的格式了&#…