VADv2 论文学习

news2024/10/7 17:29:06

VADv2: End-to-End Vectorized Autonomous Driving via Probabilistic Planning

  • 解决了什么问题?
  • 相关工作
    • 感知
    • 运动预测
    • 规划
    • 自动驾驶领域的大语言模型
  • 提出了什么方法?
    • 场景编码器
    • 概率规划
    • 训练
      • 分布损失
      • 冲突损失
      • 场景 Token 损失
    • 推理
  • 实验
    • 实验设定
    • 指标
    • 消融实验
    • 可视化

论文链接:https://arxiv.org/abs/2402.13243
代码链接:https://github.com/hustvl/VAD

解决了什么问题?

端到端自动驾驶最近变得非常重要且受到关注。现在有很多的人类驾驶数据可以用来训练自动驾驶模型。通过分析这些数据,自动驾驶系统有可能学习到类似人类的驾驶策略。尽管有潜力,但规划过程中的不确定性和非确定性使得从这些示例中提取驾驶知识变得具有挑战性。为了证明这种不确定性,下图展示了两个场景:

  • 跟随另一辆车,人类驾驶员在这种情况下有多种合理的驾驶操作,比如保持跟随或变道超车;
  • 与来车交互,人类驾驶员在这种情况下有两种可能的驾驶操作,让路或者超车。

从统计学角度看,动作(包括时机和速度)是高度随机的,受到许多无法建模的潜在因素的影响。

现有的基于学习的规划方法遵循了决定性的范式,回归目标 a ^ \hat{a} a^ 要么是未来轨迹,要么是控制信号(加减速和转向)。该范式假设,在环境和动作之间存在一个确定性的关系,这意味着给定一个环境状态,总有一个确定的动作与之对应,但事实并非如此。人类驾驶行为是变化无常的,这会造成回归目标具有歧义。尤其当可行解空间是非凸的(即存在多个局部最优解)时,确定性建模无法处理这种情况,可能会输出一个折中的动作,可能导致安全问题。此外,基于确定性回归的规划器倾向于输出在训练数据中出现频率最高的轨迹情况(比如停车或直行),这可能导致不理想的规划表现。

相关工作

感知

感知是实现自动驾驶的第一步,一个统一的驾驶场景表示对于整合到下游任务是有帮助的。近些年,BEV 表示变成了一个常用的策略,使场景特征编码和多模态数据融合成为可能。LSS 通过直接预测图像像素的深度, 将透视视角转换成 BEV。BEVFormer 通过空间和时域注意力机制,避免了直接预测深度,取得了显著的检测表现。后续工作通过优化时域模型和 BEV 变换策略,不断地提升了下游任务的表现。

关于矢量化建图,HDMapNet 通过后处理,将车道分割转换为矢量地图。VectorMapNet 以自回归的方式预测矢量地图元素。MapTR 引入了排列等价关系和分层匹配策略,显著地提升了建图的表现。LaneGAP 为车道图引入了路径建模。

运动预测

运动预测旨在预测驾驶场景中其它交通参与者的未来轨迹,辅助自车的规划决策。传统的运动预测任务使用诸如历史轨迹、高精地图来预测未来轨迹。但最近端到端的运动预测方法联合进行感知和运动预测。

关于场景表示,一些工作使用栅格化图像表示,用 CNN 网络做预测。其它的方法利用矢量化表示,通过 GNN 或 Transformer 模型提取特征、预测运动。

一些工作将交通参与者未来的运动当作密集的占用或光流来处理,而非参与者未来的路径点。

一些运动预测方法采用高斯混合模型来回归多模态的轨迹。它可以用到规划里,建模不确定性,但是高斯混合模型的个数是有限的。

规划

因为数据驱动的本质和数据增长带来的优异表现,基于学习的规划展现了巨大的潜力。早期的工作是完全黑盒的,直接用传感器数据来预测控制信号。但是,这个策略缺乏可解释性,难以优化。

