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

news2024/11/24 12:38:45

控制障碍函数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**2
    f = 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'])**2
    dV = 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 program
    H_ = 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 format
    P = matrix(H_)
    q = matrix(f_)
    G = matrix(A_)
    h = matrix(b_)

    # Solve QP problem using cvxopt
    sol = solvers.qp(P, q, G, h)
    u_opt = sol['x'][0] # Second term is the slack variable

    dx = f + g * u_opt
    x_n = x + dx * dt

    # Save data
    u[i, 0] = u_opt
    if 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.coloradmin.cn/o/1718395.html

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

相关文章

[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…

字符串匹配算法(二)BM算法

文章目录 算法简介坏字符规则坏字符的定义坏字符的移动 好后缀规则好后缀的定义好后缀的移动 算法实现 算法简介 BM算法也就是Boyer Moore算法&#xff0c;它是一种非常高效的字符串匹配算法&#xff0c;是一种滑动算法。什么是滑动&#xff1f; 下面例子中&#xff0c;主串中…

vcruntime140_1.dll在哪个文件夹?详细修复vcruntime140_1.dll缺失的方法

vcruntime140_1.dll文件是什么&#xff1f;相信很多人都对它很陌生吧&#xff1f;毕竟大部分人对于dll文件还是了解得太少了&#xff0c;当突发情况出现vcruntime140_1.dll文件丢失&#xff1f;你要怎么办&#xff1f;不要担心&#xff0c;下面我们就来给大家详细的讲解一下修复…

出吉林大学计算机考研资料适用于计专966/计学941/软专967

本人是24上岸吉大计算机专硕的考生&#xff0c;先上成绩&#xff1a; 出专业课备考过程的相关笔记资料&#xff0c;也可以提供经验分享等&#xff1a; 吉林大学计算机数据结构基础算法ADL汇总&#xff0c;适用于计专966/计学941/软专967综合整理小绿书以及期末题上重难点算法…

LLVM入门教学——Code Coverage插桩

1、简介 LLVM的Code Coverage工具集提供了一系列工具和库&#xff0c;帮助开发者收集和分析代码覆盖率数据&#xff0c;从而评估测试的有效性和代码的执行情况。LLVM的Code Coverage工具集包括以下主要组件&#xff1a; Clang编译器&#xff1a;用于编译源代码并生成覆盖率信息…

Linux下配置Pytorch

1.Anaconda 1.1虚拟环境创建 2.Nvidia驱动 3.CUDA驱动安装 4.Pytorch安装 具体的步骤如上&#xff1a;可参考另一位博主的博客非常详细&#xff1a; Linux服务器配置PythonPyTorchCUDA深度学习环境_linux cuda环境配置-CSDN博客https://blog.csdn.net/NSJim/article/detai…

官方小游戏项目

一 项目原理&#xff1a;看广告&#xff0c;操作简单&#xff0c;时间自由&#xff0c;适合利用业余时间来做&#xff0c;一个广告大概在15s-30s之间。 二 介绍&#xff1a;给你开代理权限&#xff0c;你就有独立后台管理系统&#xff0c;监测每台手机每条广告的情况&#xff0…

探索Web3工具:正确使用区块链平台工具的秘诀

在当今日新月异的数字时代&#xff0c;区块链技术正以惊人的速度改变着我们的生活和工作方式。尤其对于那些想要踏入区块链世界的人来说&#xff0c;正确使用区块链平台工具至关重要。本文将向您介绍一些关键的Web3工具&#xff0c;并以TestnetX.com为例&#xff0c;展示如何利…

第七在线惊艳亮相第11届奥莱峰会,AI驱动零售供应链升级

2024年5月22-24日&#xff0c;第11届奥莱领秀峰会暨2024奥莱产业经济论坛在南京盛大举行。论坛上&#xff0c;智能商品计划管理系统服务商第七在线凭借富有前瞻性的AI技术&#xff0c;引领零售供应链迈入全新升级阶段&#xff0c;赢得了与会嘉宾的广泛关注与赞誉。 峰会由中国奥…

《Kubernetes部署篇:基于麒麟V10+ARM64架构部署harbor v2.4.0镜像仓库》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;企业级K8s集群运维实战 一、环境信息 K8S版本 操作系统 CPU架构 服务版本 1.26.15 Kylin Linux Advanced Server V10 ARM64 harbor v2.4.0 二、部…

使用element的小弹框并修改css

使用el-popover来做弹框&#xff1a; 滑动或点击元素要加插槽slot"reference"来展示弹框&#xff1b; <el-popoverplacement"top"width"166"trigger"hover"popper-class"popover"><div><div><div>…

安装 Android Studio 2024.1.1.6(Koala SDK35)和过程问题解决

记录更新Android Studio版本及适配Android V应用配置的一些过程问题。 安装包&#xff1a;android-studio-2024.1.1.6-windows.exe原版本&#xff1a;Android Studio23.2.1.23 Koala 安装过程 Uninstall old version 不会删除原本配置&#xff08;左下角提示&#xff09; Un…

配置华为路由器通过RADIUS对接安当ASP身份认证服务器以实现上网功能解决方案

当配置华为路由器通过RADIUS对接安当ASP身份认证服务器以实现上网功能时&#xff0c;以下是一个更详细的解决方案&#xff1a; 一、前期准备 1. 确认网络环境&#xff1a; 确保华为路由器与安当ASP身份认证服务器之间的网络连接稳定可靠。确定RADIUS协议所需的端口&#xff08…

博客星球大冒险:用Spring Boot和JWT打造你的数字王国

揭秘如何在Spring Boot中无缝集成JWT&#xff0c;为你的应用打造一个高度可扩展且安全的认证系统。从添加依赖到创建JWT过滤器&#xff0c;再到实现令牌的有效性管理和刷新机制&#xff0c;每一步都精心设计&#xff0c;确保你的乐园能够迎接成千上万的游客&#xff01; 文章目…

HOW - BFF 服务实践系列(一)

目录 一、BFF 介绍1.1 BFF 的概念1.2 为什么需要 BFF1.3 举例说明 二、适用于Web前端的BFF应该提供哪些能力2.1 接口聚合&#xff08;重要&#xff09;2.2 简化和优化的API2.3 安全和身份验证&#xff08;重要&#xff09;2.4 缓存机制2.5 错误处理和重试机制2.6 数据格式转换2…

Nvidia Orin/Jetson +GMSL/RLINC/VbyOne/FPDLink 同轴AI多相机同步车载视觉解决方案

在本次演讲中&#xff0c;介绍了多相机同步技术在自主机器中的应用情况&#xff0c;围绕无人配送小车、控制器视觉传感器方案升级、人形机器人三个典型案例中如何为客户提供高效的多相机同步解决方案进行了详细的讲解&#xff0c;并进一步介绍如何通过创新的多相机同步技术&…

掌控未来,爱普生SR3225SAA用于汽车钥匙、射频电路的智慧引擎

为了响应市场需求&#xff0c;Epson使用独家QMEMS*2技术所生产的石英振荡器&#xff0c;与其精巧的半导体技术所制造的射频传输器电路&#xff0c;开发了SR3225SAA。不仅内建的石英震荡器之频率误差仅有2 ppm&#xff0c;更使其封装尺寸达仅3.2 mm x 2.5 mm&#xff0c;为客户大…

Maven简介和快速入门

1.1Maven介绍 Maven – Introduction (apache.org) Maven就是一个软件&#xff0c;掌握软件安装、配置、以及基本功能&#xff08;项目构建、依赖管理&#xff09;。 1.2Maven主要作用 1.依赖管理&#xff1a; Maven 可以管理项目的依赖&#xff0c;包括自动下载所需依赖库、…

Aigtek功率放大器的主要性能要求有哪些

功率放大器是电子系统中的重要组件&#xff0c;用于将低功率信号放大到高功率水平。功率放大器的性能直接影响到信号的放大质量和系统的整体性能。下面西安安泰将介绍功率放大器的主要性能要求。 增益&#xff1a;功率放大器应当具有足够的增益&#xff0c;即将输入信号的幅度放…

机器人控制系列教程之D-H参数建模法

机器人运动学的研究依赖于机器人的模型的建立&#xff0c;目前较为多见的两种方法分别是Denavit-Hartenberg建模法&#xff08;简称&#xff1a;D-H建模法&#xff09;。该方法时由Denavit和Hartenberg于19955年提出的一种为关节链中的每一个杆件建立一个坐标系的矩阵方法&…