欧拉旋转

姿态角pitch/roll/yaw

​ 姿态角是飞行器的机体坐标系与地面坐标系的夹角,也叫欧拉角。其中,

pitch是俯仰角,yaw是偏航角,roll是滚转角。

​ 欧拉角最直观、最容易理解、存储空间少,但欧拉角存在万向节死锁现象、插值速度不均匀等缺点,而且不可以在计算机中直接运算。

设xyz-轴为参考系的参考轴,也成为固定轴,XYZ-轴称为动轴,xy-平面和XY-平面的相交为交点线,用字母N表示。则章动角θ=β是z轴与Z轴的夹角,进动角ψ=α是x轴与交点线的夹角,自转角j=γ是交点线与X轴的夹角。上述旋转方式采用zxz的顺规方式旋转得到,即:

1. 绕z轴旋转α,使x轴与N轴重合,N轴是旋转前后两个坐标系x-y平面的交线
2. 绕x轴(也就是N轴)旋转β,使z轴与旋转后的z轴重合
3. 绕z轴旋转γ,使坐标系与旋转后的完全重合

欧拉角的旋转方式总共有12种:

  • 非对称型欧拉角: XYZ,XZY,YXZ,YZX,ZXY,ZYX
  • 对称型欧拉角: XYX,XZX,YXY,YZY,ZXZ,ZYZ

每一种旋转方式得到的结果并不一样,比如先绕X轴旋转45°再分别绕Y轴和Z轴旋转45°与先绕Y轴再绕X轴和Z轴旋转得到的结果是不一致的,由此可见旋转顺序的重要性。

在数学公式表达中,需要用矩阵相乘来表示旋转,乘以矩阵的顺序不同意味着旋转方式的不同,其结果也是不一样的。以二维旋转为例:

​ 设x点的坐标为(x0,y0),旋转后的坐标为(x1,y1),旋转角度为θ,则以矩阵表示为
[x1y1]=[cosθ−sinθsinθcosθ][x0y0]\left[ \begin{matrix} x1 \\ y1 \end{matrix} \right] =\left[ \begin{matrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{matrix} \right] \left[ \begin{matrix} x0 \\ y0 \end{matrix} \right] [x1y1​]=[cosθsinθ​−sinθcosθ​][x0y0​]
​ 在三维旋转中,可以分解为先绕x轴旋转,再绕y轴旋转,之后绕z轴旋转,则通过矩阵可表示为
[x1y1z1]=[cosα−sinα0sinαcosα0001][cosβ0−sinβ010sinβ0cosβ][1000cosθ−sinθ0sinθcosθ][x0y0z0]\left[ \begin{matrix} x1 \\ y1 \\ z1 \end{matrix} \right]= \left[ \begin{matrix} cos\alpha & -sin\alpha & 0 \\ sin\alpha & cos\alpha & 0 \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} cos\beta & 0 & -sin\beta \\ 0 & 1 & 0 \\ sin\beta & 0 & cos\beta \end{matrix} \right] \left[ \begin{matrix} 1 & 0 & 0 \\ 0 & cos\theta & -sin\theta \\ 0 & sin\theta & cos\theta \end{matrix} \right] \left[ \begin{matrix} x0 \\ y0 \\ z0 \end{matrix} \right] ⎣⎡​x1y1z1​⎦⎤​=⎣⎡​cosαsinα0​−sinαcosα0​001​⎦⎤​⎣⎡​cosβ0sinβ​010​−sinβ0cosβ​⎦⎤​⎣⎡​100​0cosθsinθ​0−sinθcosθ​⎦⎤​⎣⎡​x0y0z0​⎦⎤​
​ 通过上述矩阵可以看出,用[x0 y0 z0]代表一个向量的前提是定义了相应的坐标系,即X轴、Y轴和Z轴已经确定,不会因为旋转的发生而导致整个坐标轴发生形变。对于旋转矩阵ZYX,其顺序是先基于X轴旋转再进行Y轴和Z轴的旋转。

​ 以万向节死锁演示视频的截图为例进行说明:蓝圈表示绕x轴旋转,红圈表示绕y轴旋转,绿圈表示绕z轴旋转,由于绿圈的旋转会导致红圈和蓝圈的方向变化,红圈的旋转会导致蓝圈的方向变化,所以可以看到,要满足矩阵公式,即坐标轴的方向不发生改变,则其旋转的顺序必须是先转动蓝圈,再转动红圈,最后转动绿圈。即该模型的旋转顺序(即顺规)是蓝红绿(XYZ)。

