【控制系统】深入理解反步控制(Backstepping) | 反步法控制器原理与应用实例解析(附Matlab/Simulink仿真实现)

💯 欢迎光临清流君的博客小天地,这里是我分享技术与心得的温馨角落 💯

在这里插入图片描述

🔥 个人主页:【清流君】🔥
📚 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 📚
🌟始终保持好奇心,探索未知可能性🌟

动图描述

文章目录

  • 引言
  • 一、非线性弹簧系统示例
    • 1.1 系统描述
    • 1.2 控制目标
    • 1.3 系统动态方程
    • 1.4 误差函数与控制目标
  • 二、反步控制器设计
    • 2.1 李雅普诺夫函数的应用
    • 2.2 新的误差函数与控制目标
    • 2.3 李雅普诺夫函数的扩展
    • 2.4 控制器增益的设计
    • 2.5 输入表达式推导
  • 三、系统验证
    • 3.1 误差函数的动态方程
    • 3.2 反馈线性化
    • 3.3 状态特征值分析
    • 3.4 系统平衡点稳定性
  • 四、Simulink仿真
    • 4.1 Simulink模型构建
    • 4.2 动态方程实现
    • 4.3 输入信号构建
    • 4.4 期望值子系统设计
    • 4.5 仿真结果分析
      • (1) 单目标值追踪
      • (2) 多目标值追踪
      • (3) 波动与振荡效果测试
      • (4) 综合效果分析
  • 五、Matlab实现
  • 六、总结
  • 参考资料


在这里插入图片描述

引言

  欢迎光临博主的高级控制系统课程系列博客!在这篇文章中,博主将带领大家深入探讨非线性反步控制的奥秘,涵盖了非线性控制器设计的基础知识。

  本篇博客内容可谓干货满满,将迎来一系列复杂的数学推导,细致地从头到尾推导了所有相关公式,并将这些结果在 Simulink 中进行验证,理论与实际完美契合!

  因此,请各位读者准备好纸笔,跟随博主一起开启这场数学与控制理论交织的思维之旅。前方高能预警,让一起挑战自我,享受知识带来的乐趣吧!


一、非线性弹簧系统示例

  先以一个非线性弹簧系统作为控制理论的应用实例开始。

1.1 系统描述

  非线性弹簧系统中,小滑块的质量为 m m m ,弹簧的系数为 α \alpha α,受一个向右的力, F F F 向右的方向为 x x x 正方向,其动态方程可以写成
m x ¨ + α x 3 = F m \ddot { x } + \alpha x ^ { 3 } = F mx¨+αx3=F因为有一个非线性弹簧的力存在,所以是非线性系统。

1.2 控制目标

  通过改变 F F F ,使小滑块儿按照一条指定的轨迹来进行移动。

1.3 系统动态方程

令:

  • F = u F = u F=u 代表输入
  • x 1 = x x_1=x x1=x 代表位移
  • x 2 = x ˙ x_2=\dot x x2=x˙ 代表速度

  目标是令 x 1 x_1 x1 趋向于 x d x_d xd,而这个 d d d 代表了 desired ,就是一条规定的轨迹,这就是目标。

  重新把它整理一下,变成

x ˙ 1 = x ˙ = x 2 x ˙ 2 = x ¨ = − α m x 3 + 1 m u \begin{align} \dot{x}_1&=\dot{x}=x_2 \tag{1}\\ \dot{x}_2&=\ddot{x}=-\frac{\alpha}{m}x^3+\frac{1}{m}u \tag{2} \\ \end{align} x˙1x˙2=x˙=x2=x¨=mαx3+m1u(1)(2)  分析一下这个式子,看到在这里面有一个 u u u ,可以通过改变 u u u ,也就是改变系统的输入来控制 x 2 x_2 x2。而通过控制 x 2 x_2 x2 ,在这个式子当中又可以反向控制 x 1 x_1 x1,这也非常好理解,可以通过作用在滑块上的力 F F F 来控制滑块本身的速度,而这个速度将最终导致滑块所停留的位置改变。

这样的形式叫做链式系统,其实这样的系统在现实当中有很多。比如

  • 空调系统:是通过电扇的转速和加热器的开关来控制向外发出空气的温度,从而最终导致屋内室温的变化。
  • 油门系统:通过踩油门来控制进油量,最终控制汽车的速度。

