EM planner 论文阅读

论文题目:Baidu Apollo EM Motion Planner

0 前言

在这里插入图片描述
EM和Lattice算法对比

EM plannerLattice Planner
参数较多(DP/QP,Path/Speed)参数少且统一化
流程复杂流程简单
单周期解空间受限简单场景解空间较大
能适应复杂场景适合简单场景

1 摘要

基于百度Apollo平台提出的一种实时运动规划系统,该规划系统包括顶层的多车道和其中的单车道自动驾驶:
(1)系统顶层是一种多车道策略,通过并行计算车道级别轨迹来处理车道变更场景
(2)在车道轨迹生成器内部,通过迭代的方法解决基于Frenet坐标的路径规划和速度规划
(3)针对路径和速度规划,提出了动态规划DP与基于样条的二次规划QP相结合的方法,构造了一个可扩展且易于调整的框架,同时处理交通、障碍物决策和平滑度问题
该规划器可扩展至高速公路和城市低速驾驶场景

2 Introduction

在这里插入图片描述
(1)高精地图提供了任何人都可以访问的高精地图
(2)感知和定位模块提供了动态环境中必要的信息
(3)运动规划模块考虑生成一条安全平滑的轨迹再交由汽车的控制模块去执行
(4)运动规划以安全第一为原则,遵循各种规则
(5)对于规划的覆盖范围:至少提供8秒或者200米的运动规划轨迹,算法的反应时间必须在100ms(人是300ms反应时间)内做出反应
(6)必须设有安全应急模块,人为操控作为最后一道保障
(7)除了安全以外,乘客的体验感也很重要,舒适度主要取决于轨迹的平滑性

EM planner是Apollo面向L4的实时运动规划算法,该算法通过顶层多车道策略,选择出一条参考线,再根据这条参考线,在Frenet坐标系下,进行车道级的路径和速度规划,规划主要通过DP和基于样条的QP实现。EM planner充分考虑了无人车安全性、舒适性、可扩展性的需求,通过考虑交通规则、障碍物决策、轨迹平滑性等要求,可适应高速公路、低速城区的规划需求。通过Apollo仿真和在环测试,EM Planner算法体现了高度的可靠性,和低耗时性。

2.1 多车道策略

对于L4级别的无人驾驶,变道策略是必须的。常见的办法就是开发一种搜索算法,可以计算所有可能的车道上的代价函数,然后选择代价最低的一条轨迹
该方法一些弊端:
(1)搜索空间因多车道而增大,导致计算量增大
(2)每个车道的交通规则不同,很难在同一框架下应用相同的算法的代价函数。
(3)应考虑避免突然变道的轨迹稳定性
遵循一致的道路驾驶规则是很重要的,以便其他驾驶员知道自动驾驶汽车的驾驶意图。

通常情况下,多车道策略应涵盖主动和被迫换道的情况。主动车道变换是routing模块因为要到达最终目的地而发出的换道请求。被动换道时因为当前车道被动态环境阻挡时汽车的自主行为。在主动和被动换道中,我们的目标是提供一个安全、平稳、成功率高的车道变换策略。因此提出了一个并行框架来处理主动和被动的环道对于候选车道,所有障碍物和环境信息都投影到Frenet框架上。然后,将交通规则与车道级别的策略绑定。然后在此框架下,每个候选车道基于规划器都生成一条最佳轨迹。最后,进行多车道轨迹决策确定一个最佳车道。

2.2 路径-速度(Path-Speed)迭代算法

在运动规划中,最优性和效率都是很重要的。因此许多自动驾驶运动规划算法是在Frenet框架下的SLT图,并且借助于参考线降低规划的维度。在Frenet下找到最优的轨迹本质上是三维空间约束优化问题。因此有两种类型方法:直接三维空间优化方法路径速度解耦法
(1)直接三维空间方法:尝试使用轨迹采样或Lattice(晶格)搜索在SLT中找到最佳轨迹。这种方法受到搜索复杂度的限制,搜索复杂度随着空间和时间搜索分辨率的增加而增加。为了满足时间消耗要求,必须在增加搜索网格大小或采样分辨率上做出折中。因此,所产生的轨迹是次优的
(2)路径-速度解耦法是分别将路径规划和速度规划分开。路径规划通常考虑静态障碍物,然后,基于生成的路径产生速度曲线。当出现动态障碍物时,路径-速度分解方法可能不是最优的,但是,因为路径规划和速度规划是分离的,因此该方法在路径和速度上都有很大的灵活性。