​ 如果换个旋转顺序——先转绿圈45°再转红圈45°最后转蓝圈45°,这和先转动蓝圈45°再转动红圈45°最后转动绿圈45°的结果是一样的吗?答案是肯定的,只要保证转动角度一致,最后产生的效果都是一样的。那为什么要规定转动的顺序呢?因为此处大家已经陷入了转动顺序的陷阱了。为什么会有这个矛盾,其实是陷入了欧拉旋转中重要的一个概念的误解,这就是顺规

顺规

首先讨论顺规存在的必要性,顺规从数学意义上来讲就是对矩阵顺序的规定,具体讨论如下:
[x1y1z1]=[cosα−sinα0sinαcosα0001][cosβ0−sinβ010sinβ0cosβ][1000cosθ−sinθ0sinθcosθ][x0y0z0]\left[ \begin{matrix} x1 \\ y1 \\ z1 \end{matrix} \right]= \left[ \begin{matrix} cos\alpha & -sin\alpha & 0 \\ sin\alpha & cos\alpha & 0 \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} cos\beta & 0 & -sin\beta \\ 0 & 1 & 0 \\ sin\beta & 0 & cos\beta \end{matrix} \right] \left[ \begin{matrix} 1 & 0 & 0 \\ 0 & cos\theta & -sin\theta \\ 0 & sin\theta & cos\theta \end{matrix} \right] \left[ \begin{matrix} x0 \\ y0 \\ z0 \end{matrix} \right] ⎣⎡​x1y1z1​⎦⎤​=⎣⎡​cosαsinα0​−sinαcosα0​001​⎦⎤​⎣⎡​cosβ0sinβ​010​−sinβ0cosβ​⎦⎤​⎣⎡​100​0cosθsinθ​0−sinθcosθ​⎦⎤​⎣⎡​x0y0z0​⎦⎤​

[x1y1z1]=[cosβ0−sinβ010sinβ0cosβ][cosα−sinα0sinαcosα0001][1000cosθ−sinθ0sinθcosθ][x0y0z0]\left[ \begin{matrix} x1 \\ y1 \\ z1 \end{matrix} \right]= \left[ \begin{matrix} cos\beta & 0 & -sin\beta \\ 0 & 1 & 0 \\ sin\beta & 0 & cos\beta \end{matrix} \right] \left[ \begin{matrix} cos\alpha & -sin\alpha & 0 \\ sin\alpha & cos\alpha & 0 \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} 1 & 0 & 0 \\ 0 & cos\theta & -sin\theta \\ 0 & sin\theta & cos\theta \end{matrix} \right] \left[ \begin{matrix} x0 \\ y0 \\ z0 \end{matrix} \right] ⎣⎡​x1y1z1​⎦⎤​=⎣⎡​cosβ0sinβ​010​−sinβ0cosβ​⎦⎤​⎣⎡​cosαsinα0​−sinαcosα0​001​⎦⎤​⎣⎡​100​0cosθsinθ​0−sinθcosθ​⎦⎤​⎣⎡​x0y0z0​⎦⎤​

​ 可以看到,矩阵的顺序不一样会导致最终的旋转结果不一致,不妨以一支笔为向量比划一下,假设向量为[1,0,0],则向量先绕y轴旋转90°到z轴,再绕x轴旋转30°,和先绕x轴旋转30°再绕y轴旋转90°,其结果是不一样的。如果空间思维能力差的可以参考欧拉角的旋转顺序能改变吗?中的几个gif动图。

​ 从数学角度上分析,确实旋转的顺序相当重要,但为什么上图中会有旋转顺序不一致结果却一样呢?这就跳回到我们前边要注意的细节,首先旋转过程中,我们必须保证第二次旋转轴不会因为第一个的旋转而发生偏转(第三次旋转同理)。即,第一次绕x轴旋转后,y轴和z轴的方向是没有发生任何变化的,这是对矩阵最直观的理解。

