关于机器人运动学与动力学建模的几点迷思

疑问1:运动学应该从速度开始推还是从位置开始推?

为什么会产生这样的疑问?我们可以从下面这个问题开始!

简单说明这幅图的含义:
我们定义了两个坐标系,惯性系{s}和移动系{b}。s和b分别是两个坐标系的原点,P是由s点指向b点的向量。

现在我们要来考察,两个坐标系原点间的相对速度了!!!

表达形式1:直接写速度的关系式
Vb=Rsb⋅VsV_b=R_s^b \cdot V_sVb​=Rsb​⋅Vs​
其中,VsV_sVs​代表了{b}系相对{s}系的速度在{s}系下的表示形式,VbV_bVb​则代表了{b}系相对{s}系的速度在{b}系下的表示形式,而RsbR_s^bRsb​就是从{s}系转换到{b}系的旋转矩阵。

表达形式2:由位置的关系式推导速度的关系式
位置的关系:
Pb=Rsb⋅PsP_b = R_s^b \cdot P_sPb​=Rsb​⋅Ps​
其中,PbP_bPb​是向量P在{b}系下的表达形式,而PsP_sPs​是向量P在{s}系下的表达形式。
对等式左右两侧求导,得到速度的关系:
Pb˙=Rsb˙⋅Ps+Rsb⋅Ps˙=ωb×Rsb⋅Ps+Rsb⋅Ps˙=ωb×Pb+Rsb⋅Ps˙\begin{aligned} \dot{P_b} &= \dot{R_s^b} \cdot P_s + R_s^b \cdot \dot{P_s} \\ &=\omega_b \times {R_s^b} \cdot P_s + R_s^b \cdot \dot{P_s} \\ &= \omega_b \times P_b + R_s^b \cdot \dot{P_s} \end{aligned} Pb​˙​​=Rsb​˙​⋅Ps​+Rsb​⋅Ps​˙​=ωb​×Rsb​⋅Ps​+Rsb​⋅Ps​˙​=ωb​×Pb​+Rsb​⋅Ps​˙​​
其中,ωb\omega_bωb​代表{b}系相对{s}系的角速度在{b}系下的表示。

那么现在问题来了,这两种速度关系,哪一种是对的呢???

结论是,这两个关系式都是对的,如何理解呢?

首先,我们得澄清,Pb˙\dot{P_b}Pb​˙​和VbV_bVb​不是同一个速度,而Ps˙\dot{P_s}Ps​˙​和VsV_sVs​是同一个速度。
Pb˙\dot{P_b}Pb​˙​这个速度,可以认为是有一个人站在{b}系的原点处,去观察{s}系相对于自身的速度,这是这个人认为自身是不动的。(这个容易想象,因为PbP_bPb​是向量P在{b}系下的表达)
VbV_bVb​这个速度,是{b}系相对{s}系的速度在{b}系下的表示形式,可以认为是一个人站在{s}系的原点去观察{b}系相对于自身的速度,然后将这个速度经由旋转矩阵,在{b}系下表达这个速度。

因此,Pb˙\dot{P_b}Pb​˙​是从{b}观测{s},VbV_bVb​是从{s}观测{b},这两个速度是不同的。如何理解呢?

我们可以简化上图中的问题,现在让我们假设{b}系相对于{s}系不再有平移速度,而只有旋转速度。我们来考察从{b}观测{s}的速度,以及从{s}观测{b}的速度有什么不同!!!

从{b}观测{s}的速度 : 因为{b}系相对于{s}系还在旋转,作为{b}系上的观测者,我们会认为自身是不动的,因此我们看{s}系原点的速度一定是ω×P\omega \times Pω×P。这个和地球自转的例子一摸一样(不考虑公转的因素)。地球相对于太阳一直在自转,我们浑然不知,还以为是太阳在围绕地球运动。