EM planner迭代优化路径和速度,在路径规划器中,上一周期的速度曲线被用来估计和迎面来的低速动态障碍物的影响。然后,将生成的路径送到速度规划器以评估最佳速度曲线。对于高速动态障碍物,EMPlanner出于安全考虑,更倾向于变道躲避而不是接近(nudge)。

EM planner 迭代策略可以帮助解决路径-速度分解框架下的动态障碍

2.3 决策和道路规则

在EM Planner中,决策和交通规则是两种不同的约束
交通规则是硬约束,不能被改变,一些障碍物属于软约束,可以协调。对于决策模块来说,一些决策方法考虑的是数值上的最优解,也有同时进行规划和决策。
在百度Apollo EM planner中,先做决策再做规划。决策过程意在于明确道路并缩小轨迹规划的搜索空间来寻找最优的轨迹。许多包含决策的规划器尝试让汽车自我决策生成相应的状态。这些方法进一步被分为手写决策基于模型的决策。手写方式有局限性,不够灵活。基于模型的方法将汽车状态离散,并使用数据驱动方式来调整模型。

针对L4级别的自动驾驶,决策模块应具有可扩展性和可行性。可扩展是场景表达能力。在多障碍时,很难通过有限的自车状态集准确的描述决策行为。出于可行性考虑,意思是所生成的决策应包括一个可行的区域,自车可以在该区域内进行动态限制。但是,手写决策和基于模型的决策都不会产生无障碍轨迹来验证可行性。

在EM Planner的决策步骤中,以不同的方式描述行为。
(1)通过一个粗略可行的轨迹来描述汽车的移动意图。这条轨迹也可以用来估计与障碍物之间的交互,即便情景变得更加复杂,这种基于可行的轨迹的决策也是可扩展的。
(2)规划器还将基于轨迹生成凸的可行空间,用来平滑样条曲线参数。基于二次规划QP平滑样条曲线求解器可用于生成遵循该决策的更平滑的路径和速度曲线。这保证了可行且平滑的解决方案。

3 多车道策略的EM Planner框架

Apollo EM Planner的整体架构
在这里插入图片描述
在顶层的数据中心,所有来源的信息都被收集和同步。
(1)采集数据后,参考线生成器会生成一系列携带交通规则信息和障碍物信息的参考线。这个过程要基于从Routing模块的导航信息和HD地图。
(2)在运动规划中,先构造Frenet框架,在框架中构建车辆与周围环境的关系。
(3)将构建的关系传递给规划器。规划器模块执行速度和路径规划。
(4)在路径规划过程中,周围环境的信息被投影到Frenet框架中(E-step)。然后基于投影的信息产生一条平滑的路径(M-step)。
(5)速度规划也是如此。速度优化过程中,一旦路径优化器生成了一条平滑的路径,障碍物就会投影到ST图中(E-step),随后,速度优化器将生成平滑的速度曲线(M-step)
(6)结合路径和速度曲线,我们将获得指定车道的平滑轨迹。所有车道级别的最佳轨迹都将发送到参考线轨迹决策器。根据当前的汽车状态,法规和成本,最后将路径和速度结合获得一条平滑的轨迹。最后一步将所有得到的轨迹发送到参考线决策器,根据当前汽车的状态、法规和每条轨迹的代价,轨迹决策器将选择最优的轨迹交给汽车执行

4 车道级别的EM Planner

