【论文笔记】Baidu Apollo EM Motion Planner

在这里插入图片描述

文章目录

  • Abstract
  • I. INTRODUCTION
    • A. Multilane Strategy
    • B. Path-Speed Iterative Algorithm
    • C. Decisions and Traffic Regulations
  • II. EM PLANNER FRAMEWORK WITH MULTILANE STRATEGY
  • III. EM PLANNER AT LANE LEVEL
    • A. SL and ST Mapping (E-step)
    • B. M-Step DP Path
    • C. M-Step Spline QP Path
    • D. M-Step DP Speed Optimizer
    • E. M-Step QP Speed Optimizer
    • F. Notes on Solving Quadratic Programming Problems
    • G. Notes on Non-convex Optimization With DP and QP
  • CASE STUDY
  • Else

Abstract

EMplanner通过一个层级结构的方式去考虑多车道和单车道的情况:
(1)顶层策略通过比较不同车道级轨迹来处理变道场景;
(2)在Frenet坐标下不断迭代求解路径优化和速度优化问题来生成轨迹;
(3)为了使框架易于扩展和调整,可以同时处理交通规则、障碍物决策和平滑曲线,他们提出了一种融合DP和QP采样的优化算法。

I. INTRODUCTION

Motion Planning安全性考虑因素:

  1. 交通规则。
  2. 范围。目标轨迹需要至少8秒的视野和200米的轨迹长度。
  3. 工作周期。小于100ms。
  4. 紧急情况。

乘员体验也是是十分重要的,考虑以下几点:

  1. 场景。不仅仅是简单的超车、让行的场景,更要能适应多车道、复杂、动态的场景。
  2. 交通规则。
  3. 舒适度。轨迹平滑。
    在这里插入图片描述
    Apollo的Pipeline

EM思想的最早起源:《Maximum likelihood from incomplete data via the EM algorithm》

EM算法,全称期望最大化算法(Expectation-Maximization Algorithm),是一种迭代算法,用于含有缺失数据的概率模型参数估计。

EM算法分为两步,即“期望步骤”(E步)和“最大化步骤”(M步)。在E步中,求出在当前参数下缺失数据的概率分布,即求出缺失数据的期望。在M步中,利用E步中求出的缺失数据的期望,最大化似然函数(或极大化后验概率)来估计模型参数。这样,利用EM算法可以通过迭代更新参数估计值,逐渐逼近真实数据分布的参数值。

EM算法广泛应用于数据挖掘、图像处理、自然语言处理等领域中的模型参数学习,比如高斯混合模型、隐马尔可夫模型等

A. Multilane Strategy

采用对不同车道进行cost计算的方式可能存在的难点:

  1. 多车道带来的计算复杂度。
  2. 不容易结合交通规则。
  3. 需要考虑不同Planning Cycle之间的变化对轨迹产生的影响。

多车道的策略需要考虑主动换道(routing规划时产生)和被动换道的场景(受障碍物、环境变化影响)。

对于每一条候选车道,将障碍物以及环境信息投影到Frenet坐标系中;每一条车道加以相应的交规约束,并对每一条车道生成一条轨迹;利用cost function和规则决定选择哪一条车道。

B. Path-Speed Iterative Algorithm

在Frenet框架中寻找最优轨迹本质是一个三维约束的优化问题。主要有两种解决方式:

  1. 综合ST问题,直接求解:通常是采用采样+搜索的算法进行,得到一条符合kinodynamic的轨迹。计算复杂度高。若为了减小计算量,可能会采用减小resolutions的方式,但这样一来会导致生成的轨迹非最优。
  2. ST解耦。路径优化考虑静态障碍物,速度优化考虑动态障碍物。求解效率高,但有可能存在求解失败的问题。

【论文笔记】Perception, Planning, Control, and Coordination for Autonomous Vehicles这篇论文也涉及相关问题的讨论。

路径优化利用上一帧的speed profile来估计低速障碍物。对于高速障碍物,EM planner更倾向于采取变道而不是nudge操作。

C. Decisions and Traffic Regulations

不同于以往的一些方法直接利用数值优化的方法同时求解决策和轨迹规划,EM planner采取了先决策后轨迹规划的方式,去减少求解最优轨迹时的计算量。

