参考资料链接: DMP:DYNAMIC MOVEMENT PRIMITIVES.
长期以来,复杂的动作一直被认为是由一系列按顺序或并行执行的原始动作构建块组成的,而DMPs是这些原始动作的一种拟议的数学形式化。DMP与先前提出的构件的区别在于,每个DMP都是一个非线性动力学系统。基本思想是,你拿一个具有明确的,稳定行为的动力系统,加上另一个术语,使它在运行过程中,遵循一些有趣的轨迹。dmp有两种:离散型和节奏型。对于离散的运动,基本系统是一个点吸引器,而对于有节奏的运动,则使用极限环。在这篇文章中,我们只关心离散的dmp,因为当我们完成所有的基本内容时,这篇文章已经很长了。
假设你有两个系统:一个是你规划轨迹的假想系统,另一个是你执行轨迹的实际系统。当您使用DMP时,您所做的就是为实际系统规划要遵循的轨迹。DMP有它自己的一组动态,通过正确地设置DMP,您可以获得实际系统要遵循的控制信号。如果我们的DMP系统正在为手规划路径,那么发送到实际系统的是需要施加到手上的力的集合。这取决于真正的系统,通过将这些手力转换成关节扭矩或肌肉激活(通过操作空间控制框架之类的东西)或其他东西来应用它们。这就是我在这里所要讲的关于实际系统的所有内容,这里我们要关注的是DMP系统。但请记住,整个DMP框架是用来生成轨迹控制信号来引导实际系统的。
在github上,已经有了基本离散DMP设置的代码和我在这篇文章中使用的示例,所以如果你想直接跳到那,有链接.您可以通过执行每个类的文件来运行测试代码。

Discrete DMPs:

让我们从点吸引器动力学开始:
y¨=αy(βy(g−y)−y˙)\ddot{y} = \alpha_y ( \beta_y (g - y) - \dot{y})y¨​=αy​(βy​(g−y)−y˙​)
其中y是系统的状态,g是目标,α\alphaα和β\betaβ是增益项。这看起来应该很熟悉,这是PD控制信号,所有这一切的作用是把我们的系统引向目标。现在我们要做的是添加一个强制项,让我们修改这个轨迹:
y¨=αy(βy(g−y)−y˙)+f\ddot{y} = \alpha_y ( \beta_y (g - y) - \dot{y}) + fy¨​=αy​(βy​(g−y)−y˙​)+f
如何定义一个非线性函数f使你得到渴望的行为是一个重要的问题。DMP框架的关键是一个附加的非线性系统,用来定义随时间变化的强迫函数f,从而为问题提供了一个定义良好的结构,可以直接解决问题,并易于推广。引入的系统称为正则动力学系统,记为xxx,具有非常简单的动力学:
x˙=−αxx\dot{x} = -\alpha_x xx˙=−αx​x
强迫函数f定义为正则系统的一个函数:
f(x,g)=Σi=1NψiwiΣi=1Nψix(g−y0)f(x,g) = \frac{\Sigma_{i=1}^N \psi_i w_i}{\Sigma_{i=1}^N \psi_i} x(g - y_0)f(x,g)=Σi=1N​ψi​Σi=1N​ψi​wi​​x(g−y0​)
y0y_0y0​是系统的初始位置。
ψi=exp(−hi(x−ci)2)\psi_i = \textrm{exp}\left( -h_i \left( x - c_i\right)^2 \right)ψi​=exp(−hi​(x−ci​)2)
wiw_iwi​ 是给定基函数ψi\psi_iψi​的权重。你可能认识到,上面的ψi\psi_iψi​方程定义了一个以cic_ici​为中心的高斯函数,其中hih_ihi​是方差。所以我们的强迫函数是一组高斯函数当正则系统x收敛到它的目标时被激活。它们的加权总和被标准化,然后乘以x(g−y0)x (g - y_0)x(g−y0​)项,这是一个“递减”和空间缩放项。
让我们把它分解一下。正则系统从某个任意值开始,贯穿这篇文章,x0=1x_0 = 1x0​=1,并且随着时间趋于无穷而趋于0。现在,我们假设xxx线性衰减到0。第一个要点是,有一些基函数作为xxx的函数被激活,这显示在下面的图中。当x的值从1减少到0时,每个高斯函数都围绕不同的xxx值被激活(或以其为中心)。第二件事是,每个基函数都有一个权重,wiw_iwi​。这些权重显示在下面:

The diminishing term

将xxx项合并到强迫函数中可以保证强迫项的贡献随时间趋于零,就像正则系统所做的那样。这意味着我们可以在晚上睡得很安稳,因为我们知道我们的系统可以沿着一些疯狂的路径,不管怎样,最终都会回到它更简单的点吸引子动力学并收敛到目标上。

Spatial scaling