车道级别优化,如图所示车道级别规划的路径-速度EM迭代。迭代过程包括两个E-step和两个M-step,轨迹信息将在规划周期之间迭代。
加粗样式在这里插入图片描述
(1)在第一个E-steps中,动态和静态障碍物都被投影到车道Frenet坐标系下。静态障碍物会直接从笛卡尔坐标系转换到Frenet坐标系,而动态障碍物的信息则以其运动轨迹来描述。在Apollo框架中,可以预测动态障碍物的移动轨迹。通过上一帧的预测信息,和自车的运动信息,可以估算自车和动态障碍物在每个时间点的交互情况,轨迹重叠的部分会被映射到Frenet坐标系中。另外,动态障碍物的出现会最终导致自车做出避让的决策。因此,出于安全考虑,SL投影只考虑低速和来向障碍物,而对于高速的动态障碍物,EM Planner的平行变道策略会考虑这种情景。
(2)在第二个E-steps中,基于生成的路径在ST坐标系下,所有障碍物(包括高速、低速和即将到来的障碍物)都将被估计,生成速度曲线。如果障碍物轨迹和已经规划的路径重叠,那么将在ST坐标系下对应区域将会再重新生成。
(3)在两个M-steps中,通过动态规划和二次规划生成路径和速度曲线。尽管我们将障碍物投影到SL和ST坐标系下,但是最优的路径和速度解仍在非凸空间中。因此,先使用动态规划获得一个粗略解,同时,这个解可以提供避让、减速、超车等障碍物决策。通过这个粗略的解,可以构建一个凸包,然后使用基于二次规划的样条优化器来求解。


(1) E-step SL和ST投影
SL投影

SL投影是基于类似于G2平滑参考线(曲率导数连续)。在笛卡尔空间中,将障碍物和车的状态以及曲率和曲率的导数转换到Frenet坐标系中。由于静态障碍物的位置不会随着时间改变,因此转换很简单。对于转换动态障碍物,我们需要借助上一个周期的轨迹来实现把上一个周期的运动轨迹被投影到Frenet坐标系上,以提取状态方向的速度曲线。给定确定的时间就会估计出汽车状态的坐标。估计的汽车状态坐标将会帮助估计动态障碍物的影响。一旦汽车状态坐标同时与障碍物轨迹发生交叉时,SL地图上的阴影区域将被标记。在此,交叉区域被定义为汽车与障碍物的重叠区域。
在这里插入图片描述

如图所示,从预测模块估计的迎面而来的动态障碍物和相应的轨迹被标记为红色,小车标记为蓝色。首先将迎面而来的动态障碍物的轨迹随时间离散成若干个轨迹点,然后将这些轨迹点投影到Frenet坐标上。一旦我们发现自车的位置坐标与投射的障碍点有交互作用,重叠区域(图中紫色部分)将在Frenet坐标中标记出来

ST投影

ST投影可以帮助我们评估自车的速度曲线。当路径优化器在Frenet坐标中生成光滑的路径曲线后,与自车有交互的静态障碍物及动态障碍物的轨迹都将被投影在路径上。同理,这种交互也定义为包围盒的重叠。

如图,红色区域表示在2s处距离自车40m远切入规划路径的动态障碍物ST信息,绿色表示在自车后的动态障碍物ST信息,M-step将会在剩下的区域找到可行光滑的最优解。
在这里插入图片描述

(2) M-Step DP Path

