当前位置: 首页 > 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…...

软件测试工作流程

流程体系介绍 在以往的项目工作中&#xff0c;我参与过&#xff0c;需求评审、测试计划制定、测试用例编写、测试用例执行、测试脚本编写、测试脚本的执行&#xff0c;进行回归测试、验收测试、编写阶段性测试报告等工作 需求分析&#xff0c;需求评审&#xff08;RPD、产品原…...

高级文本编辑软件 UltraEdit mac中文版介绍说明

UltraEdit mac是一款在Windows系统中非常出名的文本编辑器&#xff0c; UltraEdit for mac对于IT程序猿来说&#xff0c;更是必不可少&#xff0c;可以使用UltraEdit编辑配置文件、查看16进制文件、代码高亮显示等&#xff0c;虽然Mac上已经有了很多优秀的文本编辑器&#xff0…...

python模块的介绍和导入

python模块的介绍和导入 概念 在Python中&#xff0c;每个Python代码文件都是一个模块。写程序时&#xff0c;我们可以将代码分散在不同的模块(文件)中&#xff0c;然后在一个模块中引用另一个模块的内容。 导入格式 1、在一个模块中引用(导入)另一个模块可以使用import语句…...

基于单片机的智能饮水机系统

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、系统设计方案分析2.1 设计功能及性能分析2.2设计方案分析 二、系统的硬件设计3.1 系统设计框图系统软件设计4.1 总体介绍原理图 四、 结论 概要 现在很多学校以及家庭使用的饮水机的功能都是比较单一的&#…...

CSS画圆以及CSS实现动态圆

CSS画圆以及CSS实现动态圆 1. 先看基础&#xff08;静态圆&#xff09;1.1 效果如下&#xff1a;1.2 代码如下&#xff1a; 2. 动态圆2.1 一个动态圆2.1.1 让圆渐变2.1.2 圆渐变8秒后消失2.1.3 转动的圆&#xff08;单个圆&#xff09; 2.2 多个动态圆 1. 先看基础&#xff08;…...

K8S知识点(一)

&#xff08;1&#xff09;应用部署方式转变 &#xff08;2&#xff09;K8S介绍 容器部署容易出现编排问题&#xff0c;为了解决就出现了大量的编排软件&#xff0c;这里将的是K8S编排问题的解决佼佼者 弹性伸缩&#xff1a;当流量从1000变为1200可以&#xff0c;自动开启一个…...

人工智能师求职面试笔试题及答案汇总

人工智能师求职面试笔试题及答案汇总 1.如何在Python中实现一个生成器&#xff1f; 答&#xff1a;在Python中&#xff0c;生成器是一种特殊类型的迭代器。生成器允许你在需要时才生成值&#xff0c;从而节省内存。生成器函数在Python中是通过关键字yield来实现的。例如&…...

【Windows-软件-FFmpeg】(01)通过CMD运行FFmpeg进行操作,快速上手

前言 通过"cmd"运行"ffmpeg"进行操作&#xff0c;快速上手&#xff1b; 实操 【实操一】 说明 使用"ffmpeg"来合并音频文件和视频文件 &#xff1b; 环境 Windows 11 专业版&#xff08;22621.2428&#xff09;&#xff1b; 代码 &#xf…...

Spring Data Redis + RabbitMQ - 基于 string 实现缓存、计数功能(同步数据)

目录 一、Spring Data Redis 1.1、缓存功能 1.1.1、分析 1.1.2、案例实现 1.1.3、效果演示 1.2、计数功能&#xff08;Redis RabbitMQ&#xff09; 1.2.1、分析 1.2.2、案例实现 一、Spring Data Redis 1.1、缓存功能 1.1.1、分析 使用 redis 作为缓存&#xff0c; M…...

Facebook Developer 的 HashCode

在 Android 中&#xff0c;您可以使用 Facebook SDK 提供的工具来生成您的应用程序的哈希码&#xff08;hash code&#xff09;&#xff0c;以便在 Facebook 开发者帐户中配置您的应用程序。 要生成哈希码&#xff0c;您可以使用以下步骤&#xff1a; 打开终端或命令提示符&am…...