1.4 误差函数与控制目标

  这时引入误差函数 e e e
e = x 1 d − x 1 (3) e = x _ { 1d } - x _ { 1 } \tag{3} e=x1dx1(3)

  这个情况下目标就发生了改变,希望 e → 0 e\rightarrow0 e0,因为 e e e 等于 0 0 0 的话,就说明 x 1 x_1 x1 是在跟踪 x 1 d x _{1d} x1d 的,而 e e e 随时间变化,可以对 e e e 求导
e ˙ = x ˙ 1 d − x ˙ 1 \dot { e } = \dot x _ { 1 d } - \dot { x } _ { 1 } e˙=x˙1dx˙1
( 2 ) ( 2 ) (2) 式代入,就等于
e ˙ = x ˙ 1 d − x 2 (4) \dot { e } = \dot x _ { 1 d } - { x } _ { 2 }\tag{4} e˙=x˙1dx2(4)

这个式子比较重要,因为目标是让 e e e 趋向于 0 0 0


二、反步控制器设计

2.1 李雅普诺夫函数的应用

  可以寻找一个李亚普诺夫函数 V ( e ) V(e) V(e),使得 V ( e ) V(e) V(e) 是正定的,而 V ˙ ( e ) \dot V(e) V˙(e) 是负定的,这样就可以最终得出来 e e e 趋向于 0 0 0 的结论。

这时不妨设
V 1 = 1 2 e 2 (5) V _ { 1 } = \frac { 1 } { 2 } e ^ { 2 } \tag{5} V1=21e2(5)  就是选取的第一个李雅普诺夫函数,很显然它是正定函数,因为只有在 e e e 等于 0 0 0 时, V 1 V_1 V1 才等于 0 0 0 ,其他时候 V 1 V_1 V1 都是大于 0 0 0
V ˙ 1 = ∂ V 1 ∂ e ⋅ d e d t = e e ˙ = e ( x ˙ 1 d − x 2 ) (6) \dot { V } _ { 1 } = \frac { \partial V _ { 1 } } { \partial e } \cdot \frac { d e } { d t } = e \dot { e } ^ { } = e ( \dot x _ { 1d }- x _ { 2 } )\tag{6} V˙1=eV1dtde=ee˙=e(x˙1dx2)(6)  因为希望 e e e 趋向于 0 0 0 ,自然希望 V ˙ 1 \dot V_1 V˙1 是一个负定的系统,所以就可以利用这一项设计
x ˙ 1 d − x 2 = − k 1 e \dot x _ { 1d }- x _ { 2 } =-k_1e x˙1dx2=k1e其中,控制器增益 k 1 > 0 k_1>0 k1>0

此时
V ˙ 1 = − k 1 e 2 \dot{V}_1=-k_1e^2 V˙1=k1e2很明显是负定函数。

如何实现让它等于 − k 1 e 2 -k_1e^2 k1e2

可以利用 x 2 x_2 x2
x 2 d = x ˙ 1 d + k 1 e (7) x _ { 2 d } = \dot x _ { 1 d} + k _ { 1 } e\tag{7} x2d=x˙1d+k1e(7)其中, x 2 d x_{2d} x2d 就是 x 2 x_2 x2 的期望值,也就是说当 x 2 d = x 2 x_{2d}=x_2 x2d=x2 时, V ˙ 1 = − k 1 e 2 \dot{V}_1=-k_1e^2 V˙1=k1e2

2.2 新的误差函数与控制目标