M-step求解Frenet坐标系下的最优路径规划,实际上在一个非凸的区间(从左和从右避让是两个局部最优情景)就是找到一个最优的 l = f ( s ) l=f(s) l=f(s)方程。主要包括两步:基于动态规划的路径决策基于样条的路径规划
基于动态规划的路径步骤提供一条粗略的路径信息,可以带来可行通道和避障决策。如下图所示,包括Lattice采样,代价函数,动态规划搜索
在这里插入图片描述
(1)Lattice采样
Lattice采样器基于Frenet坐标系,如下图,首先在车辆之前对多行Lattice采样。不同行之间的点通过五次多项式来平滑连接。行之间的间隔取决于速度,道路结构,变换车道等。该框架允许根据场景自定义采样策略。
在这里插入图片描述
比如,车道变换的采样间隔可能比当前车道行驶更长。此外,出于安全考虑,路径总长可以达到200m或者覆盖8s的行驶长度
(2)代价函数
构造完Lattice,通过代价函数的总和来评估每一条路径。使用SL投影得到的信息结合交通规则、汽车动力学模型去构建函数。总的代价是平滑度、避障和车道代价函数的线性组合。
每段 Lattice (晶格) 路径的代价通过光滑程度、障碍物避让、车道代价来评价:
在这里插入图片描述
光滑程度smooth用以下方程来衡量
在这里插入图片描述
一阶导表示朝向偏差,二阶导表示曲率,三阶导表示曲率导数
障碍物的代价由以下方程给出,方程中的d由自车bounding box到障碍物bounding box的距离表示。
在这里插入图片描述
C n u d g e C_{nudge} Cnudge定义为单调递减函数,处于安全考虑, d c d_c dc设置保留缓冲区,可根据情况微调 d n d_n dn范围, C c o l l i s i o n C_{collision} Ccollision是碰撞代价函数。
车道代价函数包括两个部分:参考线代价和车道代价参考线定义为周围没有障碍物时的理想路径,通常这条线提取的是道路中心线。车道代价函数通常被道路边界决定,道路外的路径点将受到很高代价的惩罚:
在这里插入图片描述
最终总的路径代价函数包含平滑度、障碍和车道代价。然后边缘代价会用于通过动态规划去选择最低成本的候选路径,候选路径也将确定障碍物决策。

(3) 样条QP路径(M-Step)

