当前位置: 首页 > news >正文

《视觉SLAM十四讲》-- 三维空间的刚体运动

文章目录

    • 02 三维空间的刚体运动
      • 2.0 机器人位姿表述
      • 2.1 点和坐标系
        • 2.1.1 三维坐标系有关表述
        • 2.1.2 坐标系变换
      • 2.2 旋转向量和欧拉角
        • 2.2.1 旋转向量
        • 2.2.2 欧拉角
      • 2.3 四元数
        • 2.3.1 四元数的定义
        • 2.3.2 四元数的计算
        • 2.3.3 四元数表示旋转
        • 2.3.4 四元数与其他旋转表示法的转换
      • 2.4 相似、仿射、射影变换

02 三维空间的刚体运动

2.0 机器人位姿表述

(1)二维与三维空间中,机器人位姿的表述:

  • 2D 的情况:横纵坐标 + 旋转角(机器人朝向),即 [ x , y , θ ] [x, y, \theta] [x,y,θ]

  • 3D 的情况:三维空间中的旋转平移

2.1 点和坐标系

2.1.1 三维坐标系有关表述

(1)基本运算

  • 加减法

  • 内积(点乘): a ⋅ b = a T b = ∑ i = 1 3 a i × b i = ∣ a ∣ ∣ b ∣ c o s < a , b > \boldsymbol{a}\cdot\boldsymbol{b}=\boldsymbol{a}^T\boldsymbol{b}=\sum_{i=1}^{3}a_{i}\times b_{i} = |\boldsymbol{a}| |\boldsymbol{b}|cos<\boldsymbol{a}, \boldsymbol{b}> ab=aTb=i=13ai×bi=a∣∣bcos<a,b>,且 a ⋅ b = b ⋅ a \boldsymbol{a}\cdot\boldsymbol{b} = \boldsymbol{b}\cdot\boldsymbol{a} ab=ba

  • 外积(叉乘):

a × b = ∥ e 1 e 2 e 3 a 1 a 2 a 3 b 1 b 2 b 3 ∥ = ( a 2 b 3 − a 3 b 2 ) e 1 + ( a 3 b 1 − a 1 b 3 ) e 2 + ( a 1 b 3 − a 3 b 1 ) e 3 = [ a 2 b 3 − a 3 b 2 a 3 b 1 − a 1 b 3 a 1 b 2 − a 2 b 1 ] = [ 0 − a 3 a 2 a 3 0 − a 1 − a 2 a 1 0 ] b = def  a ∧ b (2-1) \begin{aligned} \boldsymbol{a} \times \boldsymbol{b}=\left\|\begin{array}{ccc} \boldsymbol{e}_{1} & \boldsymbol{e}_{2} & \boldsymbol{e}_{3} \\ a_{1} & a_{2} & a_{3} \\ b_{1} & b_{2} & b_{3} \end{array}\right\| &=(a_2b_3-a_3b_2)\boldsymbol{e}_{1}+(a_3b_1-a_1b_3)\boldsymbol{e}_{2}+(a_1b_3-a_3b_1)\boldsymbol{e}_{3} \\ &=\left[\begin{array}{c} a_{2} b_{3}-a_{3} b_{2} \\ a_{3} b_{1}-a_{1} b_{3} \\ a_{1} b_{2}-a_{2} b_{1} \end{array}\right]=\left[\begin{array}{ccc} 0 & -a_{3} & a_{2} \\ a_{3} & 0 & -a_{1} \\ -a_{2} & a_{1} & 0 \end{array}\right] \boldsymbol{b}\stackrel{\text { def }}{=}\boldsymbol{a}^{\wedge} \boldsymbol{b} \end{aligned} \tag{2-1} a×b= e1a1b1e2a2b2e3a3b3 =(a2b3a3b2)e1+(a3b1a1b3)e2+(a1b3a3b1)e3= a2b3a3b2a3b1a1b3a1b2a2b1 = 0a3a2a30a1a2a10 b= def ab(2-1)
也即 a × b = ∣ a ∣ ∣ b ∣ s i n < a , b > \boldsymbol{a} \times \boldsymbol{b} = |\boldsymbol{a}| |\boldsymbol{b}|sin<\boldsymbol{a}, \boldsymbol{b}> a×b=a∣∣bsin<a,b>,方向垂直于向量 a \boldsymbol{a} a b \boldsymbol{b} b 组成的平面,遵循右手定则。