此外,有不少研究尝试将强化学习和规划结合使用。在闭环仿真环境中自动地探索驾驶行为,实现甚至超过了人类司机的驾驶表现。但是,如何将仿真和真实环境之间的鸿沟填上、解决安全顾虑,是强化学习应用在真实驾驶场景所面临的挑战。

模仿学习是另一个研究方向,模型学习专家的驾驶行为,从而实现良好的规划表现,使驾驶风格接近人类司机。

近些年,端到端自动驾驶方案涌现出来,将感知、运动预测和规划整合到一个模型,这样一个完全数据驱动的方法非常有前景。UniAD 巧妙地将多个感知和预测任务整合起来,增强规划的表现。VAD 研究了将矢量化场景表示用于规划的潜力,摆脱了密集的地图。

自动驾驶领域的大语言模型

LLM 所展现的可解释性和逻辑推理能力可以极大地辅助自动驾驶。最近的一些工作尝试将 LLM 和自动驾驶结合起来。一些工作通过问答任务,利用 LLM 做驾驶场景理解和评价。另一些工作则通过基于 LLM 的场景理解,进一步融合了规划。例如,DriveGPT4 的输入包括历史视频和文本(包括问题和额外的信息,如历史控制信号)。经过编码后,这些输入会进入 LLM 预测问题的答案和控制信号。LanguageMPC 的输入是语言形式的历史 ground-truth 感知结果和高精地图。然后,利用思维链分析方法来理解场景,然后用一个 LLM 预测规划动作,这些动作来自于一个预先定义的动作集合。每个动作都对应一个控制信号。

VADv2 受到 GPT 启发,处理不确定性的问题。在语言模型中都存在不确定性。给定一个上下文,next word 是非确定性的和概率的。LLM 从大规模语料库里学习 next word 的上下文条件的概率分布,从这个分布中采样一个单词。受到 LLM 启发,VADv2 将规划策略建模为一个环境条件的非平稳随机过程。VADv2 将动作空间离散化,产生规划的词汇表,基于大规模的驾驶示例近似出一个概率分布,每一步都从这个分布中采样一个动作来控制车辆。

提出了什么方法?

本文提出了 VADv2,一个基于概率规划的端到端的驾驶模型。VADv2 是第一个使用概率建模、拟合连续的规划动作空间的工作,这和之前的使用确定性建模的规划方法不同。本文将规划策略建模为一个环境条件的非平稳随机过程,这意味着规划策略不是固定的,而是随着环境的变化而变化的。规划策略表示为 p ( a ∣ o ) p(a|o) p(ao),其中 o o o 表示驾驶环境的历史和当前观测, a a a 表示候选的规划动作。与确定性建模相比,概率建模可以更有效地获取规划中的不确定性,实现更加准确和安全的规划性能。

规划的动作空间是一个高维的、连续的时空空间。为了建模从动作空间到概率分布的映射,作者采用了概率场函数。这个函数能将每个可能的动作映射到一个概率值,表示该动作在给定环境下被选择的可能性。由于直接拟合连续的规划动作空间是不可行的,作者采用了一种间接的方法,将规划动作空间离散化,将其划分为一个较大的规划词汇表(planning vocabulary),这个词汇表由一系列代表性的轨迹组成,这些轨迹是从驾驶示例中收集并选择出来的。通过分析大量的驾驶示例,作者学习了基于规划词汇表的规划动作的概率分布。为了离散化,作者收集了驾驶示例中的所有轨迹,采用最远轨迹采样(furthest trajectory sampling)方法,选取 N N N 条代表性轨迹,这些轨迹作为规划词汇表,代表了可能的规划动作。

概率规划有两个额外的优势。首先,概率规划建模了每个动作和环境之间的关系。确定性建模只提供了目标规划动作的稀疏的监督信号,它只关注最终选择的动作。相比之下,概率规划不仅对正样本提供监督信号,还对规划词汇表中所有候选项提供监督信号,使得监督信息更加丰富,有助于模型更好地学习和理解不同环境下的合适动作。此外,概率规划在推理阶段更加灵活。它输出多种可能的规划结果,容易和基于规则或基于优化的规划方法结合,提高规划的灵活性和适应性。我们能往规划词汇表中灵活地添加其它的候选规划动作并做评价,因为我们是对整个动作空间的分布做建模。

