贝塞尔曲线与B样条曲线

B-spline and Bezier Curve

介绍一下robotics运动规划方向的B样条曲线与贝塞尔曲线相关知识。

0728:TODO,节点向量如何得到?

  • 贝塞尔曲线,B-样条,非均匀有理B样条梳理
  • 曲线篇: 贝塞尔曲线
  • Animated Bézier Curves
  • Bézier curve Wikipedia,建议看维基百科上的图片
  • 详解样条曲线(上)(包含贝塞尔曲线)

1. Bezier, 贝塞尔曲线

Bézier curves can be used in robotics to produce trajectories of an end-effector due to the virtue of the control polygon’s ability to give a clear indication of whether the path is colliding with any nearby obstacle or object.[30] Furthermore, joint space trajectories can be accurately differentiated using Bézier curves. Consequently, the derivatives of joint space trajectories are used in the calculation of the dynamics and control effort (torque profiles) of the robotic manipulator.[30]

1.1 贝塞尔曲线的定义

m m m次贝塞尔曲线定义为:
b ( u ) = ∑ j = 0 m B j m ( u ) p j 0 ≤ u ≤ 1 {\bf b}(u) = \sum_{j=0}^{m}B_j^m(u){\bf p}_j \quad 0 \leq u \leq 1 b(u)=j=0mBjm(u)pj0u1

其中, p j {\bf p}_j pj 为控制点,基函数 B j m ( u ) B_j^m(u) Bjm(u) m m m伯恩斯坦多项式,定义为:

B j m ( u ) = m ! j ! ( m − j ) ! u j ( 1 − u ) m − j B_j^m(u)=\frac{m!}{j!(m-j)!}u^j(1-u)^{m-j} Bjm(u)=j!(mj)!m!uj(1u)mj

j = 0 , . . . , m j=0,...,m j=0,...,m,给定 m + 1 m+1 m+1个控制点,得到 m m m阶贝塞尔曲线;贝塞尔曲线的阶数与控制点的个数相关。

下图为四个控制点情况下的Cubic Bezier curve:

贝塞尔曲线与贝兹多边形

1.2 贝塞尔曲线的导数

m m m次贝塞尔曲线的导数 m − 1 m-1 m1次贝塞尔曲线,定义为:
b ( 1 ) ( u ) = m ∑ i = 0 m − 1 B i m − 1 ( u ) ( p i + 1 − p i ) {\bf b}^{(1)}(u)=m\sum_{i=0}^{m-1}B_i^{m-1}(u)({\bf p}_{i+1}-{\bf p}_i) b(1)(u)=mi=0m1Bim1(u)(pi+1pi)

特别地,贝塞尔曲线端点处的 k k k阶导数只取决于此端点前的 k + 1 k+1 k+1个控制点,如端点处的一阶导数为:

p ( 1 ) ( 0 ) = m ( p 1 − p 0 ) , p ( 1 ) ( 1 ) = m ( p m − p m − 1 ) {\bf p}^{(1)}(0)=m({\bf p}_1 - {\bf p}_0), \quad {\bf p}^{(1)}(1)=m({\bf p_m}-{\bf p}_{m-1}) p(1)(0)=m(p1p0),p(1)(1)=m(pmpm1)

端点处的二阶导数为:

p ( 2 ) ( 0 ) = m ( m − 1 ) ( p 0 − 2 p 1 + p 2 ) , p ( 2 ) ( 1 ) = m ( m − 1 ) ( p m − 2 p m − 1 + p m − 2 ) {\bf p}^{(2)}(0)=m(m-1)({\bf p}_0 - 2{\bf p}_1 + {\bf p}_2), \quad {\bf p}^{(2)}(1)=m(m-1)({\bf p}_m - 2{\bf p}_{m-1} + {\bf p}_{m-2}) p(2)(0)=m(m1)(p02p1+p2),p(2)(1)=m(m1)(pm2pm1+pm2)

其余各阶导数也可以由上式推出。

1.3 贝塞尔曲线的性质

