Fast Planner规划算法(三)—— Fast Planner后端之轨迹优化与轨迹优化与时间重分配

news2024/12/26 2:34:09

   本系列文章用于学习记录Fast-Planner规划算法的相关内容,主要学习资料是深蓝学院的移动机器人运动规划课程

   三、Fast Planner后端之轨迹优化

   在上一篇文章中,我们给出了 Fast Planner中的B样条曲线的表达式,在给定时间区间后,唯一的变量就是控制点的位置

   p ( s ( u ) ) = s ( u ) T M 4 q m s ( u ) = [ 1 s ( u ) s 2 ( u ) s 3 ( u ) ] T q m = [ Q m − 3 Q m − 2 Q m − 1 Q m ] T s ( u ) = ( u − u m ) / Δ u M 4 = 1 3 ! [ 1 4 0 0 − 3 0 3 0 3 − 6 3 0 − 1 3 − 3 1 ] \begin{aligned}\mathbf{p}\big(s(u)\big)&=\mathbf{s}(u)^\mathrm{T}\mathbf{M}_4\mathbf{q}_m\\\mathbf{s}(u)&=[1\quad s(u)\quad s^2(u)\quad s^3(u)]^\mathrm{T}\\\mathbf{q}_m&=[\mathbf{Q}_{m-3}\quad\mathbf{Q}_{m-2}\quad\mathbf{Q}_{m-1}\quad\mathbf{Q}_{m}]^\mathrm{T}\\\mathbf{s}(u)&=(u-u_m)/\Delta u\end{aligned}\quad\mathbf{M}_4=\dfrac{1}{3!}\begin{bmatrix}1&4&0&0\\-3&0&3&0\\3&-6&3&0\\-1&3&-3&1\end{bmatrix} p(s(u))s(u)qms(u)=s(u)TM4qm=[1s(u)s2(u)s3(u)]T=[Qm3Qm2Qm1Qm]T=(uum)uM4=3!1 1331406303330001

   接下来介绍如何构建优化问题来得到满足各种约束的轨迹,需要注意的是两端的控制点,即起点和目标点是固定的,在考虑到一些求导及特性,我们仅选取中间部分的N+1-2 p b p_b pb个控制点,即 { Q p b , Q p b + 1 , … , Q N − p b } \{\mathbf{Q}_{p_b},\mathbf{Q}_{p_b+1},\ldots,\mathbf{Q}_{N-p_b}\} {Qpb,Qpb+1,,QNpb}作为优化变量

   目标函数由三部分组成,对应的期望轨迹是顺滑的,期望轨迹是无碰撞的,期望轨迹的速度和加速度是有上限的。即

   f t o t a l = λ 1 f s + λ 2 f c + λ 3 ( f v + f a ) f_{total}=\lambda_{1}f_{s}+\lambda_{2}f_{c}+\lambda_{3}(f_{v}+f_{a}) ftotal=λ1fs+λ2fc+λ3(fv+fa)

   我们想要得到就是使上面 f t o t a l f_{total} ftotal极小的一系列控制点的位置x

在这里插入图片描述

   接下来,我们依次来具体看一下构成目标函数的三部分内容的具体函数表达式,首先是期望轨迹顺滑的项 f s f_s fs

   Fast Planner中通过捕获轨迹的几何信息并且不依赖于时间分配的函数来定义平滑成本 f s f_s fs,如下式所示,原因是优化后的时间分配可能会有所调整,这与许多使用snap或jerk的平方的积分作为平滑成本的方法不同

   f s = ∑ i = p b − 1 N − p b + 1 ∥ ( Q i + 1 − Q i ) + ( Q i − 1 − Q i ) ∥ 2 f_s=\sum_{i=p_b-1}^{N-p_b+1}\|(\mathbf{Q}_{i+1}-\mathbf{Q}_i)+(\mathbf{Q}_{i-1}-\mathbf{Q}_i)\|^2 fs=i=pb1Npb+1(Qi+1Qi)+(Qi1Qi)2

   上式代表的几何意义是想要使得与线段的距离尽可能的小,即让下图中红色的线段尽可能的短,极端情况下就是所有的控制点在由起点和目标点构成的直线上,如下图所示