空间缩放的意思是,一旦我们建立了系统,按照一个理想的轨迹,以达到一个特定的目标,我们希望能够把这个目标移动得更远或更近,并得到我们的轨迹的缩放版本。这就是强制函数的(g−y0)(g - y_0)(g−y0​)项所处理的,通过将每个基函数的激活量按比例缩放到与目标的距离,从而使系统覆盖或多或少的距离。例如,假设我们有一组离散的DMPs,按照给定的轨迹设置:

本例中的目标是1和.5,您可以看到这是dmp结束的地方。现在,我们已经为这些特定的目标(1和.5)在本例中指定了所有内容,但是现在假设我们想一般化并得到这个轨迹的一个扩展版本,以便通过DMPs移动到目标2。如果我们不适当地缩放我们的强迫函数(g−y0)(g - y_0)(g−y0​)项,那么我们最终会得到这样的结果:

基本上所发生的是对于这些新目标相同权重的基函数太弱了无法让系统遵循或达到预期的轨迹。然而,一旦(g−y0)(g - y_0)(g−y0​)项包含在强制函数中,我们得到:

Spreading basis function centers

好了,不幸的是,我们的正则系统并不像我们之前假设的那样,线性地收敛于目标系统。下面是实际系统的线性衰减和指数衰减的比较:

这是一个问题,因为我们的基函数的激活依赖于xxx。如果系统是线性的,那么我们将很好,基函数的激活将很好地分散到系统收敛到目标。但是,在实际的动力学中,xxx不是时间的线性函数。当我们把基本功能的激活作为时间的函数时,我们可以看到大多数激活都是在xxx开始快速移动时立即被激活的,然后随着xxx在最后变慢而延伸:

为了使基函数随时间分布得更均匀(以便我们的强迫函数在接近目标时仍能使系统沿着有趣的路径移动),我们需要更精明地选择高斯中心点。如果我们看x随时间变化的值,我们可以选择我们想要高斯函数被激活的时间,然后反向求出对应的xxx值在那个时间点上给我们激活。所以,让我们看一张图片:

红色的点是高斯函数居中的时间,蓝色的线是标准系统xxx。沿着虚线一直到对应的xxx值,我们可以看到高斯函数需要居中的x值是多少。此外,我们需要稍微担心一下高斯函数的宽度,因为那些稍后被激活的函数将被激活更长的时间。为了使它均匀,后面的基函数的宽度应该更小。通过非常非分析的试错法,我计算方差为
hi=#BFscih_i = \frac{\#BFs}{c_i}hi​=ci​#BFs​
它表示基函数iii的方差等于基函数的个数除以基函数的中心。当我们这样做的时候,我们现在可以为基函数生成中心它们之间间隔得很好:

Temporal scaling

再说一次,可泛化性是我们想从这个系统中得到的非常重要的东西之一。有两种明显的类型,时间和空间。我们在上面讨论过空间缩放,在时间情况下,我们希望能够以不同的速度遵循相同的轨迹。有时快,有时慢,但总是沿着同一条路走。为了做到这一点,我们要在系统动力学中加入另一个项,时间尺度项τ\tauτ。已知系统动力学是:
y¨=αy(βy(g−y)−y˙)+f\ddot{y} = \alpha_y ( \beta_y (g - y) - \dot{y}) + fy¨​=αy​(βy​(g−y)−y˙​)+f
x˙=−αxx\dot{x} = -\alpha_x xx˙=−αx​x
为了给我们时间上的灵活性,我们可以添加τ\tauτ项:
y˙+=τy¨,\dot{y}\; +\hspace{-1mm}= \tau \ddot{y},y˙​+=τy¨​,

y+=τy˙,y\; +\hspace{-1mm}= \tau \dot{y},y+=τy˙​,

x+=τx˙,x\; +\hspace{-1mm}= \tau \dot{x},x+=τx˙,
这就是我们所要做的!为了让系统减速,你把τ\tauτ设置在0和1之间,为了让系统加速,你把τ\tauτ设置为大于1。

Imitating a desired path

