ESP32(MicroPython) 四足机器人(五)功能补充

本次更新增加了前后倾斜(每次动作交换前部和后部高度)、蹲起与抬脚动作,均位于用于连续执行动作的function函数中,但实测抬脚动作需要先启动function函数的另一项功能才能正常开启,代码检查无误,应该是MicroPython固件的bug。另外,对于判断功能,增加了elif语句的使用,避免重复使用if语句以提高运行效率。

程序如下

import time

from machine import SoftI2C,Pin

from servo import Servos

import _thread

i2c=SoftI2C(sda=Pin(9),scl=Pin(8),freq=10000)

servos=Servos(i2c,address=0x40)

 

servos.position(0,90)

servos.position(1,90)

servos.position(2,90)

servos.position(3,90)

servos.position(4,90)

servos.position(5,90)

servos.position(6,90)

servos.position(7,90)

servos.position(8,120)

servos.position(9,120)

servos.position(10,120)

servos.position(11,120)

time.sleep(1)

 

Height1=0 #前部高度,0为最高

Height2=0 #后部高度,0为最高

mode=0

delay=300

 

def straight(angle): #直行,给所有转向舵机写入相应角度以调整方向

    servos.position(0,angle)

    servos.position(1,angle)

    servos.position(2,angle)

    servos.position(3,angle)

 

def turn(angle): #倾斜

    servos.position(0,angle)

    servos.position(1,angle)

    servos.position(2,180-angle)

    servos.position(3,180-angle)

    

def tilt(height1,height2): #前后倾斜,局部变量与全局变量通过大小写区分

    servos.position(4,90-height1)

    servos.position(5,90-height1)

    servos.position(6,90-height2)

    servos.position(7,90-height2)

    servos.position(8,120-height1-height1) #底部舵机使用两倍偏置以确保平衡

    servos.position(9,120-height1-height1)

    servos.position(10,120-height2-height2)

    servos.position(11,120-height2-height2)

    

def crawl(step,angle): #爬行,第一个参数为步骤数,第二个参数为相比直立状态降低的角度,步长随第二个参数的增大而增大

    if step==1:

        servos.position(4,90-angle-angle)

        servos.position(7,90-angle)

    if step==2:

        servos.position(5,90-angle-angle)

    if step==3:

        servos.position(6,90-angle-angle)

    if step==4:

        servos.position(4,90-angle)

        servos.position(5,90-angle)

        servos.position(6,90-angle)

        servos.position(7,90-angle-angle)   

def walk(step,angle): #步行,第一个参数为步骤数,第二个参数为相比直立状态降低的角度,步长随第二个参数的增大而增大

    if step==1:

        servos.position(4,90-angle-angle)

        servos.position(5,90-angle)

        servos.position(6,90-angle)

        servos.position(7,90-angle-angle)

    if step==2:

        servos.position(4,90-angle)

        servos.position(5,90-angle-angle)

        servos.position(6,90-angle-angle)

        servos.position(7,90-angle)

 

i1=0

i2=0

def function(i1, i2): #功能函数,执行连续进行的动作

    global mode

    global delay

    global Height1

    global Height2

    while True:

        if Height1>45: #参数超出范围时设为最大值

            Height1=45

        if Height2>45: #参数超出范围时设为最大值

            Height2=45    

        if mode==0 or mode>6: #不执行功能

            Step=0 #步数复位            

        elif mode==1: #爬行功能

            if Step==0:

                tilt(Height1,Height1) #先降低高度

                Step=1 #改变变量的值以进入下一步骤

            elif Step==1:    

                crawl(1,Height1)

                Step=2

            elif Step==2:    

                crawl(2,Height1)

                Step=3

            elif Step==3:    

                crawl(3,Height1)

                Step=4

            elif Step==4:    

                crawl(4,Height1)

                Step=1

        elif mode==2: #爬行功能(反向)

            if Step==0:

                tilt(Height1,Height1) #先降低高度

                Step=4 #改变变量的值以进入下一步骤

            elif Step==4:    

                crawl(4,Height1)

                Step=3

            elif Step==3:    

                crawl(3,Height1)

                Step=2

            elif Step==2:    

                crawl(2,Height1)

                Step=1

            elif Step==1:    

                crawl(1,Height1)

                Step=4  

        elif mode==3: #步行功能(由于只有两个步骤,无正反向调节,可能不能正常使用,后续视实际测试情况进行调整)

            if Step>2:

                Step=0

            if Step==0:

                tilt(Height1,Height1) #先降低高度

                Step=1 #改变变量的值以进入下一步骤

            elif Step==1:    

                walk(1,Height1)

                Step=2

            elif Step==2:    

                walk(2,Height1)

                Step=1

        elif mode==4: #前后倾斜

            if Step>2:

                Step=0

            if Step==0:

                tilt(0,0) #回到直立状态

                Step=1 #改变变量的值以进入下一步骤

            elif Step==1:    

                tilt(Height1,Height2)

                Step=2

            elif Step==2:

                tilt(Height1,Height2) #向反方向倾斜

                Step=0

        elif mode==5: #蹲起动作

            if Step>1:

                Step=0

            if Step==0:

                tilt(0,0) #回到直立状态

                Step=1 #改变变量的值以进入下一步骤

            elif Step==1:    

                tilt(Height1,Height2)

                Step=0

        elif mode==6: #抬脚动作

            tilt(0,0) #回到直立状态

            if Step==1:

                servos.position(4,20)

                Step=2 #改变变量的值以进入下一步骤

            elif Step==2:    

                servos.position(4,90)

                Step=3

            elif Step==3:    

                servos.position(5,20)

                Step=4

            elif Step==4:    

                servos.position(5,90)

                Step=1    

        time.sleep_ms(delay)

 