下图展示了 VADv2 的整体架构。基于概率规划,它的输入是多视图的图像序列,这些图像是连续流式的;然后将传感器数据转换成环境 token 编码,再输出动作的概率分布,并从中采样一个动作来控制车辆。本文使用了大规模驾驶示例和场景约束来监督预测的分布。VADv2 只依赖摄像头传感器,在 CARLA Town05 基准测试中实现了 SOTA 的闭环性能,显著优于其它方法。VADv2 没有使用额外的规则或约束来辅助决策,也能稳定地以端到端的方式运行。

场景编码器

图像中的信息是稀疏且低层级的。作者使用一个编码器,将传感器数据转换为实例级的 token 嵌入 E e n v E_{env} Eenv,直接提取高层级的信息。 E e n v E_{env} Eenv 包括四类 tokens:map token, agent token, traffic element token, image token

  • VADv2 使用一组 map tokens 来预测地图(包括车道中线、车道分隔线、道路边界、人行横道)的矢量化表示。
  • 此外,VADv2 使用一组 agent tokens 来预测其它交通参与者的运动信息(包括位置、朝向角、大小、速度和多模态的未来轨迹)。交通元素对于规划也非常重要。
  • VADv2 将传感器数据变换为 traffic element tokens,预测交通元素的状态。在 CARLA 中,我们考虑两类交通信号:交通灯信号和停止信号。
  • 将 image tokens 作为规划用的场景表示,包含丰富的信息,可以作为上述实例级的 tokens 的补充。

通过对应的监督信号来监督 map tokens, agent tokens 和 traffic element tokens,确保它们显式地编码了对应的高层级信息。此外,用一个 MLP 将导航信息和自车状态编码为嵌入 { E n a v i , E s t a t e } \{E_{navi}, E_{state}\} {Enavi,Estate}

概率规划

作者提出了概率规划来处理规划的不确定。作者将规划策略建模为环境条件的非平稳随机过程,记作 p ( a ∣ o ) p(a|o) p(ao)。基于大规模驾驶示例,将规划动作空间近似为一个概率分布,每一个时间步都从这个分布中采样一个控制车辆的动作。

规划动作空间是高维连续的时空空间 A ∈ { a ∣ a ∈ R 2 T } \mathbb{A}\in \{a|a\in\mathbb{R}^{2T}\} A{aaR2T}。直接拟合连续的规划动作空间是不现实的,作者将规划动作空间离散化为一个大规模的规划词汇表 V ∈ { a i } N \mathbb{V}\in \{a^i\}^N V{ai}N。作者收集了驾驶示例中全部的规划动作,通过最远轨迹采样选取了 N N N 个具有代表性的动作,作为规划词汇表使用。 V \mathbb{V} V 中的每条轨迹都来自于驾驶示例,因此自然地就满足自车的动力学约束,当一条轨迹转换为控制信号(转向、调节油门、刹车),控制信号不会超出合理范围。默认 N = 4096 N=4096 N=4096

将规划词汇表中的每个动作表示成一个路径点序列 a = ( x 1 , y 1 , x 2 , y 2 , . . . , x T , y T ) a=(x_1,y_1,x_2,y_2,...,x_T,y_T) a=(x1,y1,x2,y2,...,xT,yT)。每个路径点都对应一个未来的时间戳。假设概率 p ( a ) p(a) p(a) 关于 a a a 是连续的,对于 a a a 微小的偏差不敏感,即 lim ⁡ Δ a → 0 [ p ( a ) − p ( a + Δ a ) ] = 0 \lim_{\Delta{a}\rightarrow 0}[p(a)-p(a+\Delta{a})]=0 limΔa0[p(a)p(a+Δa)]=0。受到 NeRF 启发,它在 5D 空间 ( x , y , z , θ , ϕ ) (x,y,z,\theta,\phi) (x,y,z,θ,ϕ) 上对连续的辐射场建模,本文用一个概率场来对从动作空间 A \mathbb{A} A 到概率分布 { p ( a ) ∣ a ∈ A } \{p(a)|a\in \mathbb{A}\} {p(a)aA} 的连续映射做建模。作者将每个动作(轨迹)编码为一个高维的规划 token 嵌入 E ( a ) E(a) E(a),用一个级联的 Transformer decoder 来和环境信息 E e n v E_{env} Eenv 交流,然后于导航信息 E n a v i E_{navi} Enavi 和自车状态 E s t a t e E_{state} Estate 结合,输出概率。

