2024年TI杯E题-三子棋游戏装置方案分享-jdk123团队-第二弹 手搓机械臂

news2024/11/25 20:43:52

第一弹赛题的选择与前期方案的准备

opencv调用摄像头bug的解决

机械臂的组装

采用三个舵机,组成一个三自由度的机械臂。
如图所示
并且利用电磁吸盘的方式,完成对棋子的抓取工作,后面的事实证明,在预算不足的情况下,队友手搓的机械臂,发挥了大作用。

机械臂的调试代码

import time
import RPi.GPIO as GPIO


class ArmControl:
    def __init__(self):
        GPIO.setwarnings(False)
        # 初始化舵机引脚
        self.servos = {
            'base': 16,
            'shoulder': 20,
            'elbow': 21
        }

        # 设定每个九宫格位置对应的舵机角度
        self.position_angles = {
            0:(60 ,60 , 90), 
            9: (94, 69, 46),  # 位置1: 基座97°,肩部14°,肘部0° true1 9 1
            8: (89, 67, 48),  # 位置2: 基座90°,肩部14°,肘部0° true1 8 1
            7: (83, 63, 51),  # 位置3: 基座82°,肩部14°,肘部0° true1 7 1
            6: (96,61, 67),   # 位置4: 基座97°,肩部5°,肘部3°  true1 6 1
            5: (89, 61, 73),   # 位置5: 基座90°,肩部0°,肘部0° true1 5 1
            4: (82, 61, 74),   # 位置6: 基座82°,肩部5°,肘部3° true1 4 1
            3: (98, 60, 89),  # 位置7: 基座99°,肩部0°,肘部45° true1 3 1
            2: (89, 60, 93),  # 位置8: 基座90°,肩部0°,肘部45°  true1 2 1
            1: (80, 60, 97) ,  # 位置9: 基座80°,肩部0°,肘部46° true1 1 1
            'A1': (75,64,63),  # 位置1: 基座97°,肩部14°,肘部0° 
            'B1':(104,67,49),  # 位置1: 基座97°,肩部14°,肘部0° true
            'C1':(106,66,67),  # 位置1: 基座97°,肩部14°,肘部0° ture
            'D1':(108, 70, 102),  # 位置1: 基座97°,肩部14°,肘部0°
            'A2':(75, 69,43),  # 位置1: 基座97°,肩部14°,肘部0° true 1
            'B2':(75, 64, 67),  # 位置1: 基座97°,肩部14°,肘部0° true
            'C2':(73, 64, 85),  # 位置1: 基座97°,肩部14°,肘部0°
            'D2':(70, 70, 112),  # 位置1: 基座97°,肩部14°,肘部0°
        }

        # 设置GPIO模式
        GPIO.setmode(GPIO.BCM)

        # 设置舵机引脚
        self.pwm = {}
        self.last_time = 0  # 上一次设置时间
        self.debounce_time = 0.5  # 防抖时间(秒)

        for servo in self.servos.values():
            GPIO.setup(servo, GPIO.OUT)
            self.pwm[servo] = GPIO.PWM(servo, 50)  # 50Hz
            self.pwm[servo].start(0)

    def set_servo_angle(self, pwm, target_angle, speed):
        """将舵机平滑旋转到指定角度,并实现防抖逻辑"""
        current_time = time.time()  # 获取当前时间

        # 防抖逻辑
        if current_time - self.last_time < self.debounce_time:
            return  # 如果距离上次设置时间小于防抖时间,则不执行

        # 计算占空比
        duty = self.angle_to_duty_cycle(target_angle)

        # 确保占空比在合理范围内
        if duty < 0:
            duty = 0
        elif duty > 12:  # 假设最大是180度
            duty = 12

        pwm.ChangeDutyCycle(duty)
        time.sleep(speed)  # 按速度控制时间延迟
        pwm.ChangeDutyCycle(0)  # 停止PWM信号
        self.last_time = current_time  # 更新最后设置时间

    def move_servo(self, servo_name, angle):
        """指定舵机移动到指定角度"""
        self.set_servo_angle(self.pwm[self.servos[servo_name]], angle, 0.5)  # 设置速度为0.5秒

    def move_to_position(self, position):
        """移动机械臂到指定棋盘位置(1-9)"""
        if position in self.position_angles:
            angles = self.position_angles[position]  # 获取角度元组
            self.move_servo('base', angles[0])# 移动基座
            time.sleep(1)
            self.move_servo('elbow', angles[2])
            time.sleep(1)
            self.move_servo('shoulder', angles[1])
            # 移动肩部
              # 移动肘部
    def remove_to_position(self, position):
        """移动机械臂到指定棋盘位置(1-9)"""
        if position in self.position_angles:
            angles = self.position_angles[position]  # 获取角度元组
            self.move_servo('shoulder', angles[1])# 移动基座
            time.sleep(1)
            self.move_servo('elbow', angles[2])
            time.sleep(1)
            self.move_servo('base', angles[0])
        else:
            print("无效的位置编号!")

    def angle_to_duty_cycle(self, angle):
        """将角度转换为PWM占空比(0到100之间)"""
        return (angle / 18) + 2  # 示例转换,具体根据舵机类型调整

    def cleanup(self):
        """清理GPIO设置"""
        for pwm in self.pwm.values():
            pwm.stop()
        GPIO.cleanup()