从{s}观测{b}的速度 : 因为{b}系相对于{s}系只有旋转,没有平移了,我们观察{b}系原点的时候,速度肯定为0。

由此可见,这两个速度是完全不同的。

为什么会产生这种分别?主要是因为两个坐标系间产生了相对旋转。

而以同样一套分析的思想,我们可以知道Ps˙\dot{P_s}Ps​˙​和VsV_sVs​是同一个速度。
Ps˙\dot{P_s}Ps​˙​这个速s度,可以认为是有一个人站在{s}系的原点处,去观察{b}系相对于自身的速度。
VsV_sVs​这个速度,可以认为是一个人站在{s}系的原点去观察{b}系相对于自身的速度,然后将这个速度经由旋转矩阵,在{s}系下表达这个速度。
既然都是从{s}系去观测{b}系,因此速度肯定就是一样的。

理解了上面的论述以后,我们就明白了涉及到旋转的问题里面有两种速度,一是从{b}观测{s}的速度,一是从{s}观测{b}的速度 。换句话说,一是从非惯性系下观测惯性系的速度,一是从惯性系下观测非惯性系的速度。

现在我们来看表达形式1
Vb=Rsb⋅VsV_b=R_s^b \cdot V_sVb​=Rsb​⋅Vs​
VsV_sVs​表示的就是从{s}观测{b}的速度在{s}系下的表达,VbV_bVb​表示的就是从{s}观测{b}的速度在{b}系下的表达。这个公式代表的是同一个速度,在不同坐标系下的表示的变换关系。

再看表达形式2
Pb˙=ωb×Pb+Rsb⋅Ps˙\dot{P_b} = \omega_b \times P_b + R_s^b \cdot \dot{P_s} Pb​˙​=ωb​×Pb​+Rsb​⋅Ps​˙​
Pb˙\dot{P_b}Pb​˙​表示的是从{b}观测{s}的速度,而Ps˙\dot{P_s}Ps​˙​表示的则是从{s}观测{b}的速度。因此,这个公式表达的是两种速度之间的一个转换关系。

下面这是更关键的一个问题
我们在机器人的运动学推导过程中,往往都是直接用表达形式一,直接写出速度关系式,而不是从位置关系式往下推速度关系式。但是,当我们推加速度关系式的时候,却都是从速度关系式往下推的,而不直接写出来加速度的关系式。这到底是为什么呢?

因为我们关心的是机器人在惯性系下的速度和加速度,也就是说我们作为外部观测者,观测机器人的速度和加速度。我们并不需要去考虑机器人观测惯性系(世界系)的速度。从这个意义上说,机器人上安装的加速度计和陀螺仪都是测量的机器人相对于惯性系的加速度和角速度,都是我们关心的量。而机器人上安装的视觉传感器,他如果能直接测量视野中的目标相对于本体的速度,那么这个速度就需要经过一个转换,才能被使用。

总而言之,我们关心的是机器人在惯性系下的速度和加速度,因此我们用表达形式一就可以了。表达形式二是用来考察惯性系和非惯性系下观测到的相对速度的变换关系的。

而对于速度推导到加速度时,为什么不能直接写出加速度的关系式呢?
首先说明,速度推导加速度的形式如下:
Vb˙=ωb×Rsb⋅Vs+Rsb⋅Vs˙\dot{V_b}=\omega_b \times R_s^b \cdot V_s + R_s^b \cdot \dot{V_s}Vb​˙​=ωb​×Rsb​⋅Vs​+Rsb​⋅Vs​˙​
这里的Vb˙\dot{V_b}Vb​˙​是 {b}系相对于{s}系的速度在{b}系下的导数 。(这个加速度没有太强的物理含义)
这里的Vs˙\dot{V_s}Vs​˙​是{b}系相对于{s}系的速度在{s}系下的导数。(也就是机器人在惯性系下的加速度)
RsbVs˙R_s^b\dot{V_s}Rsb​Vs​˙​是可以由加速度计直接测量的

