控制障碍函数CBF详解(附带案例实现)

控制障碍函数CBF详解(附带案例实现)

文章目录

  • 控制障碍函数CBF详解(附带案例实现)
    • 1. Control Affine System
    • 2. Lyapunov Theory, Nagumo's Theory, Invariance Principle
    • 3. Control Lyapunov Function (CLF) and CLF-QP
    • 4. Control Barrier Function (CBF) and CBF-CLF-QP
    • 5. A Toy Example
      • 5.1 Derivation
      • 5.2 Simulation
    • Reference

1. Control Affine System

一个控制仿射系统的典型形式是

x ˙ = F ( x , u ) \dot{x} = F(x,u) x˙=F(x,u)

其中, x ∈ R n x\in \mathbb{R}^n xRn是系统的状态, u ∈ R m u\in\mathbb{R}^m uRm是系统的控制输入, F F F是Lipschitz连续的,这样就能保证给定一个初始状态 x ( t 0 ) = x 0 x(t_0)=x_0 x(t0)=x0的时候,动态系统的轨迹 x ( t ) x(t) x(t)存在且唯一。

我们通常处理的是非线性系统,那么我们可以将非线性的仿射系统写成如下的形式

x ˙ = f ( x ) + g ( x ) u \dot{x} = f(x) + g(x) u x˙=f(x)+g(x)u

其中 f : R n → R n f:\mathbb{R}^n \to \mathbb{R}^n f:RnRn是系统的漂移向量场,它描述了系统在没有控制输入时的动态行为, g : R n → R n × m g:\mathbb{R}^n\to\mathbb{R}^{n\times m} g:RnRn×m,是系统的控制向量场,它描述了系统的控制输入 u u u是如何影响系统的。

2. Lyapunov Theory, Nagumo’s Theory, Invariance Principle

Lyapunov Theory

对于系统 x ˙ = f ( x ) \dot{x}=f(x) x˙=f(x)而言, x ∈ R n x\in \mathbb{R}^n xRn是系统的状态, f : R n → R n f:\mathbb{R}^n \to \mathbb{R}^n f:RnRn是一个系统状态的映射函数。如果

∃ V ( x ) s.t.  V ( x e ) = 0 , V ( x ) > 0 for  x ≠ x e , V ˙ ( x ) = ∂ V ∂ x f ( x ) < 0 for  x ≠ x e \exists V(x) \\ \text{s.t. } V(x_e) = 0, V(x)>0 \text{ for } x \ne x_e, \\ \dot{V}(x) = \frac{\partial V}{\partial x} f(x) < 0 \text{ for } x\ne x_e V(x)s.t. V(xe)=0,V(x)>0 for x=xe,V˙(x)=xVf(x)<0 for x=xe

那么系统则是稳定的。并且状态 x x x所构成的集合,可以被称为是一个不变集(Invariance set)。

不变集合: 集合 C \mathcal{C} C被称为不变的,如果系统从 C \mathcal{C} C内的任意一点开始演化,那么系统的轨迹始终停留在 C \mathcal{C} C内。

Nagumo’s Theory

对于系统 x ˙ = f ( x ) \dot{x} = f(x) x˙=f(x)而言, x ∈ R n x\in \mathbb{R}^n xRn是系统的状态, C = { x ∣ h ( x ) ≥ 0 } \mathcal{C}=\{x|h(x)\ge0\} C={xh(x)0}是映射 h : R n → R h:\mathbb{R}^n \to \mathbb{R} h:RnR的一个上水平集,如果

h ˙ ( x ) ≥ 0 ∀ x ∈ ∂ C \dot{h}(x) \ge 0 \\ \forall x\in\partial\mathcal{C} h˙(x)0xC

那么 C \mathcal{C} C是一个不变集。符号的具体含义如下:

C = { x ∈ D ⊂ R n : h ( x ) ≥ 0 } , ∂ C = { x ∈ D ⊂ R n : h ( x ) = 0 } , Int ( C ) = { x ∈ D ⊂ R n : h ( x ) > 0 } , \begin{align*} \mathcal{C} & = \{ x\in D\sub \mathbb{R}^n: h(x) \ge 0 \}, \\ \partial\mathcal{C} & = \{ x\in D\sub \mathbb{R}^n: h(x) = 0 \}, \\ \text{Int}(\mathcal{C}) & = \{ x\in D\sub \mathbb{R}^n: h(x) > 0 \}, \end{align*} CCInt(C)={xDRn:h(x)0},={xDRn:h(x)=0},={xDRn:h(x)>0},