​ 从演示视频和模型来看,如果我们先转动红圈,其实蓝圈的轴心已经发生了偏转,即我们不能认为红圈先动就先乘以第二个矩阵。换言之,在数学上,哪个矩阵先乘在该模型中不等于哪个圈先转动,而必须遵循一个准则——先转动的圈不能影响还没转动的圈的轴心方向。所以实际上,该模型的顺规其实是已经确定了,即xyz顺序。那如何理解先转动红圈对应的数学模型呢?

​ 重新声明一点,通过矩阵运算可以得到,右边的矩阵运算后是对左边的矩阵不产生影响的,而左边的矩阵运算是会对右边的矩阵有一定的影响作用。我们可以通过空间想象得知,由于左边的矩阵会导致右边的矩阵原定旋转方向产生一定的偏转,相当于代入我们已知β的值,实际上就已经产生了对前一个矩阵旋转轴和整个向量的偏转,即红圈对蓝圈产生了影响,蓝圈也发生偏转了!

万向节死锁

​ 万向节死锁是欧拉旋转中顺规存在导致的必然缺陷,其本质就是欧拉旋转过程中出现了维度丢失的情况。无论是哪种顺规的欧拉旋转,总是会存在这种情况。比如zxz,但x旋转180°时,前后两次围绕z轴的旋转只产生了一个维度上的旋转,此时zxz的旋转只能产生两个维度的转动,即滚转角和俯仰角,偏转角丢失了。

​ 万向节死锁的关键原因在于顺规的存在——由于有了绕轴转动的顺序问题,导致对于绕顺序为第二的轴转动90°会导致其他两个轴上的运动方向重合,从而导致了原本三维的旋转运动少了一个维度,进而导致在某种特定的情况下不能按照预期的路线进行绕轴运动,具体过程可参考万向节死锁演示视频。详细的解释可参考【Unity编程】Unity中的欧拉旋转和【Unity编程】欧拉角与万向节死锁(图文版)。其解释仅供参考,我们还可以通过万向节死锁模拟程序Unity动手实践演示。

​ Unity中的顺规是zxy,即绕z轴的转动不影响x和y轴,绕x轴的转动不影响y轴但影响z轴,绕y轴的转动直接影响x和z轴,所以当先对x轴产生一个90°的旋转时,y轴和z轴都产生了同样的翻滚角效果,无法产生偏转角(x轴产生的是俯仰角的变化)。

​ 万向节死锁的模型演示已经在上述视频和其他文章中描述的比较清晰,以下我们只从数学角度上理解。
[x1y1z1]=[cosα−sinα0sinαcosα0001][cosβ0−sinβ010sinβ0cosβ][1000cosθ−sinθ0sinθcosθ][x0y0z0]\left[ \begin{matrix} x1 \\ y1 \\ z1 \end{matrix} \right]= \left[ \begin{matrix} cos\alpha & -sin\alpha & 0 \\ sin\alpha & cos\alpha & 0 \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} cos\beta & 0 & -sin\beta \\ 0 & 1 & 0 \\ sin\beta & 0 & cos\beta \end{matrix} \right] \left[ \begin{matrix} 1 & 0 & 0 \\ 0 & cos\theta & -sin\theta \\ 0 & sin\theta & cos\theta \end{matrix} \right] \left[ \begin{matrix} x0 \\ y0 \\ z0 \end{matrix} \right] ⎣⎡​x1y1z1​⎦⎤​=⎣⎡​cosαsinα0​−sinαcosα0​001​⎦⎤​⎣⎡​cosβ0sinβ​010​−sinβ0cosβ​⎦⎤​⎣⎡​100​0cosθsinθ​0−sinθcosθ​⎦⎤​⎣⎡​x0y0z0​⎦⎤​

=[cosαcosβ−sinαcosθ−cosαsinβsinθsinαsinθ−cosαsinβcosθsinαcosβcosαcosθ−sinαsinβsinθ−cosαsinθ−sinαsinβcosθsinβcosβsinθcosβcosθ][x0y0z0]= \left[ \begin{matrix} cos\alpha cos\beta & -sin\alpha cos\theta-cos\alpha sin\beta sin\theta & sin\alpha sin\theta-cos\alpha sin\beta cos\theta \\ sin\alpha cos\beta & cos\alpha cos\theta-sin\alpha sin\beta sin\theta & -cos\alpha sin\theta-sin\alpha sin\beta cos\theta \\ sin\beta & cos\beta sin\theta & cos\beta cos\theta \end{matrix} \right] \left[ \begin{matrix} x0 \\ y0 \\ z0 \end{matrix} \right] =⎣⎡​cosαcosβsinαcosβsinβ​−sinαcosθ−cosαsinβsinθcosαcosθ−sinαsinβsinθcosβsinθ​sinαsinθ−cosαsinβcosθ−cosαsinθ−sinαsinβcosθcosβcosθ​⎦⎤​⎣⎡​x0y0z0​⎦⎤​