这时新的目标就产生了,需要令 x 2 → x 2 d x _ { 2 } \rightarrow x _ { 2d } x2x2d 。可以再引入一个误差函数
δ = x 2 d − x 2 (8) \delta = x _ { 2d } - x _ { 2 }\tag{8} δ=x2dx2(8)这时候把 ( 8 ) (8) (8) 式带入到 ( 6 ) (6) (6) 式当中,可以得到新的 V ˙ 1 \dot V_1 V˙1
V ˙ 1 = e ( x ˙ 1 d − ( x 2 d − δ ) ) \dot { V } _ { 1 } = e ( \dot { x } _ { 1d } - ( x _ { 2d } - \delta ) ) V˙1=e(x˙1d(x2dδ))
x 2 d x_{2d} x2d 再代入,把 ( 7 ) (7) (7) 式代入
V ˙ 1 = − k 1 e 2 + e δ (9) \dot { V } _ { 1 } = - k _ { 1 } e ^ { 2 } + e \delta \tag{9} V˙1=k1e2+(9)这时来分析一下 δ \delta δ 的变化
δ ˙ = x ˙ 2 d − x ˙ 2 \dot { \delta } = \dot x _ { 2d } - \dot { x } _ { 2 } δ˙=x˙2dx˙2 ( 2 ) (2) (2) 式带入,同时也把 ( 7 ) (7) (7) 式带入
δ ˙ = x ¨ 1 d + k 1 e ˙ − ( − α m x 1 3 + 1 m u ) \dot { \delta } = \ddot { x} _ { 1 d} + k _ { 1 } \dot { e } - ( - \frac { \alpha } { m } x _ { 1 } ^ { 3 } + \frac { 1 } { m } u ) δ˙=x¨1d+k1e˙(mαx13+m1u)带入 ( 4 ) (4) (4) 式,消到 e ˙ \dot e e˙,就就可以得到
δ ˙ = x ¨ 1 d + k 1 ( x ˙ 1 d − x 2 ) + α m x 1 3 − 1 m u (10) \dot { \delta } =\ddot x _ { 1 d} + k _ { 1 } ( \dot { x } _ { 1 d} - x _ { 2 } ) + \frac { \alpha } { m } x _ { 1 } ^ { 3 } - \frac { 1 } { m } u\tag{10} δ˙=x¨1d+k1(x˙1dx2)+mαx13m1u(10)  这时候目标,新的目标使得系统稳定,就希望 δ , e \delta,e δ,e 都趋向于零。也就是说要找到一个新的里阿普诺夫函数 V ( e , δ ) V(e,\delta) V(e,δ),里面包含了 e e e δ \delta δ ,使得它是正定函数,而且同时满足 V ˙ ( e , δ ) \dot V(e,\delta) V˙(e,δ) 是负定的。

2.3 李雅普诺夫函数的扩展

不妨构造新的李雅普诺夫函数
V 2 = V 1 + 1 2 δ 2 V _ { 2 } = V _ { 1 } + \frac { 1 } { 2 } \delta ^ { 2 } V2=V1+21δ2前面已经验证过了 V 1 V_1 V1 是一个正定的系统,而后面这一项 1 2 δ 2 \frac { 1 } { 2 } \delta ^ { 2 } 21δ2 也是正定的,所以整个来说, V 2 V_2 V2 就是正定的,这时对 V 2 V_2 V2 求导
V 2 ˙ = V 1 ˙ + δ δ ˙ \dot { V _ { 2 } } = \dot { V _ { 1 } } + \delta \dot { \delta } V2˙=V1˙+δδ˙代入 ( 9 ) (9) (9) 式,这时
V ˙ 2 = − k 1 e 2 + e δ + δ δ ˙ = − k 1 e 2 + δ ( e + δ ˙ ) \dot V _ { 2 } = - k _ { 1 } e ^ { 2 } + e \delta + \delta \dot \delta = - k _ { 1 } e ^ { 2 } + \delta ( e + \dot { \delta } ) V˙2=k1e2++δδ˙=k1e2+δ(e+δ˙)

2.4 控制器增益的设计

从上式可见, − k e 2 -ke^2 ke2 是负定系统,而后面这一项 δ ( e + δ ˙ ) \delta ( e + \dot { \delta } ) δ(e+δ˙) 当然也希望是负定的,所以就可以设计
e + δ ˙ = − k 2 δ e + \dot { \delta } =-k_2\delta e+δ˙=k2δ 其中, k 2 k_2 k2 也是大于 0 0 0 的控制器增益,这样
V ˙ 2 = − k 1 e 2 − k 2 δ 2 \dot{V}_2=-k_1e^2-k_2\delta ^2 V˙2=k1e2k2δ2所以新的目标就是让 e + δ ˙ = − k 2 δ e + \dot { \delta } =-k_2\delta e+δ˙=k2δ

2.5 输入表达式推导