p ( a ) = MLP ( Transformer ( E ( a ) , E e n v ) + E n a v i + E s t a t e ) , q = E ( a ) , k = v = E e n v , a = ( x 1 , y 1 , x 2 , y 2 , . . . , x T , y T ) , E ( a ) = Cat [ Γ ( x 1 ) , Γ ( y 1 ) , Γ ( x 2 ) , Γ ( y 2 ) , . . . , Γ ( x T ) , Γ ( x T ) ] , Γ ( p o s ) = Cat [ γ ( p o s , 0 ) , γ ( p o s , 1 ) , . . . , γ ( p o s , L − 1 ) ] , γ ( p o s , j ) = Cat [ cos ⁡ ( p o s / 1000 0 2 π j / L , sin ⁡ ( p o s / 1000 0 2 π j / L ) ) ] \begin{equation} \begin{split} &p(a) = \text{MLP}(\text{Transformer}(E(a), E_{env}) + E_{navi} + E_{state}),\\ &q = E(a), k=v=E_{env},\\ &a=(x_1,y_1,x_2,y_2,...,x_T,y_T),\\ &E(a) = \text{Cat}\left[\Gamma(x_1), \Gamma(y_1), \Gamma(x_2), \Gamma(y_2),..., \Gamma(x_T), \Gamma(x_T)\right],\\ &\Gamma(pos) = \text{Cat}\left[\gamma(pos, 0), \gamma(pos, 1), ..., \gamma(pos, L-1)\right],\\ &\gamma(pos,j) = \text{Cat}\left[ \cos(pos/10000^{2\pi j/L}, \sin(pos/10000^{2\pi j/L})) \right] \end{split} \end{equation} p(a)=MLP(Transformer(E(a),Eenv)+Enavi+Estate),q=E(a),k=v=Eenv,a=(x1,y1,x2,y2,...,xT,yT),E(a)=Cat[Γ(x1),Γ(y1),Γ(x2),Γ(y2),...,Γ(xT),Γ(xT)],Γ(pos)=Cat[γ(pos,0),γ(pos,1),...,γ(pos,L1)],γ(pos,j)=Cat[cos(pos/100002πj/L,sin(pos/100002πj/L))]

Γ \Gamma Γ 是编码函数,将 R \mathbb{R} R 中的每个坐标映射到高维的嵌入空间 R 2 L \mathbb{R}^{2L} R2L,对轨迹 a a a 的每个坐标值都单独使用 Γ \Gamma Γ 函数。通过这些函数将连续的输入坐标映射到一个更高维度的空间,更好地近似高频率场函数。

训练

使用三种监督来训练 VADv2:分布损失、冲突损失和场景 token 损失,

L = L d i s t r i b u t i o n + L c o n f l i c t + L t o k e n \begin{equation} \begin{split} \mathcal{L} = \mathcal{L}_{distribution} + \mathcal{L}_{conflict} + \mathcal{L}_{token} \end{split} \end{equation} L=Ldistribution+Lconflict+Ltoken

分布损失

从大规模驾驶示例中学习概率分布。使用 KL 散度最小化预测分布和数据分布之间的差距,