当β=pi/2时,sinβ=1,cosβ=0,故

[x1y1z1]=[0−sin(θ+α)−cos(θ+α)0cos(θ+α)−sin(θ+α)100][x0y0z0]\left[ \begin{matrix} x1 \\ y1 \\ z1 \end{matrix} \right]= \left[ \begin{matrix} 0 & -sin(\theta+\alpha) & -cos(\theta+\alpha) \\ 0 & cos(\theta+\alpha) & -sin(\theta+\alpha) \\ 1 & 0 & 0 \end{matrix} \right] \left[ \begin{matrix} x0 \\ y0 \\ z0 \end{matrix} \right] ⎣⎡​x1y1z1​⎦⎤​=⎣⎡​001​−sin(θ+α)cos(θ+α)0​−cos(θ+α)−sin(θ+α)0​⎦⎤​⎣⎡​x0y0z0​⎦⎤​
​ 此时可以看到θ和α的变化都产生了相同的效果,即产生的都是绕z轴的旋转(正常情况下α和θ对应的矩阵是正交的),而原本θ角产生的旋转维度丢失了,不能产生偏转角。实际上对于不同的向量,会有不同的锁定效果,如当[x0 y0 z0]=[1 0 0]时,不能产生偏转角,当[x0 y0 z0]=[0 0 1]时,不能产生滚转角等。归结为:万向节死锁产生的是在某个特殊状态下某种特定运动不能发生,如无法发生偏转,无法发生翻滚或者无法发生俯仰,或者无法发生上述运动的某个结合运动,具体取决于向量的初始状态。

​ 丢失旋转维度产生的最大问题在视频中也有详细的演示,即向量不能朝某一个特定的方向进行最短路径旋转,而需要绕弧线产生一定的旋转,为什么会这样?直观上看就是因为丢失了一个维度导致在这个维度上呈现出锁死的状态,需要先解除这个特殊状态才能转到我们需要的姿态角上。

​ 以下从微分学的角度来分析为什么在这个状态下不能产生特定维度的旋转。

​ 我们以[x0 y0 z0]=[1 0 0]为例,首先我们将x、y、z看成是自变量为α、β和θ的函数。即
x=x0∗cosβcosα+y0∗(−sinαcosθ−cosαsinβsinθ)+z0∗(sinαsinθ−cosαsinβcosθ)y=x0∗sinαcosβ+y0∗(cosαcosθ−sinαsinβsinθ)+z0∗(−cosαsinθ−sinαsinβcosθ)z=x0∗(sinβ)+y0∗cosβsinθ+z0∗cosβcosθx=x_0*cos\beta cos\alpha + y_0*(-sin\alpha cos\theta-cos\alpha sin\beta sin\theta) + z_0*(sin\alpha sin\theta-cos\alpha sin\beta cos\theta) \\ y=x_0*sin\alpha cos\beta +y_0*(cos\alpha cos\theta-sin\alpha sin\beta sin\theta)+z_0*(-cos\alpha sin\theta-sin\alpha sin\beta cos\theta) \\ z=x_0*(sin\beta)+y_0*cos\beta sin\theta+z_0*cos\beta cos\theta x=x0​∗cosβcosα+y0​∗(−sinαcosθ−cosαsinβsinθ)+z0​∗(sinαsinθ−cosαsinβcosθ)y=x0​∗sinαcosβ+y0​∗(cosαcosθ−sinαsinβsinθ)+z0​∗(−cosαsinθ−sinαsinβcosθ)z=x0​∗(sinβ)+y0​∗cosβsinθ+z0​∗cosβcosθ
分别求出x、y和z在α=0、β=pi/2和θ=0时的偏导数,得到
∂x∂α=y0,∂x∂β=−x0,∂x∂θ=y0∂y∂α=z0,∂y∂β=0,∂y∂θ=z0∂z∂α=0,∂z∂β=−z0,∂z∂θ=0\frac{\partial x}{\partial \alpha} = y_0, \frac{\partial x}{\partial \beta} = -x_0, \frac{\partial x}{\partial \theta} = y_0\\ \frac{\partial y}{\partial \alpha} = z_0, \frac{\partial y}{\partial \beta} = 0, \frac{\partial y}{\partial \theta} = z_0\\ \frac{\partial z}{\partial \alpha} = 0, \frac{\partial z}{\partial \beta} = -z_0, \frac{\partial z}{\partial \theta} = 0 ∂α∂x​=y0​,∂β∂x​=−x0​,∂θ∂x​=y0​∂α∂y​=z0​,∂β∂y​=0,∂θ∂y​=z0​∂α∂z​=0,∂β∂z​=−z0​,∂θ∂z​=0