这时把 ( 10 ) (10) (10) 代进去可以得到
e + x ¨ 1 d + k 1 ( x ˙ 1 d − x 2 ) + α m x 1 3 − 1 m u = − k 2 δ e + \ddot x _ { 1d }+ k _ { 1 } ( \dot x _ { 1 d} - x _ { 2 } ) + \frac { \alpha } { m } x _ { 1 } ^ { 3 } - \frac { 1 } { m } u = - k _ { 2 } \delta e+x¨1d+k1(x˙1dx2)+mαx13m1u=k2δ这时就可以推出来
u = m e + m x ¨ 1 d + m k 1 ( x ˙ 1 d − x 2 ) + α x 1 3 + m k 2 δ (11) u = m e + m \ddot x _ { 1 d } + m k _ { 1 } ( \dot x _ { 1d } - x _ { 2 } ) + \alpha x _ { 1 } ^ { 3 } + m k _ { 2 } \delta\tag{11} u=me+mx¨1d+mk1(x˙1dx2)+αx13+mk2δ(11)经过了一系列的计算,这是最终想要得到的输入表达形式。


三、系统验证

下面来验证一下。

3.1 误差函数的动态方程

可以把 ( 8 ) (8) (8) 式代入 ( 4 ) (4) (4) 式,这时就可以得到
e ˙ = x ˙ 1 d − ( x 2 d − δ ) \dot { e } = \dot x _ { 1d }- ( x _ { 2 d } - \delta ) e˙=x˙1d(x2dδ)这时再把 ( 7 ) (7) (7) x 2 d = x ˙ 1 d + k 1 e x _ { 2 d } = \dot x _ { 1 d} + k _ { 1 } e x2d=x˙1d+k1e 代入,就可以新的得到
e ˙ = − k 1 e + δ \dot { e } = - k _ { 1 } e + \delta e˙=k1e+δ再把 ( 11 ) (11) (11) 式带回到 ( 10 ) (10) (10) 式,就可以得到
δ ˙ = x ¨ 1 d + k 1 ( x ˙ 1 d − x 2 ) + α m x 1 3 − e − x ¨ 1 d − k 1 ( x ˙ 1 d − x 2 ) − α x 1 3 − k 2 δ = − e − k 2 δ \begin{aligned} \dot{\delta}&=\ddot{x}_{1d}+k_1\left( \dot{x}_{1d}-x_2 \right) +\frac{\alpha}{m}x_{1}^{3}-e\\ &\ \ \ \ \ -\ddot{x}_{1d}-k_1\left( \dot{x}_{1d}-x_2 \right) -\alpha x_{1}^{3}-k_2\delta\\ &=-e-k_2\delta\\ \end{aligned} δ˙=x¨1d+k1(x˙1dx2)+mαx13e     x¨1dk1(x˙1dx2)αx13k2δ=ek2δ

3.2 反馈线性化

把它们两个写在一起
[ e ˙ δ ˙ ] = [ − k 1 1 − 1 − k 2 ] [ e δ ] \left[ \begin{array}{c} \dot{e}\\ \dot{\delta}\\ \end{array} \right] =\left[ \begin{matrix} -k_1& 1\\ -1& -k_2\\ \end{matrix} \right] \left[ \begin{array}{c} e\\ \delta\\ \end{array} \right] [e˙δ˙]=[k111k2][eδ]  可以发现这是线性系统,所以整个过程就是通过反馈系统把它线性化 ( Feedback Linurization )了。

3.3 状态特征值分析

分析一下这个式子,对于这个系统来说,它的状态特征值
λ 1 + λ 2 = Λ = − k 1 − k 2 < 0 λ 1 ⋅ λ 2 = ∣ − k 1 1 − 1 − k 2 ∣ = k 1 k 2 + 1 > 0 \begin{matrix} \lambda _ { 1 } + \lambda _ { 2 } = \Lambda = - k _ { 1 } - k _ { 2 } < 0 \\ \lambda _ { 1 } \cdot \lambda _ { 2 } = \left| \begin{matrix} -k_1& 1\\ -1& -k_2\\ \end{matrix} \right| = k _ { 1 } k _ { 2 } + 1 > 0 \end{matrix} λ1+λ2=Λ=k1k2<0λ1λ2= k111k2 =k1k2+1>0所以可以推出 λ 1 , λ 2 \lambda_1,\lambda_2 λ1,λ2 一定是同号,并且都小于 0 0 0