L d i s t r i b u t i o n = D K L ( p d a t a ∣ ∣ p p r e d ) \begin{equation} \begin{split} \mathcal{L}_{distribution} = D_{KL}(p_{data}|| p_{pred}) \end{split} \end{equation} Ldistribution=DKL(pdata∣∣ppred)

训练时,将 ground-truth 轨迹作为正样本添加到规划词汇表中。其它轨迹当作负样本。给负样本分配不同的损失权重。接近 ground-truth 的轨迹所受到的惩罚就小一些。

冲突损失

使用驾驶场景约束来帮助模型学到重要的驾驶先验信息,进一步正则预测的分布。如果规划词汇表中的某个动作于其它交通参与者的未来运动或道路边界有冲突,则该动作就被认为是负样本,就会对该动作赋予一个较大的权重,降低其概率。

场景 Token 损失

Map tokens, agent tokens, traffic element tokens 用相应的监督信号来监督,确保它们编码对应的高层级信息。

Map tokens 的损失和 MapTRv2 一样,使用 l 1 l_1 l1 损失来计算预测地图点和 ground-truth 地图点之间的回归损失。用 Focal loss 作为地图分类损失。

Agent tokens 的损失包括检测损失、运动预测损失,这和 VAD 一样。将 l 1 l_1 l1 损失作为回归损失,预测交通参与者的属性(位置、朝向角、大小等),用 Focal loss 预测参与者的类别。对于每个与 ground-truth 匹配的参与者,预测 K K K 个未来轨迹,使用最终位移错误最低(minFDE)的那条轨迹作为预测代表。然后计算代表轨迹和 ground-truth 轨迹的 l 1 l_1 l1 损失,作为运动回归损失。此外,使用 Focal loss 作为多模态轨迹的运动分类损失。

Traffic element tokens 包括两个部分:交通灯 token 和停止符 token。一方面,将交通灯 token 送入一个 MLP 预测交通灯状态(黄、红、绿),以及是否会影响自车行驶。另一方面,停止符 token 也送入一个 MLP 来预测停止符区域和自车是否有交集。使用 Focal loss 来监督这些预测。

推理

在闭环推理中,可以很灵活地从分布中获取驾驶策略 π m o d e l \pi_{model} πmodel。在每个时间戳,我们采样置信度最高的动作,使用 PID 控制器将选中的轨迹转换为控制信号(转向、控制油门、刹车)。

在现实应用中,我们有更多鲁棒的策略来充分利用概率分布。选取 top-K \text{top-K} top-K 个动作作为候选项,使用 rule-based 方法来筛选候选项,以及一个基于优化的后处理方法来改进。此外,动作的概率也反映了端到端模型的确信程度,可以作为判断依据来切换传统的 PnC 和 learning-based PnC。

实验

实验设定

使用 CARLA 模拟器来评测 VADv2。对于闭环评测,采用了 Town05 Long 和 Town05 Short 基准。每个基准都包含多个预定义的驾驶路线。Town05 Long 包含 10 条路线,每条路线长度约一公里。Town05 Short 包含 32 条路线,每条路线长度约 70 米。Town05 Long 验证模型的综合能力,Town05 Short 则关注于模型在特殊场景的能力,如路口前变道。

作者使用了官方的自动驾驶智能体来收集训练数据,随机生成 Town03, Town04, Town06, Town07, Town10 的驾驶路线。数据采样频率是 2Hz,收集了大约三百万帧用于训练。每一帧都有六个相机的环视图像、交通信号、其它交通参与者的信息和自车状态。此外,为了训练在线建图模块,作者用将 CARLA 提供的地图预处理成 OpenStreetMap 格式的地图。值得注意的是,地图信息只在训练时作为 ground-truth 提供,VADv2 在闭环评测时没有用任何的高精地图。

指标

对于闭环评测,使用了 CARLA 官方的指标。

  • Route Completion 表示一个参与者完成的路线距离的百分比。
  • Infraction Score 表示该路线上发生的违规程度。典型的违规行为包括闯红灯、行人碰撞等。每种违规行为都有对应的惩罚系数,违规行为越多,Infraction Score 就越低。
  • Driving Score 是 Route Completion 和 Infraction Score 的乘积,是评测的主要指标。