集合 C \mathcal{C} C是安全集, ∂ C \partial\mathcal{C} C是安全集的边界, Int ( C ) \text{Int}(\mathcal{C}) Int(C)是安全集的内部点。

3. Control Lyapunov Function (CLF) and CLF-QP

Control Lyapunov Function

V ( x ) : R n → R V(x):\mathbb{R}^n \to \mathbb{R} V(x):RnR是一个连续可微的函数,如果这里存在一个常量 c > 0 c>0 c>0使得

1)  Ω c : = { x ∈ R n : V ( x ) ≤ c } , a sublevel set of  V ( x ) is bounded 2)  V ( x ) > 0 , ∀ s ∈ R n \ { x e } , V ( x e ) = 0 3)  inf ⁡ u ∈ U V ˙ ( x , u ) < 0 , ∀ x ∈ Ω c \ { x e } \begin{align*} & \text{1) }\Omega_c := \{ x\in\mathbb{R}^n: V(x) \le c\}, \text{ a sublevel set of } V(x) \text{ is bounded} \\ & \text{2) }V(x) > 0, \forall s \in\mathbb{R}^n \backslash \{x_e\}, V(x_e) = 0 \\ & \text{3) }\inf_{u\in U} \dot{V}(x,u) < 0, \forall x \in \Omega_c \backslash \{x_e\} \end{align*} 1) Ωc:={xRn:V(x)c}, a sublevel set of V(x) is bounded2) V(x)>0,sRn\{xe},V(xe)=03) uUinfV˙(x,u)<0,xΩc\{xe}

1)存在一个子集,使得 V ( x ) ≤ c V(x)\le c V(x)c是有界的

2)Lyapunov函数不在原点时大于零,在原点时等于零

3)对于控制量和系统状态来说,总使得 V ( x ) V(x) V(x)的导数 V ˙ ( x ) \dot{V}(x) V˙(x)小于零。

其中, V ( x ) V(x) V(x)可以被称为局部控制李雅普诺夫函数, Ω c \Omega_c Ωc是一个引力区(Region of Attraction, ROA), Ω c \Omega_c Ωc中的每一个点都会收敛到 x e x_e xe,整个轨迹就如下图所示,会一直保持在这个区域内,并且最终收敛到 x e x_e xe,这其实就是一种渐进稳定。

Image

我们可以将导数显示地写出来

V ˙ ( x ) = ∇ V ( x ) x ˙ = ∇ V ( x ) f ( x ) + ∇ V ( x ) g ( x ) u = L f V ( x ) + L g V ( x ) u \begin{align*} \dot{V}(x) & = \nabla V(x) \dot{x} \\ & = \nabla V(x)f(x) + \nabla V(x)g(x)u \\ & = L_fV(x) + L_g V(x) u \end{align*} V˙(x)=V(x)x˙=V(x)f(x)+V(x)g(x)u=LfV(x)+LgV(x)u

其中 L p q ( x ) = ∇ q ( x ) ⋅ p ( x ) L_p q(x) = \nabla q(x) \cdot p(x) Lpq(x)=q(x)p(x)是李导数算子,使得公式更加简洁。

为了使收敛更加迅速,我们需要考虑收敛的时间限制,指数收敛是一种快速的方式,所以我们希望最终的结果能够按照指数的方式进行收敛。

我们可以增加一个判断条件,设 V ( x ) : R n → R V(x):\mathbb{R}^n \to \mathbb{R} V(x):RnR是连续可微、正定、有界的函数,如果 ∃ λ > 0 \exists \lambda>0 λ>0使得

4)  inf ⁡ u ∈ U V ˙ ( x , u ) + λ V ( x ) ≤ 0 \text{4) }\inf_{u\in U} \dot{V}(x,u) + \lambda V(x) \le 0 4) uUinfV˙(x,u)+λV(x)0

或者写成