3.4 系统平衡点稳定性

再来看关于这个系统的平衡点,也就是
[ e ˙ δ ˙ ] = 0 ⇒ [ e δ ] = 0 \left[ \begin{array}{c} \dot{e}\\ \dot{\delta}\\ \end{array} \right] =0\Rightarrow \left[ \begin{array}{c} e\\ \delta\\ \end{array} \right] =0 [e˙δ˙]=0[eδ]=0就是它的平衡点是零点,而因为特征值都小于 0 0 0 ,所以它是渐进稳定的系统。

OK ,所有的问题都已经验证成功。


四、Simulink仿真

现在进入到 Simulink 当中来看一下整个系统的反应。下载链接如下:

  链接:Simulink仿真文件
  提取码:jjcc

4.1 Simulink模型构建

现在进入到 MATLAB Simulink 里:

在这里插入图片描述

4.2 动态方程实现

下面具体看一下

在这里插入图片描述

这一部分是系统的动态方程,有两个积分器,所以经过积分可分别得到 x 1 , x 2 x_1,x_2 x1,x2 这里面就代表了系统方程,-u(2)/u(1)*u(3)^3+1/u(1)*u(4) 而这个方程对应于刚刚推导的 ( 2 ) (2) (2) 式:
x ˙ 2 = − α m x 3 + 1 m u (2) \dot{x}_2=-\frac{\alpha}{m}x^3+\frac{1}{m}u \tag{2} x˙2=mαx3+m1u(2)

4.3 输入信号构建

再看这一部分
在这里插入图片描述

  这一部分就是系统输入,有很多项组成,可以在这里进行调节,由这一大堆式子来表明了 u u u 是怎么建立的:

u(1)*u(3)+u(1)*u(11)+u(1)*u(4)*(u(10)-u(8))+u(2)*u(7)^3+u(1)*u(5)*u(6)

4.4 期望值子系统设计

  再回到头看左上角的期望值子系统,就是系统的设定值,打开看一下它的样子:

在这里插入图片描述

  这里把它写成了一个正弦曲线的方法,因为如果自己直接用 Matlab 自带的 DDT 函数,就是 Derivative 模块的话,并不是一个很好的选择,因为它是用数值来解的,会出现无穷点,所以这部分自己写,因为考虑到是 sin 函数,所以这第一部分 sinx1 函数如下:

u(2)+u(3)*sin(u(1)*pi/u(4))

  左侧第二个模块 u(2)重复序列阶梯(Repeating Sequence Stair)u(3) Osc 为正弦函数的变化幅值,再乘以 sin 正弦函数。下面两个分别是它的导数以及二阶导数。

4.5 仿真结果分析

(1) 单目标值追踪

  先来看一下,把正弦函数的变化幅值 Osc 设成 0 0 0 。假如就让目标值到 3 3 3 ,让 x 1 x_1 x1 的初始值是 0 0 0 ,这时候运行一下

在这里插入图片描述

  这个 scope 代表了 x 1 x_1 x1 x 1 d x_{1d} x1d x 1 x_1 x1 是从 0 0 0 开始的, 3 3 3 是目标值,红线是目标,可以看到它很好地追踪到了黄线上。

(2) 多目标值追踪

  这时改一下,把期望值改成有多个目标值的阶梯形式,比如 [3 5 7 2 1].',再来做运行一下

在这里插入图片描述

可以看到也是非常好的追踪效果。

(3) 波动与振荡效果测试

再来改一下,加上一些 波动,都让它从 3 3 3 开始,但是存在以 10 10 10 秒为周期的波动。

在这里插入图片描述

  所以这时来看红线是想要的,走一个正弦波的形状,蓝线也是非常好的追踪效果,很快地就追踪过去了。

  这时的输入可想而知,也是类似正弦的效果:

在这里插入图片描述

(4) 综合效果分析

  这时再把期望值的 u(2) 复杂一点,比如说 [3 5 3 5 2].',同样让它有一个正弦信号的波动,这样再来看