决策方法可分为基于规则(手动操作)和基于模型的方法:

  1. 基于规则:容易手动调整,但是泛用性差。
  2. 基于模型:通常将车辆状态离散化为有限驾驶状态,再使用数据驱动的方式去调整。

多智能体的交互在预测和决策等方面很重要,这就需要POMDP、RL等方法了。

EM的决策流程

  • 首先,通过一条粗糙可通行的轨迹来表示自车的意图。同时也利用这个轨迹来测量障碍物之间的交互。
  • 接着,基于这个轨迹,生成凸空间。基于凸优化的问题,生成遵循决策的平滑路径和速度曲线。

II. EM PLANNER FRAMEWORK WITH MULTILANE STRATEGY

在这里插入图片描述

Data Center:用于收集和同步所有的信息。
Reference Line Generator:提供车道级的参考线,参考线包括交规、障碍物等信息。

基于Frenet坐标系估计自车和周围环境的相对关系,并将信息传递到车道级的优化器之中。

Optimizer

  • path optimization
    • (E-step):将周围环境信息投影到Frenet坐标系(SL)。
    • (M-step):生成光滑的轨迹。
  • speed optimization:
    • (E-step): 将障碍物投影到ST图。
    • (M-step):生成光滑的速度曲线。

最后合并路径和速度部分,并送入reference line trajectory decider基于车辆状态、规则、cost选出最优路径。

III. EM PLANNER AT LANE LEVEL

在这里插入图片描述
两步E-step和两步M-step;轨迹随着规划周期进行迭代。

在第一个E-step中,障碍物被投射到车道Frenet坐标系,包括静态障碍物和动态障碍物。在Apollo框架中,动态障碍物的意图是用障碍物的移动轨迹来描述的.处于安全的考虑,路径优化部分只考虑低速或相向的障碍物,高速情况利用变道进行解决。

在第二个E-step中,所有障碍物,包括高速、低速和迎面而来的障碍物都会投影到ST图中进行评估。

在M-step中,通过DP+QP的方式生成path profiles和speed profiles。利用DP给出一个粗糙的决策,将非凸的空间转化为凸空间。QP进行优化。

A. SL and ST Mapping (E-step)

SL部分

SL投影基于参考线二阶导连续。
状态向量:

  • 在笛卡尔坐标系中: ( x , y , θ , κ , κ ˙ ) (x,y,\theta,\kappa,\dot\kappa) (x,y,θ,κ,κ˙)
  • 在Frenet坐标系中: ( s , l , d l , d d l , d d d l ) (s,l,dl,ddl,dddl) (s,l,dl,ddl,dddl)

对于动态障碍物,利用上一帧自车的轨迹。给定一个时间,可以估计出相应的位置,再利用这个位置与障碍物的轨迹进行交互决策。

下面是一个例子。
在这里插入图片描述

蓝色:自车;
红色:迎面而来的障碍车以及其轨迹;
紫色:交互区域。


ST部分
路径优化之后,可能产生交互作用的静态障碍物和动态障碍物都被投影到路径上。ps:注意apollo在之后方案与此处的不同。

在这里插入图片描述

一个障碍物在 t = 2 s t=2s t=2s, s = 40 m s=40m s=40m处切入当前车道,其在ST图中的投影为红色。后方车辆在ST图中的投影为绿色。剩余的区域为可行区域。

B. M-Step DP Path

在这里插入图片描述

DP的结构:包括lattice采样、代价函数以及DP search。

动态规划用于先给出一个粗略的路径。下面是一个示例。

在这里插入图片描述

  • 在自车的前方撒点。不同行之间的点通过五次多项式进行连接。采样间隔依赖于速度、道路结构以及场景(比如说换道场景会增大采样间隔)。
  • 采样结束后,利用SL投影、交规以及车辆动力学去构造代价函数。
  • 最后DP找到最低cost的路径,同时给出相应的决策。

DP-path总的代价函数:
C t o t a l ( f ( s ) ) = C s m o o t h ( f ) + C o b s ( f ) + C g u i d a n c e ( f ) C_{total}(f(s))=C_{smooth}(f)+C_{obs}(f)+C_{guidance}(f) Ctotal(f(s))=Csmooth(f)+Cobs(f)+Cguidance(f)