inf ⁡ u ∈ U [ L f V ( x ) + L g V ( x ) u ] + λ V ( x ) ≤ 0 \inf_{u\in U} [L_f V(x) + L_gV(x)u] + \lambda V(x) \le 0 uUinf[LfV(x)+LgV(x)u]+λV(x)0

那么 V ( x ) V(x) V(x)就是指数稳定的控制李雅普诺夫函数(exponentially stabilizing CLF,ES-CLF),其中 λ \lambda λ V ( x ( t ) ) V(x(t)) V(x(t))上界的衰减率。

Image

Control Lyapunov Function Quadratic Program

Image

CLF约束对于 u u u是线性的,因此用最小范数控制器,二次规划的目标位最小化控制量,受限制为,满足李雅普诺夫函数收敛的上界以及控制量 u u u在解集内。由于这个优化为一个凸优化问题,因此其实时性是可以被保证的,CLF约束通常用松弛变量来保证问题的可行性,如果没有松弛变量,控制器将指数稳定到系统原点 x e x_e xe

4. Control Barrier Function (CBF) and CBF-CLF-QP

B ( x ) : R n → R B(x):\mathbb{R}^n \to \mathbb{R} B(x):RnR是连续、可微的函数, C = { x ∣ B ( x ) ≥ 0 } \mathcal{C}=\{x|B(x)\ge 0\} C={xB(x)0}是该函数的零上水平集,并且 ∇ B ( x ) ≠ 0 , ∀ x ∈ ∂ C \nabla B(x)\ne 0,\forall x\in\partial\mathcal{C} B(x)=0,xC,如果 ∃ γ \exists \gamma γ使得 ∀ x ∈ C \forall x\in\mathcal{C} xC

sup ⁡ u ∈ U [ L f B ( x ) + L g B ( x ) u ] + γ B ( x ) ≥ 0 \sup_{u \in U}[L_fB(x) + L_g B(x)u] + \gamma B(x) \ge 0 uUsup[LfB(x)+LgB(x)u]+γB(x)0

那么 B ( x ) B(x) B(x)就被称作Control Barrier Function

Image

因此这个二次规划问题就变成了

Image

5. A Toy Example

我们考虑一个简单的例子,在这个例子中有两辆车辆,分别是lead vehicleego vehicle,如下图所示

Image

下面我们先推导一下,然后再进行仿真验证。

5.1 Derivation

设计我们的状态量为: x = [ p , v , z ] T ∈ R 3 x = [p, v, z]^T \in \mathbb{R}^3 x=[p,v,z]TR3,系统的微分方程为:

{ p ˙ = v v ˙ = u − F r ( v ) m , F r ( v ) = f 0 + f 1 v + f 2 v 2 z ˙ = v 0 − v \left\{ \begin{align*} \dot{p} & = v \\ \dot{v} & = \frac{u - F_r(v)}{m}, \quad F_r(v) = f_0 + f_1 v + f_2 v^2 \\ \dot{z} & = v_0 - v \end{align*} \right. p˙v˙z˙=v=muFr(v),Fr(v)=f0+f1v+f2v2=v0v

其中F_r(v)是摩擦力,将微分方程写成矩阵的形式

x ˙ = [ p ˙ v ˙ z ˙ ] = [ v − 1 m F r ( v ) v 0 − v ] + [ 0 1 m 0 ] u \dot{x} = \begin{bmatrix} \dot{p} \\ \dot{v} \\ \dot{z} \\ \end{bmatrix} = \begin{bmatrix} v \\ -\frac{1}{m} F_r(v) \\ v_0 - v \end{bmatrix} + \begin{bmatrix} 0 \\ \frac{1}{m} \\ 0 \end{bmatrix} u x˙= p˙v˙z˙ = vm1Fr(v)v0v + 0m10 u

为了保障系统的安全性,给系统的输入做如下的限制

− m c d g ≤ u ≤ m c a g -mc_dg \le u \le mc_ag mcdgumcag

ego vehicle的目标速度为

v → v d v \to v_d vvd

最小安全距离必须满足时间前瞻量的限制 T h T_h Th

z ≥ T h v z \ge T_h v zThv

系统的平衡点 x e = [ ⋅ , v d , ⋅ ] T x_e = [\cdot, v_d, \cdot]^T xe=[,vd,]T设计Lyapunov Function V ( x ) V(x) V(x)

V ( x ) = ( v − v d ) 2 V ˙ ( x ) = ∇ V ( x ) x ˙ \begin{align*} V(x) & = (v - v_d)^2 \\ \dot{V}(x) & = \nabla V(x) \dot{x} \\ \end{align*} V(x)V˙(x)=(vvd)2=V(x)x˙

其中

∇ V ( x ) = [ 0 , 2 ( v − v d ) , 0 ] x ˙ = [ v − 1 m F r ( v ) v 0 − v ] + [ 0 1 m 0 ] u \nabla V(x) = [0, 2(v-v_d), 0] \\ \dot{x} = \begin{bmatrix} v \\ -\frac{1}{m} F_r(v) \\ v_0 - v \end{bmatrix} + \begin{bmatrix} 0 \\ \frac{1}{m} \\ 0 \end{bmatrix}u V(x)=[0,2(vvd),0]x˙= vm1Fr(v)v0v + 0m10 u

然后我们可以获得

L f V ( x ) = − 2 m F r ( v ) ( v − v d ) L g V ( x ) = 2 m ( v − v d ) L_f V(x) = -\frac{2}{m} F_r(v)(v-v_d) \\ L_g V(x) = \frac{2}{m} (v-v_d) LfV(x)=m2Fr(v)(vvd)LgV(x)=m2(vvd)

所以CLF的约束 inf ⁡ u ∈ U [ L f V ( x ) + L g V ( x ) u ] + λ V ( x ) ≤ 0 \inf_{u\in U} \quad[L_f V(x) + L_g V(x)u] + \lambda V(x) \le 0 infuU[LfV(x)+LgV(x)u]+λV(x)0可以表示为

inf ⁡ u ∈ U ( v − v d ) [ 2 m ( u − F r ) + λ ( v − v d ) ] ≤ 0 \inf_{u\in U} \quad(v-v_d) [\frac{2}{m} (u-F_r) + \lambda (v-v_d)] \le 0 uUinf(vvd)[m2(uFr)+λ(vvd)]0

保障安全性的目标是 z ≥ T h V z\ge T_h V zThV,则设计CBF

B ( x ) = z − T h V B(x) = z - T_h V B(x)=zThV

则有

∇ B ( x ) = [ 0 , − T h , 1 ] L f B ( x ) = T h m F r + ( v 0 − v ) , L g B ( x ) = − T h m \nabla B(x) = [0, -T_h, 1] \\ L_f B(x) = \frac{T_h}{m} F_r + (v_0 - v), \quad L_g B(x) = -\frac{T_h}{m} B(x)=[0,Th,1]LfB(x)=mThFr+(v0v),LgB(x)=mTh

所以CBF的约束 sup ⁡ u ∈ U [ L f B ( x ) + L g B ( x ) u ] + γ B ( x ) ≥ 0 \sup_{u\in U} \quad [L_f B(x) + L_g B(x)u] + \gamma B(x) \ge 0 supuU[LfB(x)+LgB(x)u]+γB(x)0 可以表示为

T h m ( F r − u ) + ( v 0 − v ) + γ ( z − T h v ) ≥ 0 \frac{T_h}{m}(F_r - u) + (v_0 - v) + \gamma (z - T_h v) \ge 0 mTh(Fru)+(v0v)+γ(zThv)0

忽略 F r F_r Fr,当 u = − m c d g u=-mc_dg u=mcdg的时候,CBF的约束可以表示为

T h c d g + v 0 + γ z − ( 1 + T h γ ) v T_h c_d g + v_0 + \gamma z - (1+T_h \gamma)v Thcdg+v0+γz(1+Thγ)v

v v v足够大的时候,可能会导致CBF的约束小于0,所以我们需要重新设计CBF

B ( x ) = z − T h v − 1 2 ( v − v 0 ) 2 c d g B(x) = z - T_hv - \textcolor{blue}{\frac{1}{2} \frac{(v-v_0)^2}{c_dg}} B(x)=zThv21cdg(vv0)2

则有

B ˙ ( x , u ) = 1 m ( T h + v − v 0 c d g ) ( F r ( v ) − u ) + ( v 0 − v ) \dot{B}(x,u) = \frac{1}{m} (T_h + \textcolor{blue}{\frac{v-v_0}{c_dg}})(F_r(v) - u) + (v_0 - v) B˙(x,u)=m1(Th+cdgvv0)(Fr(v)u)+(v0v)

u = − m c d g u=-mc_dg u=mcdg的时候, B ˙ ( x , u ) = 1 m T h F r + T h c d g > 0 \dot{B}(x,u) = \frac{1}{m}T_h F_r + T_h c_dg > 0 B˙(x,u)=m1ThFr+Thcdg>0,所以此CBF是一个可行的CBF,那么我们最终获得的CLF-CBF-QP为

arg ⁡ min ⁡ u T H u s.t. ( v − v d ) [ 2 m ( u − F r ) + λ ( v − v d ) ] ≤ 0 1 m ( T h + ( v − v 0 ) c d g ) ( F r − u ) + ( v 0 − v ) + γ ( z − T h v ) ≥ 0 − m c d g ≤ u ≤ m c a g \begin{align*} \arg\min & \quad u^T Hu \\ \text{s.t.} & \quad (v-v_d)[\frac{2}{m}(u-F_r) + \lambda(v-v_d)] \le 0 \\ & \quad \frac{1}{m}(T_h + \frac{(v-v_0)}{c_d g})(F_r - u) + (v_0 - v) + \gamma (z - T_h v) \ge 0 \\ & \quad -m c_d g \le u \le m c_a g \end{align*} argmins.t.uTHu(vvd)[m2(uFr)+λ(vvd)]0m1(Th+cdg(vv0))(Fru)+(v0v)+γ(zThv)0mcdgumcag

5.2 Simulation

使用python来编写脚本代码,使用cvxopt凸优化的库来进行求解,具体可以参考cvxopt的wiki官网。

import numpy as np
import matplotlib.pyplot as plt
from cvxopt import matrix, solvers# Simulation parameters
dt = 0.02
T = 30
length = int(np.ceil(T / dt))# System initialization
p = np.zeros((length + 1, 1))
v = np.zeros((length + 1, 1))
z = np.zeros((length + 1, 1))
u = np.zeros((length, 1))sys = {'m': 1650,'g': 9.81,'v0': 14,'vd': 24,'f0': 0.1,'f1': 5,'f2': 0.25,'ca': 0.3,'cd': 0.3,'T': 1.8,'clf_rate': 5,'cbf_rate': 5,'weight_input': 2 / 1650**2,'weight_slack': 2e-2
}sys['u_max'] = sys['ca'] * sys['m'] * sys['g']
sys['u_min'] = -sys['cd'] * sys['m'] * sys['g']# Initial conditions
p[0] = 0
v[0] = 10
z[0] = 100# Simulation loop
for i in range(length):current_p = p[i, 0]current_v = v[i, 0]current_z = z[i, 0]x = np.array([current_p, current_v, current_z])F_r = sys['f0'] + sys['f1'] * current_v + sys['f2'] * current_v**2f = np.array([current_v, -F_r / sys['m'], sys['v0'] - current_v])g = np.array([0, 1 / sys['m'], 0])V = (current_v - sys['vd'])**2dV = np.array([0, 2 * (current_v - sys['vd']), 0])LfV = np.dot(dV, f)LgV = np.dot(dV, g)B = current_z - sys['T'] * current_v - 0.5 * (current_v - sys['v0'])**2 / (sys['cd'] * sys['g'])dB = np.array([0, -sys['T'] - (current_v - sys['v0']) / (sys['cd'] * sys['g']), 0])LfB = np.dot(dB, f)LgB = np.dot(dB, g)# Quadratic programH_ = np.array([[sys['weight_input'], 0],[0, sys['weight_slack']]])f_ = np.array([-sys['weight_input'] * F_r, 0])A_ = np.array([[LgV, -1], [-LgB, 0],[1, 0],[-1, 0]])b_ = np.array([-LfV - sys['clf_rate'] * V, LfB + sys['cbf_rate'] * B,sys['u_max'],-sys['u_min']])# Convert to cvxopt formatP = matrix(H_)q = matrix(f_)G = matrix(A_)h = matrix(b_)# Solve QP problem using cvxoptsol = solvers.qp(P, q, G, h)u_opt = sol['x'][0] # Second term is the slack variabledx = f + g * u_optx_n = x + dx * dt# Save datau[i, 0] = u_optif i < length:p[i + 1, 0] = x_n[0]v[i + 1, 0] = x_n[1]z[i + 1, 0] = x_n[2]# Plotting
time = np.arange(0, T + dt, dt)plt.figure(figsize=(10, 8))
plt.subplot(4, 1, 1)
plt.plot(time, p)
plt.ylabel('p')plt.subplot(4, 1, 2)
plt.plot(time, v)
plt.ylabel('v')plt.subplot(4, 1, 3)
plt.plot(time, z)
plt.ylabel('z')plt.subplot(4, 1, 4)
plt.plot(time[:-1], u)
plt.ylabel('u')plt.xlabel('Time (s)')
plt.tight_layout()
plt.show()

最后的结果如下

Image

Reference

[1]Jason Choi – Introduction to Control Lyapunov Functions and Control Barrier Functions
[2]CBF-CLF-Helper

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

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

相关文章

算法(十二)分治算法

文章目录 算法概念算法例子字符串中小写转大写求X^n问题 算法概念 分治算法&#xff08;divide and conquer&#xff09;算法的核心思想其实就是"分而治之"&#xff0c;将原问题划分成n个规模较小&#xff0c;并且结构与原问题相似的子问题&#xff0c;递归地解决这…

移植其他命令行Vivado IDE的工具

移植其他命令行Vivado IDE的工具 介绍 本章介绍如何迁移各种AMD命令行工具以在AMD中使用 Vivado™集成设计环境&#xff08;IDE&#xff09;。 迁移ISE Partgen命令行工具 ISE™Design Suite Partgen工具可获得&#xff1a; •系统上安装的所有设备的信息 •详细的包装信息 您可…

[openwrt-21.02]openwrt-21.02 make menuconfig不显示luci-app-firewall问题分析及解决方案

问题描述 make menuconfig在 在applications界面没有luci-app-firewall 问题分析 首先重新执行 ./scripts/feeds update -a ./scripts/feeds install -a 然后再次执行make menuconfig&#xff0c;依然不显示&#xff0c;所以不是feeds安装的问题 最后看到log有个openmptc…

GB-T 43206-2023 信息安全技术 信息系统密码应用测评要求

GB-T 43206-2023 信息安全技术 信息系统密码应用测评要求 编写背景 随着信息技术的飞速发展&#xff0c;信息系统在社会经济活动中扮演着越来越重要的角色。信息安全问题也随之成为社会关注的焦点。GB-T 43206-2023《信息安全技术 信息系统密码应用测评要求》是针对信息系统中…

kotlin gradle 在libs.versions.toml控制下添加本地aar/jar的方法

与之前gradle集中控制的方法相同&#xff0c;唯一不同的是改成kotlin dsl格式&#xff1a; 修改Module级别的build.gradle.kt文件 在dependencies函数块内添加下面代码块 implementation(fileTree(mapOf("dir" to "libs","include" to listOf(…

记录mabatis-plus初体验

一、简介 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 测试问题现象&#xff1a;测试mabatis的crud方法 增加 批量删除都没有问题 单单就是这个根据ID删除有问题 解决方案&#xff1a;真的就是pom文件的问题 自己的版本是Intelli…

Fully Convolutional Networks for Semantic Segmentation--论文笔记

论文笔记 资料 1.代码地址 2.论文地址 https://arxiv.org/abs/1411.4038 3.数据集地址 论文摘要的翻译 卷积网络是强大的视觉模型&#xff0c;可以产生特征层次结构。我们表明&#xff0c;卷积网络本身&#xff0c;经过端到端&#xff0c;像素对像素的训练&#xff0c;在…

【新能源大巴BMS结构与乘用车的区别】

新能源大巴BMS结构与乘用车的区别 这篇文章主要介绍新能源大巴的电池和BMS的结构与乘用车的区别。 主要有&#xff0c;新能源大巴行业、新能源电池系统结构和新能源大巴的BMS系统。 第一部分 新能源大巴行业 其实数数全球的商用车(大巴卡车)&#xff0c;大致的方向还是沿着就…

解释 Vue route和router的区别?

Vue中的route和router在单页应用&#xff08;SPA&#xff09;开发中扮演着不同的角色&#xff0c;它们的区别可以归纳为以下几点&#xff1a; 定义与功能&#xff1a; router&#xff1a;router是Vue Router的一个实例对象&#xff0c;它是全局的。通过Vue.use(VueRouter)和Vue…

RocketMQ重复消费的幂等性问题

什么是幂等性&#xff1f;----》多次调用接口&#xff0c;得到的结果都一样。 用幂等性来解决重复消费的问题。 重复消费可以解决吗-----》重复消费根部避免不了。只能从消息的幂等消费入手。 为什么会有重复消费&#xff1f; 由于我们要求RocketMQ消息不丢失&#xff0c;要…

前端传String字符串 后端使用enun枚举类出现错误

情况 前端 String 后端 enum 前端 后端 报错 2024-05-31T21:47:40.61808:00 WARN 21360 --- [nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to con…

多态的一些问题

&#x1f3f7;️ 问答题&#xff1a; 1. 什么是多态&#xff1f; 多态&#xff08;Polymorphism&#xff09;是面向对象编程中的一个重要概念&#xff0c;指的是同一操作作用于不同对象时&#xff0c;可以表现出不同的行为方式。多态性允许不同类型的对象以统一的接口进行操作…

tomlkit mypy error: Value of type “Item | Container“ is not indexable [index]

使用tomlkit进行TOML文件的读写时&#xff0c;mypy静态检查报错如下&#xff1a; demo.py:5: error: Value of type "Item | Container" is not indexable [index]poetry_conf doc[tool][poetry]^~~~~~~~~~~~~~~~~~~~~ demo.py:7: error: Unsupported target for …

香港服务器无法访问是什么情况?

香港服务器无法访问是什么情况?简单来说&#xff0c;这意味着香港服务器没有响应请求&#xff0c;客户端无法访问。此错误可能由于多种原因而发生&#xff0c;包括网络连接问题、服务器停机、防火墙限制和 DNS 错误。当发生服务器无法访问错误时&#xff0c;它会影响您网站的性…

OncePerRequestFilter 和 GenericFilterBean比较

OncePerRequestFilter 和 GenericFilterBean 都是Spring框架提供的用于构建自定义Servlet过滤器&#xff08;Filter&#xff09;的基类&#xff0c;它们主要用于处理Web请求的拦截和处理逻辑。以下是它们各自的详细说明&#xff1a; GenericFilterBean 类描述&#xff1a;Gen…

Qt for android : libusb在android中使用

简介 如何在Qt for Android中使用libusb&#xff0c; 其实libusb的文档里面都写的很清楚&#xff0c; 这里只是稍微做下整理。 libusb libusb github源码 libusb release的版本, 有编译好的静态 步骤 1. 下载libusb libusb v1.0.027 源码包 2. 整理提取libusb android使用源…

Docker 私有仓库部署和管理

目录 一、案例一 概述 二、案例一 前置知识点 2.1、什么是 Docker Compose 2.2、什么是 Consul 三、案例一 使用 docker Compose 搭建 Consul 集群环境 3.1、案例实验环境 3.2、案例需求 四、案例实施 4.1、Docker 网络通信 1&#xff09;端口映射 2&#xf…

运筹学_3.运输问题(特殊的线性规划)

目录 前言3.1 平衡运输问题中初始基可行解确定运输问题平衡运输与非平衡运输平衡运输问题的数学模型单纯形法解决平衡运输问题&#xff0c;初始可行基的确认 3.2 平衡运输问题的最优解判别求检验数表上作业法 3.3 产销不平衡的运输问题运输问题中产大于销的问题运输问题中产小于…

【MySQL访问】

文章目录 一、C远程连接到MySQLmysql_init()函数mysql_real_connect&#xff08;&#xff09;函数实战案例 二、处理查询select的细节mysql_store_result()函数获取结果行和列获取select结果获取行内容获取列属性 三、MySQL图形化界面连接 关于动态链接&#xff0c;请看这篇文章…

Nginx 实战-02-nginx proxy_pass 服务代理访问 使用笔记 ubuntu nodejs

前言 大家好&#xff0c;我是老马。很高兴遇到你。 我们为 java 开发者实现了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何处理的&#xff0c;可以参考我的另一个项目&#xff1a; 手写从零实现简易版 tomcat minicat 手写 nginx 系列 …