性质: a × b = − b × a \boldsymbol{a} \times \boldsymbol{b} = - \boldsymbol{b} \times \boldsymbol{a} a×b=b×a

为便于后续表达,记

a ∧ = [ 0 − a 3 a 2 a 3 0 − a 1 − a 2 a 1 0 ] (2-2) \boldsymbol{a}^{\wedge}=\left[\begin{array}{ccc} 0 & -a_{3} & a_{2} \\ a_{3} & 0 & -a_{1} \\ -a_{2} & a_{1} & 0 \end{array}\right] \tag{2-2} a= 0a3a2a30a1a2a10 (2-2)
这是一个反对称矩阵,满足 A T = − A A^T=-A AT=A

2.1.2 坐标系变换

(1)三维空间向量表示:

a = [ e 1 , e 2 , e 3 ] [ a 1 a 2 a 3 ] = a 1 e 1 + a 2 e 2 + a 3 e 3 (2-3) \boldsymbol{a}=\left[\boldsymbol{e_1},\boldsymbol{e_2},\boldsymbol{e_3}\right]\left[\begin{array}{l} a_{1} \\ a_{2} \\ a_{3} \end{array}\right]=a_1\boldsymbol{e_1}+a_2\boldsymbol{e_2}+a_3\boldsymbol{e_3} \tag{2-3} a=[e1,e2,e3] a1a2a3 =a1e1+a2e2+a3e3(2-3)
其中, e 1 、 e 2 、 e 3 \boldsymbol{e_1}、\boldsymbol{e_2}、\boldsymbol{e_3} e1e2e3为基向量。

(2)两个坐标系之间的运动由一个旋转加一个平移组成,这种运动称为刚体运动