其次,如果直接写出加速度的关系式那么就是:
Ab=Rsb⋅AsA_b=R_s^b \cdot A_sAb​=Rsb​⋅As​
其中,AsA_sAs​是Vs˙\dot{V_s}Vs​˙​,也就是{b}系相对于{s}系的速度在{s}系下的导数,可以由加速度计直接测量。(也就是机器人在惯性系下的加速度)
AbA_bAb​是 {b}系相对于{s}系的速度在{s}系下的导数在{b}系下的表示,这个加速度不等于Vb˙\dot{V_b}Vb​˙​。

我们可以直接写出加速度的关系式,但是如果这样做,对于分析运动学没有任何帮助。

因为我们想要知道的量是VbV_bVb​,我们需要知道机器人相对于惯性系的速度在机器人自身坐标系下的表示。比如说我有一个轮式机器人,我想知道我相对于地面的速度在我自己坐标系下的表示,这样我就可以建立轮子转速和相对地面的速度之间的关系了。

而我们直接写加速度的关系式,我们求出了AbA_bAb​,但是Ab≠Vb˙A_b \neq \dot{V_b}Ab​̸​=Vb​˙​,我们无法对其积分,得到VbV_bVb​。

因此我们需要建立VbV_bVb​和AsA_sAs​(或Vs˙\dot{V_s}Vs​˙​)的联系,所以我们要从速度推导到加速度。

小结1:

在这个疑问中,我主要纠结的点在于,为什么我们写移动机器人运动学部分的时候公式往往式下面这样的:
Vs=Rbs⋅VbVs˙=ω×Vs+RbsVb˙\begin{matrix} V_s = R_b^s \cdot V_b \\ \dot{V_s} = \omega \times V_s+R_b^s\dot{V_b} \end{matrix} Vs​=Rbs​⋅Vb​Vs​˙​=ω×Vs​+Rbs​Vb​˙​​
我感到很困惑,为什么不从位置公式的地方开始推呢?你怎么就直接写出速度的公式来了?你既然可以直接写速度的公式,为什么不可以直接写加速度的公式?

经过这一番思考,我明白了。

首先,你得知道你考察机器人运动学的时候,你关心的是什么?

我们关心只的有三个:

  • 机器人相对惯性系的速度在惯性系下的表示,就是VsV_sVs​。
  • 机器人相对惯性系的速度在机器人系下的表示,就是VbV_bVb​。
  • 机器人相对惯性系的加速度,就是Vs˙\dot{V_s}Vs​˙​。

这是因为,我们需要知道机器人相对于惯性系的运动VsV_sVs​和Vs˙\dot{V_s}Vs​˙​,另外,我们也需要知道VbV_bVb​,这样对于我们控制机器人才有帮助。

说到这里,我们也就明白了运动学也可以写成这种形式:
Vb=Rsb⋅VsVs=∫Vs˙dt\begin{matrix} V_b = R_s^b \cdot V_s \\ V_s= \int \dot{V_s} \ dt \end{matrix} Vb​=Rsb​⋅Vs​Vs​=∫Vs​˙​ dt​

这种写法也是对的,和上面的那个公式结果应该是相等的。

疑问2:是否该对旋转矩阵求导?

在运动学推导过程中,有些资料里是对旋转矩阵求导的,有些是不对旋转矩阵求导的,有时候就很懵逼,什么时候该求,什么时候不该求呢?

我总结了一下,其实是取决于你看待旋转矩阵的方式。

方式一: 旋转矩阵就是一个算子,它是一个常量,可用来转换坐标系。
方式二: 旋转矩阵就是一个时间的函数,它也是等式中的一个变量。

接下来,我们就详细解释这两种方式的区别。

我们假设有两个坐标系,{s}系和{b}系。同时有一个向量ppp,他在{s}系下表示为psp_sps​,在{b}系下表示为pbp_bpb​,RbsR_b^sRbs​表示从{b}到{s}的旋转矩阵。