在这里插入图片描述

  追踪的效果依然还是非常好的,看到大概在 5 5 5 秒左右时,就可以很完整地贴合过去,最终效果比较好,大家可以把它下载下来,以后自己尝试不同的组合玩一玩。而且大家可以修改质量块的质量,修改弹性系数,包括可以修改不同的控制器增益,看会有什么不同的反应。


五、Matlab实现

%DSC example
%--------------------------------system-----------------------------------%
%dot_x1=x2
%dot_x2=-x1^2+u
%-------------------------------settings----------------------------------%
%initial state
%x1(0)=0.5,x2(0)=0
%sample time
%tao=0.01
%tracking target
%x_1d=[3 1 4 1 3]//interval time:20
%-------------------------------------------------------------------------%%-------------------------------数据初始化--------------------------------%
%参数取值
k1=1;
k2=50;
%采样时间
tao=0.01;
%总采样次数
T=10000;
%总时间
total_time=tao*T;      %观测时间设置为100秒
%定义初始状态
x1_initial=0.5;
x2_initial=0;
u_initial=0;
%定义状态变量矩阵和控制变量矩阵
x1=zeros(1,T);
x2=zeros(1,T);
u=zeros(1,T);
%x1d的定义
x1d=zeros(1,T);
for i=1:T/5x1d(i)=3;
end
for i=T/5+1:2*T/5x1d(i)=1;
end
for i=2*T/5+1:3*T/5x1d(i)=4;
end
for i=3*T/5+1:4*T/5x1d(i)=1;
end
for i=4*T/5+1:Tx1d(i)=3;
end
%x2d初始化
x2d=zeros(1,(T));
%x2_bar表示x2上面带杠杠
x2_bar=0;
for k=1:Tif k==1x1(k)=x1_initial+tao*x2_initial;x2(k)=x2_initial+tao*(-x1_initial^2+u_initial);x2d(k)=x2_bar;x2_bar=(x1d(k)-0)/tao-k1*(x1(k)-x1d(k));u(k)=-(x1(k)-x1d(k))+x1(k)^2+(x2_bar-x2d(k))/tao-k2*(x2(k)-x2d(k));elsex1(k)=x1(k-1)+tao*x2(k-1);x2(k)=x2(k-1)+tao*(-x1(k-1)^2+u(k-1));x2d(k)=x2_bar;x2_bar=(x1d(k)-x1d(k-1))/tao-k1*(x1(k)-x1d(k));u(k)=-(x1(k)-x1d(k))+x1(k)^2+(x2_bar-x2d(k))/tao-k2*(x2(k)-x2d(k));end
end
figure(1),hold on;
plot(x1,'b','linewidth',1.2);
plot(x1d,'r','linewidth',1.2);
xlabel('时间/s');
ylabel('信号幅值');
title('动态面控制效果');
legend('x1','x1d')
set(gca,'xticklabel',0:10:100);
hold off;

六、总结

  在本篇博客中,通过一个非线性弹簧系统实例,深入探讨了控制理论的应用。首先描述了系统的动态方程,并提出了控制目标:通过改变输入力 F F F,使小滑块按照指定轨迹移动。接着引入误差函数,并利用李雅普诺夫函数设计了反步控制器,通过反馈线性化将非线性系统转化为线性系统,并分析了系统的稳定性。

  在 Simulink 仿真环节,构建了系统模型,并进行了动态方程的实现。通过设定不同的期望值,观察了系统对单目标值、多目标值以及波动和振荡效果的追踪能力。仿真结果显示,系统具有良好的追踪效果和稳定性。

  本篇博客的内容就到这,下篇博客将进入自适应控制中,也就是说如果整个系统受到外界的不确定扰动,应该如何设计控制器,欢迎大家留言讨论。


参考资料

  [1]【Advanced控制理论】15_Nonlinear Backstepping Control_反馈线性化控制_Feedback Linearization

  [2] 全网最细反步法控制(Backstepping)设计讲解!!(3)——反步法控制、动态面matlab实例!(Dyanamic surface control)


后记:

🌟 感谢您耐心阅读这篇关于 反步法控制器原理与应用实例解析 的技术博客。 📚

🎯 如果您觉得这篇博客对您有所帮助,请不要吝啬您的点赞和评论 📢

🌟您的支持是我继续创作的动力。同时,别忘了收藏本篇博客,以便日后随时查阅。🚀