好了。我们有一个强制条件,可以使系统在汇聚到目标点时采取奇怪的路径,以及时间和空间的可扩展性。我们如何设置系统来遵循我们指定的路径?这将是理想的,向系统显示路径,让它能够反向工作并计算出力,然后能够在任何我们想要的时候生成轨迹。这是一个非常直接的过程。
我们可以控制强迫项,它影响系统加速度。因此,我们首先需要取我们想要的轨迹,yd\textbf{y}_dyd​(其中粗体表示一个向量,在本例中是轨迹中想要的点的时间序列),并对它微分两次以得到加速度:
y¨d=∂∂ty˙d=∂∂t∂∂tyd\ddot{\textbf{y}}_d = \frac{\partial}{\partial t} \dot{\textbf{y}}_d = \frac{\partial}{\partial t} \frac{\partial}{\partial t} \textbf{y}_dy¨​d​=∂t∂​y˙​d​=∂t∂​∂t∂​yd​
一旦我们有了想要的加速轨迹,我们需要去除基点吸引器系统的影响。我们有上面的公式确切地说明了点吸引器系统在每个时间点上引起的加速度是什么:
y¨=αy(βy(g−y)−y˙)\ddot{y} = \alpha_y ( \beta_y (g - y) - \dot{y})y¨​=αy​(βy​(g−y)−y˙​)
然后计算强迫项需要产生这个轨迹,我们有:
fd=y¨d−αy(βy(g−y)−y˙)\textbf{f}_d = \ddot{\textbf{y}}_d - \alpha_y ( \beta_y (g - \textbf{y}) - \dot{\textbf{y}})fd​=y¨​d​−αy​(βy​(g−y)−y˙​)
从这里我们知道强迫项由加权求和的基函数通过激活时间,所以我们可以使用一个优化技术等局部加权回归权重选择在我们的基函数,这样强制函数匹配所需的轨迹fd\textbf {f} _dfd​。在局部加权回归集合中使之最小化:
Σtψi(t)(fd(t)−wi(x(t)(g−y0)))2\Sigma_t \psi_i(t)(f_d(t) - w_i (x(t) (g - y_0)))^2Σt​ψi​(t)(fd​(t)−wi​(x(t)(g−y0​)))2
解决方案是(我不会在此推导,但在Schaal 1998年的论文中进行了推导)
wi=sTψifdsTψisw_i = \frac{\textbf{s}^T \pmb{\psi}_i \textbf{f}_d}{\textbf{s}^T \pmb{\psi}_i \textbf{s}}wi​=sTψ​ψ​​ψi​ssTψ​ψ​​ψi​fd​​
其中:
s=(xt0(g−y0)⋮xtN(g−y0)),ψi=(ψi(t0)…00⋱00…ψi(tn))\textbf{s} = \left( \begin{array}{c}x_{t_0}(g - y_0) \\ \vdots \\ x_{t_N}(g - y_0) \end{array} \right), \;\;\; \pmb{\psi}_i = \left( \begin{array}{ccc} \psi_i(t_0) & \dots & 0 \\ 0 & \ddots & 0 \\ 0 & \dots & \psi_i(t_n) \end{array} \right)s=⎝⎜⎛​xt0​​(g−y0​)⋮xtN​​(g−y0​)​⎠⎟⎞​,ψ​ψ​​ψi​=⎝⎛​ψi​(t0​)00​…⋱…​00ψi​(tn​)​⎠⎞​
太棒了!现在,我们有了开始用一些基本离散DMPs所需的基本知识!

Different numbers of basis functions

在模仿路径时,你马上就会注意到的一件事是,随着轨迹复杂性的增加,所需的基函数数量也会增加。例如,下面,系统试图遵循一个正弦波和一个高度非线性分段函数:

我们可以看到,在第二种情况下,虽然DMP永远不能准确地再现期望的轨迹,但随着基函数数目的增加,近似度会继续变得更好。这种在某些非线性领域的缓慢改进是可以从基函数的放置方式中预料到的。我们使用了随时间均匀分布基函数中心的方法,但为了模拟,Schaal博士的实验室还有另一种方法,将基函数放置得更有策略性。需求由该区域内的功能复杂性决定,并相应地定义基本功能中心和宽度。在高度非线性的区域,我们预计会有许多窄基函数,而在线性区域,我们预计会有较少的基函数,但更宽的基函数。这个方法被称为局部加权投影回归(LWPR),我计划在以后的文章中写它并应用它。

Conclusions \ thoughts

真的有很多的力量在这个框架中,有大量的在这个基本设置上的扩充,包括将系统反馈,时空耦合的纯数字,使用纯数字增益控制和轨迹控制,将成本函数和强化学习,识别动作类型,和其他真正令人激动的东西。
我在一些地方偏离了论文中使用的术语。首先,我看不出有理由把二阶方程组化为两个一阶方程组。当我计算它的时候,我发现它更令人困惑而不是有用,所以我把动力学作为一个二阶系统。第二,我还把τ\tauτ项移到了右边,这只是为了它匹配代码,这并不重要。这两项变化都不大,但以防你在看报纸时感到疑惑。
我上面提到的是沿着多个维度进行规划。其实很简单;DMP框架简单地为每个被控制的自由度分配一个DMP。但是,在某些时候,它绝对值得明确地说明。
我在上面也提到过,但这是一个很好的轨迹控制系统,可以放在之前讨论过的操作空间控制框架之上。在DMP框架之上规划健壮的、可推广的移动,在OSCs之下执行这些命令,我们可以开始得到一些真正整洁的应用程序。对于在真实系统上的应用,将反馈和时空耦合的术语结合起来是很重要的,所以下一篇文章可能会解决这些问题,然后我们可以开始研究一些令人激动的实现!
说到实现,在我的github上有一个DMP和规范的系统代码,请随意探索它,运行它,给我有关它的问题。无论什么。我还应该提一下,在Stefan Schaal的实验室网站上有很多这样的东西。