由此,我们有:
ps=Rbs⋅pbp_s = R_b^s \cdot p_bps​=Rbs​⋅pb​

我们可以把psp_sps​和pbp_bpb​,写为如下形式:
ps=[xs,ys,zs]Tp_s=[x_s,y_s,z_s]^Tps​=[xs​,ys​,zs​]T

pb=[xb,yb,zb]Tp_b=[x_b,y_b,z_b]^Tpb​=[xb​,yb​,zb​]T

另外,我们可以把ps⃗\vec{p_s}ps​​和pb⃗\vec{p_b}pb​​写成如下形式:

ps⃗=xs⋅is⃗+ys⋅js⃗+xs⋅ks⃗\vec{p_s}=x_s\cdot \vec{i_s} + y_s\cdot \vec{j_s} + x_s\cdot \vec{k_s}ps​​=xs​⋅is​​+ys​⋅js​​+xs​⋅ks​​

pb⃗=xb⋅ib⃗+yb⋅jb⃗+xb⋅kb⃗\vec{p_b}=x_b\cdot \vec{i_b} + y_b\cdot \vec{j_b} + x_b\cdot \vec{k_b}pb​​=xb​⋅ib​​+yb​⋅jb​​+xb​⋅kb​​

当我们采用方式一来看待旋转矩阵时:
旋转矩阵就是一个算子,类似于加减乘除,类似于一种操作。
所以,我们可以理解为旋转矩阵就是对向量的一种操作,即:
ps=Rbs⋅pb⇌ps⃗=Θ(pb⃗)p_s = R_b^s \cdot p_b \rightleftharpoons \vec{p_s} = \Theta(\vec{p_b})ps​=Rbs​⋅pb​⇌ps​​=Θ(pb​​)
Θ(⋅)\Theta(\cdot)Θ(⋅)代表一种对向量的操作,那么我们对等式求导的手,就不用考虑对旋转矩阵求导了。

如何对这个等式求导呢?
因为这两个向量表达在不同的坐标系下,我们在求导的时候,必须统一到一个坐标系下求导。也就是说,要么左右两边都在{s}系下求导,要么都在{b}系下求导,这里我们以在{s}系下求导为例,说明如何进行求导:
dspsdt=dsdt(xs⋅is⃗+ys⋅js⃗+zs⋅ks⃗)=dsxsdt⋅is⃗+xs⋅dsis⃗dt+dsysdt⋅js⃗+ys⋅dsjs⃗dt+dszsdt⋅ks⃗+zs⋅dsks⃗dt=x˙s⋅is⃗+y˙s⋅js⃗+z˙s⋅ks⃗=p˙s\begin{aligned} \frac{d^s p_s}{dt} &=\frac{d^s}{dt} \left( x_s\cdot \vec{i_s} + y_s\cdot \vec{j_s} + z_s\cdot \vec{k_s} \right) \\ &=\frac{d^sx_s}{dt}\cdot \vec{i_s}+ x_s\cdot \frac{d^s \vec{i_s} }{dt} + \frac{d^sy_s}{dt}\cdot \vec{j_s}+ y_s\cdot \frac{d^s \vec{j_s} }{dt} + \frac{d^sz_s}{dt}\cdot \vec{k_s}+ z_s\cdot \frac{d^s \vec{k_s} }{dt}\\ &=\dot x_s \cdot \vec{i_s} + \dot y_s \cdot \vec{j_s} + \dot z_s \cdot \vec{k_s} \\ &=\dot p_s \end{aligned} dtdsps​​​=dtds​(xs​⋅is​​+ys​⋅js​​+zs​⋅ks​​)=dtdsxs​​⋅is​​+xs​⋅dtdsis​​​+dtdsys​​⋅js​​+ys​⋅dtdsjs​​​+dtdszs​​⋅ks​​+zs​⋅dtdsks​​​=x˙s​⋅is​​+y˙​s​⋅js​​+z˙s​⋅ks​​=p˙​s​​

