“Hopf Oscillator-Based Gait Transition for A Quadruped Robot“代码复现

paper链接:https://ieeexplore.ieee.org/abstract/document/7090642/

import math
import numpy as np
import matplotlib.pyplot as plt# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体为黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号'-'显示为方块的问题class CPG(object):def __init__(self, gait=0):self.gait_num = 3self.gait_names = ["Walk","Trot", "Pace", "Bound"]self.labels = ['FL', 'FR', 'HL', 'HR']# CPG构建基本参数self._alpha = 100self.leg_num = 4self.gait = gaitself.mu_ = -1self._a = 50self.u1 = 0self.u2 = 0# 负载系数对相关参数影响self.BEAT_ = [0.75, 0.5, 0.5, 0.5]self.period_ = [0.6, 0.5, 0.5, 0.4]self._beta = self.BEAT_[0]self._t = self.period_[0]# 时间self.t_step = 0.001self.point_x = np.zeros(self.leg_num)self.point_y = np.zeros(self.leg_num)self.PHASE = [[0 * 2 * np.pi, 0.5 * 2 * np.pi, 0.25 * 2 * np.pi, 0.75 * 2 * np.pi],[0 * 2 * np.pi, 0.5 * 2 * np.pi, 0.5 * 2 * np.pi, 0 * 2 * np.pi],[0 * 2 * np.pi, 0.5 * 2 * np.pi, 0 * 2 * np.pi, 0.5 * 2 * np.pi],[0 * 2 * np.pi, 0 * 2 * np.pi, 0.5 * 2 * np.pi, 0.5 * 2 * np.pi],]# 相对相位矩阵self.R_cell = np.zeros(shape=(self.leg_num, self.leg_num, 2, 2))self.Phi = None# 初始值,非0即可self.leg_x = Noneself.leg_y = Noneself.reset()# 计数,什么时候完成相位同步self.count_ = 0# 计数,什么时候结束步态转换self.t_count_ = 0self.init_phase()def init_phase(self):for _ in range(700):self.step()def reset(self):self._beta = self.BEAT_[self.gait]self._t = self.period_[self.gait]self.Phi = self.PHASE[self.gait]self.leg_x = np.ones(self.leg_num) * 0.0001self.leg_y = np.ones(self.leg_num) * 0.0001self.update_rotation_matrix()def next_gait(self):self.gait = (self.gait + 1) % self.gait_numself.reset()def update_rotation_matrix(self):        for i in np.arange(0, self.leg_num):for j in np.arange(0, self.leg_num):self.R_cell[j, i] = np.array([[np.cos(self.Phi[i] - self.Phi[j]), - np.sin(self.Phi[i] - self.Phi[j])],[np.sin(self.Phi[i] - self.Phi[j]), np.cos(self.Phi[i] - self.Phi[j])]])def transit_gait(self, tau=0):self.t_count_ = self.t_count_ + 1# 步态在一个周期内完成转换if tau == 0:# walk to trot# beta/φ2从0.75变换到0.5# walk步态周期为0.6,假设在1s内完成转换,共200步,每步变换1/800=0.00125transit_step = 0.00125self.Phi[0] = 0# self.Phi[1] = 0.5phi2_ = 0.75 - transit_step * self.t_count_self.Phi[2] = phi2_ * 2 * np.piself.Phi[3] = (phi2_ - 0.5) * 2 * np.pi# 更新占空比参数和周期参数self._beta = phi2_            else:# trot to gallop# φ1从0.5到0,0.5/200=1/400=0.0025transit_step = 0.0025phi1_ = 0.5 - transit_step * self.t_count_self.Phi[1] = phi1_ * 2 * np.piself.Phi[3] = (0.5 - phi1_) * 2 * np.piif self.t_count_ >= 200:self.t_count_ = 0if tau == 0:self._t = 0.5else:self._t = 0.4self.update_rotation_matrix()def step(self):if self.count_ > 400:self.mu_ = 1self.count_  = self.count_ + 1if self.count_ > 1200 and self.count_ <= 1400:self.transit_gait(tau=0)if self.count_ > 1800 and self.count_ <= 2000:self.transit_gait(tau=1)for _ in range(5):for i in np.arange(0, self.leg_num):r_pow = (self.leg_x[i] - self.u1) ** 2 + (self.leg_y[i] - self.u2) ** 2W = math.pi / (self._beta*self._t*(math.exp(-self._a*self.leg_y[i]) + 1)) + math.pi / ((1-self._beta)*self._t*(math.exp(self._a*self.leg_y[i]) + 1))V = np.matmul(np.array([[self._alpha * (self.mu_ - r_pow), - W], [W, self._alpha * (self.mu_ - r_pow)]]),np.array([[self.leg_x[i] - self.u1], [self.leg_y[i] - self.u2]])) + \np.matmul(self.R_cell[0, i], np.array([[self.leg_x[0] - self.u1], [self.leg_y[0] - self.u1]])) + \np.matmul(self.R_cell[1, i], np.array([[self.leg_x[1] - self.u2], [self.leg_y[1] - self.u2]])) + \np.matmul(self.R_cell[2, i], np.array([[self.leg_x[2] - self.u1], [self.leg_y[2] - self.u2]])) + \np.matmul(self.R_cell[3, i], np.array([[self.leg_x[3] - self.u1], [self.leg_y[3] - self.u2]]))self.leg_x[i] = self.leg_x[i] + V[0, 0] * self.t_stepself.leg_y[i] = self.leg_y[i] + V[1, 0] * self.t_stepfor i in range(0, self.leg_num):self.point_x[i] = self.leg_x[i]self.point_y[i] = self.leg_y[i]if self.leg_y[i] > 0:self.point_y[i] = 0else:self.point_y[i] = -self.leg_y[i]return np.concatenate([[h, k] for h, k in zip(self.point_x, self.point_y)])if __name__ == '__main__':cpg = CPG(0)step_num = 1800plt.rcParams.update({'font.size': 20})fig1 = plt.figure(figsize=(9, 6))plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=0.5)phases = np.stack(np.array([cpg.step() for _ in range(step_num)]), axis=1)ax = plt.subplot(4, 1, 1)leg_labels = ['FL', 'FR', 'HL', 'HR']for i in range(4):ax.plot(np.arange(0, step_num) * 0.005, phases[2 * i, :], linewidth=2, label=leg_labels[i])ax.set_xlim(0,step_num * 0.005)ax.legend(prop={'size': 14}, loc= 'lower right')plt.show()

