当前位置: 首页 > news >正文

【笔记】自动驾驶预测与决策规划_Part3_路径与轨迹规划

文章目录

    • 0. 前言
    • 1. 基于搜索的路径规划
      • 1.1 A* 算法
      • 1.2 Hybrid A* 算法
    • 2. 基于采样的路径规划
    • 3. 基于优化的路径规划
      • 3.1 以百度Apollo EM planner为例
      • 3.2 M-Step DP Path
      • 3.3 M-Step DP Speed Optimizerp

0. 前言

本文主要记录课程《自动驾驶预测与决策技术》的学习过程,难免会有很多纰漏,感谢指正。
课程链接:https://www.shenlanxueyuan.com/my/course/700

  • 基于搜索的路径规划

  • 基于采样的路径规划

  • 基于优化的路径规划

1. 基于搜索的路径规划

1.1 A* 算法

A*算法是一种用于路径规划和搜索的启发式算法,基于图搜索的思想,结合了深度优先搜索(DFS)和广度优先搜索(BFS)的优点,可以找到从起点到终点的最优路径。

基本原理

A*算法通过维护一个优先队列来存储当前待探索的节点,每次从中选择一个估计总代价最小的节点进行扩展。每个节点的总代价由两个部分组成:

  • g(n): 从起点到当前节点n的实际代价。这是路径上已经发生的开销,也就是从起点出发,经过一系列已探索的节点,到达当前节点n所花费的总代价。g(n)通常根据具体问题中的距离、时间、能量消耗等进行计算。
  • h(n): 从节点n到终点的估计代价(通常使用启发式函数计算)

A*算法的核心思想是通过选择最小的f(n)来扩展节点,其中:

f ( n ) = g ( n ) + h ( n ) f(n) = g(n) + h(n) f(n)=g(n)+h(n)
启发式函数

启发式函数h(n)是关键所在,它估计从当前节点到目标节点的代价。常用的启发式函数包括:

  • 曼哈顿距离: h ( n ) = ∣ x n − x g o a l ∣ + ∣ y n − y g o a l ∣ h(n) = |x_{n} - x_{goal}| + |y_{n} - y_{goal}| h(n)=xnxgoal+ynygoal 适用于网格状地图。
  • 欧几里得距离: h ( n ) = ( x n − x g o a l ) 2 + ( y n − y g o a l ) 2 h(n) = \sqrt{(x_{n} - x_{goal})^2 + (y_{n} - y_{goal})^2} h(n)=(xnxgoal)2+(ynygoal)2

启发式函数需要满足一致性可接受性,即h(n)不会高估实际代价。

A*算法的优点在于通过启发式函数指导搜索,能够高效地找到最优路径。它在自动驾驶中的应用包括动态路径规划,避免障碍物,并实时更新路径以应对道路上的变化。

image.png

image.png

二维格点上进行 A* 算法 缺点:不满足车辆的运动学约束

image.png

1.2 Hybrid A* 算法

Hybrid含义:

  • 节点的拓展基于车辆运动学模型;
  • 代价的计算基于栅格化地图;

image.png

image.png

Hybrid A*算法的关键特性

  1. 连续空间搜索:
    • 传统A算法通常用于离散网格的搜索,例如二维网格上的路径规划。Hybrid A则在连续空间中进行搜索,允许路径规划的结果在更高的精度上表示车辆的位姿(位置和方向)。
    • 车辆的状态不仅仅包括其在网格上的位置,还包括其方向和速度等动态信息。
  2. 车辆动力学约束:
    • Hybrid A*考虑车辆的运动学和动力学约束,例如最小转弯半径、最大转向角等。这些约束使得路径规划的结果不仅是可达的,还必须是车辆能够实际执行的。
    • 在搜索过程中,Hybrid A*会基于这些约束来生成平滑的轨迹,而不仅仅是直线或折线段。

Dubins 曲线: 经典的圆弧直线法

image.png

Reeds Shepp 曲线:可以倒车 泊车主流算法。随着无图的自动驾驶,需要基于搜索,Hybrid A* 可以适用该场景。

image.png

代价计算:

g(n): 路径长度、运动学约束、道路切合程度、方向突变、压实线、逆行等(过程代价,描述已知的代价);

最短路径:

h1(n): 只考虑运动学约束,不考虑障碍物。

h2(n): 只考虑障碍物信息,通过格子去拓展,计算到终点的距离。基于经验,或者存图。

或者 leaning based huritical 。

image.png

伪代码流程:

image.png

2. 基于采样的路径规划

要求路径的一致性

2.1 Frenét Frame方法

image.png

缺点:很难约束极限道路场景下的曲率。(被参考线的曲率所欺骗)

Frenet坐标系是基于车辆的运动路径(通常称为参考路径)建立:

  1. 切向坐标 s s s: 这是沿着参考路径的距离坐标。它表示在路径上某一点距离起点的弧长,也就是路径上的累计距离。
  2. 横向坐标 l l l: 这是垂直于参考路径的距离坐标。它表示车辆当前位置偏离参考路径的横向距离,即从路径到车辆的最短距离。

2.2 Cartesian →Frenét 1D ( x , y ) (x, y) (x,y) —> ( s , l ) (s, l) (s,l)

要将笛卡尔坐标系中的位置 ( x , y ) (x, y) (x,y) 转换为 Frenet 坐标系中的 ( s , l ) (s, l) (s,l),需要将车辆在参考路径上的位置进行投影,计算出对应的弧长 ( s ) ( s ) (s) 和横向偏移 ( l ) ( l ) (l)。这个过程可以通过以下几个步骤来实现。

1. 计算 ( s ) (s) (s):找到参考线上距离 ( x , y ) (x, y) (x,y) 最近的投影点

方法 1:暴力遍历或二分查找(用于离散点形式的参考线)

  • 暴力遍历:对参考线上的每个点计算到 (x, y) 的距离,选择距离最小的点作为投影点。

    d i = ( x − x i ) 2 + ( y − y i ) 2 d_i = \sqrt{(x - x_i)^2 + (y - y_i)^2} di=(xxi)2+(yyi)2

    其中, ( ( x i , y i ) ) ( (x_i, y_i) ) ((xi,yi)) 是参考线上的一个离散点。找到最小距离 ( d i ) ( d_i ) (di) 所对应的点 ( x i , y i ) (x_i, y_i) (xi,yi),然后计算出该点对应的弧长 ( s ) (s) (s)

  • 二分查找:如果参考线是有序的,可以利用二分查找来加速寻找最近的点。

方法 2:梯度优化(用于多项式形式的参考线)

  • 如果参考线由一个多项式表示,可以使用梯度下降法来找到 ( x , y ) (x, y) (x,y) 到参考线的最短距离。设参考线方程为 ( y = f ( x ) ) ( y = f(x) ) (y=f(x)),则需要找到一个 ( x ∗ ) ( x^* ) (x),使得

d ( x ∗ ) = ( x − x ∗ ) 2 + ( y − f ( x ∗ ) ) 2 d(x^*) = \sqrt{(x - x^*)^2 + (y - f(x^*))^2} d(x)=(xx)2+(yf(x))2