样条QP路径步骤是对动态规划路径的改进,在动态规划路径中,会根据所选的路径生成可行的走廊。然后基于样条QP在该走廊生成一条平滑路径,如下图所示:
在这里插入图片描述
通过QP求解器求解具有线性约束的目标函数生成最优的QP路径,如下图所示:
在这里插入图片描述
QP路径的目标代价函数是平滑度代价和引导线代价的线性组合。该步骤中的引导线是动态规划挑选出来的路径。引导线提供了避开障碍物的估计值。在数学上QP路径步骤优化以下函数:
在这里插入图片描述
g ( s ) g(s) g(s)是动态规划的结果。 f ′ ( s ) , f ′ ′ ( s ) , f ′ ‘ ′ ( s ) f^{'}(s),f^{''}(s),f^{'‘'}(s) f(s),f′′(s),f(s)分别表示朝向、曲率和曲率的导数。该目标函数描述了避开障碍物和平滑度之间的平衡

QP路径中的限制条件包含了边界约束条件动力学可行性。这些约束都会施加在每个s ss处。为了提取边界约束,提取各状态点的可行区间。在EM Planner中,车辆被看成自行车模型。因此仅仅提供 l = f ( s ) l=f(s) l=f(s)的范围是不够的,因为车的方向也很重要
如下图,为了保持边界约束的凸包性和线性,在汽车的前后两端分别添加两个半圆,其中前轮到后轮的中心距离为 l f l_f lf和车辆宽度为 w w w
在这里插入图片描述
车的左前角的横向位置表示:
在这里插入图片描述
θ \theta θ是汽车和道路状态方向之间的航向角,可用下面的不等式进一步近似的线性约束:
在这里插入图片描述
类似地,线性优化剩下的三个角度。线性约束足够好是因为 θ θ θ通常很小( θ < π / 12 θ < π / 12 θ<π/12)。

f ′′ ( s ) f ^{′′}(s) f′′(s) f ′ ′ ′ ( s ) f ^{′′'}(s) f(s)的区间限制可表示为动力学约束,因为曲率与曲率导数有关,除了边界约束外,生成的路径还可以匹配汽车的横向初始位置和导数 ( f ( s 0 ) , f ′ ( s 0 ) , f ′′ ( s 0 ) ) (f (s_0),f ^{′}(s_0),f ^{′′}(s_0)) (f(s0),f(s0),f′′(s0))。由于所有约束相对于样条曲线参数都是线性的,因此可以使用二次规划求解器来快速解决问题

(4) DP速度优化器(M-Step)

M-Step速度规划器在ST图里面生成一个速度曲线,该速度曲线表示为相对于时间 S ( t ) S(t) S(t)的状态函数。与路径规划器相似,在ST图上寻找最优速度曲线也是一个非凸问题,所以采用DP与QP相结合的方法在ST图上寻找一个光滑的速度曲线
如下图所示,在QP速度时采用DP生成的速度曲线作为引导线,利用可行走廊生成凸域。
在这里插入图片描述
如下图,DP速度规划步骤包括代价函数,离散ST图网格和DP搜索。生成分段线性速度曲线、可行走廊、障碍物速度决策。
在这里插入图片描述
具体步骤,障碍物信息首先在ST图上离散成网格。将 ( t 0 , t 1 , . . . , t n ) (t_0,t_1,...,t_n) (t0,t1,...,tn)表示为在时间轴上具有间隔 d t dt dt的等距评估点。分段线性速度曲线在网格上表示为 S = ( s 0 , s 1 , . . . , s n ) S=(s_0,s_1,...,s_n) S=(s0,s1,...,sn)。此外,利用有限差分法对导数进行逼近。
在这里插入图片描述
目标是在ST图中优化一个带有约束的代价函数。准确说,DP速度优化器的代价:
在这里插入图片描述
第一项是速度保持代价,表示当没有障碍物或者没有红绿灯时,车辆应按照指定的速度行驶。 V r e f V_{ref} Vref描述的是参考速度,参考速度由道路速度限制、曲率和其他交通规则来确定。g函数被用来对小于或者大于 V r e f V_{ref} Vref值施加不同的惩罚。最后一个 C o b s C_{obs} Cobs描述了总障碍物代价,对车辆到所有的障碍物距离进行评估,确定总障碍物代价。

动态规划搜索空间必须在动力学约束范围内,包括加速度、加加速度 j e r k jerk jerk和单调性约束。因为我们要求生成的轨迹在道路上不执行倒车的操作,只能在泊车或者其他指定情况下执行倒车。搜索算法是向前的,基于车辆动态约束的一些必要修剪也被应用以加速该过程

(5) QP速度优化器(M-Step)

由于分段线性速度曲线不能满足动力学要求,需要用QP来解决这个问题。如下图,样条QP速度优化器包括三个部分:代价函数线性约束条件样条QP求解器
在这里插入图片描述
代价函数这样表示:
在这里插入图片描述
第一项是DP速度参考线 S r e f S_{ref} Sref和最后需要生成 S S S之间的距离。加速度和 j e r k jerk jerk是速度曲线平滑度。因此,目标函数是为了平衡引导线和平滑度。

QP速度优化器的限制条件包括了边界限制、初始速度和加速度匹配的约束:
在这里插入图片描述
第一个约束是单调性,第二、第三和第四、第五个约束是来自交通规则和车辆动力学约束的要求。在完成代价函数和约束后,QP求解器将生成一条平滑可行的速度曲线,如下图所示结合路径曲线,EM规划器将给控制模块生成一条平滑的轨迹。
在这里插入图片描述

(6)求解二次规划问题笔记

出于安全的考虑,我们评估了大概100个不同位置或时间点的路径和速度。约束的数量超过600。对于选择所需的路径和速度优化器,发现五项多项式是比较合适的。样条曲线包括3到5个多项式,大约有30个参数。因此,二次规划问题有相对较小的目标函数,但约束条件较多。因此,主动设置QP求解器有助于解决该类问题。除了加速二次规划求解外,我们还将上一个循环的计算结果作为hot start(热启动)。QP问题平均可以在3ms内解决,满足了我们对时间消耗的需求。

(7)求解DP和QP非凸问题笔记

DP和QP在非凸领域都有各自的局限性。DP和QP的结合将充分利用两者的优点,以达到最理想的解决方案。

  1. DP:算法依赖于一个采样步骤来生成候选解。由于处理时间的限制,采样网格限制了候选样本的数量。有限网格内的优化会得到一个粗糙的DP解。换句话说,DP不一定能在所有的场景下都取得最优解。例如,DP求出从左侧避开障碍物的路径,但不能选择具有最佳距离的路径。
  2. QP:相反,QP是基于凸域生成解。如果没有DP步骤的帮助,它是不可用的。例如,如果一个障碍物在车辆前面,QP需要一个决策,例如从左变道,从右变道,跟随或者超车,来生成约束。随机或者基于规则的决策很容易使QP陷入失败或者局部极小值。
  3. DP+QP:DP+QP算法将两者的局限性降到最低:(1)EM规划器首先用DP在网格内搜索,以求得粗略的解(2)DP的结果被用于生成凸域并引导QP(3)QP被用于在凸域内寻找全局最优解。

5 Case Study

虽然大多数高级的规划算法都是基于重决策的,但EM planner是一个基于轻决策的规划器。虽然基于重决策的算法,或者依赖规则的算法容易被解释。但是缺点也很明显:可能被困在角落(陷入局部最优解的频率与限制条件的复杂性和数量密切关),并不总是最优的。如下的案例说明轻决策算法的优点。这些案例都是在百度很多的重决策规划模块中的日常测试中暴露出来的,并最后由轻决策解决。
在这里插入图片描述
如图所示,EM规划器如何在规划周期和迭代周期之间迭代以获得最佳轨迹。

当障碍物进入到规划的路径如何生成轨迹。假设车辆的速度为10m/s,并且有一个动态障碍物以10m/s的速度朝我们移动,EM规划器将按照以下步骤迭代生成路径和速度曲线。

(1)历史规划(图15a),在历史规划速度曲线中,在动态障碍物进入前,车辆以10m/s的恒定速度直线前进;
(2)路径曲线的迭代(b),这一步中,速度曲线以10m/s的速度从原始曲线巡航。根据该速度推算,车子和动态障碍物将在s=40m处相撞,因此,避免该障碍物的最佳方法是在s=40m处从右侧躲避。
(3)速度曲线迭代(c),从步骤1开始,根据从右侧避开的路径曲线,主车辆根据其与障碍物的相互作用来调整其速度。因此,如乘客可能期望的,当以较慢的速度通过障碍物时,主车辆将减速到5 m/s。
(4)路径曲线迭代2(d),在新的速度曲线下,车辆不会在s=40m处通过障碍物,而是在s=30m处通过。因此应躲避障碍物的路径更新为一个新的路径,以使躲避的距离最大化为s=30。
(5)速度曲线迭代2(e),在新的路径曲线下,在s=30m处执行而不再需要在s=40m处进行减速。新的速度曲线显示,车辆可以在s=40处加速,在s=30处仍然能平稳通过。

因此,基于这四个步骤生成的最终轨迹整体过程是:在s=30处缓慢躲避障碍物,然后车辆通过障碍物再加速,这才是人类驾驶员在这种情况下可能的操作。规划并不一定要始终执行四个步骤。它根据不同的场景可以采用更少或者更多的步骤。一般来说,环境越复杂,可能需要的步骤就越多。

6 计算性能

由于将三维状态横向速度问题分解为状态横向速度和状态速度两个二维问题,极大降低了EM Planner的计算复杂度。因而具有很高的规划效率。假设我们有n个障碍物、M条候选路径和N条候选速度曲线,则该算法的计算复杂度为O(n(M+N))。

7 结论

EM Planner是一个基于轻决策的规划算法。与其他基于重决策的算法相比,Em规划器的优势在于能够在复杂的多障碍场景下执行。当基于重决策的方法试图预先确定如何处理每个障碍物时,困难是显而易见的:
(1)很难理解和预测障碍物如何与主车相互作用,因此它们的跟随运动难以描述,因此很难被任何规则考虑
(2)当多个障碍物阻塞道路时,无法找到满足所有预定决策的轨迹概率大大降低,从而导致规划的失败

自动驾驶汽车的一个关键问题是对安全性和通过性的挑战。严格的规则增加了汽车的安全性,但降低了通过性,反之亦然。以换道为例,如果后面有车辆,只要有简单的规则,就可以很容易地暂停换道过程。这样可以保证安全,但大大降低了通过性。本文所描述的EM-planner,在解决潜在决策与规划不一致的同时,也提高了自主驾驶车辆的通过性。

EM planner通过将三维规划问题转换为两个二维规划问题,大大降低了计算复杂度。大大减少了处理时间,从而提升整个系统的交互能力。

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

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

相关文章

使用Pygame显示文字的示例代码

import pygame import syspygame.init()# 设置窗口尺寸 win_size (800, 600) screen pygame.display.set_mode(win_size) pygame.display.set_caption("文字显示示例")# 设置字体和文字内容 font pygame.font.SysFont(None, 48) # 使用系统默认字体&#xff0c;字…

Windows VSCode 使用Python

一、vscode中安装python 二、下载python.exe&#xff08;即vscode中需要的python解释器&#xff09; 下载地址&#xff1a;https://www.python.org/downloads/ 三、安装第三方代码规范工具 参考网址&#xff1a;https://www.python.org/downloads/ 工具介绍 flake8 &#xf…

快速打通 Vue 3(四):标签的 ref 属性与 Vue3 生命周期

很激动进入了 Vue 3 的学习&#xff0c;作为一个已经上线了三年多的框架&#xff0c;很多项目都开始使用 Vue 3 来编写了 这一组文章主要聚焦于 Vue 3 的新技术和新特性 如果想要学习基础的 Vue 语法可以看我专栏中的其他博客 Vue&#xff08;一&#xff09;&#xff1a;Vue 入…

Mondo备份linux操作系统为iso镜像 —— 筑梦之路

简介 Mondo Rescue&#xff08;以下简称Mondo&#xff09;可以说是Linux 下的Ghost&#xff0c;它可以将你的系统像照相一样备份至磁带&#xff0c;CD-R&#xff0c;CD-RW&#xff0c;NFS或硬盘分区。Mondo广泛支援LVM&#xff0c;RAID&#xff0c;ext2, ext3, JFS, XFS,Reise…

Fragstats景观格局指数计算入门教程

土地利用以及景观格局是当前全球环境变化研究的重要组成部分及核心内容&#xff0c;其对区域的可持续发展以及区域土地管理有非常重要的意义。通过对土地利用时空变化规律进行分析可以更好的了解土地利用变化的过程和机制&#xff0c;并且通过调整人类社会经济活动&#xff0c;…

蓝桥杯练习题(二)

&#x1f4d1;前言 本文主要是【算法】——蓝桥杯练习题&#xff08;二&#xff09;的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 …

VS Code 配置 Vue3 模板 详细步骤

1、打开 VS Code &#xff0c;在页面左下角找到这个设置图标&#xff0c;然后找到 “用户代码片段” 2、接着点击 “新建全局代码片段文件” 3、在输入框中输入你要设置的模板名&#xff0c;然后回车确认 4、接下来配置自己想要模板代码&#xff0c;或者也可以借鉴我写的这个&…

【C语言刷题每日一题#牛客网HJ73】——计算日期到天数转换(给定日期,计算是该年的第几天)

目录 问题描述 思路分析 数据结构构建部分 计算部分 代码实现 结果测试 此问题解决方法不唯一&#xff0c;这里介绍的是一种使用数组和循环实现的简单办法 问题描述 思路分析 问题的要求是输入一个日期&#xff0c;计算这是当年的第几天——要解决这个问题&#xff0c;逻…

MongoDB之Change Stream实战

什么是 Chang Streams Change Stream 指数据的变化事件流&#xff0c;MongoDB 从 3.6 版本开始提供订阅数据变更的功能。Change Stream 是 MongoDB 用于实现变更追踪的解决方案&#xff0c;类似于关系数据库的触发器&#xff0c;但原理不完全相同&#xff1a; Change Stream触…

Linux动态分配IP与正向解析DNS

目录 一、DHCP分配 1. 动态分配 1.1 服务端服务安装 1.2 修改服务端dhcp配置 1.3 修改客户端dhcp&#xff0c;重启查询网卡信息 2. 根据mac固定分配 2.1 修改服务器端dhcp服务配置 2.2 客户端自动获取&#xff0c;查看网卡信息 二、时间同步 1. 手动同步 2. 自动同…

java实现AES256对称加解密工具类

一、引入依赖包 引入相关依赖包 <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.70</version> </dependency> <!--lombok用于简化实体类开发--> <dependency&g…

Hive基础

hive的基础部分大致有四部分&#xff1a;Hive数据类型、Hive运算符、Hive数据存储、Hive表存储格式。这四部分是学习hive必须掌握的知识。 一、Hive数据类型 整体概述 1&#xff0c;hive的数据类型指的是表中列字段类型&#xff0c;类似于编程语言中对变量类型的定义如&#…

Beauty algorithm(七)瘦脸

瘦脸的实现采用局部平移法。 一、skills 前瞻 局部平移 二、目标区域定位 左脸: 关键点选择3、5点,基点30 rmax:计算两点5-3间的距离, |x-c|:图像任一点到固定基点c的距离 |m-c|:两固定点距离 右脸: 关键点选择

【MySQL】锁机制

文章目录 一、表级锁和行级锁二、排他锁和共享锁三、InnoDB行级锁行级锁间隙锁意向共享锁和意向排他锁 四、InnoDB表级锁五、死锁六、锁的优化建议 一、表级锁和行级锁 表级锁&#xff1a; 对整张表加锁。开销小&#xff0c;加锁快&#xff0c;不会出现死锁&#xff1b;锁粒度…

STL-list的使用简介

目录 ​编辑 一、list的底层实现是带头双向循环链表 二、list的使用 1、4种构造函数&#xff08;与vector类似&#xff09;​编辑 2、迭代器iterator 3、容量&#xff08;capicity&#xff09;操作 4、element access 元素获取 5、增删查改 list modifiers 6、list的迭…

Linxu每日智囊

每日分享三个Linux命令,悄悄培养读者的Linux技能。 欢迎关注公众号(NLP Research) apt 作用 包管理器 语法 apt [选项] 软件包 参数: -h:帮助-y:当安装过程提示选择全部为"yes"-q:不显示安装的过程案例 列出所有可更新的软件清单命令sudo apt update升级软…

ROS2——Parameters

节点可以使用参数来配置各项操作&#xff0c;这些参数可以说布尔值、整数、字符串等类型。节点在启动时会读取参数。我们将参数单独列出来&#xff0c;而不是写在源文件中&#xff0c;这样做可以方便我们调试&#xff0c;因为在不同的机器人、环境中&#xff0c;我们需要的参数…

【Unity】Joystick Pack摇杆插件实现锁四向操作

Joystick Pack ​ 简介&#xff1a;一款Unity摇杆插件&#xff0c;非常轻量化 ​ 摇杆移动类型&#xff1a;圆形、横向、竖向 ​ 摇杆类型&#xff1a; Joystick描述Fixed固定位置Floating浮动操纵杆从用户触碰的地方开始&#xff0c;一直固定到触碰被释放。Dynamic动态操纵…

网卡高级设置-提高网络环境

网卡高级设置&#xff0c;提高网络质量排除一些连接问题 一、有线网卡 1、关闭IPv6&#xff1b; 可以关闭协议版本6&#xff0c;因为它会引起一些网络连接问题&#xff0c;而且现在几乎用不到IP6。 2、关闭节约电源模式&#xff1b; 右击计算机->设备->设备管理器-&…

开源C语言库Melon:数据恢复算法

本文讲述开源C语言库Melon中的里德所罗门纠错码的使用。 关于 Melon 库&#xff0c;这是一个开源的 C 语言库&#xff0c;它具有&#xff1a;开箱即用、无第三方依赖、安装部署简单、中英文文档齐全等优势。 Github repo 简介 里德所罗门编码是一种纠错码技术&#xff0c;…