路径平滑程度的代价
C s m o o t h ( f ) = w 1 ∫ ( f ′ ( s ) ) 2 d s + w 2 ∫ ( f ′ ′ ( s ) ) 2 d s + w 3 ∫ ( f ′ ′ ′ ( s ) ) 2 d s . \begin{aligned} C_{smooth}(f)& \begin{aligned}&=w_1\int(f'(s))^2ds+w_2\int(f''(s))^2ds\end{aligned} \\ &+w_3\int(f^{\prime\prime\prime}(s))^2ds. \end{aligned} Csmooth(f)=w1(f(s))2ds+w2(f′′(s))2ds+w3(f′′′(s))2ds.
f ′ ( s ) f'(s) f(s)代表车道和自车航向角之差;
f ′ ′ ( s ) f''(s) f′′(s)代表路径的曲率, κ = d θ d s \kappa = \frac {d\theta}{ds} κ=dsdθ;
f ′ ′ ′ ( s ) f'''(s) f′′′(s)代表路径曲率的二阶导。

障碍物的代价
C o b s ( d ) = { 0 , d > d n C n u d g e ( d − d c ) , d c ≤ d ≤ d n C c o l l i s i o n d < d c C_{obs}(d)=\begin{cases}0,&d>d_n\\C_{nudge}(d-d_c),&d_c\leq d\leq d_n\\C_{collision}&d<d_c&\end{cases} Cobs(d)= 0,Cnudge(ddc),Ccollisiond>dndcddnd<dc
遍历路径上的 s s s序列 s 0 , s 1 , . . . , s n {s_0,s_1,...,s_n} s0,s1,...,sn,比较和障碍物的距离 d d d C n u d g e C_{nudge} Cnudge是一个单调递减函数。 d c d_c dc是一个基于安全考虑的buffer。 d n d_n dn是一个阈值,超过它,cost为0,阈值可随场景变更; C c o l l i s i o n C_{collision} Ccollision是碰撞的cost,通常会设一个很大的值。

车道的代价由两部分组成:
一部分是参考线的代价,使得轨迹靠近参考线;另一部分是道路的代价,保证轨迹在道路边界之内(若不在,设置一个很高的惩罚)。
C g u i d a n c e ( f ) = ∫ ( f ( s ) − g ( s ) ) 2 d s C_{guidance}(f)=\int(f(s)-g(s))^2ds Cguidance(f)=(f(s)g(s))2ds
注意:这里的参考线指的是道路中心线

C. M-Step Spline QP Path

在这里插入图片描述
QP在DP的基础上平滑轨迹。

在这里插入图片描述

QP的流程,包含目标函数和线性化的约束。

QP的目标函数:
C s ( f ) = w 1 ∫ ( f ′ ( s ) ) 2 d s + w 2 ∫ ( f ′ ′ ( s ) ) 2 d s + w 3 ∫ ( f ′ ′ ′ ( s ) ) 2 + w 4 ∫ ( f ( s ) − g ( s ) ) 2 d s . \begin{aligned} C_{s}(f)& \begin{aligned}&=w_1\int(f'(s))^2ds+w_2\int(f''(s))^2ds\end{aligned} \\ &\begin{aligned}&+w_3\int(f'''(s))^2+w_4\int(f(s)-g(s))^2ds.\end{aligned} \end{aligned} Cs(f)=w1(f(s))2ds+w2(f′′(s))2ds+w3(f′′′(s))2+w4(f(s)g(s))2ds.

注意这里的 g ( s ) g(s) g(s)是DP规划出来的路径。因为DP规划出来的路径包含了对nudge障碍物的考虑,因此QP的目标函数则是对nudge以及路径平滑程度两者之间的权衡。

QP路径的约束考虑了边界约束以及动态可行性。边界约束包括 f ( s ) , f ′ ( s ) , f ′ ′ ( s ) f(s),f'(s),f''(s) f(s),f(s),f′′(s)

在这里插入图片描述

为了保证约束的凸性和线性,在自车bounding box前面和后面分别添加了一个半圆。
l left front corner = f ( s ) + s i n ( θ ) l f + w / 2 l_\text{left front corner}=f(s)+sin(\theta)l_f+w/2 lleft front corner=f(s)+sin(θ)lf+w/2
l f l_f lf后轴到车前部的距离;
w w w半车宽;
θ \theta θ车辆航向角和道路方位角之差。
f ( s ) + s i n ( θ ) l f + w / 2 ≤ f ( s ) + f ′ ( s ) l r + w / 2 ≤ l left corner bound \begin{aligned} \begin{aligned}f(s)+sin(\theta)l_f+w/2\end{aligned}& \begin{aligned}&\leq f(s)+f'(s)l_{\textcolor{purple}{r}}+w/2\end{aligned} \\ &\leq l_{\text{left corner bound}} \end{aligned} f(s)+sin(θ)lf+w/2f(s)+f(s)lr+w/2lleft corner bound
线性化近似之后得到下式。其余三个点也一样。