dspbdt=dsdt(xb⋅ib⃗+ys⋅jb⃗+zb⋅kb⃗)=dsxbdt⋅ib⃗+xb⋅dsib⃗dt+dsybdt⋅jb⃗+yb⋅dsjb⃗dt+dszbdt⋅kb⃗+zb⋅dskb⃗dt=x˙b⋅ib⃗+y˙b⋅jb⃗+z˙b⋅kb⃗+xb⋅ω×ib⃗++yb⋅ω×jb⃗+zb⋅ω×kb⃗=p˙b+ω×pb\begin{aligned} \frac{d^s p_b}{dt} &=\frac{d^s}{dt} \left( x_b\cdot \vec{i_b} + y_s\cdot \vec{j_b} + z_b\cdot \vec{k_b} \right) \\ &=\frac{d^sx_b}{dt}\cdot \vec{i_b}+ x_b\cdot \frac{d^s \vec{i_b} }{dt} + \frac{d^sy_b}{dt}\cdot \vec{j_b}+ y_b\cdot \frac{d^s \vec{j_b} }{dt} + \frac{d^sz_b}{dt}\cdot \vec{k_b}+ z_b\cdot \frac{d^s \vec{k_b} }{dt}\\ &=\dot x_b \cdot \vec{i_b} + \dot y_b \cdot \vec{j_b} + \dot z_b \cdot \vec{k_b} + x_b \cdot \omega \times \vec{i_b} + + y_b \cdot \omega \times \vec{j_b} + z_b \cdot \omega \times \vec{k_b}\\ &=\dot p_b +\omega \times p_b \end{aligned} dtdspb​​​=dtds​(xb​⋅ib​​+ys​⋅jb​​+zb​⋅kb​​)=dtdsxb​​⋅ib​​+xb​⋅dtdsib​​​+dtdsyb​​⋅jb​​+yb​⋅dtdsjb​​​+dtdszb​​⋅kb​​+zb​⋅dtdskb​​​=x˙b​⋅ib​​+y˙​b​⋅jb​​+z˙b​⋅kb​​+xb​⋅ω×ib​​++yb​⋅ω×jb​​+zb​⋅ω×kb​​=p˙​b​+ω×pb​​

所以,
ps⃗˙=Θ(pb⃗)˙=Θ(p˙b+ωb×pb)\dot{\vec{p_s}} = \Theta(\dot{\vec{p_b})}=\Theta{{(\dot p_b +\omega_b \times p_b)}}ps​​˙​=Θ(pb​​)˙​=Θ(p˙​b​+ωb​×pb​)
即:
ps˙=Rbs⋅(p˙b+ω×pb)=Rbs⋅p˙b+Rbs⋅(ωb×pb)\dot{p_s} = R_b^s \cdot (\dot p_b +\omega \times p_b)=R_b^s \cdot \dot p_b+R_b^s \cdot (\omega_b \times p_b)ps​˙​=Rbs​⋅(p˙​b​+ω×pb​)=Rbs​⋅p˙​b​+Rbs​⋅(ωb​×pb​)