if __name__ == "__main__":
    arm = ArmControl()

    try:
        # 将舵机初始化到位置 0
        print("Moving to position 0...")
        arm.remove_to_position(0)
        time.sleep(2)  # 等待,确保舵机到达位置
        
        # 返回到位置 0
        print("Returning to position 0...")
        arm.move_to_position('B1')
        time.sleep(2)  # 等待,确保舵机到达位置
        
        
        # 然后移动到位置 1
        print("Moving to position 1...")
        #arm.remove_to_position(0)
        time.sleep(2)  # 等待,确保舵机到达位置

        

    except KeyboardInterrupt:
        print("Process interrupted!")
    finally:
        arm.cleanup()  # 清理GPIO设置

机械臂的问题

首先,三个舵机一定要与树莓派共地,不然机械臂可能会出现,随机乱动的情况。
其次,一定要根据三个舵机的功率,去计算机械臂的功率,然后选取非常稳定的稳压模块去给其供电。

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

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

相关文章

顺序表的实现——数据结构

线性表 文章目录 线性表线性表的定义和基本操作线性表的定义线性表的基本操作 线性表的顺序表示顺序表的定义顺序表的实现——静态分配顺序表的实现——动态分配顺序表的特点 线性表的定义和基本操作 线性表的定义 线性表&#xff08;Linear List&#xff09;的定义 ​ 线性…

多进程多线程

exec 系列函数 结束代码函数 atexec 函数 结束标志&#xff0c;从下往上 先出2再出1 void cleanup1() {printf("clean1"); }void cleanup2() {printf("clean2"); }atexec(cleanup1) atexec(cleanup2)

28. 找出字符串中第一个匹配项的下标【 力扣(LeetCode) 】

一、题目描述 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 二、测试用例 示例 1&#xff1a; 输…

Cmake编译工程

Cmake目录结构&#xff1a;项目主目录中会放一个CmakeList.txt的文本文档&#xff0c;后期使用cmake指令时候&#xff0c;依赖的就是该文档 1.包含源文件的子文件夹包含Cmakelist.txt文件时&#xff0c;主目录的Cmakelists.txtx要通过add_subdirector添加子目录 2.包含源文件…

算法3:二分查找(下)