当然还有起点约束。

这部分还可参考二次规划(QP)样条路径优化

D. M-Step DP Speed Optimizer

在这里插入图片描述
还有剪枝的操作,可参考【Apollo学习笔记】——规划模块TASK之SPEED_HEURISTIC_OPTIMIZER

在这里插入图片描述
速度DP结果:分段线性化的speed profile(在QP中作为参考线)、可行区域(在QP中用以生成凸空间)以及对障碍物的决策。

代价函数:
C t o t a l ( S ) = w 1 ∫ t 0 t n g ( S ′ − V r e f ) d t + w 2 ∫ t 0 t n ( S ′ ′ ) 2 d t + w 3 ∫ t 0 t n ( S ′ ′ ′ ) 2 d t + w 4 C o b s ( S ) \begin{aligned} C_{total}(S)& \begin{aligned}=w_1\int_{t_0}^{t_n}g(S'-V_{ref})dt\end{aligned} \\ &\begin{aligned}&+w_2\int_{t_0}^{t_n}(S'')^2dt+w_3\int_{t_0}^{t_n}(S''')^2dt\end{aligned} \\ &+w_4C_{obs}(S) \end{aligned} Ctotal(S)=w1t0tng(SVref)dt+w2t0tn(S′′)2dt+w3t0tn(S′′′)2dt+w4Cobs(S)

考虑因素:

  • 速度接近于参考速度 V r e f V_{ref} Vref V r e f V_{ref} Vref取决于限速、交规、曲率。 g g g用以适应于不同场景调整相应的惩罚。
  • 平滑程度。 S ′ ′ , S ′ ′ ′ S'',S''' S′′,S′′′
  • 障碍物。

DP搜索空间考虑的约束有:加速度、加加速度以及单调递增(不考虑向后行车)。

E. M-Step QP Speed Optimizer

在这里插入图片描述QP的结构

C t o t a l ( S ) = w 1 ∫ t 0 t n ( S − S r e f ) 2 d t + w 2 ∫ t 0 t n ( S ′ ′ ) 2 d t + w 3 ∫ t 0 t n ( S ′ ′ ′ ) 2 d t . \begin{aligned} C_{total}(S)& \begin{aligned}&=w_1\int_{t_0}^{t_n}(S-S_{ref})^2dt+w_2\int_{t_0}^{t_n}(S'')^2dt\end{aligned} \\ &+w_3\int_{t_0}^{t_n}(S''')^2dt. \end{aligned} Ctotal(S)=w1t0tn(SSref)2dt+w2t0tn(S′′)2dt+w3t0tn(S′′′)2dt.
S r e f S_{ref} Sref为DP规划出的speed profile。

约束:
S ( t i ) ≤ S ( t i + 1 ) , i = 0 , 1 , 2 , . . . , n − 1 , S l , t i ≤ S ( t i ) ≤ S u , t i , S ′ ( t i ) ≤ V u p p e r , − D e c m a x ≤ S ′ ′ ( t i ) ≤ A c c m a x − J m a x ≤ S ′ ′ ′ ( t i ) ≤ J m a x \begin{gathered} \begin{aligned}S(t_i)\leq S(t_{i+1}),i=0,1,2,...,n-1,\end{aligned} \\ \begin{aligned}S_{l,t_{i}}\leq S(t_{i})\leq S_{u,t_{i}},\end{aligned} \\ S^{\prime}(t_{i})\leq V_{upper}, \\ \begin{aligned}-Dec_{max}\leq S''(t_{i})\leq Acc_{max}\end{aligned} \\ \begin{aligned}-J_{max}\leq S^{\prime\prime\prime}(t_i)\leq J_{max}\end{aligned} \end{gathered} S(ti)S(ti+1),i=0,1,2,...,n1,Sl,tiS(ti)Su,ti,S(ti)Vupper,DecmaxS′′(ti)AccmaxJmaxS′′′(ti)Jmax

在这里插入图片描述

