机械臂多任务逆运动学(优先级同等和存在优先级)

news2024/11/28 6:40:40

我们经常使用微分运动学来计算机器人的逆运动学,对于单个任务的机械臂的逆运动学使用的是梯度投影法:

冗余机械臂求解逆运动学解——梯度投影法

但是对于多任务的逆运动学在一般的机器人学里面很少有提及,最近看到了相关的论述,于是做一下笔记整理一下。

前置说明

设共有 n t n_t nt个任务,对于每个任务 t a s k i task_i taski我们可以给出其雅克比矩阵和期望的速度的表示:

t a s k i : = { J i , w i ∗ } . \begin{align} {task}_{i}: & = \left\{\mathbf{J}_{i}, \mathbf{w}_{i}^{*}\right\} . \end{align} taski:={Ji,wi}.

我们怎么计算这里的逆运动学呢?即根据一系列的 w i \mathbf{w}_i wi来计算 q ˙ \dot{\mathbf{q}} q˙呢?我们可以分为无优先级和有优先级的两种情况来考虑。

1. 多任务(优先级同等)

优先级是同等的情况下,我们可以建立关节空间( q ˙ \dot{\mathbf{q}} q˙)和操作空间( w ‾ \overline{\mathbf{w}} w)之间的映射

[ J 1 ⋮ J n t ] ⏟ J ‾ q ˙ = ( w 1 ⋮ w n t ) ⏟ w ‾ \begin{align} \underbrace{\left[\begin{array}{c} \mathbf{J}_{1} \\ \vdots \\ \mathbf{J}_{n_{t}} \end{array}\right]}_{\overline{\mathbf{J}}}\dot{\mathbf{q}} & = \underbrace{\left(\begin{array}{c} \mathbf{w}_{1}^{} \\ \vdots \\ \mathbf{w}_{n_{t}}^{} \end{array}\right)}_{\overline{\mathbf{w}}} \end{align} J J1Jnt q˙=w w1wnt
直接对上面的方程求伪逆就可以了。

q ˙ = [ J 1 ⋮ J n t ] + ⏟ J ‾ ( w 1 ∗ ⋮ w n t ∗ ) ⏟ w ‾ \begin{align} \dot{\mathbf{q}} & = \underbrace{\left[\begin{array}{c} \mathbf{J}_{1} \\ \vdots \\ \mathbf{J}_{n_{t}} \end{array}\right]^{+}}_{\overline{\mathbf{J}}} \underbrace{\left(\begin{array}{c} \mathbf{w}_{1}^{*} \\ \vdots \\ \mathbf{w}_{n_{t}}^{*} \end{array}\right)}_{\overline{\mathbf{w}}} \end{align} q˙=J J1Jnt +w w1wnt

一种排优先级的方式是引入一个权重矩阵:

J ‾ + W = ( J ‾ T W J ‾ ) − 1 J ‾ T W \begin{align} \overline{\mathbf{J}}^{+W} & = \left(\overline{\mathbf{J}}^{T} \mathbf{W} \overline{\mathbf{J}}\right)^{-1} \overline{\mathbf{J}}^{T} \mathbf{W} \end{align} J+W=(JTWJ)1JTW

其中:

W = diag ⁡ ( w 1 , … , w m ) \mathbf{W}=\operatorname{diag}\left(w_{1}, \ldots, w_{m}\right) W=diag(w1,,wm)

这等价于计算下面表达式的最小值

∥ W 1 / 2 ( w ‾ − J ‾ q ˙ ) ∥ 2 \left\|\mathbf{W}^{1 / 2}(\overline{\mathbf{w}}-\overline{\mathbf{J}} \dot{\mathbf{q}})\right\|_{2} W1/2(wJq˙) 2

对于没有优先级的情况我们可以看到上面的对角矩阵 W \mathbf{W} W的对角元都是1。

2. 多任务(存在优先级)