使 ( d ( x ∗ ) ( d(x^*) (d(x) 最小化。可以通过迭代的方法来求解这个优化问题,最终得到对应的 ( x ∗ ) ( x^*) (x) ( y ∗ = f ( x ∗ ) ( y^* = f(x^*) (y=f(x)

  • 一旦找到最近点 ( x ∗ , y ∗ ) (x^*, y^*) (x,y),可以计算出对应的弧长 ( s ) ( s ) (s),这通常可以通过数值积分计算,也可以根据预先计算的参考路径上的弧长来直接查表得到。

2. 计算 ( l ) ( l ) (l):使用三角形向量关系

找到最近的投影点后,计算横向偏移 ( l ) ( l ) (l)

  • 向量定义

    • r ( s ) \mathbf{r}(s) r(s) 是参考线上点 ( s ) (s) (s) 处的坐标向量。
    • p ( x , y ) \mathbf{p}(x, y) p(x,y) 是车辆当前位置的坐标向量。
    • n ( s ) \mathbf{n}(s) n(s) 是参考线上 ( s ) (s) (s) 处的法向量。
  • 横向位移 ( l ) ( l ) (l) 的计算:

    通过向量的点积可以计算出横向位移 ( l ) ( l ) (l)

l = ( p − r ( s ) ) ⋅ n ( s ) l = (\mathbf{p} - \mathbf{r}(s)) \cdot \mathbf{n}(s) l=(pr(s))n(s)

其中, n ( s ) \mathbf{n}(s) n(s) 是垂直于参考线在 ( s ) ( s) (s) 处的法向量。如果法向量朝向参考线左侧,那么 ( l ) ( l ) (l) 为正,反之为负。

核心步骤总结

  1. ( s ) ( s ) (s):找到离车辆位置 ( x , y ) (x, y) (x,y)最近的参考线点,这可以通过暴力搜索或优化方法实现。
  2. ( l ) ( l ) (l):通过计算车辆位置和参考线投影点的法向量点积,求得横向偏移 ( l ) ( l ) (l)

实际应用中的注意事项

  • 参考线左侧、右侧方向不一致:需要注意法向量的方向。一般通过约定参考线法向量方向或使用方向向量进行修正,确保在 Frenet 坐标系中,左侧偏移为正,右侧偏移为负。
  • 参考线的光滑性:如果参考线不是光滑的,则可能需要对参考线进行平滑处理,以确保计算结果的精度和稳定性。

image.png

求解S 代码:EPSILON/core/common/src/common/lane/lane.cc

ErrorType Lane::GetArcLengthByVecPosition(const Vecf<LaneDim>& vec_position,decimal_t* arc_length) // 寻找距离自车最近的点
ErrorType Lane::GetArcLengthByVecPositionWithInitialGuess( const Vecf<LaneDim>& vec_position, const decimal_t& initial_guess, decimal_t* arc_length) //牛顿法来近似计算曲线长度

image.png

2.3 Cartesian →Frenét 3D

image.png

Frenét → Cartesian 3D

image.png

参考链接:
https://blog.csdn.net/qq_23981335/article/details/102832823
https://blog.csdn.net/AdamShan/article/details/80779615

2.4 贝尔曼Bellman最优性原理

贝尔曼最优原理(Bellman’s Principle of Optimality)是动态规划(Dynamic Programming)中的核心思想之一。它是由美国数学家理查德·贝尔曼(Richard Bellman)提出的,用于解决多阶段决策问题。它的核心思想是,无论过程过去的状态和决策如何,对前面的决策所形成的状态而言,余下的决策必须构成最优策略。这个原理可以将一个复杂的问题分解为子问题,通过递归地解决这些子问题来找到最优解。

贝尔曼最优原理的定义

贝尔曼最优原理可以表述为:

一个问题的最优策略具备这样的性质:无论初始状态及初始决策如何,余下的决策必须构成最优策略,即从当前状态开始的决策序列是问题的最优解。

换句话说,假设一个问题可以分解为多个阶段,每个阶段的决策都会影响后续阶段的状态。贝尔曼最优原理指出,如果我们已经知道某个阶段之后的决策序列是最优的,那么在之前阶段的决策也必须是最优的,以确保整个决策序列是最优的。

形式化描述

假设我们有一个决策问题,它可以分为若干阶段。每个阶段的状态可以表示为 ( s ) ( s ) (s),在每个状态 ( s ) ( s ) (s) 下,可以选择一个决策 ( a ) ( a ) (a),该决策会带来一个即时奖励 ( r ( s , a ) ( r(s, a) (r(s,a)),并将系统转移到下一个状态 ( s ′ ) ( s' ) (s)

( V ( s ) ) (V(s)) (V(s)) 表示从状态 ( s ) ( s) (s)开始并且遵循最优策略所能获得的最大期望收益。那么贝尔曼最优原理的递推公式(贝尔曼方程)可以表示为:

V ( s ) = max ⁡ a [ r ( s , a ) + γ V ( s ′ ) ] V(s) = \max_a \left[ r(s, a) + \gamma V(s') \right] V(s)=amax[r(s,a)+γV(s)]

其中:

  • ( max ⁡ a ) (\max_a ) (maxa) 表示在所有可能的行动 ( a ) ( a) (a) 中选择使得收益最大的那个行动。
  • ( r ( s , a ) ) ( r(s, a) ) (r(s,a)) 是在状态 ( s ) (s) (s) 采取行动 ( a ) (a) (a) 所获得的即时奖励。
  • ( γ ) ( \gamma) (γ) 是折扣因子,用于表示未来收益的重要性。
  • ( s ′ ) ( s' ) (s) 是在状态 ( s ) ( s ) (s) 采取行动 ( a ) ( a ) (a) 后到达的下一个状态。

这个公式表示,从状态 ( s ) (s) (s) 开始的最优价值 ( V ( s ) ) (V(s)) (V(s)) 是选择一个最优行动 ( a ) ( a ) (a) ,使得当前的即时奖励和未来各阶段的最优价值(考虑到折扣因子)之和最大。

贝尔曼最优原理的优势

  • 递归结构:贝尔曼方程提供了一个递归结构,允许我们通过逐步求解子问题来解决复杂的决策问题。
  • 最优性保证:遵循贝尔曼最优原理的策略确保了最终解是全局最优的,而不是局部最优。

贝尔曼方程 时间一致性
V ( t , k t ) = max ⁡ c t [ f ( t , k t , c t ) + V ( t + 1 , g ( t , k t , c t ) ) ] V(t, k_t) = \max_{c_t} \left[ f(t, k_t, c_t) + V(t + 1, g(t, k_t, c_t)) \right] V(t,kt)=ctmax[f(t,kt,ct)+V(t+1,g(t,kt,ct))]
这里的 ( V ( t , k t ) ) ( V(t, k_t)) (V(t,kt)) 是在时间 ( t ) ( t ) (t) 和状态 ( k t ) ( k_t) (kt) 下的最优价值函数。方程表明,最优决策是在当前时间 ( t ) ( t ) (t) 选择一个最优的控制 KaTeX parse error: Can't use function '\)' in math mode at position 7: ( c_t \̲)̲ ,使得当前的收益和下一步的最优价值之和最大。

  • 轨迹的时间一致性
    在轨迹规划中,为了确保每一步规划的轨迹是连续且光滑的,需要遵循之前计算出的轨迹的剩余部分,确保时间一致性。

  • 路径对比
    图中展示了两条不同时间步长下的轨迹规划( ( Δ T a ) ( \Delta T_a ) (ΔTa) 和 ( Δ T b ) \Delta T_b ) ΔTb) )。这反映了在不同的时间尺度上,基于贝尔曼最优原理规划出的路径,如何在每个阶段选择最优的路径。
    image.png

符合Bellman最优性 --> 解决最优控制问题

image.png

2.5 高速轨迹采样——横向

高速——横向运动相比于纵向运动相对幅度非常小,近似横纵向解耦,横纵向可独立计算。

image.png
image.png

2.6 高速轨迹采样——纵向

image.png
image.png
image.png

2.7 低速轨迹规划——横向

低速——横向运动和纵向运动可比,而车辆有运动学约束,横纵向解耦会忽略运动学约束。

沿 S 采样。

image.png

横纵向采样轨迹结合以及代价评估

高速:横纵向解耦 s ( t ) / d ( t ) s(t)/d(t) s(t)/d(t)

低速:耦合 s ( t ) d ( s ) s(t)d(s) s(t)d(s)

如何确保曲率符合要求: 大曲率要额外反投。 高低速、大小曲率。

image.png

2.8 总结

整体流程:

image.png

简单示例:

image.png

相关参考材料:

  • https://zhuanlan.zhihu.com/p/514864431

  • https://xueshu.baidu.com/usercenter/paper/show?paperid=14ec16ebb0e97cb89598c0aaef9f76d4&site=xueshu_se&hitarticle=1

  • https://blog.csdn.net/sinat_52032317/article/details/132924715?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-132924715-blog-118462640.235%5Ev43%5Epc_blog_bottom_relevance_base6&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-132924715-blog-118462640.235%5Ev43%5Epc_blog_bottom_relevance_base6&utm_relevant_index=2

3. 基于优化的路径规划

3.1 以百度Apollo EM planner为例

image.png
整体框架:

image.png

3.2 M-Step DP Path

路径:如何在 S L 坐标系下生成一条path,且满足一定的约束。

image.png

以向下绕行为例:

image.png

如果决策可以判断需要向下绕行 --> 可得到避障的上下界, Lower bound ≤ L(s) ≤ Upper bound --> Cost(f)

按照其他cost function 优化求解轨迹。

避障问题 --> 导致非凸 --> DP --> 初始解 --> QP 求解

避障问题 --> 如果可得到避障的上下界 --> 改为 cost function --> QP 求解

image.png

image.png

M-Step QP Path ——修正DP的path

image.png
image.png

对自车碰撞处理,自车前角点做映射。当 θ \theta θ 很小时,近似等于 s i n ( θ ) sin(\theta) sin(θ) , 再近似角度的抬高距离,f’(s)。

image.png
纵向 非凸,可加速、减速。一般需要用DP搜索,克服非凸性。
image.png

3.3 M-Step DP Speed Optimizerp

image.png
image.png

M-Step QP Speed Optimizer ——使得DP生成的分段线性速度初值满足动态要求

image.png
image.png
image.png

总结
DP+QP

  • DP:生成粗解和凸空间
  • QP:在凸空间求解
  • 缺点:窄道会车场景

EM planner 参考:
https://arxiv.org/pdf/1807.08048.pdf
https://gitcode.com/ApolloAuto/apollo/tree/master/modules/planning?utm_source=csdn_github_accelerator&isLogin=1
https://blog.csdn.net/qq_39805362/article/details/128850317
https://blog.csdn.net/qq_41667348/article/details/125708616

相关文章:

【笔记】自动驾驶预测与决策规划_Part3_路径与轨迹规划

文章目录 0. 前言1. 基于搜索的路径规划1.1 A* 算法1.2 Hybrid A* 算法 2. 基于采样的路径规划2.1 Frent Frame方法2.2 Cartesian →Frent 1D ( x , y ) (x, y) (x,y) —> ( s , l ) (s, l) (s,l)2.3 Cartesian →Frent 3D2.4 贝尔曼Bellman最优性原理2.5 高速轨迹采样——…...

Shiro-721—漏洞分析(CVE-2019-12422)

文章目录 Padding Oracle Attack 原理PKCS5填充怎么爆破攻击 漏洞原理源码分析漏洞复现 本文基于shiro550漏洞基础上分析&#xff0c;建议先看上期内容&#xff1a; https://blog.csdn.net/weixin_60521036/article/details/142373353 Padding Oracle Attack 原理 网上看了很多…...

【Python语言初识(一)】

一、python简史 1.1、python的历史 1989年圣诞节&#xff1a;Guido von Rossum开始写Python语言的编译器。1991年2月&#xff1a;第一个Python编译器&#xff08;同时也是解释器&#xff09;诞生&#xff0c;它是用C语言实现的&#xff08;后面&#xff09;&#xff0c;可以调…...

Python 中的方法解析顺序(MRO)

在 Python 中&#xff0c;MRO&#xff08;Method Resolution Order&#xff0c;方法解析顺序&#xff09;是指类继承体系中&#xff0c;Python 如何确定在调用方法时的解析顺序。MRO 决定了在多继承环境下&#xff0c;Python 如何寻找方法或属性&#xff0c;即它会根据一定规则…...

MySQL表的内外连接

内连接 其实就是from 两个表 把笛卡尔积的表 再用where 进行条件筛选 ——之前我们写的多表查询就是内连接 基本格式&#xff1a; 外链接 没有向内连接那样真的把两个表连接形式一个表显示&#xff0c;而只是建立关系 外连接分为左链接和右链接 左链接 联合查询时候&#…...

系统架构设计师:软件架构的演化和维护

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师:软件架构的演化和维护前言软件架构演化的重要性面向对象的软件架构演…...

QT的dropEvent函数进入不了

在使用QT想实现拖拽功能的时候&#xff0c;发现了dropEvent没有调用运行&#xff0c;遂查找原因&#xff1a; 首先是网上都说要在dragEnterEvent里面使用event->accept(); 但我这边在出现问题之前就已经这样做了&#xff1a; void CanvasView::dragEnterEvent(QDragEnterEv…...

Spring Boot 入门

前言 Spring Boot 是一个开源的 Java 基础框架&#xff0c;用于创建独立、生产级的基于 Spring 的应用程序。它简化了基于 Spring 的应用开发&#xff0c;通过提供一系列的“起步依赖”来快速启动和运行 Spring 应用。本文将带你深入了解 Spring Boot 的核心概念、关键特性&am…...

LDD学习2--Scull(TODO)

《Linux Device Drivers》&#xff08;LDD&#xff09;书籍中的 scull&#xff08;Simple Character Utility for Loading Localities&#xff09;是一个用于演示 Linux 字符设备驱动程序编写的示例代码。它为理解 Linux 内核模块和字符设备驱动程序的编写提供了基础实践平台&a…...

【算法-堆排序】

堆排序是一种基于堆这种数据结构的比较排序算法&#xff0c;它是一种原地、不稳定的排序算法&#xff0c;时间复杂度为 O(n log n)。堆排序的基本思想是将数组构建成一个二叉堆&#xff0c;并通过反复调整堆顶和未排序部分之间的关系来实现排序。 堆的定义 堆是一种特殊的完全…...

音视频入门基础:AAC专题(4)——ADTS格式的AAC裸流实例分析

音视频入门基础&#xff1a;AAC专题系列文章&#xff1a; 音视频入门基础&#xff1a;AAC专题&#xff08;1&#xff09;——AAC官方文档下载 音视频入门基础&#xff1a;AAC专题&#xff08;2&#xff09;——使用FFmpeg命令生成AAC裸流文件 音视频入门基础&#xff1a;AAC…...

【第33章】Spring Cloud之SkyWalking服务链路追踪

文章目录 前言一、介绍1. 架构图2. SkyWalking APM 二、服务端和控制台1. 下载2. 解压3. 初始化数据库4. 增加驱动5. 修改后端配置6. 启动7. 访问控制台8. 数据库表 三、客户端1. 下载2. 设置java代理3. idea配置3.1 环境变量3.2 JVM参数3.3 启动日志 4. 启用网关插件 四、链路…...

如何选择OS--Linux不同Distribution的选用

写在前言&#xff1a; 刚写了Windows PC的不同editions的选用&#xff0c;趁热&#xff0c;把Linux不同的Distribution选用也介绍下&#xff0c;希望童鞋们可以了解-->理解-->深入了解-->深入理解--...以致于能掌握特定版本的Linux的使用甚者精通。……^.^…… so&a…...

cesium效果不酷炫怎么办--增加渲染器

DrawCommand 可以发挥 WebGL 全部潜力吗&#xff1f; 回答&#xff1a; Cesium 的 DrawCommand 是一个用于表示 WebGL 渲染管线中单个绘制调用的低级抽象。它封装了执行 WebGL 绘制所需的所有信息&#xff0c;包括着色器程序、顶点数组、渲染状态、统一变量&#xff08;unifo…...

计算机网络:概述 --- 体系结构

目录 一. 体系结构总览 1.1 OSI七层协议体系结构 1.2 TCP/IP四层(或五层)模型结构 二. 数据传输过程 2.1 同网段传输 2.2 跨网段传输 三. 体系结构相关概念 3.1 实体 3.2 协议 3.3 服务 这里我们专门来讲一下计算机网络中的体系结构。其实我们之前…...

DEPLOT: One-shot visual language reasoning by plot-to-table translation论文阅读

文章链接&#xff1a;https://arxiv.org/abs/2308.01979http://arxiv.org/abs/2212.10505https://arxiv.org/abs/2308.01979 源码链接&#xff1a;https://github.com/cse-ai-lab/RealCQA 启发&#xff1a;two-stage方法可能是未来主要研究方向&#xff0c;能够增强模型可解释…...

从 HDFS 迁移到 MinIO 企业对象存储

云原生、面向 Kubernetes 、基于微服务的架构推动了对 MinIO 等网络存储的需求。在云原生环境中&#xff0c;对象存储的优势很多 - 它允许独立于存储硬件对计算硬件进行弹性扩展。它使应用程序无状态&#xff0c;因为状态是通过网络存储的&#xff0c;并且通过降低操作复杂性&a…...

Rust 常见问题汇总

问题1&#xff1a; cargo build 一直提示Blocking waiting for file lock on package cache。 在 cargo.toml 文件中添加了依赖之后&#xff0c;运行 cargo build 命令时&#xff0c;如果卡在 blocking waiting for file lock on package cache lock 这里&#xff0c; 后来发…...

java泛型类与泛型方法

Java泛型类和泛型方法是Java泛型编程中的重要组成部分。它们允许开发者编写类型安全且高度复用的代码。下面详细介绍泛型类和泛型方法的概念、用法和示例。 泛型类 泛型类是在类定义中使用类型参数的类&#xff0c;可以指定具体的类型实例化该类。这样可以确保类型安全&#…...

Android String资源文件中,空格、换行以及特殊字符如何表示

空格&#xff1a; 例&#xff1a;<string name"test">test test</string> 换行&#xff1a;\n 例&#xff1a;<string name"test">test \n test</string> tab&#xff1a;\t …...

CUDA及GPU学习资源汇总

CUDA C Programming Guide 的中文翻译版GPU中的SM和warp的关系推荐几个不错的CUDA入门教程CUDA编程入门极简教程...

uniapp vue3 梯形选项卡组件

实现的效果图&#xff1a; 切换选项卡显示不同的内容&#xff0c;把这个选项卡做成了一个组件&#xff0c;需要的自取。 // 组件名为 trapezoidalTab <template> <view class"pd24"><view class"nav"><!-- 左侧 --><view cla…...

如何在微信小程序中实现WebSocket连接

微信小程序作为一种全新的应用形态&#xff0c;凭借其便捷性、易用性受到了广大用户的喜爱。在实际开发过程中&#xff0c;实时通信功能是很多小程序必备的需求。WebSocket作为一种在单个TCP连接上进行全双工通信的协议&#xff0c;能够实现客户端与服务器之间的实时通信。本文…...

二级等保测评中安全物理环境的重要性及高危项分析

当今数字化时代&#xff0c;信息安全至关重要。网络安全等级保护测评是确保信息系统安全稳定运行的重要手段之一&#xff0c;其中二级等保测评对于许多企业和组织来说是必须要达到的安全标准。 而安全物理环境作为等保测评的重要组成部分&#xff0c;其重要性不容忽视。 安全物…...

C++11——lambda

lambda lambda的介绍lambda的使用lambda的细节->捕捉列表 lambda的介绍 lambda是匿名函数&#xff0c;再适合的场景去使用可以提高代码的可读性。 场景&#xff1a; 假设有一个Goods类需要进行按照价格、数量排序 class Goods {string name;size_t _price;//价格int num;/…...

Dubbo3序列化安全问题

序列化安全 在 Dubbo 3.0 中&#xff0c;序列化协议的安全性得到了加强。 1. 序列化安全性升级 Triple 协议: 推荐使用 Triple 协议 的非 Wrapper 模式&#xff0c;该模式在安全性上更为严格。需要开发人员编写 IDL&#xff08;接口描述语言&#xff09;文件&#xff0c;这虽…...

秒懂Linux之共享内存

目录 共享内存概念 模拟实现共享内存 创建key阶段 ​编辑创建共享内存阶段 删除共享内存阶段 查看共享内存属性阶段 挂接共享内存到进程阶段 取消共享内存与进程挂接阶段 进程通信阶段 添加管道改进版 共享内存函数 shmget函数 shmat函数 shmdt函数 shmctl函数 共享内存概念 共…...

【计算机网络】网络层协议解析

网络层的两种服务IPv4分类编址划分子网无分类地址 IPv4地址应用IP数据报的发送和转发过程主机发送IP数据报路由器转发IP数据报 IPv4数据报首部格式ICMP网际控制报文协议虚拟专用网VPN与网络地址转换NAT 网络层主要任务是实现网络互连&#xff0c;进而实现数据包在各网络之间的传…...

sqlist void reverse(SqList A)

#include <stdlib.h> #include <stdio.h> #include <iostream> using namespace std; #define INIT_SIZE 5 #define INCREMENT 10 # define OK 1 # define ERROR 0/* 定义ElemType为int类型 */ typedef int ElemType; void input(ElemType &s); void out…...

聊聊Thread Local Storage

聊聊ThreadLocal 为什么需要Thread Local StorageThread Local Storage的实现PThread库实现操作系统实现GCC __thread关键字实现C11 thread_local实现JAVA ThreadLocal实现 Thread Local Storage 线程局部存储&#xff0c;简称TLS。 为什么需要Thread Local Storage 变量分为全…...