#开启线程

_thread.start_new_thread(function, (i1, i2))

    

while True:

    try:    

        data=int(input('input')) #输入9位数字

        mode=data//100000000 #第一位为模式

        Height1=data%100000000 #第二、三位为前部高度或步长

        Height1=Height1//1000000

        Height2=data%1000000 #第四、五、六位为后部高度或旋转角度

        Height2=Height2//1000

        delay=data%1000 #最后三位为延时

        #非连续执行的功能在此处执行

 if mode==7: #直行功能
            if Height2<=180: #参数超出范围则不执行,下同
                straight(Height2)  
        elif mode==8: #转向功能
            if Height2<=180:
                turn(Height2)
        elif mode==9: #倾斜功能
            if Height1<=60 and Height2<=60:
                tilt(Height1,Height2)        
    except:
        pass
    

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决eclipse 打开报错 An error has occurred. See the log file null.

解决eclipse 打开报错an error has ocurred. See the log file null 出现原因&#xff1a;安装了高版本的jdk,更换 jdk 版本&#xff0c;版本太高了。 解决方案&#xff1a;更改环境变量 改成 jkd 1.8

【深度学习实践】垃圾检测

简介 本项目使用深度学习目标检测开源框架PaddleDetection中的yolox算法实现了垃圾检测&#xff0c;本文包含了从头训练yolox模型和直接使用训练好的模型进行推理的代码及相关权重。 一、数据集准备 本次训练的数据集为coco格式&#xff0c;共包含150张垃圾的照片&#xff0…

F5 LTM 知识点和实验 6-使用虚拟服务器处理流量

第六章:使用虚拟服务器处理流量 virtual server 类型 前几章描述的场景,可以简单总结为,F5设备终结了一个会话,在client-side充当服务端,在server-side充当客户端,完成了一个全代理过程,这种模型的vs类型被称为标准类型。一般在你需要将流量做负载等场景时需要。 但是…

利用小波分解信号,再重构

function [ output_args ] example4_5( input_args ) %EXAMPLE4_5 Summary of this function goes here % Detailed explanation goes here clc; clear; load leleccum; s leleccum(1:3920); % 进行3层小波分解&#xff0c;小波基函数为db2 [c,l] wavedec(s,3,db2); %进行…

hcip——路由策略

要求&#xff1a; 基础配置 AR1 [R1]int g 0/0/0 [R1-GigabitEthernet0/0/0]ip add 12.0.0.1 24[R1-GigabitEthernet0/0/0]int g 0/0/1 [R1-GigabitEthernet0/0/1]ip add 14.0.0.1 24[R1]int loop0 [R1-LoopBack0]ip add 1.1.1.1 24[R1]rip 1 [R1-rip-1]vers 2 [R1-rip-1]net…

adb命令丨adb push命令大全_adb操控手机和指令

【ADB命令】adb push命令总结 adb push命令大全操控手机和指令 运行在 Android 设备上的adb后台进程 执行 adb shell ps | grep adbd &#xff0c;可以找到该后台进程&#xff0c;windows 请使用 findstr 替代 grep [xuxu:~]$ adb shell ps | grep adbd root 23227 1 6672 8…

Unity 性能优化五:渲染模块压力

CPU压力 Batching 在GPU渲染前&#xff0c;CPU会把数据按batch发送给GPU&#xff0c;每发送一次&#xff0c;都是一个drawcall&#xff0c;GPU在渲染每个batch的时候&#xff0c;会切换渲染状态&#xff0c;这里的渲染状态指的是&#xff1a;影响对象在屏幕上的外观的渲染属性…

【Python机器学习】实验05 贝叶斯推理

