姿态旋转与坐标变换

2023-05-16

姿态旋转与坐标变换

  • 旋转还是变换 ?
  • 坐标旋转/变换矩阵(Rotation Matrix)
  • 等效旋转矢量(Axis-Angle)
    • 罗德里格斯公式(Rodrigues's Formula)
  • 汉密尔顿四元数(Hamilton Quaternion)
  • 欧拉角
  • Eigen中的姿态表示
    • 变换矩阵
    • 等效旋转矢量
    • 旋转四元数
    • 使用Eigen进行矢量旋转
  • 结语

旋转还是变换 ?

作为SLAM中位姿估计的重要内容,姿态的表示方法多种多样,估计精度对系统性能的影响也比位置重要的多。众所周知,姿态的描述方法包括等效旋转矢量、欧拉角、旋转矩阵、姿态四元数等等,有大量成熟的文献描述了这些方法的详细定义和相互之间的转换关系。但遗憾的是,这一看似成熟的领域却依旧是实际应用中错误的重灾区。这一现象的原因,归根结底,在于相关概念的混乱,其中最典型的,就是“空间旋转”和“坐标变换”。因此,在深入讨论姿态表示的相关概念之前,我们需要首先明确,我们所谈论的“姿态表示”,到底是什么?

首先我们来考虑第一种情况,记坐标系 f \bm{f} f下一个空间矢量的坐标为 v f \bm{v}^f vf,上标表示矢量所在的坐标系;坐标系 f \bm{f} f保持不变,记该矢量绕 z z z轴旋转 π 2 \frac{\pi}{2} 2π后的矢量为 v ′ f \bm{v}'^f vf,由线性代数的知识我们知道,两者之间的关系可以由一个矩阵表示,即: v ′ f = R 1 v f \bm{v}'^f=\bm{R}_1\bm{v}^f vf=R1vf

接下来我们考虑第二种情况,同样记坐标系 f \bm{f} f下一个空间矢量的坐标为 v f \bm{v}^f vf,现在保持矢量不变,将坐标系 f \bm{f} f z z z轴旋转 π 2 \frac{\pi}{2} 2π后得到坐标系 f 1 \bm{f}_1 f1,同样可以用一个矩阵表示空间矢量 v \bm{v} v在两个坐标系下的关系: v f 1 = R 2 v f \bm{v}^{f_1}=\bm{R}_2\bm{v}^f vf1=R2vf

显然,直觉告诉我们矩阵 R 1 \bm{R}_1 R1 R 2 \bm{R}_2 R2并不一样,那两者之间有什么关系呢?

坐标旋转/变换矩阵(Rotation Matrix)

矩阵 R 1 \bm{R}_1 R1表示空间矢量的旋转过程,称为矢量旋转矩阵;与之相对,矩阵 R 2 \bm{R}_2 R2表示坐标系的旋转过程,矢量本身并没有旋转,只是在不同坐标系下的坐标表示不同,因此称为坐标变换矩阵,根据旋转的可逆性,显然有 R 1 R 2 = I \bm{R}_1\bm{R}_2=\bm{I} R1R2=I。这里请大家牢记并理清这两个矩阵定义上的不同,在后续我们讨论各种姿态表示方法之间的转换关系时,一定要首先明确针对的是旋转还是变换,否则将得到完全相反的结论。

这里需要说明,完整的坐标变换矩阵 T \bm{T} T为齐次坐标(Homogeneous Coordinates)形式,包括这里所说的旋转变换矩阵 R \bm{R} R和表示坐标系原点变化的平移变换矢量 t \bm{t} t两部分,即 T = [ R ∣ t ] \bm{T}=[\bm{R}|\bm{t}] T=[Rt]。但由于本文我们只讨论旋转的相关内容,为了描述方便,以下均将 R \bm{R} R简称为变换矩阵。

等效旋转矢量(Axis-Angle)

使用矩阵来表示旋转存在过参数化问题(对称矩阵的自由度为6维,但实际旋转的自由度只有3维),且难以直观的表示矢量之间的旋转关系。根据刚体运动学的相关知识,有限次的旋转都可以等效为一个旋转轴和一个旋转角的单次旋转。记该单次旋转对应的旋转轴为 k \bm{k} k,旋转角为 θ \theta θ,则矢量 k n \bm{k}n kn称为等效旋转矢量或轴角(Axis-Angle)。

罗德里格斯公式(Rodrigues’s Formula)

在这里插入图片描述
回到上面的问题,旋转前后的矢量之间的关系如何使用等效旋转矢量表示呢?上图表示了同一个坐标系下矢量旋转前后的分解关系,由于所有矢量均在同一个坐标系下表示,为了书写方便,这里我们省略上标 f f f,记旋转前后的矢量分别为 v \bm{v} v v ′ \bm{v}' v,对应的旋转矢量为 k θ \bm{k}\theta kθ。首先我们将矢量分别投影到旋转矢量的垂直方向和平行方向,得到垂直分量 v ⊥ \bm{v}_\perp v和平行分量 v ∥ \bm{v}_\parallel v。平行分量可以由向量内积得到:
(1) v ∥ = ( v ⋅ k ) k \bm{v}_\parallel=\left(\bm{v}\cdot\bm{k}\right)\bm{k} \tag{1} v=(vk)k(1)
垂直分量 v ⊥ \bm{v}_\perp v则可根据拉格朗日公式 a × ( b × c ) = b ( a ⋅ c ) − c ( a ⋅ b ) \bm{\bm{a}\times(\bm{b}\times\bm{c})=\bm{b}(\bm{a}\cdot\bm{c})-\bm{c}(\bm{a}\cdot\bm{b})} a×(b×c)=b(ac)c(ab)得到:
(2) v ⊥ = v − ( v ⋅ k ) k = − k × ( k × v ) \bm{v}_\perp=\bm{v}-\left(\bm{v}\cdot\bm{k}\right)\bm{k}=-\bm{k}\times(\bm{k}\times\bm{v}) \tag{2} v=v(vk)k=k×(k×v)(2)
平行分量在旋转过程中保持不变 v ∥ ′ = v ∥ \bm{v}'_\parallel=\bm{v}_\parallel v=v,旋转后的垂直分量为:
(3) v ⊥ ′ = v ⊥ cos ⁡ θ + k × v ⊥ sin ⁡ θ \bm{v}'_\perp=\bm{v}_\perp\cos\theta+\bm{k}\times\bm{v}_\perp\sin\theta \tag{3} v=vcosθ+k×vsinθ(3)
v ⊥ = v − v ∥ \bm{v}_\perp=\bm{v}-\bm{v}_\parallel v=vv带入式 ( 3 ) (3) (3)并注意到 k × v ∥ = 0 \bm{k}\times\bm{v}_\parallel=\bm{0} k×v=0得到:
(4) v ′ = v ∥ ′ + v ⊥ ′ = v ∥ + ( v − v ∥ ) cos ⁡ θ + k × ( v − v ∥ ) sin ⁡ θ = cos ⁡ θ v + ( 1 − cos ⁡ θ ) v ∥ + sin ⁡ θ k × v = cos ⁡ θ v + ( 1 − cos ⁡ θ ) ( v ⋅ k ) k + sin ⁡ θ k × v \begin{aligned} \bm{v}'&=\bm{v}'_\parallel+\bm{v}'_\perp\\ &=\bm{v}_\parallel+(\bm{v}-\bm{v}_\parallel)\cos\theta+\bm{k}\times(\bm{v}-\bm{v}_\parallel)\sin\theta\\ &=\cos\theta\bm{v}+(1-\cos\theta)\bm{v}_\parallel+\sin\theta\bm{k}\times\bm{v}\\ &=\cos\theta\bm{v}+(1-\cos\theta)(\bm{v}\cdot\bm{k})\bm{k}+\sin\theta\bm{k}\times\bm{v} \end{aligned} \tag{4} v=v+v=v+(vv)cosθ+k×(vv)sinθ=cosθv+(1cosθ)v+sinθk×v=cosθv+(1cosθ)(vk)k+sinθk×v(4)
由于 ( v ⋅ k ) = k k T v (\bm{v}\cdot\bm{k})=\bm{k}\bm{k}^T\bm{v} (vk)=kkTv,带入上式,并与 v ’ = R v \bm{v}’=\bm{R}\bm{v} v=Rv联立,可以得到旋转矩阵 R \bm{R} R的表达式为:
(5) R = cos ⁡ θ I + ( 1 − cos ⁡ θ ) k k T + sin ⁡ θ k ∧ \bm{R}=\cos\theta\bm{I}+(1-\cos\theta)\bm{k}\bm{k}^T+\sin\theta\bm{k}^\wedge \tag{5} R=cosθI+(1cosθ)kkT+sinθk(5)
至此,我们得到了使用等效旋转矢量表示的旋转前后矢量坐标之间的关系,式 ( 5 ) (5) (5)称为罗德里格斯公式(Rodrigues’s Formula),表征了等效旋转矢量旋转矩阵之间的关系。

注意这里的矩阵 R \bm{R} R旋转矩阵而非变换矩阵。有时候(甚至更多时候)我们会用等效旋转矢量表示坐标系的旋转而非矢量的旋转。例如,坐标系 f 1 \bm{f}_1 f1经过等效旋转矢量 k θ \bm{k}\theta kθ旋转后,得到坐标系 f 2 \bm{f}_2 f2,则由罗德里格斯计算得到的矩阵 R \bm{R} R表征的是 f 2 → f 1 \bm{f}_2\rightarrow\bm{f}_1 f2f1的坐标变换,即:
(6) v f 1 = R v f 2 \bm{v}^{f_1}=\bm{R}\bm{v}^{f_2} \tag{6} vf1=Rvf2(6)

汉密尔顿四元数(Hamilton Quaternion)

使用等效旋转矢量表示姿态依旧存在一个问题——“奇异性”,因此我们需要找到一种即紧凑,又不容易产生奇异的方式描述姿态。由于复数天然可以用来表示复平面上的旋转,使用复数表示空间三维旋转的方式也应运而生,即姿态四元数

一个完整的姿态四元数包含一个实部和三个虚部,且模长为1:
(7) q = q w + q x i + q y j + q z k ∥ q ∥ = 1 \begin{aligned} &\bm{q}=q_w+q_x\bm{i}+q_y\bm{j}+q_z\bm{k}\\ &\|\bm{q}\|=1 \end{aligned} \tag{7} q=qw+qxi+qyj+qzkq=1(7)
这里我们采用的是实部在前,虚部在后的方式,称为汉密尔顿四元数(Hamilton Quaternion);同样亦存在实部位于最后的定义方式(例如后面要将的C++线性代数库Eigen),在使用四元数相关公式时(例如四元数微分、四元数和旋转矩阵的转换等)一定要明确四元数分量的排列顺序。

四元数和旋转矢量之间的关系定义为:
(8) q = cos ⁡ θ 2 + sin ⁡ θ 2 i + sin ⁡ θ 2 j + sin ⁡ θ 2 k \bm{q}=\cos\frac{\theta}{2}+\sin\frac{\theta}{2}\bm{i}+\sin\frac{\theta}{2}\bm{j}+\sin\frac{\theta}{2}\bm{k} \tag{8} q=cos2θ+sin2θi+sin2θj+sin2θk(8)
由式 ( 8 ) (8) (8)得到的四元数称为旋转四元数,使用旋转四元数进行矢量旋转的操作为:
(9) v ′ f = q v f q ∗ \bm{v}'^f = \bm{q}\bm{v}^f\bm{q}^\ast \tag{9} vf=qvfq(9)
式中, q ∗ = cos ⁡ θ 2 − sin ⁡ θ 2 i − sin ⁡ θ 2 j − sin ⁡ θ 2 k \bm{q}^\ast=\cos\frac{\theta}{2}-\sin\frac{\theta}{2}\bm{i}-\sin\frac{\theta}{2}\bm{j}-\sin\frac{\theta}{2}\bm{k} q=cos2θsin2θisin2θjsin2θk q \bm{q} q的共轭四元数。

同样,当四元数 q \bm{q} q表示坐标系 f 1 → f 2 \bm{f}_1\rightarrow\bm{f}_2 f1f2的旋转时,式 ( 9 ) (9) (9)表征的是 f 2 → f 1 \bm{f}_2\rightarrow\bm{f}_1 f2f1的坐标变换关系,即:
(10) v f 1 = q v f 2 q ∗ \bm{v}^{f_1}=\bm{q}\bm{v}^{f_2}\bm{q}^\ast \tag{10} vf1=qvf2q(10)
由于四元数与其共轭表示相反方向的旋转,自然有 v f 2 = q ∗ v f 1 q \bm{v}^{f_2}=\bm{q}^\ast\bm{v}^{f_1}\bm{q} vf2=qvf1q,将其与式 ( 6 ) (6) (6)联立可以得到坐标系 f 1 → f 2 \bm{f}_1\rightarrow\bm{f}_2 f1f2之间旋转四元数 q f 1 f 2 \bm{q}_{f_1}^{f_2} qf1f2坐标变换矩阵 R f 1 f 2 \bm{R}_{f_1}^{f_2} Rf1f2之间的关系为:
(11) R f 1 f 2 [ x y z ] = [ ( q w 2 + q x 2 − q y 2 − q z 2 ) x + 2 ( q w q z + q x q y ) y + 2 ( q x q z − q 2 q y ) z 2 ( q x q y − q w q z ) x + ( q w 2 − q x 2 + q y 2 − q z 2 ) y + 2 ( q w q x + q y q z ) z 2 ( q w q y − q x q z ) x + 2 ( q y q z − q w q x ) y + ( q w 2 − q x 2 − q y 2 + q z 2 ) z ] = [ ( q w 2 + q x 2 − q y 2 − q z 2 ) 2 ( q w q z + q x q y ) 2 ( q x q z − q 2 q y ) 2 ( q x q y − q w q z ) ( q w 2 − q x 2 + q y 2 − q z 2 ) 2 ( q w q x + q y q z ) 2 ( q w q y − q x q z ) 2 ( q y q z − q w q x ) ( q w 2 − q x 2 − q y 2 + q z 2 ) ] [ x y z ] \begin{aligned} \bm{R}_{f_1}^{f_2}\left[\begin{array}{c}x\\y\\z\end{array}\right]&=\left[\begin{array}{c} \left(q_w^2+q_x^2-q_y^2-q_z^2\right)x + 2\left(q_wq_z+q_xq_y\right)y+2\left(q_xq_z-q_2q_y\right)z\\ 2\left(q_xq_y-q_wq_z\right)x+\left(q_w^2-q_x^2+q_y^2-q_z^2\right)y+2\left(q_wq_x+q_yq_z\right)z\\ 2\left(q_wq_y-q_xq_z\right)x+2\left(q_yq_z-q_wq_x\right)y+\left(q_w^2-q_x^2-q_y^2+q_z^2\right)z \end{array}\right]\\ &=\left[\begin{array}{ccc} \left(q_w^2+q_x^2-q_y^2-q_z^2\right) & 2\left(q_wq_z+q_xq_y\right) & 2\left(q_xq_z-q_2q_y\right)\\ 2\left(q_xq_y-q_wq_z\right) & \left(q_w^2-q_x^2+q_y^2-q_z^2\right) & 2\left(q_wq_x+q_yq_z\right)\\ 2\left(q_wq_y-q_xq_z\right) & 2\left(q_yq_z-q_wq_x\right) & \left(q_w^2-q_x^2-q_y^2+q_z^2\right) \end{array}\right]\left[\begin{array}{c}x\\y\\z\end{array}\right] \end{aligned} \tag{11} Rf1f2xyz=(qw2+qx2qy2qz2)x+2(qwqz+qxqy)y+2(qxqzq2qy)z2(qxqyqwqz)x+(qw2qx2+qy2qz2)y+2(qwqx+qyqz)z2(qwqyqxqz)x+2(qyqzqwqx)y+(qw2qx2qy2+qz2)z=(qw2+qx2qy2qz2)2(qxqyqwqz)2(qwqyqxqz)2(qwqz+qxqy)(qw2qx2+qy2qz2)2(qyqzqwqx)2(qxqzq2qy)2(qwqx+qyqz)(qw2qx2qy2+qz2)xyz(11)

欧拉角

由于解算存在奇异,且对转序敏感,欧拉角在实际的姿态解算中应用并不多;但欧拉角的表示方式比较符合易于想象,因此在大多数情况下只用于结果的显示和保存,这里暂且略过不谈。

Eigen中的姿态表示

作为应用最广泛的C++开源线性代数运算库,几何模块Eigen::Geometry提供了刚体运动相关的各项功能,所有角度的单位以弧度(radius)表示。

变换矩阵

Eigen中的坐标变换矩阵即普通的3x3双精度矩阵Matrix3d,构造方式和普通的矩阵一致,例如:

Eigen::Matrix3d rotation_matrix;
rotation_matrix << x_00,x_01,x_02,x_10,x_11,x_12,x_20,x_21,x_22;

等效旋转矢量

Eigen中的等效旋转矢量拥有自己的专属模板类AngelAxis,一般使用预定义好的double型子类AngleAxisd,构造方式如下:

Eigen::AngleAxisd rvec(double angle, Eigen::Vector3d axis)//直接由参数构造
Eigen::AngleAxisd rvec(rotation_matrix)// 通过变换矩阵构造

需要注意的是构造时传入的变换矩阵为逆矩阵,即若构造 f 1 → f 2 \bm{f}_1\rightarrow\bm{f}_2 f1f2的旋转矢量,则需要传入变换矩阵 R f 2 f 1 \bm{R}_{f_2}^{f_1} Rf2f1。构造完成后,使用成员函数toRotationMatrix()可以获得逆变换矩阵 R f 2 f 1 \bm{R}_{f_2}^{f_1} Rf2f1

旋转四元数

Eigen中的旋转四元数归属于模板类Quaternion,一般同样使用预定好的double型子类Quaterniond,旋转四元数可以直接由旋转矢量构建:

Eigen::Quaterniond q(rvec)// 直接由旋转矢量构建
Eigen::Quaterniond q1(q_w, q_x, q_y, q_z)// 直接由分量构建;
Eigen::Quaterniond q2(rotation_matrix)// 直接由变换矩阵构建;
  • 使用旋转矢量构造式,获得的四元数为与旋转矢量一致的旋转四元数;
  • 使用变换矩阵构造时,与旋转矢量一样需要传入逆矩阵;
  • 由分量构造时,按照实部在前的顺序传入,但在Eigen内部存储时,采用的是实部在后的存储格式。

使用Eigen进行矢量旋转

Eigen中使用旋转矢量和四元数对矢量进行运算时,由于操作符*重载为矩阵运算方式,因此只接收左乘操作,运算表示旋转而非变换。

Eigen::AngleAxisd rvec(M_PI/2.0, Eigen::VEctor3d(0, 0, 1)); // 绕z轴旋转pi/2
Eigen::Matrix3d R = rvec.toRotationMatrix();
Eigen::Quaterniond q(rvec);

Eigen::Vector3d a{1., 0., 0.}
std::cout << "q * a: " << std::endl << q * a << std:: endl; 
std::cout << "R * a: " << std::endl << R * a <<std::endl;
std::cout << "rvec * a" << std::endl << rvec * a << std::endl;

在上面这个例子中,无论是使用四元数、旋转矩阵(注意不是变换矩阵)还是旋转矢量,我们均得到了一致的结果。

结语

综上,在进行姿态运算时,一定要理清到底是矢量的旋转还是坐标系的旋转,使用的矩阵到底是旋转矩阵还是变换矩阵,否则很容易获得完全相反的结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

姿态旋转与坐标变换 的相关文章

  • jtag和swd区别,该用哪个?

    我刚开始学习单片机是STC最经典的STC89C52RC 导致我后面很多51的产品应用都会选择STC xff0c 一方面是因为熟悉 xff0c 一方面是使用确实很方便 其中最让我满意的就是烧录 xff0c 可以直接用串口就可以下载程序 xff
  • 匈牙利算法原理与Python实现

    匈牙利算法原理与Python实现 今天学习一个新的算法 匈牙利算法 xff0c 用于聚类结果分析 xff0c 先用图表示我当前遇到的问题 xff1a 这两列值是我用不同算法得到的聚类结果 xff0c 从肉眼可以看出第一列聚类为0的结果在第二
  • STM32之后哪块板子发展最好?

    从事开发10年了 xff0c 我来说说我个人见解 首先 xff0c 除非是顶尖的垄断技术 xff0c 否则一般不会有屹立不倒的芯片 站在研发经理的角度 xff0c 单片机选型时主要会考虑以下几个因素 xff1a 1 稳定性 2 价格 3 交
  • stm32用什么软件编程烧写比较好呢?

    今天给大家分享我从业单片机开发11年必备的神器 在刚入行不久 xff0c 看到那些老工程师费很大的劲去搭建开发调试环境 xff0c 让我很不解 我想有那工夫 xff0c 我程序都写完了 xff0c 如果有问题就看代码找Bug呗 直到后面做了
  • 嵌入式开发要学多久?要学哪些课程

    曾经有新手和我抱怨 xff1a 为什么嵌入式开发这么难 xff1f 相信我 xff0c 你不是学不会 xff0c 只是没找对方法 这是一片真正为 终结迷茫 而生的回答 xff0c 内容有点长 xff0c 如果你赶时间 xff0c 建议先点赞
  • 单片机volatile关键字的作用?

    最近我们无际单片机学员在做stm8和stm32项目的时候 xff0c 问volatile这个关键词怎么理解 xff1f 有什么作用 xff1f Volatile是C语言的一个关键字 xff0c 在stm8和stm32的固件库里也会经常看见这
  • STC89C51单片机相比于其他单片机具有那些优点?

    STC89C51只适合和同性能的51内核单片机相比 xff0c 性能不同并无可比性 11年前 xff0c 我就是通过自学STC89C51入行单片机开发的 到目前为止都非常经典 xff0c 很多开发板都是基于这个芯片去做的 我对STC单片机也
  • 单片机怎么实现真正的多线程?

    所谓多线程都是模拟的 xff0c 本质都是单线程 xff0c 因为cpu同一时刻只能执行一段代码 模拟的多线程就是任务之间快速切换 xff0c 看起来像同时执行的样子 据说最近有多核的单片机 xff0c 不过成本应该会高很多 对于模拟的多线
  • 单片机能运行操作系统吗?

    先直接上答案 xff1a 可以 xff01 但是操作系统不是刚需 xff0c 上操作系统比较占用单片机的资源 xff0c 比如占用比较多的FLASH和RAM xff0c 间接增加了硬件成本 xff0c 哪怕成本增加1毛钱 xff0c 对于上
  • stm32 单片机主要优点有哪些?

    STM32我用了近10年了 xff0c 用它做过的项目至少也有10几个 可以说是我用过单片机里 xff0c 最省心最好用的 xff0c 不会有乱七八糟的问题 我感觉STM32这几年这么热门 xff0c 开发板至少占了一半功劳 不过 xff0
  • 初学stm32单片机可以做什么简单的小作品?

    已从事单片机开发十几年 xff0c 刚开始接触单片机时 xff0c 感觉挺有意思 可以用自己的思维写程序 xff0c 控制硬件去实现一些智能化的操作 刚点亮第一个LED xff0c 就开始幻想以后能做任何自己想要的产品 xff0c 那感觉多
  • 微机原理,有啥书籍推荐?

    我从事了单片机开发十几年 xff0c 很惭愧 xff0c 没有完整看完一本技术书籍 刚入行那会 xff0c 看过模电 xff0c 给我的感觉就是 xff0c 这书不是给新手看的 xff0c 是给专家看的 xff0c 果断放弃 后面又看了一些
  • public/private/protected的具体区别

    1 public xff1a public表明该数据成员 成员函数是对所有用户开放的 xff0c 所有用户都可以直接进行调用 2 private xff1a private表示私有 xff0c 私有的意思就是除了class自己之外 xff0
  • 单片机中有FLASH为啥还需要EEROM?

    这是一片真正为 终结懵逼 而生的回答 看完如果还不懂 xff0c 那就多看几遍 以前我做项目 xff0c 有时用Flash xff0c 有时用EEPROM xff0c 搞得我有点懵逼 然后在网上搜了一些资料 xff0c 看完以后还是不能理解
  • 嵌入式软件去哪个公司好?

    从事嵌入式单片机开发十几年 xff0c 碰到坑逼公司无数 这篇文章不会直接给你说什么公司好 xff0c 而是根据我的惨痛经历 xff0c 聊聊什么公司值得去 很多人说去越大的公司越好 xff0c 在大公司里 xff0c 你如同蝼蚁 xff0
  • 该不该放弃嵌入式,单片机这条路?

    本文几乎浓缩了我从业10几年的精华 xff0c 内容 涵盖我转行 打工 创业的经历 建议从头到尾不要错过一字一句 xff0c 因为字里行间的经验之谈 xff0c 或许能成为你人生重要转折点 全文 3700 多字 xff0c 写了 6 个多小
  • 集成学习(Ensemble Learning)

    集成学习Ensemble Learning Ensemble LearningDefinitionCommon types of ensemblesBootstrap aggregating Bagging BoostingStacking
  • 入住CSDN第一天

    对CSDN的个人看法 缺点 其实我对CSDN不感冒 xff0c 因为多年来一直在 简述 上面编写自己的博客 xff0c hexo 搭建个人博客 我对哪些必须扫码注册登录才能看复制 xff0c 必须花钱充钱才能下载资源的平台表示不喜欢 CSD
  • 前端技术文档

    前端技术大纲 首先声明需要CSS xff0c html xff0c xff08 js xff09 技术可不不用太深但是必须会一点 1 vue vueCDNvue Clivue routervue loadervue api 所有方法vue
  • 英雄手游版教程

    Android教程 百度搜索 ourplay 翻墙注册 Google 或者 拳头 或者 facebook 账号启动游戏 IOS教程 下载加速器个人推荐 迅雷 因为其他的都要收费搜索下载英雄联盟启动游戏

随机推荐

  • vue component

    component Vue component 39 todoItem 39 template 96 lt p gt 这是一个代办项 lt p gt 96 lt div gt lt todo ttem gt lt div gt 当vue实例
  • vue监听对象的用法

    watch监听对象 data return obj name 34 JackMe 34 watch 39 obj 39 handler newValue oldValue console log newValue name oldValue
  • VSCODE无法使用cnpm

    这里写自定义目录标题 简单暴力 简单暴力 1 xff0c 右击VSCode图标 xff0c 选择以管理员身份运行 xff1b 2 xff0c 在终端中执行get ExecutionPolicy xff0c 显示Restricted xff0
  • Win10环境下不同版本WinGW切换

    因需要 xff0c 安装了不同版本的WinGW gcc xff0c 实际使用中遇到一些问题 xff0c 解决过程记录如下 xff1a 在使用BusMaster时需要4 8 1版本 xff0c 原本系统默认9 2 0 xff0c busmas
  • 【无标题】

    这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题 xff0c 有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中 居左 居右SmartyP
  • expo优势

    优点一 xff1a 一条命令生成apk或者ipa文件 xff0c 方便发布到应用商店 优点二 xff1a 代码publish xff0c 应用内热更新 优点三 xff1a 比react native多出不少实用原生组件 xff0c 比如一些
  • C++一些常见问题

    关于赋值的疑问 1 编译器为每个类默认重载了赋值操作符 xff1b 2 默认的赋值操作符仅完成了浅拷贝 xff1b 3 当需要进行深拷贝时必须重载赋值操作符 xff1b 4 赋值操作符与拷贝构造函数有相同的存在意义 实例分析 xff1a s
  • 树莓派学习(二):更换镜像源以及安装虚拟环境miniforge3

    树莓派学习 xff08 二 xff09 xff1a 更换镜像源以及安装pytorch 步骤一 xff1a 更换镜像源步骤二 xff1a 下载前的准备2 1 原来numpy库的卸载 步骤三 xff1a 安装miniforge3 步骤一 xff
  • 3.1 python版MapReduce基础实战

    输入文件在你每次点击评测的时候 xff0c 平台会为你创建 xff0c 无需你自己创建 xff0c 只需要启动HDFS xff0c 编写python代码即可 第1关 xff1a 成绩统计 mapper py usr bin python3
  • 怎么获取li里面的内容

    获取li的内容 span class token tag span class token tag span class token punctuation lt span ul span span class token punctuat
  • 偏移量的概念

    span class token selector span span class token punctuation span span class token property padding span span class token
  • js中的二级联动

    省份市级城市联动 span class token doctype lt DOCTYPE html gt span span class token tag span class token tag span class token pun
  • 页面跳转的几种方法

    location对象 href assgin跳转到另一个页面可以返回到原来的页面 location span class token punctuation span href span class token operator 61 sp
  • 学习JS基础部分一

    数据类型 分支结构 循环结构 数据类型 简单数据类默认值Number0BooleanfalseString Undefinedundefinednullnull 复杂数据类型默认值Array Object 分支结构 分支语句说明if 条件
  • 来,带你见识一下CT三维重建

    文 xff1a 北京协和医院放射科孙昊 来源 xff1a 从医开始 xff0c 协和八的奇妙临床笔记 相信各位同学在临床工作中 xff0c 已经接触到很多CT三维重建的图像了 xff0c 那么CT三维重建到底是个啥东东 xff1f 这个问题
  • 数组常用方法

    concat span class token keyword let span arr1 span class token operator 61 span span class token punctuation span span c
  • 深拷贝和浅拷贝

    浅拷贝和深拷贝的区别 浅拷贝是复制原数据的数据内容 xff0c 引用原数据的地址 xff1b 当改变复制之后的数据时 xff0c 原数据的数据内容也会被改变 xff0c 因为这是引用原来数据的地址 xff0c 改变的是原数据地址的数据内容
  • Set集合和Map集合

    Set集合 用于存放不重复的数据 xff0c 通过构造函数的形式 参数必须是一个可迭代对象 创建Set对象 span class token keyword const span s1 span class token operator 6
  • js树型结构处理

    span class token comment 获取树形结构并处理 span span class token comment 当child为null时处理 span span class token comment 如果是childre
  • 姿态旋转与坐标变换

    姿态旋转与坐标变换 旋转还是变换 xff1f 坐标旋转 变换矩阵 xff08 Rotation Matrix xff09 等效旋转矢量 xff08 Axis Angle xff09 罗德里格斯公式 xff08 Rodrigues 39 s