文章目录 寻找峰值寻找旋转数组最小值 寻找峰值 class Solution { public:int findPeakElement(vector<int>& nums) {int left 0, right nums.size() - 1;while(left < right){int mid left (right - left) / 2;if(nums[mid] < nums[mid 1])left mid 1;…

opencv-python图像增强三:图像清晰度增强

文章目录 一、简介&#xff1a;二、图像清晰度增强方案&#xff1a;三、算法实现步骤3.1高反差保留实现3.2. usm锐化3.3 Overlay叠加 四&#xff1a;整体代码实现五&#xff1a;效果 一、简介&#xff1a; 你是否有过这样的烦恼&#xff0c;拍出来的照片总是不够清晰&#xff…

视频汇聚/安防监控综合平台EasyCVR接入海康私有协议EHOME显示失败是什么原因?

安防监控/视频综合管理平台/视频集中存储/磁盘阵列EasyCVR视频汇聚平台&#xff0c;支持多种视频格式和编码方式&#xff08;H.264/H.265&#xff09;&#xff0c;能够轻松对接各类前端监控设备&#xff0c;实现视频流的统一接入与集中管理。安防监控EasyCVR平台支持多种流媒体…

Stable Diffusion【 ControlNet实战】OpenPose 轻松制作武侠动作

前言 hello&#xff0c;大家好** 好了&#xff0c;进入正题。如何通过Stable Diffusion ControlNet来进行姿态控制。来一起来看下老徐的简单示例&#xff1a; 老徐参数设置&#xff1a; **大模型&#xff1a;**墨幽人造人_v1080 所有的AI设计工具&#xff0c;模型和插件&…

25届秋招网络安全面试资料库

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s?…

机器人中的wrench(力旋量)

在机器人领域&#xff0c;wrench&#xff08;力旋量&#xff09;是一个由力和力矩组成的6D空间向量&#xff0c;用于描述刚体在空间中受到的力和力矩的综合作用。具体来说&#xff0c;wrench可以看作是一个包含线性分量和旋转分量的矢量&#xff0c;其中线性分量代表作用在刚体…

时间序列+预训练大模型!最新开源成果性能暴涨42.8%

今天我们来聊一个新兴的、创新空间很大的方向&#xff1a;时间序列预训练大模型。 预训练大模型因为在大规模多领域的数据集上进行训练&#xff0c;能学习到丰富的、跨领域的时间序列表示&#xff0c;在面对新的、没见过的时间序列数据时&#xff0c;它能够表现出更强的泛化性…

快速排序效率

为了搞清楚快速排序的效率&#xff0c;我们先从分区开始。分解来看&#xff0c;你会发现它包含两种步骤。 ❏ 比较&#xff1a;每个值都要与轴做比较。 ❏ 交换&#xff1a;在适当时候将左右指针所指的两个值交换位置。 一次分区至少有N次比较&#xff0c;即数组的每个值都要…

打开第四十二天:买卖股票的最佳时机IV、最佳买卖股票时机含冷冻期、买卖股票的最佳时机含手续费

一、买卖股票的最佳时机IV&#xff08;困难&#xff09; 题目 文章 视频 这道题目可以说是上一题的进阶版&#xff0c;这里要求至多有k次交易。 确定dp数组以及下标的含义 在上一题中定义了一个二维dp数组&#xff0c;本题其实依然可以用一个二维dp数组。使用二维数组 dp…

wireshark使用介绍及案例分享

一、wireshark介绍 1、定义 wireshark是非常流行的网络封包分析软件,简称小鲨鱼,功能十分强大。可以截取各种网络封包,显示网络封包的详细信息。对应的,linux下的抓包工具是 tcpdump。 1.1、网络基础 参考TCP/IP五层模型,帧结构如下: 帧字段 帧字段含义 Frame 物理层的…

百元蓝牙耳机哪个牌子的比较好?四款百元必入热门机型盘点

一款优秀的蓝牙耳机都能极大提升我们的使用体验&#xff0c;然而&#xff0c;对于大多数消费者而言&#xff0c;高端蓝牙耳机昂贵的价格常常令人望而却步&#xff0c;幸运的是&#xff0c;市场上有很多性价比极高的品牌提供了百元左右的优质选择&#xff0c;那么百元蓝牙耳机哪…

基于STM32开发的智能电能监测系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码控制代码应用场景 家庭电能监测工业用电管理常见问题及解决方案 常见问题解决方案结论 1. 引言 智能电能监测系统通过实时采集电流、电压等电力参数&#xff0c;计算电能消耗&…

FPGA开发——UART串口通信的介绍和回环实验框架构建

一、简介 1、原理 UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff0c;通用异步收发器&#xff09;是一种广泛使用的串行通信协议&#xff0c;特别适用于微控制器、计算机和各种嵌入式设备之间的数据通信。 UART是一种异步串行通信方式&#xff0c;通过…

Prometheus+Grafana-1-基础介绍及安装

一、体系架构(了解) 数据采集流程 说白了就是采集数据->计算是否超过阈值->发起警告 Prometheus查询界面如下 1.报警简介 展现形式&#xff1a;短信&#xff0c;邮件&#xff0c;电话&#xff0c;通讯软件。 阈值(Trigger Value)&#xff0c;如达到阈值可以触发预警。…

巨详细的规则引擎 Drools——小白也可食用

巨详细的规则引擎 Drools——小白也可食用 一、问题1.1、传统做法1.2、存在的问题1.3、引入 二、规则引擎概述2.1、什么是规则引擎2.2、使用规则引擎的优势2.3、规则引擎应用场景2.4、Drools介绍 三、Drools入门案例3.1、创建Springboot项目3.2、引入依赖3.3、添加Drools配置类…

鸿蒙(API 12 Beta3版)【投播组件开发指导】分布式媒体会话

通过本开发指导&#xff0c;完成一次音视频跨设备投播。 约束与限制 需同时满足以下条件&#xff0c;才能使用该功能&#xff1a; 设备限制 本端设备&#xff1a;HarmonyOS NEXT Developer Preview0及以上版本的手机设备 远端设备&#xff1a;HarmonyOS NEXT Developer Previ…