当我们采用方式二来看待旋转矩阵时:
旋转矩阵是个时间的函数,psp_sps​和pbp_bpb​也都是时间的函数,那么就有:
ps=Rbs⋅pb⇌ps(t)=Rbs(t)⋅pb(t)p_s = R_b^s \cdot p_b \rightleftharpoons p_s(t) = R_b^s(t) \cdot p_b(t)ps​=Rbs​⋅pb​⇌ps​(t)=Rbs​(t)⋅pb​(t)
所以,对等号两边求导:
ps˙(t)=Rbs˙(t)⋅pb(t)+Rbs(t)⋅pb˙(t)=ωs×Rbs(t)⋅pb(t)+Rbs(t)⋅pb˙(t)\begin{aligned} \dot{p_s}(t) &= \dot{R_b^s}(t) \cdot p_b(t) + R_b^s(t) \cdot \dot{p_b}(t) \\ &=\omega_s \times R_b^s(t) \cdot p_b(t) + R_b^s(t) \cdot \dot{p_b}(t) \end{aligned} ps​˙​(t)​=Rbs​˙​(t)⋅pb​(t)+Rbs​(t)⋅pb​˙​(t)=ωs​×Rbs​(t)⋅pb​(t)+Rbs​(t)⋅pb​˙​(t)​
即:
ps˙=ωs×Rbs⋅pb+Rbs⋅pb˙=Rbs⋅p˙b+Rbs⋅(ωb×pb)\dot{p_s} = \omega_s \times R_b^s \cdot p_b + R_b^s \cdot \dot{p_b}=R_b^s \cdot \dot p_b+R_b^s \cdot (\omega_b \times p_b)ps​˙​=ωs​×Rbs​⋅pb​+Rbs​⋅pb​˙​=Rbs​⋅p˙​b​+Rbs​⋅(ωb​×pb​)
这里蕴含了一个公式R⋅(a×b)=R⋅a×R⋅bR\cdot(a \times b)=R\cdot a \times R\cdot bR⋅(a×b)=R⋅a×R⋅b

算到这里,我们就明白了,两种方式的结论是一摸一样的,是不是很神奇。

小结2:

通过这部分的阐述,我们知道了:
当某些资料上对旋转矩阵求导时,他是把旋转矩阵看成了一个与时间相关的函数;
当某些资料上不对旋转矩阵求导时,他把旋转矩阵看成了一个算子,或者说是一种操作。

所以下次,当我们遇到类似的问题的时候必须注意啦,不能即对旋转矩阵求导了,然后又对向量展开求导,这样就相当于,你即把旋转矩阵当函数,又把他当一种操作,那旋转矩阵好累呀!内心OS:老子不想干了!

领悟3:牛顿定律只在惯性系下成立!

这个不能说是疑问,这个是最近对其产生深刻认识的一件事情。
动能对速度求导是动量
动能对角速度求导是角动量
这些都只能发生在惯性系内
所以,动能必须是相对于惯性系的动能
而速度也是相对于惯性系的速度
动量也是相对于惯性系的动量
这一点千万要注意