在评测时,大多数工作都采用一个 rube-based 方法,降低违规次数。为了和其它方法公平比较,本文也遵循了常用的 rule-based 方法。

对于开环评测,使用 L2 距离和碰撞率来说明学到的驾驶策略和专家演示之间的相似程度。在消融实验中,考虑到开环指标的计算速度快,更加稳定,作者采用了开环的评测指标。对于开环评测,作者使用了 CARLA 的官方自动驾驶智能体,基于 Town05 Long 基准的设定生成验证集,对所有验证样本的结果求平均值。

消融实验

下表展示了 VADv2 核心模块的消融实验。如果没有分布损失(ID 1)提供的专家驾驶行为的监督,模型的表现会很差。冲突损失提供了重要的驾驶先验信息,如果没有冲突损失(ID 2),模型的规划准确率就会受影响。场景 tokens 将重要的场景元素编码为高维度特征,规划 tokens 与场景 tokens 交流,学习驾驶场景中的动态和静态信息。当某一场景 token 丢失了,模型的规划性能就会受到影响(ID 3-6)。当模型加入了所有的设计项后,就实现了最佳的规划表现(ID 7)。

可视化

下图展示了 VADv2 的定性结果。第一张图展示了 VADv2 预测的在不同驾驶速度下的多模态的规划轨迹。第二张图展示了在变道场景,VADv2 预测的慢速前进和多模态的左转的轨迹。第三张图描述了在路口向右变道的场景,VADv2 预测了直行和向右变道的多条轨迹。最后一张图介绍了当有一辆车位于目标车道时的变道场景,VADv2 预测了多条合理的变道轨迹。

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

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

相关文章

AI类课程的笔记

信息论、导论、模式识别(数据挖掘)、语义网络与知识图谱、深度学习、强化学习 (零)信息论 详见另一篇博文 信息论自总结笔记(仍然在更新)_信息论也更新了-CSDN博客https://blog.csdn.net/sinat_27382047/article/details/12690…

【Unity踩坑】Unity导出的UWP项目编译失败

在Unity中导出了UWP平台的项目后(Xaml或D3D),使用Visual Studio编译时发生错误: Error: Unity.IL2CPP.Building.BuilderFailedException: Lump_libil2cpp_vm.cpp 查找后发现是Visual Studio 与Unity兼容的问题 原贴:…

数据分析案例-机器学习工程师薪资数据可视化分析

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

bus中设备驱动的probe触发逻辑和device、driver的添加逻辑

注:以下的代码皆摘自于linux 4.9.88版本的内核源码,不同版本可能有所出入。 往期内容: 驱动中的device和device_driver结构体bus总线的相关结构体和注册逻辑 1. driver的probe触发方式 在 Linux 设备模型中,probe() 函数是驱动…

自动驾驶系列—智能驾驶中的“换挡革命”:线控换挡技术详解

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

Java垃圾回收简述

什么是Java的垃圾回收? 自动管理内存的机制,负责自动释放不再被程序引用的对象所占用的内存。 怎么触发垃圾回收? 内存不足时:JVM检测到堆内存不足时,无法为新的对象分配内存时,会自动触发垃圾回收。手动…

UDP协议【网络】

文章目录 UDP协议格式 UDP协议格式 16位源端口号:表示数据从哪里来。16位目的端口号:表示数据要到哪里去。16位UDP长度:表示整个数据报(UDP首部UDP数据)的长度。16位UDP检验和:如果UDP报文的检验和出错&…

【电路】1.2 电流和电压的参考方向

1.2 电流和电压的参考方向 参考方向就是一个假设的方向(类似中学物理的正方形),选参考方向的原因是电路结构略显复杂, 无法直接看出支路电压、电流的实际方向,参考方向可以任意选择,任意支路电压、电流只有…

【韩顺平Java笔记】第8章:面向对象编程(中级部分)【272-284】