🚗 让我们一起期待更多的技术分享,共同探索移动机器人的无限可能!💡

🎭感谢您的支持与关注,让我们一起在知识的海洋中砥砺前行 🚀

动图描述

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

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

相关文章

使用Airtest自动化某云音乐爬取歌曲名称

简介 本文将介绍如何使用Airtest自动化工具来模拟用户操作&#xff0c;从某云音乐中爬取与特定关键词相关的歌曲名称。我们将以搜索“文字”相关的歌曲为例&#xff0c;并将结果保存到本地文件。 准备工作 安装Airtest并配置好Android设备或模拟器。确保你的设备上已安装某云…

【独家:AI编程助手Cursor如何revolutionize Java设计模式学习】

【独家:AI编程助手Cursor如何revolutionize Java设计模式学习】 导语 在Java高级编程的世界里,设计模式是每个开发者必须掌握的利器。但是,如何快速理解并灵活运用这些模式呢?让我们一起探索如何借助AI编程助手Cursor,轻松掌握设计模式,提升Java编程技能! 正文 设计模式:J…

QUIC(Quick UDP Internet Connections)与 RTMP(Real Time Messaging Protocol)

QUIC&#xff08;Quick UDP Internet Connections&#xff09;和 RTMP&#xff08;Real Time Messaging Protocol&#xff09;是两种不同的网络传输协议&#xff0c;它们在一些方面有不同的特点和应用场景。 QUIC 协议 特点 基于 UDP&#xff1a;QUIC 建立在 UDP 之上&#xff…

探索 Jupyter 核心:nbformat 库的神秘力量

文章目录 探索 Jupyter 核心&#xff1a;nbformat 库的神秘力量1. 背景介绍&#xff1a;为何选择 nbformat&#xff1f;2. nbformat 是什么&#xff1f;3. 如何安装 nbformat&#xff1f;4. 简单的库函数使用方法4.1 读取 Notebook 文件4.2 修改 Notebook 中的单元格4.3 添加 M…

灵当CRM index.php 任意文件上传漏洞复现

0x01 产品描述&#xff1a; 灵当CRM是一款专为中小企业量身定制的智能客户关系管理工具&#xff0c;由上海灵当信息科技有限公司开发和运营。该系统广泛应用于多个行业&#xff0c;包括金融、教育、医疗、IT服务及房地产等领域&#xff0c;旨在满足企业对客户个性化管理的需求&…

【2024版】sql-liabs靶场前十关解题过程和思路----适合入门小白

在你们看到这个靶场之前&#xff0c;你们可以先去听一下课&#xff0c;然后再来做这个靶场你们的感悟就会比较深&#xff0c;当你听过课再来做就不会觉得这么懵了&#xff0c;重庆橙子科技-sql注入&#xff0c;我之前学习是听的他的课&#xff0c;我觉得是全网讲的最好的一个师…

vue2使用pdfjs-dist实现pdf预览(iframe形式,不修改pdfjs原来的ui和控件,dom层可以用display去掉一部分组件)

前情提要 在一开始要使用pdf预览的时候&#xff0c;第一次选的是vue-pdf&#xff0c;但是vue-pdf支持的功能太少&#xff0c;缺少了项目中需要的一项-复制粘贴功能 之后我一顿搜搜搜&#xff0c;最终貌似只有pdfjs能用 但是网上支持text-layer的貌似都是用的2.09那个版本。 使…

MySQL同步到ES的方案选型

文章目录 1. 同步双写优点缺点实现方式 2. 异步双写优点缺点实现方式 3. 另起应用 SQL 查询写入优点缺点实现方式 4. Binlog 实时同步优点缺点实现方式 5. 应用场景 本文参考: https://www.bilibili.com/video/BV13hvZeaErr/?vd_sourceb7e4d17fd13ffa91c4da6d37c08a6c7c 最近在…

【题解】—— LeetCode一周小结42

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结41 14.鸡蛋掉落 题目链接&#xff1a;887. 鸡蛋掉落 给你 k 枚…

c++迷宫游戏

1、问题描述 程序开始运行时显示一个迷宫地图&#xff0c;迷宫中央有一只老鼠&#xff0c;迷宫的右下方有一个粮仓。游戏的任务是使用键盘上的方向健操纵老鼠在规定的时间内走到粮仓处。 基本要求: 老鼠形象可以辨认,可用键盘操纵老鼠上下左右移动&#xff1b;迷宫的墙足够结…