F. Notes on Solving Quadratic Programming Problems

  • 采用五次多项式进行QP求解。参考:二次规划ST速度优化、二次规划(QP)样条路径优化
  • 利用上一次规划的结果作为热启动以提高求解效率。

G. Notes on Non-convex Optimization With DP and QP

  • DP采样的节点数受到采样间隔的影响,同时DP在复杂场景的计算量会很大,占据大量计算时间。一般的,DP只是提供一个粗解,并不会给出最优解。
  • QP需要依赖于DP获得凸空间,否则可能会陷入局部最小值或规划失败。(QP并非一定需要DP作为前置步骤,若能转换到凸问题进行求解也是可以的)

CASE STUDY

EM planner是一个基于轻决策的规划器,相比传统的重决策或者完全rule-based的方案,更具有泛化能力。

一个两轮迭代的例子。
在这里插入图片描述
(a) 驻车沿着历史轨迹行驶。
(b) 两车相遇点在s=40处,因此在s=40处采用nudge操作通过可以有效避开障碍物。
© 主车会在s=40处降低速度通过。
(d) 更新nudge距离到s=30。
(e) 在s=30处nudge通过,之后在s=40处加速。

Else

附录里提到了reproducing kernel Hilbert space (RKHS)的概念,有些不大理解,后续再看。

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

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

相关文章

刻字机尖角补偿

1 刻字机尖角补偿原理 刀具切割直线段过渡方法在文章旋转偏心裁切刀切向跟踪及半径补偿 已经有过说明。刻字机由于刀具半径的影响&#xff0c;切割直角时会不直会比较圆滑&#xff0c;而且在闭合曲线的下刀点会容易不闭合。使用尖角补偿可以克服这些问题。 如上图所示&#xf…

上海亚商投顾:沪指放量反弹 医药、AI概念股集体走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数早间震荡反弹&#xff0c;午后集体拉升涨超1%&#xff0c;深成指一度涨超1.5%&#xff0c;随后涨幅略…

【JDK 8-Lambda】3.2 自定义函数式编程实战

一、自定义lambda接口流程 需求 : 定义一个可以使用加减乘除的接口 Stage 1&#xff1a;定义一个函数式接口 Stage 2&#xff1a;写一个方法&#xff0c;输入需要操做的数据和接口 Stage 3&#xff1a;运行结果 一、自定义lambda接口流程 需求 : 定义一个可以使用加减乘除的…

Web 器学习笔记(基础)

Filter 过滤器 概念&#xff1a;表示过滤器&#xff0c;是 JavaWeb 三大组件&#xff08;Servlet、Filter、Listener&#xff09;之一 作用&#xff1a;顾名思义可以过滤资源的请求&#xff0c;并实现特殊的需求 Filter 接口及它核心的 doFilter() 方法&#xff08;执行前就是…

激光焊接汽车PP塑料配件透光率测试仪

随着汽车主机厂对车辆轻量化的需求越来越强烈&#xff0c;汽车零部件轻量化设计、制造也成为汽车零部件生产厂商的重要技术指标。零部件企业要实现产品的轻量化&#xff0c;在材料指定的情况下&#xff0c;要通过产品设计优化、产品壁厚减小和装配方式的优化来解决。使用PP材料…

Rocketmq并发和顺序消费的失败重试机制

文章目录 问题并发消费触发时机客户端发起请求 CONSUMER_SEND_MSG_BACKBroker处理CONSUMER_SEND_MSG_BACK请求 顺序消费Q&A消费的时候是一批的消息, 如果其中某条消费失败了,是所有的消息都会被重试吗&#xff1f;用户可以自己控制重试次数、重试间隔时间吗?批量消费消息,…

Kubernetes网络揭秘:看完你就懂了

一、Master集群网络 master集群的网络比较简单&#xff0c;和通常的负载均衡集群一样。多个节点的apiserver的ip与端口(6443)使用负载均衡的ip与端口。在master/node节点join时均使用此负载均衡的ip与端口&#xff0c;这样就是master节点的集群网络。 master 节点之间的网络&a…

arm栈推导

按照栈生长方向分&#xff1a;可以分为递增栈&#xff08;向高地址生长&#xff09;&#xff1b;递减栈&#xff08;向低地址生长&#xff09; 按照sp执行位置来分&#xff1a;满栈&#xff08;sp指向栈顶元素的位置&#xff09;&#xff1b;空栈&#xff08;sp指向即将入栈的…