关于机器人运动学与动力学建模的几点领悟相关推荐

  1. matlab ikine 源码,RTB-9.10 matlab robotics toolbox 工具箱软件 可进行机器人运动学与动力学建模 275万源代码下载- www.pudn.com...

    文件名称: RTB-9.10下载  收藏√  [ 5  4  3  2  1 ] 开发工具: matlab 文件大小: 20442 KB 上传时间: 2016-11-27 下载次数: 16 提 供 者 ...

  2. 机器人运动学与动力学入门(一)自由度与连杆机构

    机器人运动学与动力学入门(一)自由度与连杆机构 在讨论机器人运动之前,先复习一些基本概念(啰里吧嗦环节).已经了解的童鞋可以自行跳过该节. 1.自由度(degree of freedom) 自由度描述 ...

  3. ROS系统MoveIt玩转双臂机器人系列(五)--浅议机器人运动学与D-H建模

    ROS系统MoveIt玩转双臂机器人系列(五)--浅议机器人运动学与D-H建模 一.概述 机器人运动学研究的是机械臂各个连杆之间的位移关系.速度关系和加速度关系.比较经典的一本书推荐大家读读熊有伦的& ...

  4. 机器人运动学与动力学在控制上的区别与联系?

    (81 条消息)机器人运动学与动力学在控制上的区别与联系? - 知乎 https://www.zhihu.com/question/52928156 目前典型的机器人控制大都采取 PID 控制, PI ...

  5. 机器人运动学、动力学与控制及Matlab实现

    机器人运动学将几何学应用于研究构成机器人系统结构的多自由度 运动链的运动.[1] [2] 对几何的强调意味着机器人的连杆被建模为刚体,并且假设其关节提供纯旋转或平移. 机器人运动学研究运动链的尺寸和连 ...

  6. 六自由度机器人牛顿-欧拉法动力学建模(自己学习用)

    目录 一.理论知识 1.机器人正向运动学与逆向运动学 2.机器人动力学建模方法 3.推牛顿-欧拉法 (1)一些物理概念 (2)牛顿-欧拉法推导 二.算法实现 都是自己在建立模型过程中发现需要掌握的知识 ...

  7. (转载)MATLAB机器人运动学与动力学

    2019年4月3日下午,MATLAB微信公众号上的一篇文章:特此贴在此处,参考学习  :D MATLAB中的机械臂算法--运动学:https://mp.weixin.qq.com/s/BOumG8LP ...

  8. matlab案例_基于matlab和frost平台的cassie案例足式机器人运动学和动力学计算实现过程...

    1.软件平台 Maltab2019a Mathematica 12.1.0 Frost 2.实现步骤 (1).安装matlab2019a (2).安装Mathematica 12.1.0 (3).下载 ...

  9. 机器人运动学-DH法建模

    机器人运动学 参数: 如图1所示,D-H法参数共有4个: a:从Zi-1到Zi的距离,即两旋转轴公共法线的距离, α:从Zi-1到Zi的角度,即垂直于a所在平面内两旋转轴的夹角 d:从Xi-1到Xi的 ...

  10. 机器人运动学、动力学基础上利用MATLAB进行PID控制仿真

    这是我的第一次写博客,不足之处还请谅解 进入正题 因为用SIMLINK做PID控制时,根据力矩反求加速度,再将得到的角度和角速度反馈回去继续重复计算,存在代数环问题仿真不出来,我一直没有找到解决办法, ...

最新文章

  1. LAMP之二:LAMP的性能测试以及安装xcache,为php加速
  2. 图解用工具对PE文件格式做初步研究
  3. SAP UI5 Fiori flower动画效果的实现明细
  4. 将AX寄存器中的16位数据分成4组(从高到低),每组4位,然后把这4组数作为数当中的低4位分别放在AL,BL,CL,DL中。
  5. 为什么一个字节定义成8位?
  6. 套口机跳针修理带图_套口机维修注意事项
  7. Ulua_toLua_基本案例(六)_LuaCoroutine2
  8. 人脸数据集——亚洲人脸数据集
  9. 互联网和物联网的区别,你有必要了解一下
  10. c语言幼儿园积木游戏,干货来袭!超详细幼儿园游戏活动教案
  11. 调用高德地图API接口,实现地铁站经纬度采集
  12. Chrome将网页保存为图片、PDF
  13. references column 'xxx' which is not in SELECT list
  14. Git ---- 国内代码托管中心-码云
  15. java 对 Map的遍历
  16. perl中bless的理解(zz) z
  17. iOS StoryBoard自适应布局
  18. 小功能⭐️Unity中利用材质自发光实现物体闪烁效果
  19. 接口幂等性设计与实现
  20. zepto的使用方法

热门文章

  1. [小工具] 五笔输入法
  2. 怎样修补渔网_渔网修补的方法
  3. Android 完美高仿的微信源码(转载)
  4. 测试了几款mysql监控工具
  5. myeclipse安装使用svn
  6. [学习]啦啦外卖定位修复,商家经纬度保存修复
  7. 这本Python入门畅销书《“笨办法”学python 3》,不仅仅是一本书
  8. 利用ichart绘制网页图表
  9. 推荐6款珍藏已久的网盘搜索工具
  10. java svn插件_eclipse 安装SVN插件 subversive