dx=∂x∂αdα+∂x∂βdβ+∂x∂θdθ=y0(dα−dθ)−x0dβdy=∂y∂αdα+∂y∂βdβ+∂y∂θdθ=zo(dθ−dα)dz=∂z∂αdα+∂z∂βdβ+∂z∂θdθ=−z0dβdx = \frac{\partial x}{\partial \alpha}d\alpha+\frac{\partial x}{\partial \beta}d\beta+\frac{\partial x}{\partial \theta}d\theta=y_0(d\alpha-d\theta)-x_0d\beta \\ dy = \frac{\partial y}{\partial \alpha}d\alpha+\frac{\partial y}{\partial \beta}d\beta+\frac{\partial y}{\partial \theta}d\theta=z_o(d\theta-d\alpha) \\ dz = \frac{\partial z}{\partial \alpha}d\alpha+\frac{\partial z}{\partial \beta}d\beta+\frac{\partial z}{\partial \theta}d\theta=-z_0d\beta \\ dx=∂α∂x​dα+∂β∂x​dβ+∂θ∂x​dθ=y0​(dα−dθ)−x0​dβdy=∂α∂y​dα+∂β∂y​dβ+∂θ∂y​dθ=zo​(dθ−dα)dz=∂α∂z​dα+∂β∂z​dβ+∂θ∂z​dθ=−z0​dβ
则可以得到,当z0≠0时,
−z0∗dx+y0∗dy+x0∗dz=0-z_0*dx+y_0*dy+x_0*dz=0 −z0​∗dx+y0​∗dy+x0​∗dz=0
此时,向量的变化是沿着与旋转后的向量垂直的平面变化的。

当z0=0时,
dx=y0(dα−dθ)−x0dβ≠0,dy=0,dz=0dx=y_0(d\alpha-d\theta)-x_0d\beta≠0,dy=0,dz=0 dx=y0​(dα−dθ)−x0​dβ​=0,dy=0,dz=0

可以看到对于[1 0 0]
dx=−x0dβ,dy=0,dz=0dx=-x_0d\beta,dy=0,dz=0 dx=−x0​dβ,dy=0,dz=0
​ 只能沿x轴方向发生变化,此变化是由β角的转动产生的**(α和θ产生的是滚转角,xyz坐标系无法体现出滚转角的变化)**,而dy和dz的变化始终为0,则可以看出,沿着Y轴与Z轴所在平面的偏转是不能实现的,这与视频中的死锁现象是一致的。

对于[0 0 1]
−dx=0-dx=0 −dx=0
​ 得到x=z0=1,即可以沿着x=1的平面进行任意角度的偏移,只要控制好α、β和θ的旋转度即可,但实际上,[0 0 1]丢失了滚转角,只是滚转角无法从xyz坐标系上表示出来罢了。

总而言之,欧拉旋转由于其固有缺陷总是会出现万向节死锁的情况,即丢失某一个特定维度的变化,这个维度可以是纯翻滚或者纯偏航等,也可以是某个角度的翻滚和某个角度的偏航的特定结合,具体取决于向量的初始状态,实际上用向量表示欧拉旋转并不合适,因为向量不存在滚转角,但向量可以表示出偏航和俯仰两种变化,故可以轻易通过向量推出俯仰或偏航锁定的情况。现实中应将向量想象为视频中的飞机,简化为带滚转角的向量。