272. 包基本介绍 272.1 看一个应用场景 272.2 包的三大作用 272.3 包的基本语法 273. 包原理 274. 包快速入门 在不同的包下面创建不同的Dog类 275. 包命名 276. 常用的包 一个包下,包含很多的类,java 中常用的包有: java.lang.* //lang 包是基本包,默认引入&…

【英语】5. 考研英语语法体系

文章目录 前言句字的成分一、常规句型简单句(5 种)1. 定义:句子中只包含 *一套主谓结构* 的句子。(一个句子只能有一个谓语动词)2. 分类 并列句(由关联词组成)(3 种)基本…

Unity Shader Graph基础包200+节点及术语解释

目录 Master Stack: Vertex block: Fragment block​编辑 Alpha Clip Threshold Dither transparency Graph Inspector Texture 2d Array/Texture 3d Virtual Texture Sampler State Keywords Boolean keyword 右键显示所有节点 简化测试系列节点&#x…

[SpringBoot] 苍穹外卖--面试题总结--上

前言 1--苍穹外卖-SpringBoot项目介绍及环境搭建 详解-CSDN博客 2--苍穹外卖-SpringBoot项目中员工管理 详解(一)-CSDN博客 3--苍穹外卖-SpringBoot项目中员工管理 详解(二)-CSDN博客 4--苍穹外码-SpringBoot项目中分类管理 详…

ThreeJS入门(091):THREE.PositionalAudio 知识详解,示例代码

作者: 还是大剑师兰特 ,曾为美国某知名大学计算机专业研究生,现为国内GIS领域高级前端工程师,CSDN知名博主,深耕openlayers、leaflet、mapbox、cesium,webgl,ThreeJS,canvas&#xf…

二叉树—相关结构

1.相关的结构问题(分治递归) 1.1节点个数 1.2叶子结点个数 叶子结点:没有孩子的节点 1.3树的高度(深度) 1.4二叉树第k层的节点个数 1.5二叉树查找值为x的节点 2.二叉树的创建和销毁 2.1二叉树的构建 二叉树遍历_牛客…

mysql语句执行过程

具体流程如下: 1】当客户端的SOL发送到MySQL时,首先是到达服务器层的连接器,连接器会对你此次发起的连接进行权限校验,以此来获取你这个账号拥有的权限。当你的账号或密码不正确时,会报用户错误。连接成功如果后续没有任何操作&am…

xlwings直接读取使用区域的数据

这里的读取方法,不用最大行号最大列号,直接使用used_range对应的方法 代码如下: import xlwings as xwfile_path r...\AAA.xlsx# 实例化app,打开文件 app_e xw.App(VisibleFalse,add_bookFalse) work_book appe.books.open(f…

New Phytologist | 中国科学院地理所:菌根共生途径塑造树木根经济空间

本文首发于“生态学者”微信公众号! 根经济空间是环境驱动下一系列根属性复杂互作的结果,本质上反映了植物地下碳(“货币”)投资与养分(“商品”)收益的多维策略权衡关系(图1)。然而…

【java】数据类型与变量以及操作符

各位看官:如果您觉得这篇文章对您有帮助的话 欢迎您分享给更多人哦 感谢大家的点赞收藏评论,感谢您的支持!!! 目录 一.字面变量: 二:数据类型 1.1:int类型:&#xff0…

高速机器人的点动与直线运动

工业机器人中的点动和直线运动非常之重要,接下来说一下他们的实现过程。 点动: 点动包括两个部分,第一个点动是每一个关节电机的点动,第二个是机器末端向xyz的三个方向进行点动处理。 第一个点动是非常简单的,即把对…

IO系列-3 NIO基本概念:Buffer和Channel和Selector

1.缓冲区 1.1 Buffer类介绍 java在BIO中通常使用字节数组byte[]和字符数组char[]实现数据传输,在NIO中,引入了缓冲区Buffer进行数据传输,相对数组提供了更多的属性和API.Buffer在java.nio包中引入,Buffer对于常见的类型有对应的…