四足机器人(二):Hopf振荡器

目录 

一、Hopf振荡器基础

        1.1 数学模型

        1.2 初始值的选取

        1.3 模型参数的选取

二、振荡器耦合

三、自适应振荡器

3.1 自适应Hopf振荡器模型

3.2 仿真分析

四、参考文献


        Hopf振荡器作为中枢模式发生器(CPG)模型的一种方法,在四足机器人、双足机器人、外骨骼机器人的步态控制中具有重要应用。本文首先介绍了Hopf振荡器的基础知识,包括其基本数学模型,并使用Matlab进行对其输出信息进行动态仿真;分析了振荡器初始值选取与参数之间的关系;振荡器各个参数对动态特性的影响进行了仿真分析。另外对多个振荡器耦合的算法进行了分析,并且通过仿真进行验证。最后,介绍了一种频率自适应振荡器的学习律,这种振荡器可以学习输入信号的频率,对其进行了仿真分析。文末给出了所有仿真源码的地址。

一、Hopf振荡器基础

1.1 数学模型

        Hopf振荡器的数学模型如下:

\frac{dx}{dt}=\alpha (\mu -r^{2})x-\omega y

\frac{dy}{dt}=\alpha (\mu -r^{2})y+\omega x

        其中x,y为振荡器的状态变量,r^{2}=x^{2}+y^{2}\alpha ,\mu ,\omega为模型参数,与振荡器的动态特性相关,各个参数单独影响动态性能。

        当初始值为:\left [ x,y \right ]=\left [ 0.5,0.5 \right ],模型参数为:\alpha =50,\mu =1,\omega =2\pi,振荡器的输出如下图所示。

(a)横坐标x,纵坐标y

(b)x,y的曲线

图1 Hopf振荡器输出

        可以看出,Hopf振荡器的实质就是一个点,从初始位置收敛到一个圆周上,然后在圆周上随着时间做周期运动。收敛的快慢、圆周的大小、运动的速度可以通过模型参数调整。

1.2 初始值的选取

        对于任意非零的初始值,在合适参数下(主要是\alpha),振荡器都能产生相同形状的周期性振荡信号。但是如果参数不合适,会导致信号不平滑,甚至发散。当初始值为:\left [ x,y \right ]=\left [ 1.0,1.0 \right ]\alpha分别为200,100,50时,振荡器的输出如下图所示。

 (a)\alpha =200

(b)\alpha =100

(c)\alpha =50

图2 不同\alpha对应的输出信号

1.3 模型参数的选取

 (1)收敛权值\alpha

        参数\alpha的作用是控制从初始位置收敛到圆环的速度。当初始值为:\left [ x,y \right ]=\left [ 0.5,0.5 \right ],模型参数为:\mu =1,\omega =2\pi,其他参数不变的情况下,\alpha分别为5,10,50时,振荡器的输出曲线如下图所示。

 

 图3 振荡器的收敛速度

        可以看出,\alpha越小,收敛速度越慢,但是如果\alpha太大,会导致振荡甚至发散,如图2所示的情况。实际使用中,不能只最求快速收敛,应综合考虑。收敛太快,可能会导致收敛阶段的信号不平滑,甚至会超过某些幅值限制,例如速度、加速度超出实际系统的最大值。因此,实际使用时,应根据系统自身限制选择合适的收敛速度。

 (2)幅值系数\mu

         振荡器输出信号的幅值,表示的是图1(a)中极限圆的半径,也是图1(b)中周期信号的幅值。当初始值为:\left [ x,y \right ]=\left [ 0.5,0.5 \right ],模型参数为:\alpha =30,\omega =2\pi,其他参数不变的情况下,\mu分别为0.25,1,1.44时,振荡器的输出曲线如下图所示。

 

图4 振荡器的幅值

         可以看出,幅值A与参数\mu的关系为:A=\sqrt{\mu }

(3)频率\omega

        这个参数表示振荡器的角频率,也就是1.1中所说的点绕圆周运动的速度快慢。当初始值为:\left [ x,y \right ]=\left [ 0.5,0.5 \right ],模型参数为:\alpha =30,\mu=1,其他参数不变的情况下,\omega分别为\pi ,2\pi,4\pi时,振荡器的输出曲线如下图所示。