Springboot指定扫描路径

方式一&#xff1a;通过在启动类的SpringbootApplication中指定包扫描或类扫描 指定需要扫描的包 scanBasePackages{"待扫描包1","待扫描包2", . . . ," "} 指定需要扫描的类 scanBasePackageClasses{类1.class,类2.class,...} 方式二&#xff…

C语言函数实现:深入理解strcpy

文章目录 一、strcpy函数的基本用法二、strcpy函数的实现原理三、strcpy函数的应用场景四、strcpy函数的安全性问题五、结论 C语言函数实现&#xff1a;深入理解strcpy 在C语言编程中&#xff0c;字符串处理是一项基础且重要的任务。 strcpy函数作为C标准库中的一个基本函数&a…

CDC变更数据捕捉技术是什么?和ETL有什么不同?

一、什么是CDC技术? 变更数据捕获&#xff08;Change Data Capture&#xff0c;简称 CDC&#xff09;是一种用于识别和跟踪数据源中发生变化的数据的技术。 工作原理&#xff1a; 1.监测数据源&#xff1a;CDC 工具会持续监测指定的数据源&#xff0c;如数据库表、文件系统…

【C++复习】经典笔试题

文章目录 八大排序快排过程 卡特兰数反转链表链表的回文结构左叶子之和另一棵树的子树归并排序类与对象编程训练杨辉三角字符串乘积二叉树前序遍历成字符串数组的交集二叉树的非递归前序遍历连续子数组的最大乘积 八大排序 插冒归稳定 快排过程 以 [3,4,6,1,2,4,7] 为例&#…

MySQL 聚合函数

1. AVG函数求平均值 以 teacher 表为例&#xff0c;先查所有 teacher 信息&#xff1a; SELECT * FROM teacher;查询结果如下图&#xff1a; 可以使用 AVG() 函数求出全部教师平均年龄&#xff1a; SELECT AVG(age) FROM teacher;执行结果如下图&#xff1a; Tips&#…

Javascript 脚本查找B站限时免费番剧

目录 前言 脚本编写 脚本 前言 B站的一些番剧时不时会“限时免费”&#xff0c;白嫖党最爱&#xff0c;主打一个又占到便宜的快乐。但是在番剧索引里却没有搜索选项可以直接检索“限时免费”的番剧&#xff0c;只能自己一页一页的翻去查看&#xff0c;非常麻烦。 自己找限…

如何修改MAC地址破解网络无线网络限制-担心别人蹭网,路由器设置MAC地址过滤,限定了能访问无线网络的网卡地址-供大家学习参考

路由器都设置了MAC地址过滤&#xff0c;也就是限定了能访问无线网络的网卡的MAC地址。因为无线路由器不一定由自己控制&#xff0c;所以当更换了笔记本或者更换了无线网卡的时候&#xff0c;也许就上不了网了。我们可以修改网卡的MAC地址实现上网。 下载&#xff1a;https://do…

各种查询sql介绍

1. 关联查询&#xff08;JOIN&#xff09; 关联查询用于从多个表中检索数据。它基于两个或多个表之间的共同字段&#xff08;通常是主键和外键&#xff09;来组合数据。 内连接&#xff08;INNER JOIN&#xff09;&#xff1a; sql SELECT a.name, b.order_date FROM custome…

计算机网络——CDN

空间编码例子&#xff1a;不是发送N个相同颜色值&#xff0c;而是仅发送2个值&#xff0c;颜色和重复个数 时间编码例子&#xff1a;不是发送i1帧的全部编码&#xff0c;而是仅发送帧i差别的地方 视频播放时&#xff0c;先下载manifest file文件——>解析&#xff08;不…

机器学习与神经网络:科技的星辰大海

前提 近日&#xff0c;2024年诺贝尔物理学奖颁发给了机器学习与神经网络领域的研究者&#xff0c;这是历史上首次出现这样的情况。这项奖项原本只授予对自然现象和物质的物理学研究作出重大贡献的科学家&#xff0c;如今却将全球范围内对机器学习和神经网络的研究和开发作为了一…