DYNAMIC MOVEMENT PRIMITIVES PART 1: THE BASICS相关推荐

  1. Dynamic Movement Primitives与UR5机械臂仿真

    Dynamic Movement Primitives (DMP),中文译名为动态运动基元.动态运动原语等,最初是由南加州大学的Stefan Schaal教授团队在2002年提出来的,是一种用于轨迹模 ...

  2. DMP (Dynamic Movement Primitives) 动态运动基元

    来源知乎文章Dynamic Movement Primitives介绍及Python实现与UR5机械臂仿真 1.DMP用处 DMP是一种用于轨迹模仿学习的方法,以其高度的非线性特性和高实时性,被应用到 ...

  3. 机械臂示教轨迹参数化方法 DMP, Dynamic Movement Primitive (一)

    机械臂示教轨迹参数化方法 DMP 1. 关于DMP 2. 香草味的DMP 3. 改进型DMP 4. 考虑Orientation的DMP 总结 很早之前就想写一栏关于DMP的博客笔记了,拖到现在一来是对 ...

  4. Dynamical Movement Primitives (DMP) 总结

    Dynamical Movement Primitives (DMP) 总结 概述 DMP通过将动态系统建立为①弹簧阻尼系统+②非线性控制项的方式fff,实现了对示教数据的建模.具体贡献如下: ① 提 ...

  5. Probabilistic Movement Primitives (ProMP) 总结

    概述 文章通过在DMP的基础上增加随机项,并通过EM算法求解得到符合示教数据的参数. 一. 模型介绍 1. 系统方程 假设示教数据为τ={qt,q˙t}t=0,...,T\tau = \{q_t, \ ...

  6. 融合机器人技术和神经科学的神经工程未来与挑战

    点击上面"脑机接口社区"关注我们 更多技术干货第一时间送达 大脑建模 机器人专家正在利用神经科学的知识来构建性能更好的机器人.机器人技术和神经科学的这融合代表了一种神经工程方法-- ...

  7. 【论文笔记】Encoding cloth manipulations using a graph of states and transitions

    [论文笔记]Encoding cloth manipulations using a graph of states and transitions Abstract 问题: Cloth manipu ...

  8. 【深度强化学习】【论文阅读】【双臂模仿】Deep Imitation Learning for BimanualRobotic Manipulation

    title: Deep Imitation Learning for BimanualRobotic Manipulation date: 2023-01-15T20:54:56Z lastmod: ...

  9. 最新导航综述!SLAM方法/数据集/传感器融合/路径规划与仿真多个主题

    点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心[SLAM]技术交流群 后台回复[SLAM综述]获取视觉SLAM.激光SLAM.RGBD ...

最新文章

  1. ubuntu终端基础命令
  2. 苏大JAVA题库_苏州大学Java程序设计课程试卷含答案(B)
  3. 转载:越早明白这四个道理越好!
  4. Apache 与 Nginx
  5. java多个数据库_java – 我们可以有多个dataSources到单个数据库
  6. centos7.x使用yum安装nginx
  7. 使用ASP.NET Core2.2创建WebApp
  8. Spring Boot2.0之热部署原理
  9. 在SPSS中将统计表格外观修改为三线表外观的步骤
  10. 安全工具之hackingtool
  11. RTK差分通讯链路---电台
  12. vue学习笔记二:HBuilder X框架搭建
  13. 计算机电源可调电阻,电脑ATX电源改0V-30V可调电源,电流7A
  14. 电阻电路的等效变化(Ⅰ)
  15. 浏览器访问网址过程详解
  16. “一切皆是映射” (光剑)
  17. 一发入魂双链表(十字链表)
  18. Android百度地图POI检索无标记显示问题
  19. 如何生成高效、兼容性好的Poco定位脚本
  20. Java之throw和throws的区别

热门文章

  1. 移动app如何开发?
  2. 小米妙想PC端连接平板5教程
  3. 网络+C#各个网上转载
  4. 你没有见过的6个创意CSS链接悬停效果
  5. 已拿头条offer的研发工程师面经(C++)
  6. 开源魔兽世界私服搭建
  7. python写采集程序_Python写的简易采集爬虫(蜘蛛)
  8. Invalid HTTP method: PATCH executing PATCH
  9. 短信通知-阿里大鱼 申请AK 发送Until
  10. 怎样删除androidstudio创建的模拟器