图5 振荡器的频率

        可以看出,当\omega =\pi时,振荡器输出信号的周期T=2,当\omega =2\pi时,振荡器输出信号的周期T=1,当\omega =4\pi时,振荡器输出信号的周期T=0.5,所以,振荡器输出信号的周期T与\omega的关系为:T=\frac{2\pi }{\omega }

二、振荡器耦合

        为什么要讨论多个振荡器耦合的情况?举个例子,四足机器人行走时,每条腿通过一个振荡器来产生固定节拍的信号,从而驱使四足机器人连续行走或小跑。机器人的四条腿并非同时抬起和放下,在一个固定步行模式下,每两条腿之间都有一个固定的相位差,为了保证任意时刻四条腿的节拍信号都满足固定相位差的要求,就需要在多个振荡器之间增加耦合。

        在多个振荡器之间增加耦合的方法,就是在Hopf振荡器数学模型里面加入一个耦合项,如下所示:

         其中,n表示耦合的振荡器个数,i=1,...,n分别对应各个振荡器,\theta _{j}^{i}=2\pi (\varphi _{i}-\varphi _{j}),其中\varphi _{i}\in [0,1)表示相位占比。

         例如对于双足机器人,左右腿各一个振荡器,左腿i=1,右腿i=2,以左腿相位作为参考相位,两条腿交替运动,相位相差50%,则\varphi _{1}=0,\varphi _{2}=0.5。初始值为\left [ x1,y1,x2,y2 \right ]=\left [ 0.5,0,-0.5,0 \right ]\alpha =30,\mu =1,\omega =2\pi时,两个耦合的振荡器输出信号如下图所示。

(a)x1-y1和x2-y2

(b)t-x1和t-x2

图6 振荡器耦合的输出

        可以看出,两个振荡器的输出信号相位始终相差50%。需要特别注意的是,在有些初始值情况下,耦合会失效,两个输出信号会完全相同。

三、自适应振荡器

        这一节内容来自论文:Dynamic Hebbian learning in adaptive frequency oscillators.

        本节介绍一种频率自适应振荡器的学习律,这里只讲用于Hopf振荡器上的自适应方法,这种方法可以类似推广到其他非线性振荡器。

3.1 自适应Hopf振荡器模型

         Hopf振荡器与一个周期输入信号相耦合的模型为:

         其中r=\sqrt{x^{2}+y^{2}}\mu >0决定了振荡器的幅值,\omega是振荡器的固有频率,这表示,如果没有扰动(\varepsilon =0)系统输出以\omega rad/s的速度振荡。这个振荡器与周期信号F进行耦合,如果没有耦合(F=0),系统有一个渐近稳定的极限环。而微小的扰动不会改变渐近稳定系统的整体表现,这个模型结构上是稳定的。

        将上述模型改成极坐标系的描述,令x=rcos\phi ,y=rsin\phi,得到:

         当振荡器的固有频率接近周期输入信号F的一个频率分量时,将会发生锁相现象,这意味着振荡器的频率与输入信号的频率会同步。

        自适应学习律为:

        (这里直接给出自适应学习律,省去了推导过程,感兴趣可以直接看论文)

        这个学习律和上面的公式(*)就组成了自适应Hopf振荡器的全部模型,非常简洁。稳定性证明略。

3.2 仿真分析

(a) 输入信号为单频率周期信号

        首先通过一个简单的例子来说明自适应系统是如何工作的,并讨论学习率参数\varepsilon对整个过程有什么影响。在公式(*)和(**)中,令输入信号为F=cos(30t),参数\mu =1,初始情况下r(0)=1\phi (0)=0\omega (0)=40,当\varepsilon分别为1, 0.8, 0.6, 0.4时进行仿真,结果如下图所示。

图7 不同参数\varepsilon的仿真结果

         可以看出,振荡器的固有频率通过自适应调整,稳定到了输入信号的频率。同时,参数\varepsilon决定了自适应的速度,\varepsilon越大频率学习的速度越快。