优先级的意思就是,我们优先保证某个任务的实现,其他任务的实现度可以相对较差。我们不妨从两个任务的情况来看。

2.1 简单案例引入:两任务情况

关于第一个任务我们有:

q ˙ = J 1 † w 1 ∗ + N 1 q ˙ 0 \begin{align} \dot{\mathbf{q}} & = \mathbf{J}_{1}^{\dagger } \mathbf{w}_{1}^{*}+\mathbf{N}_{1} \dot{\mathbf{q}}_{0} \end{align} q˙=J1w1+N1q˙0

对于第二个任务我们代入(5)式有:

w 2 = J 2 q ˙ = J 2 ( J 1 † w 1 ∗ + N 1 q ˙ 0 ) \begin{align} \mathbf{w}_{2} = \mathbf{J}_{2} \dot{\mathbf{q}} = \mathbf{J}_{2}\left(\mathbf{J}_{1}^{\dagger } \mathbf{w}_{1}^{*}+\mathbf{N}_{1} \dot{\mathbf{q}}_{0}\right) \end{align} w2=J2q˙=J2(J1w1+N1q˙0)

这样我们可以解出 q ˙ 0 \dot{\mathbf{q}}_{0} q˙0

q ˙ 0 = ( J 2 N 1 ) † ( w 2 ∗ − J 2 J 1 + w 1 ∗ ) \begin{align} \dot{\mathbf{q}}_{0} & = \left(\mathbf{J}_{2} \mathbf{N}_{1}\right)^{\dagger }\left(\mathbf{w}_{2}^{*}-\mathbf{J}_{2} \mathbf{J}_{1}^{+} \mathbf{w}_{1}^{*}\right) \end{align} q˙0=(J2N1)(w2J2J1+w1)

于是我们带回(5)式

q ˙ = J 1 † w 1 ∗ + N 1 ( J 2 N 1 ) † ( w 2 ∗ − J 2 J 1 + w 1 ∗ ) \begin{align} \dot{\mathbf{q}} & = \mathbf{J}_{1}^{\dagger } \mathbf{w}_{1}^{*}+\mathbf{N}_{1}\left(\mathbf{J}_{2} \mathbf{N}_{1}\right)^{\dagger }\left(\mathbf{w}_{2}^{*}-\mathbf{J}_{2} \mathbf{J}_{1}^{+} \mathbf{w}_{1}^{*}\right) \end{align} q˙=J1w1+N1(J2N1)(w2J2J1+w1)

这样我们就用一个表达式把$ q ˙ \dot{\mathbf{q}} q˙和第一个任务的期望的速度 w 1 \mathbf{w}_1 w1和第二个任务的期望的速度 w 2 \mathbf{w}_2 w2联系了起来。只用一个式子就进行了表示。

那么如果我们有更多的任务我们应该怎么表示呢?我们可以定义一个变换:

J ‾ i = [ J 1 ⋮ J i − 1 ] \begin{align} \overline{\mathbf{J}}_{i} & = \left[\begin{array}{ccc} \mathbf{J}_{1} \\ \vdots\\ \mathbf{J}_{i-1} \end{array}\right] \end{align} Ji= J1Ji1

N ‾ i \overline{\mathbf{N}}_i Ni J ‾ i \overline{\mathbf{J}}_{i} Ji对应的零空间,零空间的含义即:

J ‾ i N ‾ i = 0 \begin{align} \overline{\mathbf{J}}_{i}\overline{\mathbf{N}}_i & = \mathbf{0} \end{align} JiNi=0

对于 J ‾ 1 \overline{\mathbf{J}}_{1} J1为单位矩阵 E \mathbf{E} E。那么我们可以把式(8)写作

q ˙ = N ‾ 1 q ˙ 1 + N ‾ 2 q ˙ 2 \begin{align} \dot{\mathbf{q}} & =\overline{\mathbf{N}}_1\dot{\mathbf{q}}_1+\overline{\mathbf{N}}_2\dot{\mathbf{q}}_2 \end{align} q˙=N1q˙1+N2q˙2

