# DMP-matlab **Repository Path**: chauby/DMP-matlab ## Basic Information - **Project Name**: DMP-matlab - **Description**: Matlab语言实现的DMP, 包括Dynamic System。 - **Primary Language**: Matlab - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 0 - **Created**: 2018-04-10 - **Last Updated**: 2024-05-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README Dynamic Movement Primitives for matlab === by chauby Zou 2018.04.09 # 1. 简介 本代码主要是 Dynamic Movement Primitives(DMPs) 的matlab代码实现, DMPs又称为动态运动基元,基本思想是将运动过程分解为一系列的运动基元,通过运动基元的加权叠加来得到运动轨迹。 # 2. Dynamic System (动力系统、动态系统) ## 2.1 一阶动力系统 微分方程表示为 $$ \dot{x} = -\alpha x $$ 给定目标位置的微分方程表示为 $$ \begin{align} \dot{x} &= -\alpha (x-x_g)\\ &= \alpha (x_g - x) \end{align} $$ 其中,$\alpha$ 为衰减率(时间常数), $x_g$ 为目标状态。
一阶动态系统的时间响应示意图如下
## 2.2 二阶动力系统 二阶动力系统其实就是弹簧-阻尼系统,示意图如下所示:
其微分方程表示为 $$ m\ddot{x} = -kx-c\dot{x} $$ 其中,$m$ 为模块的质量,$k$ 为弹簧系数,$c$ 为阻尼系数。 给定目标位置的微分方程推导过程为 $$ \begin{align} m\ddot{y} &= -ky-c\dot{y} \\ m\ddot{y} &= c(-\frac{k}{c}y-\dot{y}) \\ \tau\ddot{y} &= \alpha(-\beta y -\dot{y}) \\ \tau\ddot{y} &= \alpha(-\beta (y - y^g) -\dot{y}) \\ \tau\ddot{y} &= \alpha(\beta (y^g - y) -\dot{y}) \\ \end{align} $$ 其中,$\alpha=c, \beta=\frac{k}{c}, m=\tau$, $y^g$ 为设定的目标状态。二阶动态系统的时间响应示意图如下所示:
其中,$\tau=1, \alpha=1,\beta=\frac{\alpha}{4}=0.25$, $y, dy, ddy$ 分别是曲线的位置、速度和加速度信息。
其中,$\tau=1$, $\alpha$ 和 $\beta$ 的值如图中所示。 # 3. Dynamic Movement Primitives 动态运动基元(Dynamic Movement Primitives, DMPs)是基于动态系统的一种轨迹调制方法,通过将动作分解为一系列的基元,并使用运动基元加权的方式来实现轨迹的拟合。DMP分为离散DMP(discrete DMP)和节律DMP(rhythmicity DMP)。 ## 3.1 离散DMP 其微分方程可以表示为 $$ \tau \ddot{y} = \alpha(\beta(g-y) - \dot{y}) + f $$ 其中 $f$ 是一个非线性函数,表示外界对于动态系统的一个非线性“力”, $f$ 可以表示为 $$ f(x, g) = \frac{\sum^{N}_{i=1}\psi_i w_i}{\sum^{N}_{i=1}\psi_i}x(g-y_0) $$ 其中,$x$ 是一个典型动态系统(canonical dynamical system), 其微分方程可以表示为 $$ \dot{x} = -\alpha_x x $$ $y_0$ 表示系统的初始值。 $w_i$ 表示权值, $\psi_i$ 表示第 $i$ 个中心值在 $c_i$的高斯函数: $$ \psi_i=exp(-h_i(x-c_i)^2) $$ # 4. Application