文章目录 朴素贝叶斯推理贝叶斯推理的基本概念1 数据读取--文件获取&#xff0c;可视化2 数据读取--训练集和测试集的划分3 数据读取--准备好每个类别各自的数据4 定义数据的均值和方差5 定义概率密度函数6 对于每个类别计算均值和方差7 定义每个类别的先验概率8 定义概率密度函…

(1)Gymnasium--安装和测试

1、官方地址 Gymnasium Documentation 2、参考教程 Gymnasium环境搭建与使用 - 知乎 3、安装 #conda 创建和使用环境 conda create -n gym_cp310 python3.10 conda activate gym_cp310#安装相关包 pip install "Gymnasium[all]" 4、报错Failed to build box2…

深入学习java虚拟机||JVM内存结构五大模型

目录 程序计数器 栈 虚拟机栈 垃圾回收是否涉及栈内存&#xff1f; 栈内存分配越大越好吗&#xff1f; 方法内的局部变量是否线程安全&#xff1f; 栈内存溢出 本地方法栈 堆 方法区 先看内存图总览 程序计数器 定义&#xff1a;全称P r o g r a m C o u n t e r R e …

windows下配置vue开发环境

安装nodejs&#xff0c;配置npm 1.下载安装包&#xff1a;下载地址&#xff1a;https://nodejs.org/en/download 2.安装node&#xff1a;下载完成后进行安装&#xff0c;记住安装的文件夹。本人安装路径为 D:\Program Files\nodejs 3.配置环境变量&#xff1a; ①安装完成后…

基于传统检测算法hog+svm实现图像多分类

直接上效果图&#xff1a; 代码仓库和视频演示b站视频005期&#xff1a; 到此一游7758258的个人空间-到此一游7758258个人主页-哔哩哔哩视频 代码展示&#xff1a; 数据集在datasets文件夹下 运行01train.py即可训练 训练结束后会保存模型在本地 运行02pyqt.py会有一个可视化…

某信用中心之加速乐实战分析

某信用中心之加速乐实战分析 某信用中心之加速乐实战分析声明逆向目标逆向分析第一层cookie获取第二层cookie获取调试分析JS文件 模拟执行致谢 某信用中心之加速乐实战分析 声明 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#x…

QTday2信号和槽

点击登录按钮,关闭Widget登录窗口,打开QQList窗口 widget.cpp #include "widget.h"void my_setupUI(Widget *w);Widget::Widget(QWidget *parent): QWidget(parent) {my_setupUI(this); }Widget::~Widget() { }void Widget::login_slots() {//fixemit jump_signal(…

CAN学习笔记1:计算机网络

计算机网络 1 概述 计算机网络就是把多种形式的计算机用通信线路连接起来&#xff0c;并使其能够互相进行交换的系统。实际上&#xff0c;计算机网络包括了计算机、各种硬件、各种软件、组成网络的体系结构、网络传输介质和网络通信计数。因此&#xff0c;计算机网络是计算机…

Kotlin筑基

Kotlin筑基 本文链接 核心思路&#xff1a;每个知识点都要和源码结合起来讲。 文章目录 Kotlin筑基编译时常量基本类型range访问权修饰符UnitNothing反引号函数内联函数引用具名函数判空和安全调用断言操作、空合并异常处理先决条件subStringsplit解构高级技巧partition repl…

SpringBoot整合RedisTemplate操作Redis数据库详解(提供Gitee源码)

前言&#xff1a;简单分享一下我在实际开发当中如何使用SpringBoot操作Redis数据库的技术分享&#xff0c;完整的代码我都提供了出来&#xff0c;大家按需复制使用即可&#xff01; 目录 一、导入pom依赖 二、yml配置文件 三、使用FastJson序列化 四、核心配置类 五、工具…

SpringCloudAlibaba之Ribbon

Ribbon是nacos自带的负载均衡器&#xff0c;属于客户端的负载均衡 但是在Spring高级版本中让LoadBalancer替代了 本人用的是2.1.0的nacos&#xff0c;ribbon还没有被替换。 使用&#xff1a; 在配置类中&#xff1a;LoadBalanced BeanLoadBalancedpublic RestTemplate restT…

【点云处理教程】05-Python 中的点云分割

一、说明 这是我的“点云处理”教程的第 5 篇文章。“点云处理”教程对初学者友好&#xff0c;我们将在其中简单地介绍从数据准备到数据分割和分类的点云处理管道。 在上一教程中&#xff0c;我们看到了如何过滤点云以减少噪声或其密度。在本教程中&#xff0c;我们将应用一些聚…

Redis(五)—— Redis进阶部分

一、Redis配置文件详解 注意这是Redis服务本身的配置文件&#xff0c;相当于maven的settings.xml&#xff0c;而不是我们在springboot去配置Redis的那个application.yml。 核心部分include 引入其他redis配置文件&#xff0c;相当于spring的<import>bind 设置IP&#xf…