美文网首页
DMP(Dynamic Movement Primitives)

DMP(Dynamic Movement Primitives)

作者: 飞多多 | 来源:发表于2020-06-12 14:37 被阅读0次

    笔者最早接触DMP的时候,看论文,也看得一头雾水.网上又缺乏详细的解释,因此,在这里做一些简单的记录.以下的整理是基于该文章(建议先读链接文章),结合论文做出的一些整理和补充.

    PART I

    首先,我们先来解一个微分方程吧,求解\dot{f}=af+b \tag{1},
    直接给出答案,即为: f=\frac{e^{at+c}}{a}-\frac{b}{a} \tag{2},
    这里,c是一个常数,我们从解中可以看到,当a<0时,随着时间t趋向于无穷,f趋向于-\frac{b}{a}.
    请记住这个结论.

    PART II

    接下来我们来展示DMP论文中最核心的一个方程:\ddot{y}=\alpha_y(\beta_y(g-y)-\dot{y}) \tag{3},
    为了分析这个方程,我们先略去下标,并系数乘进去,我们整理得到:\ddot{y}=a(g-y)-b\dot{y} \tag{4},
    这是一个典型的过程方程,我们以(y\quad \dot{y})^T作为状态量,写成矩阵的形式为:
    \left( \begin{matrix} \dot{y} \\ \ddot{y} \end{matrix} \right) = \left (\begin{matrix} 0 & 1\\ -a & -b \end{matrix}\right) \cdot \left( \begin{matrix}y\\ \dot{y}\end{matrix}\right) + \left(\begin{matrix} 0 \\ ag \end{matrix}\right), \tag{5}
    我们发现,(5)式于(1)式是一样的,为了保证(5)的收敛性,我们需要(5)中系数矩阵的配置极点小于0,这可以通过选取合适的a,b值来做到.当该方程收敛时,我们类比(2)式,随着时间的推移,该方程将收敛到
    -\left(\begin{matrix} 0 & 1 \\ -a & -b\end{matrix}\right)^{-1}\cdot \left(\begin{matrix}0\\ag\end{matrix}\right) =\left(\begin{matrix}g\\0\end{matrix}\right),\tag{6}
    即,状态量最后收敛到我们的目标g上,即最后到达目标点,以上的分析保证了一点:那就是采用该系统过程的DMP算法保证了最后必然会收敛到目标点.但是,需要说明的是,我们要求的不仅是能够到达指定的目标点,而且要在整个运动过程中尽可能的模仿原始轨迹的运动.

    PART III

    为了让运动过程能模仿原始轨迹,我们在(3)式的基础上引入一个新的控制项f,f是一个非线性函数,我们这样定义f:
    f(x,g)=\frac{\sum^N_{i=1}\psi_i\omega_i}{\sum^N_{i=1}\psi_i}x(g-y_0), \tag{7}
    这里的x是相位项,笔者觉得用论文中的s作为记号是更贴切的,相位项随时间增加趋向于零.g是目标点,y_0是起始点 ,\omega_i是权重项.\psi_i是一个高斯函数,定义为:
    \psi_i=exp(-h_i(x-c_i)^2), \tag{8}
    其中,c_ih_i分别是高斯的中心和方差项.则式(3)变成:
    \ddot{y}=\alpha_y(\beta_y(g-y)-\dot{y})+f \tag{9},
    接下来我们先解释一下(7)(8)两式.

    笔者以前有幸上过机器学习的公选课.对于高维的SVM来说,我们用很多很多(比如100个)高斯核函数来作为他的"基向量",即是径向基函数.我们给每个核函数(原博客中又叫基函数basis function)都一个权重,我们的目标是找到这么一组权重,使得计算出来的分类与原始分类的误差(损失函数)最小,这就是训练的过程.其实DMP的核心思想和这是一样的.
    我们基于最简单一维的运动来分析,高维的情况可以很自然的作推广.假设我们有七个高斯,并且假定h_i是相同的,c_i均匀分布在整个相位轴x上.这整个核函数的图像如下图上半部分所示.

    psi3.png
    假设我们已经学习到了一组权重(当然也应该是七个).他们如上图的条形图所示.然后我们在任意x处运用(7)式,因为权重是基于期望轨迹学习到的,因此我们就可以得到一个期望的函数曲线(也即期望运动轨迹,这里的轨迹是纵坐标,是一维的.横坐标是相变量,是关于时间的映射.),即上图下半部分的曲线.
    这里需要对(9)式作一些说明
    1. f项被引入后,从现代控制系统的观点来看,相当于我们引入了一个控制项,而随着时间趋向于无穷,x会趋向于0,则控制项f也会趋向于0,整个方程还是会收敛到目标(6)式上去.
    2. 从现代控制理论的观点来说,对于一个可控系统,我们能控制他到达任意状态点,但是不能控制状态的变化轨迹,状态的变化只能沿着状态空间中的向量场方向进行运动.但是对于给定的状态轨迹,我们可以学习改轨迹产生过程中的控制量(也即是学习(9)式中f),这也是为什么我上面为什么会提到学习的内容.事实上,这里的学习过程不同于现在流行的各种深度学习,它更像是一种回归过程,SVM就是一种回归.
    3. DMP中的运动基元这概念,笔者的认为,指的就是这里的控制项f中的每一个i对应的小单元.

    PART IV

    我们上文的讨论中忽略了x的定义,论文中选取了经典系统来定义x:
    \dot{x}=-\alpha_xx\tag{10}
    显然,x是随时间作指数衰减.如果高斯核函数在相变量x仍然均匀分布,那么它在时间上的分布就会挤在前部分,如下图所示

    gauss_over_time2.png
    为了让高斯核函数在时间上均匀分布,我们需要把时间均匀切片,然后找出对应的相变量的值,然后把这些值作为核函数的中心值,如下图所示
    des_gauss_centers1.png
    另外,对于核函数的宽度,我们给出一个经验公式:

    即核函数数量除以第个函数的中心值,得到其宽度,这样计算出来的核函数在时间上的分布如下图所示
    gauss_over_time_spaced_well2.png
    对与空间尺度和时间尺度,空间尺度因子保证模仿轨迹对于被模仿轨迹的有效跟踪,你可以认为空间尺度因子是乘到每个核函数上去的,用来调整核函数尺度,保证权重的有效性.而时间尺度主要是是模仿轨迹在时间上加速和减速的.我认为这些都是比较自然的引入,不需要作过多说明.

    PART V

    有观众就要说了:你前面说了那么多,所以权重w_i到底如何从被模仿轨迹中得到呢?其实思路比较简单,上面讨论的过程是正向使用w_i求出y,我们只需要反过来用,使用yw_i就行了.具体来说是:
    首先,在求w_i时,(9)式中的y是已知量,是我们的期望轨迹,用y_d来表示.然后整理得到:
    f_d=\ddot{y_d}-\alpha_y(\beta_y(g-y)-\dot{y}) \tag{11}
    这里的f_d是根据系统过程方程计算出来的,我们还有一个是通过高斯核函数来拟合出来的f_{target}.我们要使两者之间尽可能的相同.很常用的方法就是最小化两者之间的距离.即:
    w_i = \mathop{argmin}_{w_i}\sum_t(f(x_{(t)})-f_d(t))^2
    这里的x仍然是前文所描述的相变量,它是关于时间的函数.而t则是数据点,比如我们的示例轨迹有100个点,则t从0取到99.将(7)式带入并展开:
    \mathop{argmin}_{w_i}\sum_t\psi_i(t)(f_{(t)}-w_ix_{(t)}(g-y_0)) \tag{12}
    最后的求解结果为:
    w_i=\frac{\mathbf{s}^T\boldsymbol{\psi_i}f_d}{\mathbf{s}^T\boldsymbol{\psi_i} \mathbf{s}},
    其中,
    \mathbf{s}=\left(\begin{matrix}x_{t0} \\ \vdots \\ x_{tN} \end{matrix}\right)\cdot(g-y_0),\qquad \boldsymbol{\psi_i} = I \cdot \left( \begin{matrix}\psi_i(t_0) \\ \vdots \\ \psi_i(t_n) \end{matrix}\right)
    到此,DMP的基本原理就介绍完了.

    相关文章

      网友评论

          本文标题:DMP(Dynamic Movement Primitives)

          本文链接:https://www.haomeiwen.com/subject/ixbitktx.html