(3)对于坐标系旋转变换,假设原坐标系和现坐标系单位正交基底分别为 [ e 1 , e 2 , e 3 ] [\boldsymbol{e_1}, \boldsymbol{e_2}, \boldsymbol{e_3}] [e1,e2,e3] [ e 1 ′ , e 2 ′ , e 3 ′ ] [\boldsymbol{e_1'}, \boldsymbol{e_2'}, \boldsymbol{e_3'}] [e1,e2,e3]

坐标分别为 [ a 1 , a 2 , a 3 ] T [a_1, a_2, a_3]^T [a1,a2,a3]T [ a 1 ′ , a 2 ′ , a 3 ′ ] T [a_1', a_2', a_3']^T [a1,a2,a3]T,由于向量本身的绝对位置没有改变,则

[ e 1 , e 2 , e 3 ] [ a 1 a 2 a 3 ] = [ e 1 ′ , e 2 ′ , e 3 ′ ] [ a 1 ′ a 2 ′ a 3 ′ ] (2-4) \left[\boldsymbol{e}_{1}, \boldsymbol{e}_{2}, \boldsymbol{e}_{3}\right]\left[\begin{array}{l} a_{1} \\ a_{2} \\ a_{3} \end{array}\right]=\left[\boldsymbol{e}_{1}^{\prime}, \boldsymbol{e}_{2}^{\prime}, \boldsymbol{e}_{3}^{\prime}\right]\left[\begin{array}{c} a_{1}^{\prime} \\ a_{2}^{\prime} \\ a_{3}^{\prime} \end{array}\right] \tag{2-4} [e1,e2,e3] a1a2a3 =[e1,e2,e3] a1a2a3 (2-4)

将上式两端分别左乘 [ e 1 T e 2 T e 3 T ] \left[\begin{array}{l} \boldsymbol{e_{1}^T} \\ \boldsymbol{e}_{2}^T \\ \boldsymbol{e}_{3}^T \end{array}\right] e1Te2Te3T 得到,

[ a 1 a 2 a 3 ] = [ e 1 T e 1 ′ e 1 T e 2 ′ e 1 T e 3 ′ e 2 T e 1 ′ e 2 T e 2 ′ e 2 T e 3 ′ e 3 T e 1 ′ e 3 T e 2 ′ e 3 T e 3 ′ ] [ a 1 ′ a 2 ′ a 3 ′ ] = def  R a ′ (2-5) \left[\begin{array}{l} a_{1} \\ a_{2} \\ a_{3} \end{array}\right]=\left[\begin{array}{lll} \boldsymbol{e}_{1}^T \boldsymbol{e}_{1}^{\prime} & \boldsymbol{e}_{1}^T \boldsymbol{e}_{2}^{\prime} & \boldsymbol{e}_{1}^T \boldsymbol{e}_{3}^{\prime} \\ \boldsymbol{e}_{2}^T \boldsymbol{e}_{1}^{\prime} & \boldsymbol{e}_{2}^T \boldsymbol{e}_{2}^{\prime} & \boldsymbol{e}_{2}^T \boldsymbol{e}_{3}^{\prime} \\ \boldsymbol{e}_{3}^T \boldsymbol{e}_{1}^{\prime} & \boldsymbol{e}_{3}^T \boldsymbol{e}_{2}^{\prime} & \boldsymbol{e}_{3}^T \boldsymbol{e}_{3}^{\prime} \end{array}\right]\left[\begin{array}{c} a_{1}^{\prime} \\ a_{2}^{\prime} \\ a_{3}^{\prime} \end{array}\right] \stackrel{\text { def }}{=} \boldsymbol{R} \boldsymbol{a}^{\prime} \tag{2-5} a1a2a3 = e1Te1e2Te1e3Te1e1Te2e2Te2e3Te2e1Te3e2Te3e3Te3 a1a2a3 = def Ra(2-5)

矩阵 R \boldsymbol{R} R即为旋转矩阵。它有如下性质:

  • R \boldsymbol{R} R 行列式为 1;
  • R \boldsymbol{R} R 是一个正交矩阵,即满足 R T R = I \boldsymbol{R}^T\boldsymbol{R}=\boldsymbol{I} RTR=I
  • 坐标系 1 到坐标系 2 ,有 a 1 = R 12 a 2 \boldsymbol{a_1}=\boldsymbol{R_{12}}\boldsymbol{a_2} a1=R12a2,反之有 a 2 = R 21 a 1 \boldsymbol{a_2}=\boldsymbol{R_{21}}\boldsymbol{a_1} a2=R21a1,其中,
    R 12 = R 21 − 1 = R 21 T \boldsymbol{R_{12}}=\boldsymbol{R_{21}}^{-1}=\boldsymbol{R_{21}}^T R12=R211=R21T

将满足此性质的矩阵集合定义为特殊正交群

S O ( n ) = { R ∈ R n × n ∣ R R T = I , det ⁡ ( R ) = 1 } (2-6) \mathrm{SO}(n)=\left\{\boldsymbol{R} \in \mathbb{R}^{n \times n} \mid \boldsymbol{R} \boldsymbol{R}^{\mathrm{T}}=\boldsymbol{I}, \operatorname{det}(\boldsymbol{R})=1\right\} \tag{2-6} SO(n)={RRn×nRRT=I,det(R)=1}(2-6)

(4)旋转加平移

可以将三维空间的刚体运动分解为平移以及旋转运动,满足:

a ′ = R a + t (2-7) \boldsymbol{a^{\prime}}=\boldsymbol{Ra+t} \tag{2-7} a=Ra+t(2-7)

(5)齐次坐标与旋转矩阵(参考机器人学中的坐标变换)

为便于表达,写成齐次形式

[ a ′ 1 ] = [ R t 0 T 1 ] [ a 1 ] = def  T [ a 1 ] (2-8) \left[\begin{array}{l} \boldsymbol{a}^{\prime} \\ 1 \end{array}\right]=\left[\begin{array}{ll} \boldsymbol{R} & \boldsymbol{t} \\ \mathbf{0}^{\mathrm{T}} & 1 \end{array}\right]\left[\begin{array}{l} \boldsymbol{a} \\ 1 \end{array}\right] \stackrel{\text { def }}{=} \boldsymbol{T}\left[\begin{array}{l} \boldsymbol{a} \\ 1 \end{array}\right] \tag{2-8} [a1]=[R0Tt1][a1]= def T[a1](2-8)

其中, T \boldsymbol{T} T即为变换矩阵(注意左乘右乘区别)。

绕静坐标系(世界坐标系)旋转即左乘,绕自身坐标系旋转即右乘

这种形式的矩阵集合定义为特殊欧式群,即

S E ( 3 ) = { T = [ R t 0 T 1 ] ∈ R 4 × 4 ∣ R ∈ S O ( 3 ) , t ∈ R 3 } (2-9) \mathrm{SE}(3)=\left\{\boldsymbol{T}=\left[\begin{array}{ll} \boldsymbol{R} & \boldsymbol{t} \\ \mathbf{0}^{\mathrm{T}} & 1 \end{array}\right] \in \mathbb{R}^{4 \times 4} \mid \boldsymbol{R} \in \mathrm{SO}(3), \boldsymbol{t} \in \mathbb{R}^{3}\right\} \tag{2-9} SE(3)={T=[R0Tt1]R4×4RSO(3),tR3}(2-9)

同样地,逆方向的变换为:

T − 1 = [ R T − R T t 0 T 1 ] (2-10) \boldsymbol{T}^{-1}=\left[\begin{array}{cc} \boldsymbol{R}^{\mathrm{T}} & -\boldsymbol{R}^{\mathrm{T}} \boldsymbol{t} \\ \mathbf{0}^{\mathrm{T}} & 1 \end{array}\right] \tag{2-10} T1=[RT0TRTt1](2-10)

2.2 旋转向量和欧拉角

2.2.1 旋转向量

(1)三维空间中刚体运动有六个自由度(旋转和平移各三个)。显然无论是上述的旋转矩阵(9个量)还是变换矩阵(16个量),都有很大的冗余;并且,矩阵中的元素相互关联,这不利于后续的非线性优化计算。因此我们希望找到一种更为紧凑的表达方式。

(2)任意一个旋转都可以用旋转轴旋转角刻画,因此可以用旋转向量(也称为角轴或轴角)来表达,即向量方向为旋转轴,其模长为旋转角

(3)罗德里格斯公式描述了旋转矩阵和旋转向量之间的关系。

R = cos ⁡ ( θ I ) + ( 1 − cos ⁡ θ ) n n T + sin ⁡ ( θ n ∧ ) (2-11) \boldsymbol{R}=\cos (\theta\boldsymbol{I}) + \left( 1- \cos \theta\right) \boldsymbol{n} {\boldsymbol{n}}^T+\sin (\theta\boldsymbol{n}^{\wedge}) \tag{2-11} R=cos(θI)+(1cosθ)nnT+sin(θn)(2-11)

反之,有
θ = a r c c o s ( t r ( R ) − 1 2 ) (2-12) \theta=arccos(\frac{tr(\boldsymbol{R})-1}{2}) \tag{2-12} θ=arccos(2tr(R)1)(2-12)
t r ( R ) tr(\boldsymbol{R}) tr(R)表示求迹,即矩阵对角线元素之和。

由于旋转轴在旋转过程中是不动的,则有
R n = n (2-13) \boldsymbol{R}\boldsymbol{n}=\boldsymbol{n} \tag{2-13} Rn=n(2-13)
这说明 n \boldsymbol{n} n是矩阵 R \boldsymbol{R} R特征值为 1 对应的特征向量,由此可以求出向量 n \boldsymbol{n} n的值。

2.2.2 欧拉角

(1)将旋转分解为 X、Y、Z 三个方向上的转动,常用的是 ZYX 顺序的旋转:

  • 绕 Z 轴旋转,得到偏航角 yaw;
  • 旋转后的 Y 轴旋转,得到俯仰角 pitch;
  • 旋转后的 X 轴旋转,得到滚转角 roll。

此时,使用 [ y , p , r ] T [y, p, r]^T [y,p,r]T这样一个三维向量便可以描述任意旋转。

(2)存在万向锁问题:即当俯仰角为 ±90° 时,第三次旋转轴和第一次旋转轴重合,使系统丢失了一个自由度,这被称为奇异性问题。因此欧拉角在 SLAM 中较少使用。

(3)旋转向量也存在奇异性,当 θ \theta θ超过 2 π 2\pi 2π时会产生周期性,这时将其限定在 2 π 2\pi 2π范围内便可以避免。

2.3 四元数

2.3.1 四元数的定义

(1)2D 情况下,可用单位复数表达旋转,在复数平面中,结合欧拉公式,如下图,向量 z \boldsymbol{z} z旋转 90° ,相当于乘上 i i i

(2)类似的,在三维空间中,采用四元数描述旋转。四元数有一个实部,三个虚部(分别对应 x、y、z轴)。

q = q 0 + q 1 i + q 2 j + q 3 k (2-14) \boldsymbol{q} = q_0+q_1i+q_2j+q_3k \tag{2-14} q=q0+q1i+q2j+q3k(2-14)

写成向量形式

q = [ s , v ] , s = q 0 ∈ R , v = [ q 1 , q 2 , q 3 ] T ∈ R 3 (2-15) \boldsymbol{q}=[s, \boldsymbol{v}], s=q_0\in \mathbb{R},\boldsymbol{v}=[q_1,q_2,q_3]^T \in \mathbb{R}^3 \tag{2-15} q=[s,v],s=q0R,v=[q1,q2,q3]TR3(2-15)

并且,虚部之间满足

{ i 2 = j 2 = k 2 = − 1 i j = k , j i = − k j k = i , k j = − i k i = j , i k = − j (2-16) \left\{ \begin{matrix} i^2=j^2=k^2=-1 \\ ij=k, ji=-k \\ jk=i, kj=-i \\ ki=j, ik=-j \end{matrix} \right. \tag{2-16} i2=j2=k2=1ij=k,ji=kjk=i,kj=iki=j,ik=j(2-16)

(3)当四元数的实部为 0 时,称为虚四元数(分别对应三维坐标),此时,可以用来表示三维空间中的点。

2.3.2 四元数的计算
  • 加法:对应部分相加

  • 乘法:每一项相乘,最后相加

  • 模长:各项系数平方和再开方;并且两个四元数乘积的模等于各自模的乘积,即 ∣ ∣ q 1 q 2 ∣ ∣ = ∣ ∣ q 1 ∣ ∣ ⋅ ∣ ∣ q 1 ∣ ∣ ||\boldsymbol{q_1}\boldsymbol{q_2}||=||\boldsymbol{q_1}||\cdot||\boldsymbol{q_1}|| ∣∣q1q2∣∣=∣∣q1∣∣∣∣q1∣∣

  • 共轭:实部相等,虚部互为相反数: q a ∗ = [ s a , − v a ] T \boldsymbol{q_a^*}=[s_a, -\boldsymbol{v_a}]^T qa=[sa,va]T。并且, q ∗ q = q q ∗ = [ s 2 + v T v , 0 ] T \boldsymbol{q^*q}=\boldsymbol{qq^*}=[s^2+\boldsymbol{v^Tv}, \boldsymbol{0}]^T qq=qq=[s2+vTv,0]T

  • 逆: q − 1 = q ∗ / ∣ ∣ q ∣ ∣ 2 \boldsymbol{q^{-1}}=\boldsymbol{q^*}/{||\boldsymbol{q}||}^2 q1=q/∣∣q∣∣2,则 q − 1 q = q q − 1 = 1 \boldsymbol{q^{-1}}\boldsymbol{q}=\boldsymbol{q}\boldsymbol{q^{-1}}=1 q1q=qq1=1,同时, ( q a q b ) − 1 = q a − 1 q b − 1 (\boldsymbol{q_a}\boldsymbol{q_b})^{-1}=\boldsymbol{q_a}^{-1}\boldsymbol{q_b}^{-1} (qaqb)1=qa1qb1

  • 数乘: k q = [ k s , k v ] T k\boldsymbol{q}=[ks, k\boldsymbol{v}]^T kq=[ks,kv]T

2.3.3 四元数表示旋转

(1)三维空间中任意点均可用一个纯虚四元数表示即 p = [ 0 , v ] T \boldsymbol{p}=[0,\boldsymbol{v}]^T p=[0,v]T,经一个单位四元数 q \boldsymbol{q} q的旋转后,得到 p ′ \boldsymbol{p'} p,则

p ′ = q p q − 1 (2-17) \boldsymbol{p'}=\boldsymbol{q}\boldsymbol{p}\boldsymbol{q^{-1}} \tag{2-17} p=qpq1(2-17)

最终 p ′ \boldsymbol{p'} p的虚部即为旋转后点的坐标。

2.3.4 四元数与其他旋转表示法的转换
  • 角轴到四元数:

q = [ c o s θ 2 , n x s i n θ 2 , n y s i n θ 2 , n z s i n θ 2 ] (2-18) \boldsymbol{q}=[cos{\frac{\theta}{2}},n_xsin{\frac{\theta}{2}}, n_ysin{\frac{\theta}{2}},n_zsin{\frac{\theta}{2}}] \tag{2-18} q=[cos2θ,nxsin2θ,nysin2θ,nzsin2θ](2-18)

  • 四元数到角轴
    { θ = 2 a r c c o s q 0 [ n x , n y , n z ] T = [ q 1 , q 2 , q 3 ] T / s i n θ 2 (2-19) \left\{ \begin{matrix} \theta=2arccos{q_0} \\ \\ [n_x, n_y, n_z]^T=[q_1, q_2, q_3]^T/sin{\frac{\theta}{2}} \end{matrix} \right. \tag{2-19} θ=2arccosq0[nx,ny,nz]T=[q1,q2,q3]T/sin2θ(2-19)

  • 四元数到旋转矩阵

  • 旋转矩阵到四元数

2.4 相似、仿射、射影变换

欧式变换不改变向量本身,只是进行旋转或平移。

(1)相似变换

相似变换比欧式变换多了一个自由度,即相当于在旋转或平移后,各坐标再进行等比例缩放,表达式为

T s = [ s R t 0 T 1 ] (2-20) \boldsymbol{T}_s=\left[\begin{array}{ll} s\boldsymbol{R} & \boldsymbol{t} \\ \mathbf{0}^{\mathrm{T}} & 1 \end{array}\right] \tag{2-20} Ts=[sR0Tt1](2-20)
s s s为缩放因子。

(2)仿射变换

表达式如下:
T A = [ A t 0 T 1 ] (2-21) \boldsymbol{T}_A=\left[\begin{array}{ll} \boldsymbol{A} & \boldsymbol{t} \\ \mathbf{0}^{\mathrm{T}} & 1 \end{array}\right] \tag{2-21} TA=[A0Tt1](2-21)

这里不要求 A \boldsymbol{A} A为正交矩阵,因此,变换后,正方形就不是方的了,但仍是平行四边形。

(3)射影变换

T P = [ A t a T v ] (2-22) \boldsymbol{T}_P=\left[\begin{array}{ll} \boldsymbol{A} & \boldsymbol{t} \\ \mathbf{a}^{\mathrm{T}} & v \end{array}\right] \tag{2-22} TP=[AaTtv](2-22)

射影变换是最一般的变换,左上角 A \boldsymbol{A} A为可逆矩阵,右上角 t \boldsymbol{t} t为平移,左下角为缩放 a T \boldsymbol{a^T} aT。从真实世界到相机照片的变换可以看做是射影变换:原本正方形的地砖,在照片中将不再是方形,由于近大远小,甚至可能是不规则的四边形。

相关文章:

《视觉SLAM十四讲》-- 三维空间的刚体运动

文章目录 02 三维空间的刚体运动2.0 机器人位姿表述2.1 点和坐标系2.1.1 三维坐标系有关表述2.1.2 坐标系变换 2.2 旋转向量和欧拉角2.2.1 旋转向量2.2.2 欧拉角 2.3 四元数2.3.1 四元数的定义2.3.2 四元数的计算2.3.3 四元数表示旋转2.3.4 四元数与其他旋转表示法的转换 2.4 相…...

关于iOS:如何使用SwiftUI调整图片大小?

How to resize Image with SwiftUI? 我在Assets.xcassets中拥有很大的形象。 如何使用SwiftUI调整图像大小以缩小图像&#xff1f; 我试图设置框架&#xff0c;但不起作用&#xff1a; 1 2 Image(room.thumbnailImage) .frame(width: 32.0, height: 32.0) 在Image上应用…...

【MySQL】数据库MySQL基础知识与操作

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《MySQL》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&a…...

vim手册(vim cheatsheet)

vim手册&#xff08;vim cheatsheet&#xff09; 1. 命令模式 1). 移动光标 在命令模式下&#xff0c;可以使用以下命令来移动光标&#xff1a; - h&#xff1a;向左移动一个字符。 - j&#xff1a;向下移动一行。 - k&#xff1a;向上移动一行。 - l&#xff1a;向右移动一个…...

软件测试具体人员分工

最近看了点敏捷测试的东西&#xff0c;看得比较模糊。一方面是因为没有见真实的环境与流程&#xff0c;也许它跟本就没有固定的模式与流程&#xff0c;它就像告诉人们要“勇敢”“努力”。有的人在勇敢的面对生活&#xff0c;有些人在勇敢的挑战自我&#xff0c;有些人在勇敢的…...

计算机网络-应用层

文章目录 应用层协议原理万维网和HTTP协议万维网概述统一资源定位符HTML文档 超文本传输协议&#xff08;HTTP&#xff09;HTTP报文格式请求报文响应报文cookie 万维网缓存与代理服务器 DNS系统域名空间域名服务器和资源记录域名解析过程递归查询迭代查询 动态主机配置协议&…...

linux 创建git项目并提交到gitee(保姆式教程)

01、git安装与初始化设置 mhzzjmhzzj-virtual-machine:~/work/skynetStudy$ apt install mhzzjmhzzj-virtual-machine:~/work/skynetStudy$ git config --global user.name "用户名" mhzzjmhzzj-virtual-machine:~/work/skynetStudy$ git config --global user.ema…...

STM32 IAP应用开发--bootloader升级程序

STM32 IAP应用开发--bootloader升级程序 Chapter1 STM32 IAP应用开发——通过串口/RS485实现固件升级&#xff08;方式2&#xff09;前言什么是IAP&#xff1f;什么是BootLoader&#xff1f; 方案介绍&#xff1a;1&#xff09;bootloader部分&#xff1a;2&#xff09;APP部分…...

Q_GLOBAL_STATIC宏

文章目录 目的Q_GLOBAL_STATIC源代码分析涉及到原子操作 以及静态变量初始化顺序代码实现 目的 由Q_GLOBAL_STATIC宏&#xff0c; 引发的基于线程安全的Qt 单例模式的使用。 Q_GLOBAL_STATIC /***************************************************************************…...

[批处理]_[初级]_[如何删除变量值里的双引号]

场景 在使用Visual Studio开发本地程序的时&#xff0c;需要在项目属性&#xff0c;生成事件->生成后事件里增加一些资源的打包&#xff0c;复制&#xff0c;删除等操作&#xff0c;那么就需要用到批处理来进行。而传递带空格的路径给外部的批处理文件时就需要双引号引用从…...

51单片机电子钟闹钟温度LCD1602液晶显示设计( proteus仿真+程序+原理图+设计报告+讲解视频)

51单片机电子钟闹钟温度液晶显示设计( proteus仿真程序原理图设计报告讲解视频&#xff09; 1.主要功能&#xff1a;2.仿真3. 程序代码4. 原理图5. 设计报告6. 设计资料内容清单&&下载链接资料下载链接&#xff08;可点击&#xff09;&#xff1a; &#x1f31f;51单片…...

怎样学好java

最近在看一本java方面的书。《java从入门到精通》&#xff0c;里面看到一段如何学习java的话&#xff0c;觉得非常好&#xff0c;下面我分享一下。 如何学好java语言&#xff0c;是所有初学者都需要面对的问题。其实&#xff0c;每种语言的学习方法都大同小异。初学者需要注意…...

HarmonyOS 数据管理与应用数据持久化(二)

通过键值型数据库实现数据持久化 场景介绍 键值型数据库存储键值对形式的数据&#xff0c;当需要存储的数据没有复杂的关系模型&#xff0c;比如存储商品名称及对应价格、员工工号及今日是否已出勤等&#xff0c;由于数据复杂度低&#xff0c;更容易兼容不同数据库版本和设备…...

Hadoop环境搭建及Demo

参考博客 Windows 10安装Hadoop 3.3.0教程 (kontext.tech) Hadoop入门篇——伪分布模式安装 & WordCount词频统计 | Liu Baoshuai’s Blog Hadoop安装教程 Linux版_linux和hadoop的安装_lnlnldczxy的博客-CSDN博客 hadoop启动出错 The value of property bind.address …...

更新一下数据集

UCI Machine Learning Repository UCI的数据集还是挺老牌的&#xff0c;最近换了地址&#xff0c;我就再记录一下。 左边是比较常见的数据集&#xff0c;比如Iris很经典&#xff0c;Heart Disease这也是&#xff0c;包括Wine&#xff0c;通常对于初学者学习比较好&#xff0c;…...

web3之跨链预言机SupraOracles:什么是Supra

文章目录 web3之跨链预言机SupraOracles什么是Supra什么是DORA(分布式Oracle协议)使用场景web3之跨链预言机SupraOracles 什么是Supra 官网:https://supraoracles.com/ 预言机的核心价值就在于数据传输,数据传输的速度、准确性、安全性更是重中之重。Supra Oracles 就是这…...

关系型数据库 期末复习(未完

关系型数据库 绪论概念间的关系数据库的历史信息和数据数据模型 关系模型数据结构关系完整性关系操作语言 关系代数语言 绪论 概念间的关系 数据->数据库->数据库管理系统->数据库系统 数据库的历史 人工管理阶段 -> 文件系统阶段 -> 数据库系统阶段 数据库…...

【学习笔记】CF1895G Two Characters, Two Colors

感谢grass8sheep提供的思路。 首先&#xff0c;我们可以用 D P DP DP解决这个问题。 设 f i , j f_{i,j} fi,j​表示前 i i i个数中有 j j j个为 1 1 1的位置为红色的最大价值。则转移如下&#xff1a; f i , j ← f i − 1 , j b i f_{i,j}\gets f_{i-1,j}b_i fi,j​←fi−…...

GZ035 5G组网与运维赛题第10套

2023年全国职业院校技能大赛 GZ035 5G组网与运维赛项&#xff08;高职组&#xff09; 赛题第10套 一、竞赛须知 1.竞赛内容分布 竞赛模块1--5G公共网络规划部署与开通&#xff08;35分&#xff09; 子任务1&#xff1a;5G公共网络部署与调试&#xff08;15分&#xff09; 子…...

基于SSM的教学管理系统(有报告)。Javaee项目。

演示视频&#xff1a; 基于SSM的教学管理系统&#xff08;有报告&#xff09;。Javaee项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringMvc My…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

【笔记】AI Agent 项目 SUNA 部署 之 Docker 构建记录

#工作记录 构建过程记录 Microsoft Windows [Version 10.0.27871.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗ ██╗███╗ ██╗ █████╗ ██╔════╝…...