代码实现了从静止到行走(walk)到小跑(trot)再到飞奔(gallop)步态的转换。具体实现细节和解释有时间再写👌。

 相关文章:raisimGymTorch的使用-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2776819.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

政安晨:示例演绎TensorFlow的官方指南(三){快速使用数据可视化工具TensorBoard}

这篇文章里咱们演绎TensorFLow的数据可视化工具&#xff1a;TensorBoard。 在机器学习中&#xff0c;要改进模型的某些参数&#xff0c;您通常需要对其进行衡量。TensorBoard 是用于提供机器学习工作流期间所需测量和呈现的工具。它使您能够跟踪实验指标&#xff08;例如损失和…

54.螺旋矩阵(Java)

题目描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 输入&#xff1a; matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a; [1,2,3,6,9,8,7,4,5] 代码实现&#xff1a; import java.util.ArrayLi…

Linux操作系统基础(四):Linux连接工具使用

文章目录 Linux连接工具使用 一、为什么要使用远程连接工具 二、虚拟机网络配置 三、获取Linux操作系统IP地址 四、聊一聊Linux系统账号 五、安装finalshell远程连接软件 六、建立连接 七、软件界面与使用说明 Linux连接工具使用 一、为什么要使用远程连接工具 因为一…

【蓝桥杯冲冲冲】Prime Gift

【蓝桥杯冲冲冲】Prime Gift 蓝桥杯备赛 | 洛谷做题打卡day31 文章目录 蓝桥杯备赛 | 洛谷做题打卡day31Prime Gift题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示题解代码我的一些话 Prime Gift 题面翻译 给你 n n n 个…

入门指南|Chat GPT 的兴起:它如何改变数字营销格局?

随着数字营销的不断发展&#xff0c;支持数字营销的技术也在不断发展。OpenAI 的 ChatGPT 是一项备受关注的突破性工具。凭借其先进的自然语言处理能力&#xff0c;ChatGPT 已被证明是全球营销人员的宝贵资产。在这份入门指南中&#xff0c;我们将探讨Chat GPT对数字营销专家及…

Composition Local