贝塞尔曲线的性质有:

  • 凸包特性:由控制点构成的控制多边形逼近样条曲线的形状,曲线完全包含在其控制点形成的凸包中
  • 终点插值特性:即一段贝塞尔曲线初始于第0个控制点,终止于第m个也就是最后一个控制点,并且不会经过其他控制点(除非所有控制点共线),公式表示为 p 0 = b ( 0 ) {\bf p}_0={\bf b}(0) p0=b(0) p m = b ( 1 ) {\bf p}_m={\bf b}(1) pm=b(1)
  • 固定时间间隔特性:每一条贝塞尔曲线总是定义在固定时间间隔 t ∈ [ 0 , 1 ] t\in[0,1] t[0,1]
  • p 0 {\bf p}_0 p0处的切线方向平行于 p 0 {\bf p}_0 p0 p 1 {\bf p}_1 p1连线的方向, p m {\bf p}_m pm处的切线方向平行于 p m {\bf p}_m pm p m − 1 {\bf p}_{m-1} pm1连线的方向
  • 速端曲线(Hodograph):贝塞尔曲线对时间的一阶微分得到的仍然是贝塞尔曲线,新的控制点可以有原始曲线的控制点表示, p i ( 1 ) = m ( p i + 1 − p i ) {\bf p}^{(1)}_i=m({\bf p}_{i+1}-{\bf p}_i) pi(1)=m(pi+1pi);注,速端曲线代表物体的向量运动

1.4 贝塞尔曲线与多项式的转换

贝塞尔曲线与标准多项式的转换
b ( u ) = ∑ i = 0 m a i u i {\bf b}(u)=\sum_{i=0}^{m}{\bf a}_i u^i b(u)=i=0maiui
其中,系数 a i {\bf a}_i ai为:

a i = m ! ( m − i ) ! ∑ j = 0 i ( − 1 ) i + j j ! ( i − j ) ! p j {\bf a}_i=\frac{m!}{(m-i)!}\sum_{j=0}^{i}\frac{(-1)^{i+j}}{j!(i-j)!}{\bf p}_j ai=(mi)!m!j=0ij!(ij)!(1)i+jpj

例, m = 3 m=3 m=3时,贝塞尔曲线的形式为:
b ( u ) = ( 1 − u ) 3 p 0 + 3 u ( 1 − u ) 2 p 1 + 3 u 2 ( 1 − u ) p 2 + u 3 p 3 {\bf b}(u)=(1-u)^3{\bf p}_0+3u(1-u)^2{\bf p}_1+3u^2(1-u){\bf p}_2+u^3{\bf p}_3 b(u)=(1u)3p0+3u(1u)2p1+3u2(1u)p2+u3p3

2. B-Spline B样条函数

样条曲线为分段多项式函数,一种有效计算样条的方法是基于B样条,也就是基础样条;这个名称的又来是因为一般样条可通过适量的B样条基函数 [ B j p ( u ) ] [B_j^p(u)] [Bjp(u)]的线性组合获得,即:
s ( u ) = ∑ j = 0 m p j B j p ( u ) u m i n ≤ u ≤ u m a x {\bf s}(u)=\sum_{j=0}^m{\bf p}_jB_j^p(u) \quad u_{min}\leq u\leq u_{max} s(u)=j=0mpjBjp(u)uminuumax
其中,系数 p j ( j = 0 , . . . , m ) {\bf p}_j(j=0,...,m) pj(j=0,...,m) 称为控制点,在运动规划中,这些控制点一般由前端搜索得到。其定义与贝塞尔曲线的定义基本一致,B样条曲线是贝塞尔曲线的一般化,不同之处在于当有 m + 1 m+1 m+1个控制点时,贝塞尔曲线为 m m m次,而B样条曲线为 [ 2 , m ] [2,m] [2,m]次。

2.1 B样条基函数