其中

N ‾ 1 = E q ˙ 1 = J 1 † w 1 ∗ = ( J 1 N ‾ 1 ) † ( w 1 ∗ ) N ‾ 2 = N 1 q ˙ 2 = ( J 2 N 1 ) † ( w 2 ∗ − J 2 J 1 + w 1 ∗ ) = ( J 2 N ‾ 2 ) † ( w 2 ∗ − J 2 N ‾ 1 q ˙ 1 ) \begin{aligned}\overline{\mathbf{N}}_1&=\mathbf{E}\\ \dot{\mathbf{q}}_1&=\mathbf{J}^{\dagger }_1\mathbf{w}_1^*\\ &=\left(\mathbf{J}_{1} \overline{\mathbf{N}}_{1}\right)^{\dagger }\left(\mathbf{w}_{1}^{*}\right)\\ \overline{\mathbf{N}}_2&=\mathbf{N}_1\\ \dot{\mathbf{q}}_2&=\left(\mathbf{J}_{2} \mathbf{N}_{1}\right)^{\dagger }\left(\mathbf{w}_{2}^{*}-\mathbf{J}_{2} \mathbf{J}_{1}^{+} \mathbf{w}_{1}^{*}\right)\\&=\left(\mathbf{J}_{2} \overline{\mathbf{N}}_{2}\right)^{\dagger }\left(\mathbf{w}_{2}^{*}-\mathbf{J}_{2} \overline{\mathbf{N}}_1\dot{\mathbf{q}}_1\right)\end{aligned} N1q˙1N2q˙2=E=J1w1=(J1N1)(w1)=N1=(J2N1)(w2J2J1+w1)=(J2N2)(w2J2N1q˙1)

2.2 多任务情况

我们可以发现规律:

单个任务的时候计算逆运动学采用梯度投影法,而增加一个任务 t a s k i task_i taski可以用前面的任务来生成新的 N ‾ i \overline{\mathbf{N}}_i Ni q ‾ i \overline{\mathbf{q}}_i qi。类似于递推的原理,我们要根据前面的几个优先的任务 t a s k 1 task_1 task1- t a s k i − 1 task_{i-1} taski1得到的来推导出接下来的引入 t a s k i task_i taski,如果前面的 1 1 1 ~ i − 1 i-1 i1的任务我们可以得到它们表示的 q ˙ \dot{\mathbf{q}} q˙

q ˙ = ∑ k = 1 i − 1 N ‾ k q ˙ k \begin{align} \dot{\mathbf{q}} = \sum_{k = 1}^{i-1}\overline{\mathbf{N}}_k\dot{\mathbf{q}}_k \end{align} q˙=k=1i1Nkq˙k

我们引入一个新任务进行扩展:

q ˙ = ∑ k = 1 i − 1 N ‾ k q k ˙ + N ‾ i q ˙ i \begin{align} \dot{\mathbf{q}}=\sum_{k=1}^{i-1}\overline{\mathbf{N}}_k\dot{\mathbf{q}_k}+\overline{\mathbf{N}}_i\dot{\mathbf{q}}_i \end{align} q˙=k=1i1Nkqk˙+Niq˙i

我们根据第 i i i个任务的微分运动并且代入(11)式有:

w i = J i q ˙ = J i ( ∑ k = 1 i − 1 N ‾ k q k ˙ + N ‾ i q ˙ i ) \mathbf{w}_i=\mathbf{J}_i\dot{\mathbf{q}}=\mathbf{J}_i\left(\sum_{k=1}^{i-1}\overline{\mathbf{N}}_k\dot{\mathbf{q}_k}+\overline{\mathbf{N}}_i\dot{\mathbf{q}}_i\right) wi=Jiq˙=Ji(k=1i1Nkqk˙+Niq˙i)

于是我们可以得到:

q ˙ i = ( J i N ‾ i ) + ( w i ∗ − J i ∑ k = 1 i − 1 N ‾ k q ˙ k ) \begin{align} \dot{\mathbf{q}}_{i} = \left(\mathbf{J}_{i} \overline{\mathbf{N}}_{i}\right)^{+}\left(\mathbf{w}_{i}^{*}-\mathbf{J}_{i} \sum_{k = 1}^{i-1} \overline{\mathbf{N}}_{k} \dot{\mathbf{q}}_{k}\right) \end{align} q˙i=(JiNi)+(wiJik=1i1Nkq˙k)

这就是最后的总的公式:

在这里插入图片描述

3. 例子

3.1 单任务

在这里插入图片描述

如图平面的三自由度的机械臂,机械臂的长度都是1( l 0 , l 1 , l 2 , l 3 l_0,l_1,l_2,l_3 l0,l1,l2,l3),我们在 t t t时刻观测到关节角度为 q t = ( π / 6 , π / 3 , π / 3 ) T \mathbf{q}_{t}=(\pi / 6, \pi / 3, \pi / 3)^{T} qt=(π/6,π/3,π/3)T,这时候的末端的速度为 0 r ˙ E , t ∗ = ( 1 , 1 ) T { }_{0} \dot{\mathbf{r}}_{E, t}^{*}=(1,1)^{T} 0r˙E,t=(1,1)T,求解这时候的各关节的角速度?


解答
期望速度为:

w E , t ∗ = 0 r ˙ E , t ∗ = ( 1 1 ) \mathbf{w}_{E, t}^{*}={ }_{0} \dot{\mathbf{r}}_{E, t}^{*}=\left(\begin{array}{l} 1 \\ 1 \end{array}\right) wE,t=0r˙E,t=(11)

对于 q t = ( π / 6 , π / 3 , π / 3 ) \mathbf{q}_{t}=(\pi / 6, \pi / 3, \pi / 3) qt=(π/6,π/3,π/3),我们可以计算它的雅克比矩阵,公式为:

J e A P ( q ) = [ l 1 c 1 + l 2 c 12 + l 3 c 123 l 2 c 12 + l 3 c 123 l 3 c 123 − l 1 s 1 − l 2 s 12 − l 3 s 123 − l 2 s 12 − l 3 s 123 − l 3 s 123 ] 其中  c 123 = cos ⁡ ( q 1 + q 2 + q 3 )   s 123 = sin ⁡ ( q 1 + q 2 + q 3 ) \begin{aligned} \mathbf{J}_{e A P}(\mathbf{q}) & =\left[\begin{array}{ccc} l_{1} c_{1}+l_{2} c_{12}+l_{3} c_{123} & l_{2} c_{12}+l_{3} c_{123} & l_{3} c_{123} \\ -l_{1} s_{1}-l_{2} s_{12}-l_{3} s_{123} & -l_{2} s_{12}-l_{3} s_{123} & -l_{3} s_{123} \end{array}\right] \end{aligned}\\ \text{其中 }c_{123}=\cos \left(q_{1}+q_{2}+q_{3}\right) \text { } s_{123}=\sin \left(q_{1}+q_{2}+q_{3}\right) JeAP(q)=[l1c1+l2c12+l3c123l1s1l2s12l3s123l2c12+l3c123l2s12l3s123l3c123l3s123]其中 c123=cos(q1+q2+q3) s123=sin(q1+q2+q3)

于是我们有:

J E , t = J E ( q t ) = 1 2 [ 0 − 3 − 3 − 4 − 3 − 1 ] \mathbf{J}_{E, t}=\mathbf{J}_{E}\left(\mathbf{q}_{t}\right)=\frac{1}{2}\left[\begin{array}{ccc} 0 & -\sqrt{3} & -\sqrt{3} \\ -4 & -3 & -1 \end{array}\right] JE,t=JE(qt)=21[043 33 1]

通过计算伪逆的方法我们可以得到:

q ˙ t single  = J E , t + w E , t ∗ = ( 0.069 − 0.560 − 0.595 ) \dot{\mathbf{q}}_{t}^{\text {single }}=\mathbf{J}_{E, t}^{+} \mathbf{w}_{E, t}^{*}=\left(\begin{array}{c} 0.069 \\ -0.560 \\ -0.595 \end{array}\right) q˙tsingle =JE,t+wE,t= 0.0690.5600.595

我们可以把这个结果带回去我们发现是符合末端的速度的要求的。

w E , t = J E , t q ˙ t single  = ( 1 1 ) = w E , t ∗ \mathbf{w}_{E, t}=\mathbf{J}_{E, t} \dot{\mathbf{q}}_{t}^{\text {single }}=\left(\begin{array}{l} 1 \\ 1 \end{array}\right)=\mathbf{w}_{E, t}^{*} wE,t=JE,tq˙tsingle =(11)=wE,t

3.2 多任务(优先级同等)

除了前面定义的末端速度的任务,我们再额外定义一个任务:我们要求前面两个关节的速度为0:

w j = ( 0 0 ) , J j = [ 1 0 0 0 1 0 ] \mathbf{w}_{j}=\left(\begin{array}{l} 0 \\ 0 \end{array}\right), \quad \mathbf{J}_{j}=\left[\begin{array}{lll} 1 & 0 & 0 \\ 0 & 1 & 0 \end{array}\right] wj=(00),Jj=[100100]

在添加这个条件的情况下,我们再计算一下关节空间的角速度。

解答
我们根据前面的多任务逆运动学情况有:

q ˙ = [ J E J j ] † ( w E ∗ w j ∗ ) \dot{\mathbf{q}}=\left[\begin{array}{c} \mathbf{J}_{E} \\ \mathbf{J}_{j} \end{array}\right]^{\dagger}\left(\begin{array}{c} \mathbf{w}_{E}^{*} \\ \mathbf{w}_{j}^{*} \end{array}\right) q˙=[JEJj](wEwj)

我们同样可以直接计算组合后的雅克比矩阵的伪逆:

q ˙ t stack  = [ J E , t J j , t ] † ( w E ∗ w j ∗ ) = ( − 0.133 − 0.067 − 1.132 ) \begin{aligned} \dot{\mathbf{q}}_{t}^{\text {stack }} & =\left[\begin{array}{c} \mathbf{J}_{E, t} \\ \mathbf{J}_{j, t} \end{array}\right]^{\dagger}\left(\begin{array}{l} \mathbf{w}_{E}^{*} \\ \mathbf{w}_{j}^{*} \end{array}\right) \\ & =\left(\begin{array}{c} -0.133 \\ -0.067 \\ -1.132 \end{array}\right) \end{aligned} q˙tstack =[JE,tJj,t](wEwj)= 0.1330.0671.132

于是我们会注意到:

[ J E , t J j , t ] q ˙ t stack  = ( 1.039 0.933 − 0.133 − 0.067 ) ≠ ( w E ∗ w Δ q ˙ ∗ ) \left[\begin{array}{c} \mathbf{J}_{E, t} \\ \mathbf{J}_{j, t} \end{array}\right] \dot{\mathbf{q}}_{t}^{\text {stack }}=\left(\begin{array}{c} 1.039 \\ 0.933 \\ -0.133 \\ -0.067 \end{array}\right) \neq\left(\begin{array}{c} \mathbf{w}_{E}^{*} \\ \mathbf{w}_{\Delta \dot{q}}^{*} \end{array}\right) [JE,tJj,t]q˙tstack = 1.0390.9330.1330.067 =(wEwΔq˙)

我们可以看到:

∥ w E , t ∗ − J E , t q ˙ t stack  ∥ 2 = 0.0059 ∥ w j , t ∗ − J j , t q ˙ t stack  ∥ 2 = 0.0223. \begin{aligned} \left\|\mathbf{w}_{E, t}^{*}-\mathbf{J}_{E, t} \dot{\mathbf{q}}_{t}^{\text {stack }}\right\|^{2} & =0.0059 \\ \left\|\mathbf{w}_{j, t}^{*}-\mathbf{J}_{j, t} \dot{\mathbf{q}}_{t}^{\text {stack }}\right\|^{2} & =0.0223 . \end{aligned} wE,tJE,tq˙tstack  2 wj,tJj,tq˙tstack  2=0.0059=0.0223.
我们可以和前面的单任务进行对比:
∥ w E , t ∗ − J E , t q ˙ t single  ∥ 2 = 0 ∥ w j , t ∗ − J j , t q ˙ t single  ∥ 2 = 0.319 \begin{aligned} \left\|\mathbf{w}_{E, t}^{*}-\mathbf{J}_{E, t} \dot{\mathbf{q}}_{t}^{\text {single }}\right\|^{2} & =0 \\ \left\|\mathbf{w}_{j, t}^{*}-\mathbf{J}_{j, t} \dot{\mathbf{q}}_{t}^{\text {single }}\right\|^{2} & =0.319 \end{aligned} wE,tJE,tq˙tsingle  2 wj,tJj,tq˙tsingle  2=0=0.319
我们可以看到为了能实现第二个任务,我们牺牲了末端的跟踪性能。

3.3 多任务(存在优先级)

如果我们向保证末端的速度任务臂保证前面两个关节速度为0有更高的优先级,应该怎么做呢?

解答
我们使用前面的公式:

q ˙ t prio  = J 1 + w 1 ∗ + N 1 ( J 2 N 1 ) + ( w 2 ∗ − J 2 J 1 + w 1 ∗ ) \dot{\mathbf{q}}_{t}^{\text {prio }}=\mathbf{J}_{1}^{+} \mathbf{w}_{1}^{*}+\mathbf{N}_{1}\left(\mathbf{J}_{2} \mathbf{N}_{1}\right)^{+}\left(\mathbf{w}_{2}^{*}-\mathbf{J}_{2} \mathbf{J}_{1}^{+} \mathbf{w}_{1}^{*}\right) q˙tprio =J1+w1+N1(J2N1)+(w2J2J1+w1)

这里:

J 1 = J E , t = 1 2 [ 0 − 3 − 3 − 4 − 3 − 1 ] , J 2 = J j , t = [ 1 0 0 0 1 0 ] , w 1 ∗ = w E , t ∗ = ( 1 1 ) w 2 = w j , t ∗ = ( 0 0 ) \mathbf{J}_{1}=\mathbf{J}_{E, t}=\frac{1}{2}\left[\begin{array}{ccc} 0 & -\sqrt{3} & -\sqrt{3} \\ -4 & -3 & -1 \end{array}\right],\\ \mathbf{J}_{2}=\mathbf{J}_{j, t}=\left[\begin{array}{lll} 1 & 0 & 0 \\ 0 & 1 & 0 \end{array}\right],\\ \mathbf{w}_{1}^{*}=\mathbf{w}_{E, t}^{*}=\left(\begin{array}{l} 1 \\ 1 \end{array}\right)\\ \mathbf{w}_{2}=\mathbf{w}_{j, t}^{*}=\left(\begin{array}{l} 0 \\ 0 \end{array}\right) J1=JE,t=21[043 33 1],J2=Jj,t=[100100],w1=wE,t=(11)w2=wj,t=(00)

我们可以计算一个可能的零空间的矩阵: N 1 = I − J 1 + J 1 = 1 9 [ 1 − 2 2 − 2 4 − 4 2 − 4 4 ] \mathbf{N}_{1}=\mathbb{I}-\mathbf{J}_{1}^{+} \mathbf{J}_{1}=\frac{1}{9}\left[\begin{array}{ccc} 1 & -2 & 2 \\ -2 & 4 & -4 \\ 2 & -4 & 4 \end{array}\right] N1=IJ1+J1=91 122244244