1.显示传参 package com.jmj.jetpackcomposecompositionlocalimport org.junit.Testimport org.junit.Assert.*/*** 显示传参*/ class ExplicitText {private fun Layout(){var color:String "黑色";//参数需要通过层层传递&#xff0c;比较繁琐Text(color)Grid(c…

思腾云计算中心 | 5千平米超大空间,基础设施完善,提供裸金属GPU算力租赁业务

2021年&#xff0c;思腾合力全资收购包头市易慧信息科技有限公司&#xff0c;正式开启云计算业务。思腾云计算中心占地2400平米&#xff0c;位于包头市稀土高新区&#xff0c;毗邻多家知名企业&#xff0c;地理位置优越&#xff0c;交通便利&#xff0c;是区内重要的信息化产业…

公有云服务器:功能与性能的完美融合

在数字化浪潮下&#xff0c;云服务器已经成为企业及个人用户存储数据、运行应用的重要基础设施。其中&#xff0c;公有云服务器凭借其诸多优势&#xff0c;更是受到了市场的广泛欢迎。上海悠远将为您详细介绍公有云服务器的功能特点&#xff0c;以及如何进行性能测试。 一、公有…

03-抓包_封包_协议_APP_小程序_PC应用_WEB应用

抓包_封包_协议_APP_小程序_PC应用_WEB应用 一、参考工具二、演示案例&#xff1a;2.1、WEB应用站点操作数据抓包-浏览器审查查看元素网络监听2.2、APP&小程序&PC抓包HTTP/S数据-Charles&Fiddler&Burpsuite2.3、程序进程&网络接口&其他协议抓包-WireSh…

MES生产制造管理:汽车零部件生产MES解决方案

某某汽车部件科技有限公司是一家铝合金零部件研发、压铸和精加工为一体的高新技术企业,拥有先进压铸、机加、检测等设备,并配套自动化生产线。为解决发动机支架等产品的全程生产质量追溯和实现机台设备联网,梅施科技提供了车间级的MES解决方案,如图所示&#xff1a; 梅施科技采…

Idea里自定义封装数据警告解决 Spring Boot Configuration Annotation Processor not configured

我们自定对象封装指定数据&#xff0c;封装类上面一个红色警告&#xff0c;虽然不影响我们的执行&#xff0c;但是有强迫症看着不舒服&#xff0c; 去除方式&#xff1a; 在pom文件加上坐标刷新 <dependency><groupId>org.springframework.boot</groupId><…

【深度学习】Softmax实现手写数字识别

实训1&#xff1a;Softmax实现手写数字识别 相关知识点: numpy科学计算包&#xff0c;如向量化操作&#xff0c;广播机制等 1 任务目标 1.1 简介 本次案例中&#xff0c;你需要用python实现Softmax回归方法&#xff0c;用于MNIST手写数字数据集分类任务。你需要完成前向计算…

24 SEMC相关

文章目录 24.1 SEMC 简介24.2 SEMC 框图剖析24.2.1 通讯引脚24.2.1.1 SEMC 的片选信号24.2.1.2 数据选通信号 DQS 24.2.2 存储器控制器24.2.3 IP 命令和 AXI 命令24.2.4 驱动时钟 24.4 SEMC 初始化配置结构体24.4.1 dqsMode24.4.2 cmdTimeoutCycles24.4.3 busTimeoutCycles24.4…

无人机图像识别技术研究及应用,无人机AI算法技术理论,无人机飞行控制识别算法详解

在现代科技领域中&#xff0c;无人机技术是一个备受瞩目的领域。随着人们对无人机应用的需求在不断增加&#xff0c;无人机技术也在不断发展和改进。在众多的无人机技术中&#xff0c;无人机图像识别技术是其中之一。 无人机图像识别技术是利用计算机视觉技术对无人机拍摄的图像…

鸿蒙原生应用再添新丁!央视新闻 入局鸿蒙

鸿蒙原生应用再添新丁&#xff01;央视新闻 入局鸿蒙 来自 HarmonyOS 微博2月9日消息&#xff0c;#央视新闻启动鸿蒙原生应用开发#中央广播电视总台旗舰央视新闻客户端正式宣布&#xff0c;将基于HarmonyOS NEXT鸿蒙星河版&#xff0c;启动央视新闻 鸿蒙原生应用开发&#xf…

《MySQL 简易速速上手小册》第10章:未来趋势和进阶资源(2024 最新版)

文章目录 10.1 MySQL 在云计算和容器化中的应用10.1.1 基础知识10.1.2 重点案例&#xff1a;使用 Python 部署 MySQL 到 Kubernetes10.1.3 拓展案例 1&#xff1a;在 AWS RDS 上部署 MySQL 实例10.1.4 拓展案例 2&#xff1a;使用 Docker 部署 MySQL 10.2 MySQL 和 NoSQL 的整合…

【软考】系统集成项目管理工程师(十五)文档和配置管理【2分】

一、 文档管理 二、配置管理 1、配置项 基线类型基线包括管理原则基线配置项所有设计文档和源程序向开发人员开放读取的权限非基线配置项项目的各类计划额报告向PM、CCB及相关人员开放所有配置项的操作权限应由CMO&#xff08;配置管理员&#xff09;严格管理 2、基线 3、配置…

可达鸭二月月赛——基础赛第六场(周五)题解,这次四个题的题解都在这一篇文章内,满满干货,含有位运算的详细用法介绍。

姓名 王胤皓 T1 题解 T1 题面 T1 思路 样例输入就是骗人的&#xff0c;其实直接输出就可以了&#xff0c;输出 Hello 2024&#xff0c;注意&#xff0c;中间有一个空格&#xff01; T1 代码 #include<bits/stdc.h> using namespace std; #define ll long long int …

自制微信红包封面

一.前言 这不是过年了吗&#xff0c;各大平台都发放了免费的微信红包封面&#xff0c;但我老是抢不到QAQ。于是乎&#xff0c;我便想“授人以鱼不如授人以渔”&#xff0c;不如自己造个封面。 二.主要步骤 1.条件 1>创建视频号 2>过去一年发表过视频号 3>过去一…

春节:当代发展及创新传承

为了解中国传统节日——春节&#xff0c;2024年2月9日&#xff0c;曲阜师范大学计算机学院“古韵新声&#xff0c;格物致‘知’”实践队队员贾宣在山东省青岛市西海岸新区的商场中进行了街头调查&#xff0c;探究春节的发展与当代意义。 春节历史悠久&#xff0c;起源于早期人…