在这里插入图片描述

   在优化时,需要计算 f s f_s fs的梯度,即 ∂ ∥ ( Q i + 1 − Q i ) + ( Q i − 1 − Q i ) ∥ 2 ∂ Q i \frac{\partial\|(\mathbf{Q}_{i+1}-\mathbf{Q}_i)+(\mathbf{Q}_{i-1}-\mathbf{Q}_i)\|^2}{\partial\mathbf{Q}_i} Qi(Qi+1Qi)+(Qi1Qi)2


   我们接着看期望轨迹的速度和加速度是有上限的代价项 f v + f a f_v+f_a fv+fa的具体表达式,我们可以规定在每一维上( μ ∈ { x , y , z } \mu\in\{x,y,z\} μ{x,y,z}),若加速度或速度的平方小于设定的最大值的平方时,该项代价值为0,大于设定的最大值的平方时为 ( a μ 2 − a m a x 2 ) 2 \left({a_{\mu}}^{2}-{a_{max}}^{2}\right)^{2} (aμ2amax2)2 ( v μ 2 − v m a x 2 ) 2 \left(v_{\mu}{}^{2}-v_{max}{}^{2}\right)^{2} (vμ2vmax2)2,如下所示:

   F ν ( v μ ) = { ( v μ 2 − v m a x 2 ) 2 v μ 2 > v m a x 2 0 v μ 2 ≤ v m a x 2 F_{\nu}(v_{\mu})=\left\{\begin{matrix}\left(v_{\mu}{}^{2}-v_{max}{}^{2}\right)^{2}&v_{\mu}{}^{2}>v_{max}{}^{2}\\0&v_{\mu}{}^{2}\leq v_{max}{}^{2}\end{matrix}\right. Fν(vμ)={(vμ2vmax2)20vμ2>vmax2vμ2vmax2

   F a ( a μ ) = { ( a μ 2 − a m a x 2 ) 2 a μ 2 > a m a x 2 0 a μ 2 ≤ a m a x 2 F_{a}(a_{\mu})=\left\{\begin{matrix}\left(a_{\mu}{}^{2}-a_{max}{}^{2}\right)^{2}&a_{\mu}{}^{2}>a_{max}{}^{2}\\0&a_{\mu}{}^{2}\leq a_{max}{}^{2}\end{matrix}\right. Fa(aμ)={(aμ2amax2)20aμ2>amax2aμ2amax2

在这里插入图片描述

   但是对于一条轨迹而言,检查每一时刻的速度和加速度是比较麻烦的事情,所以,我们对三阶B样条轨迹求导,借助得到的二阶B样条,也就是速度轨迹,利用B样条的凸包性,只需要让顶点处的速度小于最大值,速度轨迹上所有点的速度就均小于最大值,同理,B样条轨迹求二次导,得到一阶的加速度轨迹,同样只需保证顶点处的加速度小于设定的最大值,则整条轨迹的加速度都小于最大值。所以代价函数可以写为下式,即只把速度轨迹、加速度轨迹的各个顶点(控制点),分别代入到上面给出的表达式,然后求和即可,如下式所示:

   f v = ∑ μ ∈ ∑ i = p b − 1 N − p b F v ( ( V i ) μ ) , f a = ∑ μ ∈ ∑ i = p b − 2 N − p b F a ( ( A i ) μ ) f_{v}=\sum_{\substack{\mu\in}}\sum_{\substack{i=p_{b}-1}}^{N-p_{b}}F_{v}\left((\mathbf{V}_{i})_{\mu}\right),\quad f_{a}=\sum_{\substack{\mu\in}}\sum_{\substack{i=p_{b}-2}}^{N-p_{b}}F_{a}\left((\mathbf{A}_{i})_{\mu}\right) fv=μi=pb1NpbFv((Vi)μ),fa=μi=pb2NpbFa((Ai)μ)

在这里插入图片描述

   它的梯度也比较容易求,如下式所示:

   V i = 1 Δ t ( Q i + 1 − Q i ) A i = 1 Δ t ( V i + 1 − V i ) ∂ F v ( ( V i ) μ ) ∂ Q i = ∂ F v ( ( V i ) μ ) ∂ V i ∂ V i ∂ Q i \begin{aligned} &\mathbf{V}_{i}={\frac{1}{\Delta t}}(\mathbf{Q}_{i+1}-\mathbf{Q}_{i})\quad\mathbf{A}_{i}={\frac{1}{\Delta t}}(\mathbf{V}_{i+1}-\mathbf{V}_{i}) \\ &\frac{\partial F_{v}\left((\mathbf{V}_{i})_{\mu}\right)}{\partial\mathbf{Q}_{i}}=\frac{\partial F_{v}\left((\mathbf{V}_{i})_{\mu}\right)}{\partial\mathbf{V}_{i}}\frac{\partial\mathbf{V}_{i}}{\partial\mathbf{Q}_{i}} \end{aligned} Vi=Δt1(Qi+1Qi)Ai=Δt1(Vi+1Vi)QiFv((Vi)μ)=ViFv((Vi)μ)QiVi


  

   最后,我们来看期望轨迹是无碰撞的代价项 f c f_c fc的具体表达式,Fast Planner中的碰撞成本被公式化为作用在每个控制点上的障碍物的排斥力,前面我们已经得到无碰撞的约束表达式 d c > 0 , r j , j + 1 < d c 3 , ( j ∈ { 1 , 2 , 3 } ) d_{c}>0,r_{j,j+1}<\frac{d_{c}}{3},(j\in\{1,2,3\}) dc>0,rj,j+1<3dc,(j{1,2,3}),它可以写成下式所示的形式

   f c = ∑ i = p b N − p b F c ( d ( Q i ) ) F c ( d ( Q i ) ) = { ( d ( Q i ) − d t h r ) 2 d ( Q i ) ≥ d t h r 0 d ( Q i ) < d t h r f_c=\sum_{i=p_b}^{N-p_b}F_c(d(\mathbf{Q}_i))\\\\F_c\big(d(\mathbf{Q}_i)\big)=\begin{cases}(d(\mathbf{Q}_i)-d_{thr})^2&d(\mathbf{Q}_i)\geq d_{thr}\\0&d(\mathbf{Q}_i)<d_{thr}\end{cases} fc=i=pbNpbFc(d(Qi))Fc(d(Qi))={(d(Qi)dthr)20d(Qi)dthrd(Qi)<dthr

   其中, d ( Q i ) d(Q_i) d(Qi)表示 Q i Q_i Qi到他最近的障碍物的距离,上式给出了顶点与障碍物的距离约束,我们还需要满足 r j , j + 1 < d c 3 , ( j ∈ { 1 , 2 , 3 } ) r_{j,j+1}<\frac{d_c}3,(j\in\{1,2,3\}) rj,j+1<3dc,(j{1,2,3})这个条件,其实这个条件是否满足完全取决于我们在构造B样条的时候,如何进行参数化,如果控制点取的密一些,时间间隔短一些,这个条件就很容易满足了,比如当 r j , j + 1 < 0.2 r_{j,j+1}<0.2 rj,j+1<0.2时,在大多数情况下都是满足这个条件的,所以在优化时,不必太关心这个条件。

   那么如何获得 Q i Q_i Qi到他最近的障碍物的距离 d ( Q i ) d(Q_i) d(Qi)呢?

   这就涉及到地图的表示方式了,在Fast Planner中采用ESDF来对地图进行表示,他是一种特殊的栅格地图,每个栅格中存放的是该栅格距离他最近的障碍物的距离,如下图所示,颜色越浅,表示与障碍物的距离越远,这种特殊的栅格地图比较容易求出它的梯度。ESDF其实也可以理解成一种距离场。

在这里插入图片描述
在这里插入图片描述


   有了目标函数各个组成部分的具体表达式,总的目标函数的表达式也就知道了,然后使用优化算法的求解器,就可以求解该优化问题了,得到使得目标函数值最小的那个控制点的位置x。


   四、Fast Planner后端之时间重分配

   当环境中障碍物比较多时,可能出现远离障碍物与满足动力学约束相违背的情况,如下图所示的情况,我们最初认为从起点到终点可以拉一条直线过去,因此,分配的时间比较少,但是由于障碍物的存在,在远离障碍物的约束下,轨迹被向上拉,拉成了比较长的曲线,这样控制点之间的距离就变大了,如果维持原有的分配时间的话,速度及加速度可能会超出限制。所以,我们先将远离障碍物项的权重给的大一些,生成一条无碰撞轨迹,然后再对时间进行重分配来使得速度及加速度满足约束。

在这里插入图片描述


   Fast Planner中是通过非均匀B样条来进行时间重分配的,由均匀B样条的表达式来推非均匀B样条的表达式,只需要将固定的时间差△t换成 t i + p + 1 − t i + 1 t_{i+p+1}-t_{i+1} ti+p+1ti+1就行了,非均匀B样条的一阶和二阶导数形式如下式所示:

   C ( ˙ t ) = ∑ i = 0 n − 1 N i + 1 , p − 1 ( t ) V i V i = p ( Q i + 1 − Q i ) t i + p + 1 − t i + 1 C ( t ¨ ) = ∑ i = 0 n − 2 N i + 2 , p − 2 ( t ) A i A i = ( p − 1 ) ( V i + 1 − V i ) t i + p + 1 − t i + 2 \mathbf{C}\dot (t)=\sum_{i=0}^{n-1}N_{i+1,p-1}(t)\mathbf{V}_i\quad\mathbf{V}_i=\frac{p(\mathbf{Q}_{i+1}-\mathbf{Q}_i)}{t_{i+p+1}-t_{i+1}}\quad\mathbf{C}(\ddot{t})=\sum_{i=0}^{n-2}N_{i+2,p-2}(t)\mathbf{A}_i\quad\mathbf{A}_i=\frac{(p-1)(\mathbf{V}_{i+1}-\mathbf{V}_i)}{t_{i+p+1}-t_{i+2}} C(˙t)=i=0n1Ni+1,p1(t)ViVi=ti+p+1ti+1p(Qi+1Qi)C(t¨)=i=0n2Ni+2,p2(t)AiAi=ti+p+1ti+2(p1)(Vi+1Vi)

   只改变时间分配,不改变控制点的位置,生成轨迹的几何情况是不会发生变化的

在这里插入图片描述

   我们对速度和加速度进行检查其是否超出了限制,以速度为例,由 V i = p ( Q i + 1 − Q i ) t i + p + 1 − t i + 1 \mathbf{V}_i=\frac{p(\mathbf{Q}_{i+1}-\mathbf{Q}_i)}{t_{i+p+1}-t_{i+1}} Vi=ti+p+1ti+1p(Qi+1Qi),可获得速度控制点,然后找出速度超出限制的速度控制点,将它们中速度最大的那个速度控制点记为 V i , μ ′ V_{i,\mu}^{\prime} Vi,μ,其速度的绝对值记为 v m v_m vm,若其对应的时间区间为 ( t ^ i + p + 1 − t ^ i + 1 ) (\hat{t}_{i+p+1}-\hat{t}_{i+1}) (t^i+p+1t^i+1),则将其增大为 μ ν ( t i + p + 1 − t i + 1 ) \color{red}{\mu_\nu(t_{i+p+1}-t_{i+1})} μν(ti+p+1ti+1),其中 μ v = v m v m a x \mu_{v}=\frac{v_{m}}{v_{max}} μv=vmaxvm,这样该速度控制点的速度就可降为 v m a x v_{max} vmax,满足约束。

在这里插入图片描述

   同理,我们可以对加速度控制点进行检查, A i = ( p − 1 ) ( V i + 1 − V i ) t i + p + 1 − t i + 2 \mathbf{A}_{i}=\frac{(p-1)(\mathbf{V}_{i+1}-\mathbf{V}_{i})}{t_{i+p+1}-t_{i+2}} Ai=ti+p+1ti+2(p1)(Vi+1Vi),找出加速度超出限制的加速度控制点,将它们中加速度最大的那个速度控制点记为 A i , μ ′ A_{i,\mu}^{\prime} Ai,μ,其速度的绝对值记为 a m a_m am,所不同的是加速度控制点受两个速度控制点的影响,每个速度控制点都对应一个时间区间,所以加速度控制点受影响的时间范围更大一些,为 ( t i + p + 2 − t i + 1 ) (t_{i+p+2}-t_{i+1}) (ti+p+2ti+1),同样对超出约束的加速度控制点对应的时间区间进行扩大,即将 ( t i + p + 2 − t i + 1 ) (t_{i+p+2}-t_{i+1}) (ti+p+2ti+1)中每个小区间都进行扩大,如下所示:

   Δ t m = t m + 1 − t m  →  Δ t ^ m = μ a Δ t m \Delta t_m=t_{m+1}-t_m\text{ → }\Delta\hat{t}_m=\mu_a\Delta t_m Δtm=tm+1tm → Δt^m=μaΔtm

   其中, m ∈ { i + 1 , i + 2 , . . . , i + p + 1 } m\in\{i+1,i+2,...,i+p+1\} m{i+1,i+2,...,i+p+1} μ a = ( a m a m a x ) 0.5 \mu_{a}=\left(\frac{a_{m}}{a_{max}}\right)^{0.5} μa=(amaxam)0.5

在这里插入图片描述


   可以发现每个速度控制点、加速度控制点都会影响好几个小区间,若将超限的速度或加速度控制点对应的每个小区间的时间都进行增大,可能会使得整条轨迹的速度变得比较慢,所以在Fast Planner中是采用迭代的方式进行时间扩展的

   在每次迭代时,都会去找超出约束的速度、加速度控制点,然后仅仅对超出约束最大的那个速度、加速度控制点对应的时间区间进行扩大,而且扩大的系数进行了抑制,扩大系数分别选为 min ⁡ { α v , v m v m a x } \min\{\alpha_{v},\frac{v_{m}}{v_{max}}\} min{αv,vmaxvm} min ⁡ { α a , ( a m a m a x ) 1 2 } \min\{\alpha_{a},\big(\frac{a_{m}}{a_{max}}\big)^{\frac{1}{2}}\big\} min{αa,(amaxam)21},其中, α v \alpha_{v} αv α a \alpha_{a} αa都是比1稍微大一点的数,然后循环迭代以上流程,直至所有的速度、加速度控制点都满足约束。

  

在这里插入图片描述


   Fast Planner规划的框架及演示如下:

在这里插入图片描述

在这里插入图片描述


   参考资料:

   1、深蓝学院-移动机器人运动规划


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

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

相关文章

【从零开始一步步学习VSOA开发】订阅发布变速器

订阅发布变速器 概念 在许多场景中&#xff0c;我们需要控制发布频率。例如&#xff0c;一个 UI 界面不能过快的接收处理信息&#xff0c;而此时发布者的发布频率又非常快。在这种场景下&#xff0c;我们需要改变发布的频率。 使用 VSOA Regulator 可以解决这个问题&#xff…

Kafka + Kraft 集群搭建教程,附详细配置及自动化安装脚本

本文主要介绍 kafka kraft 搭建过程&#xff0c;主要用途是为了日志采集&#xff0c;所以搭建相对比较简单暴力&#xff0c;不过也可以作为一个参考供大家学习&#xff0c;主打一个能用管跑&#xff08;调优啊&#xff0c;参数解释啊&#xff0c;原理啊&#xff0c;太枯燥了&a…

其实PMP考试真的不需要焦虑

在考PMP之前&#xff0c;觉得报名费好贵很可怕&#xff0c;很怕自己考不过然后3900打水漂~然后我自己慢慢悠悠跟着老师安排来&#xff0c;2个月就上岸啦~担心真的是多余的&#xff01; 问了一下培训班的小伙伴&#xff0c;好像都过了。听说PMP在国内的通过率高达90%不知道真假…

高频焊机电源模型建立及谐波分析

1、仿真建模工具 本文的仿真建模工具软件采用MATLAB7.0&#xff0c;即目前工程领域最为流行的软件。MATLAB把计算、可视化、程序设计融入到了一个交互的工作环境中&#xff0c;已经成为电力系统仿真、自动控制理论、数字信号处理、图像处理等领域的常用工具软件。MATLAB中的SIM…

解锁数据“智能”背后的秘密

在这个被数据洪流包围的时代&#xff0c;每一秒都有无数的信息在生成、传递、分析。但你是否曾好奇&#xff0c;这些数据是如何从简单的数字、文字转化为推动社会进步、改变生活方式的“智能”力量的&#xff1f;今天&#xff0c;就让我们一起揭开数据“智能”背后的神秘面纱&a…

在Excel中启用宏 (~ ̄▽ ̄)~

一、启用宏 打开任意Excel&#xff0c;点击屏幕左上角的文件选项&#xff0c;然后选择Excel选项窗口。在Excel选项窗口中&#xff0c;选择信任中心按钮&#xff1b;在信任中心设置窗口中&#xff0c;选择宏设置&#xff0c;启用所有宏&#xff08;不推荐&#xff0c;潜在风险&a…

鸿蒙OS开发使用Canvas组件绘制天气曲线图

参考下文&#xff1a; 鸿蒙征文 | 使用Canvas组件绘制天气曲线图_harmonyos_鸑鷟407-HarmonyOS开发者社区效果图&#xff1a; 原理 使用贝塞尔曲线 首先可以了解一下贝塞尔曲线。 如果看不懂也没关系&#xff0c;这里会直接讲绘制曲线的步骤。 使用CanvasRenderingContext2D对象…

VS code初学笔记

一、调试 1.1添加查看全部数组元素 监视->*(type(*)[number])begin 其中type表示类型int、char等。number表示要查看的数量。begin是起始地址指针&#xff0c;即数组名。

github使用gh-pages部署vue静态网站(简单易懂)

github使用gh-pages部署vue静态网站 当我们想把自己的网站部署到一个静态网站上&#xff0c;Github Pages是一个很好的选择&#xff08;稳定、可靠、不花钱&#xff09; 假设你已经有一个项目并且已经发布到github上了&#xff0c;先把项目git clone到本地 &#xff0c;接着在…

第二季度云计算市场份额榜单:微软下滑,谷歌上升,AWS仍保持领先

2024 年第二季度&#xff0c;随着企业云支出达到 790 亿美元的新高&#xff0c;三大云计算巨头微软、谷歌云和 AWS的全球云市场份额发生了变化。 根据新的市场数据&#xff0c;以下是 2024 年第二季度全球云市场份额结果和六大世界领先者&#xff0c;其中包括 AWS、阿里巴巴、…

条形码与二维码报表

概述 条形码与二维码&#xff1a;演示条形码与二维码&#xff0c;条形码数据将来自于关联的字段值。支持各种常用的条形码与二维码。 应用场景 如下图所示&#xff0c;简单展示数据 示例说明 数据准备 在数据面板中添加数据集&#xff0c;可选择Json数据集和API服务数据…

​全国大学分布SHP数据分享

数据是GIS的血液&#xff01; 我们在《全国地铁路线及站点SHP数据》一文中&#xff0c;为你分享过全国地铁路线及站点数据。 现在再为你分享全国大学信息分布SHP数据&#xff0c;你可以在文末查看该数据的领取方法。 全国大学分布数据 据不完全统计至2024年6月20日&#xf…

护眼落地灯十大品牌排名:2024十大值得入手的护眼落地灯盘点

2024十大值得入手的护眼落地灯是哪款&#xff1f;随着生活水平的提高&#xff0c;许多家长在关心孩子身心健康的同时也关注着孩子的视力健康&#xff0c;很多家长了解到光线对孩子视力的影响&#xff0c;都纷纷给孩子准备护眼大路灯&#xff0c;但是面对市面上众多的护眼大路灯…

Java HotSpot虚拟机中的内存管理手册阅读笔记

显示与自动内存管理 内存管理是计算机编程中的一个重要概念&#xff0c;它涉及到跟踪和控制程序使用内存的方式。内存管理可以分为两种主要类型&#xff1a;显式内存管理和自动内存管理。 显式内存管理 在显式内存管理系统中&#xff0c;程序员必须手动分配和释放内存。这通…

筒射巡飞无人机技术详解

筒射巡飞无人机&#xff08;Launch and Recovery by Tube, LRAT&#xff09;作为一种新型无人机系统&#xff0c;其机体结构设计充分考虑了便携性、隐蔽性及空气动力学效率。该无人机通常采用模块化设计&#xff0c;主体结构紧凑&#xff0c;能够适配于标准发射筒内进行发射与回…

CISP和NISP到底啥区别?网络安全行业考证必知

随着网络攻击的日益频繁和复杂化&#xff0c;信息安全专业人才的需求也随之激增。 在众多信息安全认证中&#xff0c;CISP与NISP尤为受到关注&#xff0c;不少搞安全的朋友应该都对他们有所耳闻。 但在选择认证时&#xff0c;往往又犯了难。 这两个安全认证的差别在哪里&#x…

基于Hadoop的PM2.5分布可视化系统设计

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍引言研究背景国内外研究现状研究目的研究意义 关键技术理论介绍Hadoop相关组件介绍分布式集群介绍 Hadoop集群搭建及数据准备Hadoop全套组件搭建数据集介绍数据预处理 Hadoo的PM2.5…

U盘中毒后文件乱码?数之寻软件助你高效恢复数据

一、U盘中毒与文件乱码的困扰 在数字化时代&#xff0c;U盘作为便携式存储设备&#xff0c;广泛应用于数据传输与备份中。然而&#xff0c;U盘在方便我们生活与工作的同时&#xff0c;也面临着诸多安全风险。其中&#xff0c;U盘“中毒”导致的文件乱码问题尤为常见&#xff0…

NDI导播系统Multiview Pro使用初探

目录 一、软件安装 二、系统启动 三、登录系统 四、开始使用 我一直推崇NDI,这是一项非常好的技术,它实现了全IP的高质量流媒体传输方案,越来越多的专业机构都用上了这项技术。 偶然机遇,发现了一款NDI相关的工具Multiview Pro,让我眼前一亮。 刚开始望文生义,以为就…

css实现两个字和三个字的两端对齐

第一种实现方式&#xff1a; css设置如下&#xff1a; <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <title>两端对齐示例</title> <style>.name {width: 100px;text-align: justify;}.nam…