于是我们可以计算得到:

q ˙ t prio  = ( − 0.169 − 0.085 − 1.070 ) \dot{\mathbf{q}}_{t}^{\text {prio }}=\left(\begin{array}{c} -0.169 \\ -0.085 \\ -1.070 \end{array}\right) q˙tprio = 0.1690.0851.070

现在我们再来看一下误差:

∥ w E , t ∗ − J E , t q ˙ t prio  ∥ 2 = 0 ∥ w j , t ∗ − J j , t q ˙ t prio  ∥ 2 = 0.036 \begin{aligned} \left\|\mathbf{w}_{E, t}^{*}-\mathbf{J}_{E, t} \dot{\mathbf{q}}_{t}^{\text {prio }}\right\|^{2} & =0 \\ \left\|\mathbf{w}_{j, t}^{*}-\mathbf{J}_{j, t} \dot{\mathbf{q}}_{t}^{\text {prio }}\right\|^{2} & =0.036 \end{aligned} wE,tJE,tq˙tprio  2 wj,tJj,tq˙tprio  2=0=0.036
与前面的优先级同等的解决方案相比,存在优先级的解总误差更大,但末端执行器任务的位置是准确的。与单个任务优化相比,可以看出总误差减少了。事实上,这是在不改变末端执行器跟踪性能的情况下降低关节速度,在最佳意义上使用了单维度零空间。

参考:

[1] Robot Dynamics Lecture Notes 43-47

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

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

相关文章

IP基础知识总结

IP他负责的是把IP数据包在不同网络间传送,这是网络设计相关的,与操作系统没有关系。所以这部分知识,不是网络的重点。IP和路由交换技术联系紧密。但是要作为基本知识点记住。 一、基本概念 网络层作用:实现主机与主机之间通信。 …

MySQL数据库操作篇4(内置函数连接查询子查询)

MySQL除了提供一些聚合函数供我们使用,同时还提供了很多的内置扩展函数,这些函数有的是进行日期处理的,有的是进行字符串处理的,有的则是进行数值处理,以及其它的种种函数,这些函数可以帮助我们对数据进行加…

创建/查看/编辑文本文件

创建/查看/编辑文本文件 将输出重定向到文件和程序 标准 输入/输出/错误 运行的程序需要从某个位置读取输入并将输出写入某位置。从shell提示符运行的命令通常会从键盘读取输入,并将输出发送到其终端窗口。 进程通过使用文件描述符的通道编号获取输出并发送输出。…

红队打靶:billu_b0x打靶思路详解(vulnhub)

目录 写在开头 第一步:主机发现和端口扫描 第二步:Web渗透 第三步:利用文件包含进行代码审计 第四步:图片马上传与反弹shell 第五步:敏感文件提权 总结与思考 写在开头 我的博客等级终于到三级了,…

Python接口自动化搭建过程,含request请求封装

开篇碎碎念 接口测试自动化好处 显而易见的好处就是解放双手😀。 可以在短时间内自动执行大量的测试用例通过参数化和数据驱动的方式进行测试数据的变化,提高测试覆盖范围快速反馈测试执行结果和报告支持持续集成和持续交付的流程 使用Requestspytes…

Attention Is All Your Need

q,k,v是一个东西(自注意力) 由于位置编码通过sin和cos得到,在+-1之间抖动,因此为了与embedding相加scale匹配,所以embedding除以根号dk 注意力机制:注意力函数 quary(不同的q) 和 k 的相似度决定了value对应的权重(不同的权重)相加得到 (不同的)输出 英文积累…

宠物赛道又出爆品!TikTok播放破千万!

在欧美国家,养宠的风潮已经持续百年。美国作为全国第一大的宠物市场,其家庭的养宠率高达70%。有关数据显示,美国目前26-41岁人群比例占比最大,已达到32%,42-57岁人群比例下降到24%。 养宠人群逐渐呈现年轻化&#xff0…

参数名的映射,小心使用strict=False