(b) 输入信号为多频率周期信号

        当学习多频率输入信号的频率时,我们通常希望振荡器收敛到其中一个频率分量。但是,如何选择自适应振荡器的初始频率范围,才能收敛到特定频率分量呢?在证明稳定性的时候,给出了一个方程,用来描述输入信号频率与振荡器初始固有频率的偏差:

         可以看出,这个方程取决于振荡器初始频率\omega _{0}、输入信号的频率分量n\omega _{F}以及该分量的幅值A_{n}。因此对于一个给定的输入信号,可以计算函数等于零时的\omega _{0}。这些零点给出了收敛区间,振荡器会向与\omega _{0}位于同一区间的频率分量收敛。例如输入信号如下:

 

         主要的频率分量为\omega _{F}=10,各频率分量对应的幅值为A_{2}=\frac{0.2}{2i},A_{3}=\frac{0.5}{2i},A_{4}=\frac{0.3}{2i},其他幅值为A_{i}=0,\forall i\notin \left \{ 2,3,4 \right \}。只需要求出下面方程的根:

         可以求出根为0或\pm \sqrt{\frac{717\pm \sqrt{134089}}{0.76}},因为频率一般大于零,所以有效的解为:\omega _{down}=21.3598,\omega _{up}=37.8233,这两个解划分出了三个区间,当振荡器的初始频率分别处于下列区间时\omega _{0}\in \left [ 0,\omega _{down} \right ],\left [ \omega _{down},\omega _{up} \right ],\left [ \omega _{up},\infty \right ],振荡器固有频率将分别收敛于20,30,40,只是在区间的临界处有一些不确定性。取\varepsilon =0.9\omega _{0}在各区间内任意取值时,振荡器最终收敛情况如下图所示。

图8 初始频率\omega _{0}取不同值时的收敛情况

        图中黑色虚线表示区间的边界,可以看出,当振荡器初始频率\omega _{0}取不同区间的值时,振荡器频率的收敛情况与以上推倒完全一致。

四、参考文献

        [1] Ludovic Righetti, Jonas Buchli, Auke Jan Ijspeert. Dynamic Hebbian learning in adaptive frequency oscillators.

        源代码包里面包括4个m文件:

        1)标准的Hopf振荡器仿真;

        2)2个Hopf振荡器耦合的仿真;

        3)自适应Hopf振荡器跟踪单频率的输入信号仿真;

        4)自适应Hopf振荡器跟踪多频率的输入信号的仿真;

        仿真源代码链接:https://download.csdn.net/download/u014170067/85036702https://download.csdn.net/download/u014170067/85036702

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
### 回答1: Hopf振荡器是一种常见的动力学模型,常用于描述生物、物理和工程学科中的周期性运动。而MATLAB是一种强大的数学工具箱,适用于数据分析、科学计算、模型仿真等多个领域。因此,结合MATLAB进行Hopf振荡器的仿真与研究具有广泛的应用价值。 在MATLAB中,Hopf振荡器模型通常采用一系列微分方程来描述。这些微分方程由Hopf本人在20世纪初提出,描述了一种由非线性时间演化方程组成的动力学系统,其运动可近似为谐波运动。 具体而言,Hopf振荡器模型中会涉及到一系列参数,包括自身演化的时间、非线性系数、耗散项等。这些参数会为Hopf振荡器的振荡频率和幅度等特性产生影响,通过MATLAB的程序仿真可以帮助我们更好地理解Hopf振荡器模型的行为特性。 除此之外,MATLAB还提供了各种计算工具和图形化界面,可以方便地进行解析分析和可视化展示。包括拟合、趋势分析、频谱分析等,都可以较为简便地完成。因此,MATLAB Hopf振荡器的研究可帮助我们探究复杂动力学系统的本质规律和性质,具有重要的理论和实际应用意义。 ### 回答2: MATLAB Hopf 振荡器是一种基于 Hopf 器件设计和实现的振荡器,用于生成具有特定频率和对称性的信号。 该振荡器在动态系统研究和信号处理领域中广泛应用,可用于探究自然界中的物理行为,如天体物理、流体动力学和生态学等。 除此之外,MATLAB Hopf 振荡器也用于数字信号处理、通信系统、压缩和编解码等技术领域。 MATLAB Hopf 振荡器由跨越各个领域的科学家共同研究和开发,并通过物理学、数学学科的理论基础和 MATLAB 编程语言的工具实现。 它主要由状态方程、耦合函数和信号调制器组成,可通过调整参数来生成不同类型、不同频率、不同对称性的振荡信号。 概括而言,MATLAB Hopf 振荡器广泛应用于许多领域,是一项基于理论、数学和计算机科学相结合的前沿技术,为实现信号处理、动态系统研究和数字通信等提供了有力支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巴普蒂斯塔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值