从数学角度理解欧拉旋转中的万向节死锁相关推荐

  1. 欧拉旋转中的Gimbal Lock理解

    三维旋转矩阵戳这里[1] http://blog.csdn.net/deng_sai/article/details/21169997 or 这里[2]http://insaneguy.me/2015 ...

  2. 【Unity步步升】各类旋转逻辑的区别,如欧拉旋转、插值旋转、矢量朝向等...及游戏视角案例

    在 Unity 中为物体旋转提供了各种 API ,例如 Rotate.RotateAround.LookAt 等方法.但为了避免万向节死锁的问题,一般使用四元数来表示物体的旋转. 而接下来的旋转方法我 ...

  3. 【Unity编程】Unity中的欧拉旋转

    版权声明:本文为博主原创文章,欢迎转载.请保留博主链接:http://blog.csdn.net/andrewfan 欧拉角的定义 在写这篇博客之前,我搜索了网上很多关于欧拉角的定义,发现大部分引用自 ...

  4. Unity3D导航网格,矩阵旋转,欧拉旋转

    旋转(欧拉.矩阵) 1.Transform:position(平移).rotation(旋转).scale(缩放). 2.四元数:应于transform组件中的rotation属性,这个属性的类型其实 ...

  5. 常见的数值积分方法_欧拉积分/中值积分/龙格-库塔积分

    参考:常见的数值积分方法 (欧拉.中值.龙格-库塔,[常用于IMU中]) 1. 积分基本概念 设F(x)为函数f(x)的一个原函数,我们把函数f(x)的所有原函数F(x)+C(C为任意常数)叫做函数f ...

  6. 运筹说 第73期 | 图论创始人“数学之王”一 欧拉

    前面我们介绍了有关动态规划的相关内容,相信大家也都有了一些收获,下面我们学习的列车继续驶往"图与网络分析"的站点,在本次文章中我们将一起走近图论的奠基人--欧拉Leonhard E ...

  7. 数学--数论-数论函数-欧拉函数

    **欧拉函数定义 对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目.例如euler(8)=4,因为1,3,5,7均和8互质. Euler函数表达通式: 其中p1,p2--pn为x的所有素因数 ...

  8. 数学--数论--广义欧拉降幂(模板)

    未使用欧拉筛: 适用于较少次数计算的欧拉降幂. #include <bits/stdc++.h> #define ll long long using namespace std; ll ...

  9. Unity中的万向节死锁

    看了一些关于万向节死锁的博客,说一下我的直观理解 概念: 1.unity inspector 面板上的x,y,z的旋转是从(0,0,0)以z->x->y的顺序执行的. 2.实测unity ...

最新文章

  1. 关于应用程序启动,你可能不知道的东西
  2. 北漂程序员边城的幸福生活
  3. mysql追溯历史性能问题_【踩坑記錄】記一次MySQL主從復制延遲的坑
  4. 《iOS应用开发指南——使用HTML5、CSS3和JavaScript》——第1章 变小的巨大影响1.1 移动魔力和掌上电脑...
  5. C#程序关闭时怎么关闭子线程
  6. Java中的内存模型JMM与线程
  7. PHP:错误控制运算符
  8. 平台式惯性导航系统简介(持续更新ing)
  9. 语义相似度(实践篇)
  10. r52500u学计算机,r52500u相当于i几
  11. Ecshop模板开发(二十三):手机版显示商城
  12. 什么是时间复杂度和空间复杂度
  13. Windows安装Mysql提示无法定位程序输入点fesetround于动态链接库的解决方案
  14. 六边形3d立体缩放动画js特效
  15. 机器学习——15分钟透彻理解感知机
  16. C盘被占满原因及解决方法
  17. HCL模拟器中Server设备启动失败的解决办法
  18. python解析xml文件最好选用的模块_用Python解析XML文件
  19. SpringMVC - 三层架构和 MVC
  20. 分享网上流行的50+开源源码下载

热门文章

  1. 微信公众平台开发(二) 微信公众平台示例代码分析
  2. 游戏3D建模师职业生涯规划,年薪百万学习路线
  3. 用HTMLParser解析html时报错:No module named 'htmlentitydefs'
  4. QuickBooks 2007 All-in-One Desk Reference For Dummies
  5. HDU 5128 The E-pang Palace
  6. java实现北京地铁换乘
  7. 二零一五,谁偷走了我的青春
  8. STM32使用SDIO进行SD卡读写关于库函数获取SD卡信息
  9. 如何抢走亚马逊竞品手上的客户和流量?
  10. Win10多版本CUDA和CUDNN安装