u = [ u 0 , . . . , u n − k n o t ] {\bf u}=[u_0, ..., u_{n-knot}] u=[u0,...,unknot]为节点向量(注意,此处为节点向量而不是控制点,控制点使用 p p p定义),且 u {\bf u} u不递减, u j ≤ u j + 1 u_j \leq u_{j+1} ujuj+1,(可以想到,这样的节点向量,或参数向量设计,与实际中的时间不谋而合,因此也可以利用B样条的这一特点进行时间分配)则第 j j j个控制点的 p p p次B样条函数的递归形式如下:
B j 0 ( u ) = { 1 , u j ≤ u ≤ u j + 1 0 , e l s e B_j^0(u)=\begin{cases}1, \quad u_j \leq u\leq u_{j+1}\\ 0, \quad {\text else} \end{cases} Bj0(u)={1,ujuuj+10,else

B j p ( u ) = u − u j u j + p − u j B j p − 1 ( u ) + u j + p + 1 − u u j + p + 1 − u j + 1 B j + 1 p − 1 ( u ) B_j^p(u)=\frac{u-u_j}{u_{j+p}-u_j}B_j^{p-1}(u)+\frac{u_{j+p+1}-u}{u_{j+p+1}-u_{j+1}}B_{j+1}^{p-1}(u) Bjp(u)=uj+pujuujBjp1(u)+uj+p+1uj+1uj+p+1uBj+1p1(u)

其中:

  • (1) B j p ( u ) B_j^p(u) Bjp(u)是分段多项式,其中$\forall u\in [u_{min},u_{max}] ,且 ,且 ,且B_j^p(u)$非负
  • (2) 在区间 u ∈ [ u j , u j + p + 1 ) u\in[u_j,u_{j+p+1}) u[uj,uj+p+1)之外, B j p ( u ) = 0 B_j^p(u)=0 Bjp(u)=0;也就是说,调整 B j p ( u ) B_j^p(u) Bjp(u),其影响仅产生在对应的区间上,而不会对全局空间造成影响,可以称为局部支撑作用,这对轨迹replan有很大帮助
  • (3) 区间 [ u i , u i + 1 ) [u_i,u_{i+1}) [ui,ui+1)称为第 i i i节点区间,区间长度可能为0,此时区间重合;这是因为节点 u u u有可能是相同的值,而断点则一定是不同的值,断点是一组不同的节点值

(4) B样条基函数归一化如下(权和性,权重的和为1):

∑ j = 0 m B j p ( u ) = 1 , ∀ u ∈ [ u 0 , u n k n o t ] \sum_{j=0}^{m}B_j^p(u)=1, \quad \forall u \in [u_0, u_{n_{knot}}] j=0mBjp(u)=1,u[u0,unknot]

(5) 在每个节点区间 [ u i , u i + 1 ) [u_i,u_{i+1}) [ui,ui+1)内,最多 p + 1 p+1 p+1个基函数 B j p B_j^p Bjp不为零,即 B i − p p , . . . , B i p B_{i-p}^p,...,B_i^p Bipp,...,Bip不为零;

可以看出,任何一个基函数,追根溯源的最底层都是 B j 0 B_j^0 Bj0,非1即0;之后再经过截断三角形的传播,得到最后的基函数;当然,任意一个基函数只有在其对应的有定义域的区间才有意义,否则为零。

一个简单的截断三角形构造如下:
B 0 0 B 0 1 B 1 0 B 0 2 B 1 1 B 0 3 B 0 2 B 1 2 B 0 4 B 2 1 B 1 3 B 0 3 B 2 2 B 3 1 B 0 4 \begin{matrix} B_0^0\\ &B_0^1\\ B_1^0 & & B_0^2\\ & B_1^1 & &B_0^3\\ B_0^2 & & B_1^2 & & B_0^4\\ & B_2^1 & & B_1^3\\ B_0^3 & & B_2^2\\ & B_3^1\\ B_0^4 \end{matrix} B00B10B02B03B04B01B11B21B31B02B12B22B03B13B04
由左至右,根据三角形位置和迭代公式求得每一个基函数的表达式(或值)。

2.2 B样条的定义和性质

假设B样条是由非均匀节点向量(大小为 n k n o t n_{knot} nknot)定义的:

u = [ u m i n , . . . , u m i n , u p + 1 , . . . , u n k n o t − p − 1 , u m a x , . . . , u m a x ] {\bf u}=[u_{min},...,u_{min},u_{p+1},...,u_{n_{knot}-p-1},u_{max},...,u_{max}] u=[umin,...,umin,up+1,...,unknotp1,umax,...,umax]

p + 1 p+1 p+1 u m i n u_{min} umin u m a x u_{max} umax,则 p p p次B样条曲线定义为:

s ( u ) = ∑ j = 0 m p j B j p ( u ) {\bf s}(u)=\sum_{j=0}^m {\bf p}_jB_j^p(u) s(u)=j=0mpjBjp(u)

其中, p j ( j = 0 , . . . , m ) {\bf p}_j(j=0,...,m) pj(j=0,...,m)为控制点,控制点组成了控制多边形,因此,要表示一条B样条曲线,需要有:

  • B样条曲线次数,整数 p p p,(不是阶数)
  • 节点向量 u \bf u u
  • s ( u ) {\bf s}(u) s(u)的系数,控制点 P = [ p 0 , p 1 , . . . , p m − 1 , p m ] {\bf P}=[{\bf p}_0, {\bf p}_1,...,{\bf p}_{m-1},{\bf p}_m] P=[p0,p1,...,pm1,pm]

所以对于 m + 1 m+1 m+1个控制点,其 p p p次B样条曲线所需的节点向量个数为 1 + m + p 1+m+p 1+m+p个,会将区间划分成 m + p m+p m+p段。

n k n o t = 1 + m + p n_{knot}=1+m+p nknot=1+m+p

即样条曲线的次数 p p p,控制点的数量 m + 1 m+1 m+1与节点的数量 n k n o t + 1 n_{knot}+1 nknot+1之间存在上述关系。注意,样条的阶数=次数+1

B样条曲线有利于生成轨迹,其性质有:

  • s ( u ) {\bf s}(u) s(u)在节点区间内是无限可微的,且在多重节点 k k k p − k p-k pk次连续可微
  • 样条曲线的次数 p p p,控制点的数量 m + 1 m+1 m+1与节点的数量 n k n o t + 1 n_{knot}+1 nknot+1之间存在 n k n o t = 1 + m + p n_{knot}=1+m+p nknot=1+m+p
  • 端点插值特性: s ( u m i n ) = p 0 {\bf s}(u_{min})={\bf p}_0 s(umin)=p0 s ( u m a x ) = p m {\bf s}(u_{max})={\bf p}_m s(umax)=pm
  • 该曲线在仿射变换(平移,旋转,缩放,剪切)下不变,可以通过将其应用于控制点来应用于 s ( u ) {\bf s}(u) s(u)
  • 局部修改:控制点 p j {\bf p}_j pj的变化只在区间 [ u j , u j + p + 1 ] [u_j,u_{j+p+1}] [uj,uj+p+1]上修改 s ( u ) {\bf s}(u) s(u)
  • 通过在节点处使用变换,B样条曲线可以实时缩放;如果假设有 u ′ = λ u {\bf u'}=\lambda {\bf u} u=λu,则该 u ′ {\bf u'} u的B样条的 i i i次导数将被缩放为 1 / λ i 1/\lambda^i 1/λi;若 λ = 2 \lambda=2 λ=2,则新B样条的速度是原始样条的 1 / 2 1/2 1/2,加速度是原始样条的 1 / 4 1/4 1/4

2.3 B样条曲线的导数

有B样条曲线 s ( u ) {\bf s}(u) s(u)的非均匀节点向量:

u = [ u m i n , . . . , u m i n , u p + 1 , . . . , u n k n o t − p − 1 , u m a x , . . . , u m a x ] {\bf u}=[u_{min},...,u_{min},u_{p+1},...,u_{n_{knot}-p-1},u_{max},...,u_{max}] u=[umin,...,umin,up+1,...,unknotp1,umax,...,umax]

其一阶导数,即对时间取一次微分为:

s ( 1 ) ( u ) = ∑ j = 0 m B j p ( 1 ) ( u ) p j u ∈ [ u m i n , u m a x ] {\bf s}^{(1)}(u)=\sum_{j=0}^{m}B_j^{p(1)}(u){\bf p}_j \quad u\in[u_{min}, u_{max}] s(1)(u)=j=0mBjp(1)(u)pju[umin,umax]

其中,B样条基函数的一阶导数为:

B j p ( 1 ) ( u ) = p u j + p − u j B j p − 1 ( u ) − p u j + p + 1 − u j + 1 B j + 1 p − 1 ( u ) B_j^{p(1)}(u)=\frac{p}{u_{j+p}-u_j}B_j^{p-1}(u)-\frac{p}{u_{j+p+1}-u_{j+1}}B_{j+1}^{p-1}(u) Bjp(1)(u)=uj+pujpBjp1(u)uj+p+1uj+1pBj+1p1(u)

求一次导之后新的节点向量为:

u ′ = [ u m i n , . . . , u m i n , u p + 1 , . . . , u n k n o t − p − 1 , u m a x , . . . , u m a x ] {\bf u'}=[u_{min},...,u_{min},u_{p+1},...,u_{n_{knot}-p-1},u_{max},...,u_{max}] u=[umin,...,umin,up+1,...,unknotp1,umax,...,umax]

与求导之前不同的是, u m i n u_{min} umin u m a x u_{max} umax在节点向量中的个数均由 p + 1 p+1 p+1变为 p p p个。

同时,控制点 q j {\bf q}_j qj也需要更新为:

q j = p p j + 1 − p j u j + p + 1 − u j + 1 {\bf q}_j=p \frac{{\bf p}_{j+1}-{\bf p}_j}{u_{j+p+1}-u_{j+1}} qj=puj+p+1uj+1pj+1pj

2.4 B样条曲线的求解

对于某固定值的自变量 u ˉ \bar u uˉ,可以通过仅考虑在包含其的第 i i i个节点区间,计算不为零的 p + 1 p+1 p+1个基函数,来计算B样条曲线。
s ( u ˉ ) = ∑ j = i − p i p j B j p ( u ˉ ) {\bf s}(\bar u)=\sum_{j=i-p}^{i}{\bf p}_jB_j^p(\bar u) s(uˉ)=j=ipipjBjp(uˉ)

  • 找到 u ˉ \bar u uˉ所属的区间索引 i i i,即 [ u i , u i + 1 ) [u_i,u_{i+1}) [ui,ui+1)
  • 给定 i i i,计算 u ˉ \bar u uˉ处的基函数
  • 通过上式计算 s ( u ˉ ) {\bf s}(\bar u) s(uˉ)

一道求解的例题

现有 m + 1 = 7 m+1=7 m+1=7个控制点, n k n o t + 1 = 11 n_{knot}+1=11 nknot+1=11个节点向量,且 u = 1.5 u=1.5 u=1.5,求其基函数。

P = [ p 0 , . . . , p m ] = [ 1 2 3 4 5 6 7 2 3 − 3 4 5 − 5 − 6 ] {\bf P}=[{\bf p_0},...,{\bf p}_m]=\begin{bmatrix} 1 & 2 & 3 & 4 & 5 & 6 & 7\\ 2 & 3 & -3 & 4 & 5 & -5 & -6 \end{bmatrix} P=[p0,...,pm]=[12233344556576]

节点向量 u = [ 0 , 0 , 0 , 0 , 1 , 2 , 4 , 7 , 7 , 7 , 7 ] {\bf u}=[0,0,0,0,1,2,4,7,7,7,7] u=[0,0,0,0,1,2,4,7,7,7,7],已知 u = 1.5 u=1.5 u=1.5,首先判断出其所属区间为 [ 1 , 2 ) [1,2) [1,2),即 [ u 4 , u 5 ) [u_4,u_5) [u4,u5)

由于 B 7 3 ( u ) B_7^3(u) B73(u) [ u 7 , u 11 ] [u_7, u_{11}] [u7,u11]以为为0,且 u 11 u_{11} u11已经不存在,因此只需考虑 B j 3 ( u ) B_j^3(u) Bj3(u) j = 0 , . . . , 6 j=0,...,6 j=0,...,6

对于 B 0 3 ( u ) B_0^3(u) B03(u),其在 [ u 0 , u 4 ) [u_0,u_4) [u0,u4)以外的区域为0,因此不做考虑, B 6 3 ( u ) B_6^3(u) B63(u)同理;

因此只需计算 B j 3 ( u ) B_j^3(u) Bj3(u) j = 1 , 2 , 3 , 4 j=1,2,3,4 j=1,2,3,4

对于 B 1 3 ( u ) B_1^3(u) B13(u),根据截断三角形,需要从 B 1 0 B_1^0 B10 B 4 0 B_4^0 B40开始从左向右计算;这四个基函数中仅 B 4 0 ( u ) B_4^0(u) B40(u) [ u 4 , u 5 ) [u_4,u_5) [u4,u5)上为1,其余全为0;

进而计算 B 3 1 ( u ) B_3^1(u) B31(u)
B 3 1 ( u ) = 0 + u 5 − u u 5 − u 4 B 4 0 ( u ) = 2 − u B_3^1(u)=0+\frac{u_5-u}{u_5-u_4}B_4^0(u)=2-u B31(u)=0+u5u4u5uB40(u)=2u
继续递归,计算 B 2 2 ( u ) B_2^2(u) B22(u)
B 2 2 ( u ) = 0 + u 5 − u u 5 − u 3 B 3 1 ( u ) = ( 2 − u ) 2 2 B_2^2(u)=0+\frac{u_5-u}{u_5-u_3}B_3^1(u)=\frac{(2-u)^2}{2} B22(u)=0+u5u3u5uB31(u)=2(2u)2
继续递归,计算 B 1 3 ( u ) B_1^3(u) B13(u)
B 1 3 ( u ) = 0 + u 5 − u u 5 − u 2 B 2 2 ( u ) = ( 2 − u ) 3 4 B_1^3(u)=0+\frac{u_5-u}{u_5-u_2}B_2^2(u)=\frac{(2-u)^3}{4} B13(u)=0+u5u2u5uB22(u)=4(2u)3
代入得到 B 1 3 = 0.0313 , B 2 3 = 0.5885 , B 3 3 = 0.3733 , B 4 3 = 0.0069 B_1^3=0.0313,B_2^3=0.5885,B_3^3=0.3733,B_4^3=0.0069 B13=0.0313,B23=0.5885,B33=0.3733,B43=0.0069,代入下式:
s ( u ) = ∑ j = 0 m p j B j p ( u ) {\bf s}(u)=\sum_{j=0}^m {\bf p}_jB_j^p(u) s(u)=j=0mpjBjp(u)
得到 s ( u = 1.5 ) = [ 3.3245 , − 0.1753 ] {\bf s}(u=1.5)=[3.3245,-0.1753] s(u=1.5)=[3.3245,0.1753];如果将 u u u看作时间,则该点即为时间为1.5时,轨迹的位置。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

gin框架内容(三)--中间件

gin框架内容(三)--中间件 Gin框架允许开发者在处理请求的过程中,加入用户自己的函数。这个函数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登录认证、权限校验、数据分页、记录日志、耗时统计等 即比如&#x…

【牛客面试必刷TOP101】Day1.反转链表和合并两个排序的链表

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:牛客面试必刷TOP101 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!&…

【Ansible】Ansible自动化运维工具的应用与常用命令

ansible自动化运维工具 一、ansible 的概述1. ansible 的概念2. ansible 的特性 二、ansible 的部署与命令1. ansible 的部署1.1 服务器ip地址设置1.2 ansible 服务器部署 2. ansible 命令行模块2.1 command 模块2.2 shell 模块2.3 cron 模块2.4 user 模块2.5 group 模块2.6 co…

财报解读:新鲜感褪去后,微软直面AI的骨感现实?

微软交出了一份远观尚可,但近看承压的“答卷”。 北京时间2023年7月26日,微软披露了2023财年第四财季及全年财报。受生产力和业务流程部门和智能云部门等业务带动,微软第四财季营收561.89亿美元,同比增长8%;净利润200…

【iOS】—— 持久化

文章目录 数据持久化的目的iOS中数据持久化方案数据持久化方式分类内存缓存磁盘缓存 沙盒机制获取应用程序的沙盒路径沙盒目录的获取方式 持久化数据存储方式XML属性列表Preferences偏好设置(UserDefaults)数据库存储什么是序列化和反序列化,…

TypeError: Failed to fetch dynamically imported module

浏览器报了如下错误: vue文件如下: 错误出现的原因是因为导入的是路径,vue会在该路径下的文件夹搜索所有文件,但是没有找到对应的组件,但是浏览器并不会直接禁止访问,而是在控制台报错,解决办法…

【雕爷学编程】Arduino动手做(174)---Sensor Shield V5.0传感器扩展板

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

k8s证书过期

k8s证书过期 [rootk8s-master102 ~]# kubectl get pod -A Unable to connect to the server: x509: certificate has expired or is not yet valid: current time 2023-07-25T15:14:0008:00 is after 2023-07-24T16:25:58Z解决方案 备份 kubernetes配置 cp -r /etc/kubernet…

【Python 实战】---- 批量识别图片中的文字,存入excel中【使用百度的通用文字识别】

分析 1. 获取信息图片示例 2. 运行实例 3. 运行结果 4. 各个文件的位置 实现 1. 需求分析 识别图片中的文字【采用百度的通用文字识别】;文字筛选,按照分类获取对应的文本;采用 openpyxl 实现将数据存入 excel 中。2. 获取 access_token 获取本地缓存的

谈谈你对Synchronized关键字的理解及使用

synchronized关键字最主要的三种使用方式的总结 修饰实例方法,作用于当前对象实例加锁,进入同步代码前要获得当前对象实例的锁修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁 。也就是给当前类加锁&…

DFS之剪枝与优化--小猫爬山

思路&#xff1a;对小猫的数量和车箱数进行bfs&#xff0c;一旦小猫的数量达到n&#xff0c;就统计ans的数量&#xff0c;如果当前车的剩余重量无法再承受任意一个猫的重量&#xff0c;那么我们将车辆数1来保证小猫能够下山。 #include<bits/stdc.h> using namespace std…

芯片制造详解.净洁室的秘密.学习笔记(三)

这是芯片制造系列的第三期跟学up主三圈&#xff0c;这里对其视频内容做了一下整理和归纳&#xff0c;喜欢的可以看原视频。 芯片制造详解03&#xff1a; 洁净室的秘密&#xff5c;为何芯片厂缺人&#xff1f; 芯片制造详解.净洁室的秘密.学习笔记 三 简介一、干净的级别二、芯片…

Mybatis 新增/批量新增, 拿到返回的自增主键ID

单个新增 &#xff1a; /** * 插入菜单 * param menuInfo * return */ int insertMenuInfo(MenuInfo menuInfo); xml&#xff1a; <insert id"insertMenuInfo" parameterType"com.XXXX..MenuInfo" keyProperty"id&quo…

devops(后端)

1.前言 该devpos架构为gitlabjenkinsharbork8s&#xff0c;项目是java项目&#xff0c;流程为从gitlab拉取项目代码到jenkins&#xff0c;jenkins通过maven将项目代码打成jar包&#xff0c;通过dockerfile构建jdk环境的镜像并把jar包放到镜像中启动&#xff0c;构建好的镜像通…

系统集成项目管理工程师挣值分析笔记大全

系统集成项目管理工程师挣值分析笔记大全 挣值分析是一种项目管理技术&#xff0c;用于量化和监控项目绩效。它通过比较计划值&#xff08;PV&#xff09;、实际成本&#xff08;AC&#xff09;和挣值&#xff08;EV&#xff09;三个参数来评估项目的进展情况和成本绩效。 挣值…

flex布局进阶

推荐看一下阮一峰老师的flex布局博客【Flex 布局教程&#xff1a;语法篇】(https://www.ruanyifeng.com/blog/2015/07/flex-grammar.html#)&#xff0c;讲的非常清晰。 一、多行布局大小相同的子盒子技巧 使用弹性布局实现多行均匀布局时&#xff0c;如若子盒子数量不能被每行…

flutter开发实战-父子Widget组件调用方法

flutter开发实战-父子Widget组件调用方法 在最近开发中遇到了需要父组件调用子组件方法&#xff0c;子组件调用父组件的方法。这里记录一下方案。 一、使用GlobalKey 父组件使用globalKey.currentState调用子组件具体方法&#xff0c;子组件通过方法回调callback方法调用父组…

项目报错clone2.weekday is not a fuction

ant-design-vue中的dayjs版本和我项目中的dayjs版本不一样 项目中的dayjs版本号 ant-design-vue中的dayjs版本号"dayjs": “^1.11.9” 解决方法&#xff1a; 将项目中的版本号更新"dayjs": “^1.11.9” yarn add dayjs^1.11.9

嵌入式软件—RK3568开发环境搭建

一、RK3568 1.1 开发板特点 BSP比较大&#xff0c;对于电脑内存和存储空间要求高 1.2 BSP BSP&#xff08;Board Support Package&#xff0c;板级支持包&#xff09;&#xff0c;类似于PC系统中BIOS和驱动程序的集合&#xff0c;BSP包含的范围更广&#xff0c;除了外设驱动…

vue+ivew model框 select校验遇到的问题

iview model 点击关闭&#xff0c;校验没有通过也会关闭 解决办法&#xff1a; 第一步&#xff1a;自定义页脚内容 <div slot"footer"><Button type"primary" click"confirmCarryOver()">确认</Button><Button click&qu…