利用爬虫技术自动化采集汽车之家的车型参数数据

导语 汽车之家是一个专业的汽车网站&#xff0c;提供了丰富的汽车信息&#xff0c;包括车型参数、图片、视频、评测、报价等。如果我们想要获取这些信息&#xff0c;我们可以通过浏览器手动访问网站&#xff0c;或者利用爬虫技术自动化采集数据。本文将介绍如何使用Python编写…

MATLAB中findpeaks函数用法

目录 语法 说明 示例 在MATLAB中&#xff0c;findpeaks函数用于查找信号中的峰值&#xff08;peaks&#xff09;。以下是findpeaks函数的基本语法、说明以及示例&#xff1a; 语法 [pks,locs] findpeaks(x) [pks,locs] findpeaks(x, Name, Value)说明 参数说明 x&…

勒索病毒最新变种.halo勒索病毒来袭,如何恢复受感染的数据?

摘要&#xff1a; .halo勒索病毒已成为数字世界中的威胁&#xff0c;通过高级加密技术将文件锁定&#xff0c;并要求支付赎金。本文91数据恢复将深入介绍.halo勒索病毒的工作原理&#xff0c;提供解锁被感染文件的方法&#xff0c;以及探讨如何有效预防这一威胁。如果您正在经…

87 # express 应用和创建应用的分离

创建应用的过程和应用本身要进行分离。路由和创建应用的过程也做一个分离。 下面实现创建应用的过程和应用本身要进行分离&#xff1a; express.js const Application require("./application");function createApplication() {// 通过类来实现分离操作return ne…

unity UDP 通信

客户端 接收端 &#xff1a; using System; using System.IO; using System.Collections; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using UnityEngine; using UnityEngine.UI;public cla…

常见音视频、流媒体开源编解码库及官网(四十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

Unity中Shader抓取屏幕并实现扭曲效果(优化)

文章目录 前言一、在之前顶点着色器的输入中&#xff0c;放弃了使用结构体传入&#xff0c;而是直接从应用程序阶段传入参数&#xff0c;这样写的话&#xff0c;对于程序来说&#xff0c;不方便扩张&#xff0c;所以需要对其进行修改实现1、定义结构体用于传入顶点坐标系2、因为…

开始撸 Android 源码

启动找工作模式&#xff0c;发现无比困难。搁在往日&#xff0c;大龄程序员找工作都是一件困难的事情&#xff0c;加上今年形势很差&#xff0c;更是难上加难。关键是我这十几年来主攻的浏览器内核方向&#xff0c;需求量更是几乎为零。在 BOSS 直聘上以 Chromium 为关键词&…

华为云云耀云服务器L实例评测|Git 私服搭建指南

前言 本文为华为云云耀云服务器L实例测评文章&#xff0c;测评内容是 云耀云服务器L实例 Git 私有服务器搭建指南 系统配置&#xff1a;2核2G 3M Ubuntu 20.04 我们平时在使用代码托管服务的时候&#xff0c;可能某些代码托管平台对成员有限制&#xff0c;或是由于内容原因会对…

教你如何清理 Docker 存储驱动的磁盘占用空间

Author&#xff1a;rab 有时候你会发现&#xff0c;你的 Docker 业务容器虽然做了数据持久化&#xff0c;且数据持久化的磁盘空间占用并不大&#xff0c;但是 Docker 的 Overlay2 目录占用却很大。我们知道 Overlay2 是 Docker 的存储驱动&#xff0c;也是 Docker 默认的存储驱…

Vue Router最佳实践,以确保你的Vue.js应用的路由管理清晰、可维护和高效

文章目录 路由结构设计命名路由动态路由参数导航守卫命名视图 (Named Views)懒加载路由错误处理 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人社区&#xff0c;欢迎你的加入&#xff1a;全栈弄潮儿的个人社区…

3D动画制作和渲染需要什么样的硬件规格?

动画是艺术与技术的令人兴奋的融合&#xff0c;为无限的创造力提供了广阔的画布。为了将创意愿景变为现实&#xff0c;动画师需要适合其工艺的强大计算资源。每个动画项目都有不同的硬件需求&#xff0c;无论是制作简单的 2D 动画还是构建复杂的 3D 世界。因此&#xff0c;有抱…