从vgg16-397923af.pth里读取的数值应该和加载预训练模型后model.load_state_dict参数一致。 而我的不一致! 原因:在载入参数到模型键值的不匹配,所以使用了strictFalse。 解决办法: 进行参数名的映射,将不匹配的参数名…

不看不知,道,一键ai绘画软件也能生成这么好看的图片

结构: 前阵子,我朋友发了几张男生的照片在朋友圈,我还以为是她脱单了,赶紧给她送上了祝福。 她收到我的祝福后,笑嘻嘻地跟我解释说:“那几张图是我用AI绘画软件生成的,是不是很看起来很真呀&a…

一款剧情特别优秀的ARPG 游戏《FC魔神英雄传》

文章目录 介绍游戏发行游戏玩法 游戏剧情详细介绍游戏开始阶段剧情任务汇总:草原阶段冰川阶段海边阶段丛林阶段沙漠阶段湖泊阶段草原2阶段海边2阶段冰川2阶段山脉阶段 世界地图汇总 道具系统装备系统战斗系统战斗规则魔法技能魔法学习方式 游戏优点游戏缺点该游戏值…

接口测试 使用 rest-assured 进行接口测试

目录 前言 正文 1.HTTP 状态码 2.节点值验证 3.格式化打印 json 4.参数化 5.响应时间 6.JSON Schema Validation 前言 使用Rest-Assured进行接口测试是一个很好的选择。Rest-Assured是一个基于Java的开源库,专门用于简化和增强RESTful接口的测试。它提供了…

我在VScode学Java类与对象(Java的类与对象、this关键字)第一辑

我的个人博客主页:如果’真能转义1️⃣说1️⃣的博客主页 关于Java基本语法学习---->可以参考我的这篇博客:《我在VScode学Java》 关于我在VScode学Java(Java方法method) 类是描述了一组有相同特性(属性&#xff09…

python_selenuim获取csdn新星赛道选手所在城市用echarts地图显示

文章目录 ⭐前言⭐selenuim获取新星赛道选手主页💖 获取参赛选手主页思路分析💖 获取参赛选手ip属地思路分析💖 echarts可视化展示 ⭐结束 ⭐前言 大家好,我是yma16,本文分享python_selenuim获取csdn新星赛道选手所在…

Requests —— Requests模块获取响应内容

Requests模块获取响应内容 响应包括响应行、响应头、响应正文内容,这些返回的响应信息都可以通过Requests模块获取。这些 获取到的响应内容也是接口测试执行得到的实际结果。 获取响应行 获取响应头 获取其它响应信息 代码示例: # 导入requests模块…

特征工程和多项式回归

特征工程的定义 特征工程(Feature Engineering)特征工程是将原始数据转化成更好的表达问题本质的特征的过程,使得将这些特征运用到预测模型中能提高对不可见数据的模型预测精度。 特征工程简单讲就是发现对因变量y有明显影响作用的特征&#…

【kubernetes系列】Kubernetes之配置dashboard安装使用

Kubernetes之配置dashboard 概述 Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。 你可以使用 Dashboard 获取运行在集群中的应用的概览信息&#x…

MybatisPlus-2

springmybatismybatisplus 创建mapper接口&#xff0c;继承BaseMapper<obj>&#xff0c;obj为你需要操作的数据表创建对应的实体类配置数据源 4.设置配置文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.spri…

华为OD机试真题 Java 实现【拔河比赛】【2023 B卷 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

JavaWeb 速通Servlet(上)

目录 一、Servlet快速入门 1.为什么需要Servlet&#xff1f; 2.什么是Servlet? 3.Servlet开发说明 : 4.入门案例 : 二、 Servlet生命周期 1.浏览器请求Servlet的流程分析&#xff08;重要&#xff09; : 2.生命周期 : 1 初始化阶段 2 处理请求阶段 3 终止阶段 三、Serv…

归并排序C语言

基本思想 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andConquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有序&a…