当前位置: 首页 > news >正文

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

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

opencv调用摄像头bug的解决

机械臂的组装

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

机械臂的调试代码

import time
import RPi.GPIO as GPIOclass 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 18: (89, 67, 48),  # 位置2: 基座90°,肩部14°,肘部0° true1 8 17: (83, 63, 51),  # 位置3: 基座82°,肩部14°,肘部0° true1 7 16: (96,61, 67),   # 位置4: 基座97°,肩部5°,肘部3°  true1 6 15: (89, 61, 73),   # 位置5: 基座90°,肩部0°,肘部0° true1 5 14: (82, 61, 74),   # 位置6: 基座82°,肩部5°,肘部3° true1 4 13: (98, 60, 89),  # 位置7: 基座99°,肩部0°,肘部45° true1 3 12: (89, 60, 93),  # 位置8: 基座90°,肩部0°,肘部45°  true1 2 11: (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)  # 50Hzself.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 = 0elif duty > 12:  # 假设最大是180度duty = 12pwm.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:# 将舵机初始化到位置 0print("Moving to position 0...")arm.remove_to_position(0)time.sleep(2)  # 等待,确保舵机到达位置# 返回到位置 0print("Returning to position 0...")arm.move_to_position('B1')time.sleep(2)  # 等待,确保舵机到达位置# 然后移动到位置 1print("Moving to position 1...")#arm.remove_to_position(0)time.sleep(2)  # 等待,确保舵机到达位置except KeyboardInterrupt:print("Process interrupted!")finally:arm.cleanup()  # 清理GPIO设置

机械臂的问题

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

相关文章:

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

第一弹赛题的选择与前期方案的准备 opencv调用摄像头bug的解决 机械臂的组装 采用三个舵机&#xff0c;组成一个三自由度的机械臂。 并且利用电磁吸盘的方式&#xff0c;完成对棋子的抓取工作&#xff0c;后面的事实证明&#xff0c;在预算不足的情况下&#xff0c;队友手搓…...

如何在Java、C、Ruby语言中使用Newscatcher API

Newscatcher 世界实时新闻聚合API 一款强大的数据服务工具&#xff0c;它通过先进的网络爬虫技术&#xff0c;实时从全球超过70,000个新闻源聚合新闻内容。这个API能够提供全面、多角度的新闻报道&#xff0c;包括但不限于标题、作者、发布日期、全文内容以及媒体资源链接。它使…...

集合: Collection的成员方法和相关实现类

Collection: - List(有序【指的是存储和取出的顺序是一致的】且可以发生重复&#xff0c;且有索引的概念) - ArrayList&#xff1a; 底层数据结构是数组&#xff0c;查询快&#xff0c;增删慢&#xff0c;线程不安全的&#xff0c;效率高。 - …...

过滤器与监听器:深入了解 Java Web 开发中的核心概念

在 Java Web 开发中&#xff0c;过滤器&#xff08;Filter&#xff09;和监听器&#xff08;Listener&#xff09;是两个重要的组件&#xff0c;它们帮助开发者在请求处理的各个阶段进行预处理和后处理。这篇博客将深入探讨这两个概念&#xff0c;并展示它们如何在实际应用中发…...

【Linux学习】动静态库从原理到制作

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f351;动静态库&#x1f41f;动静态库的制作与使用&#x1f680;生成静态库&#x1f512;生成动态库 &#x1f98c;动态库的查…...

WPF篇(10)-Label标签+TextBlock文字块+TextBox文本框+RichTextBox富文本框

Label标签 Label控件继承于ContentControl控件&#xff0c;它是一个文本标签&#xff0c;如果您想修改它的标签内容&#xff0c;请设置Content属性。我们曾提过ContentControl的Content属性是object类型&#xff0c;意味着Label的Content也是可以设置为任意的引用类型的。 案…...

JavaFX对话框控件-ChoiceDialog

JavaFX对话框控件-ChoiceDialog 常用属性titlecontentTextinitOwnergraphicheaderTextdefaultValuechoicesdialogPane 常用事件显示事件setOnShowing显示事件setOnShown弹框按钮点击 综合案例自定义下拉框内容 与Alert大部分功能类似按钮不可以自定义多一个下拉框 常用属性 …...

一文了解BTC中的二层协议中Nervos network,CKB,RGB++,UTXO stack 之间的关系

注&#xff1a;该内容不构成投资建议&#xff0c;有些内容摘抄其他地方&#xff0c;如侵权&#xff0c;请联系删除。 Nervos network Nervos Network 是一个开源的区块链生态项目&#xff0c;该项目提供一套解决方案来应对区块链扩展性和互操作性的问题。 Nervos Network 成立…...

Oracle(47)如何创建和使用集合?

在PL/SQL中&#xff0c;集合&#xff08;Collection&#xff09;是一种复合数据类型&#xff0c;用于存储一组相关的数据项。集合主要有三种类型&#xff1a;关联数组&#xff08;Associative Arrays&#xff09;、嵌套表&#xff08;Nested Tables&#xff09;和可变数组&…...

SpringIOC和SpringAOC

lombok插件 XML<!-- 加载资源文件 --><context:property-placeholder location"classpath:jdbc.properties"></context:property-placeholder><!-- 注入数据源 --><bean id"dataSource" class"com.mchange.v2.c3p0.ComboP…...

static关键字详解

文章目录 static使用示例static底层原理静态初始化顺序静态与线程安全 static static是Java中的一个关键字&#xff0c;用于定义类级别的成员&#xff0c;类级别的成员是指那些属于整个类&#xff0c;而不是特定对象实例的成员。在Java中&#xff0c;类级别的成员包括静态变量…...

使用 Java RestClient 与 Elasticsearch 进行索引管理的示例

文章目录 准备工作测试连接创建索引查询索引是否存在删除索引总结 在这篇博客中&#xff0c;我将和大家分享如何使用 Java RestClient 与 Elasticsearch 进行简单的索引管理操作。如果你在开发过程中需要对海量数据进行高效搜索和分析&#xff0c;Elasticsearch 可能是个不错的…...

编程-设计模式 10:外观模式

设计模式 10&#xff1a;外观模式 定义与目的 定义&#xff1a;外观模式&#xff08;Facade Pattern&#xff09;提供了一个统一的接口&#xff0c;用来访问子系统中的一群接口。它定义了一个高层接口&#xff0c;让子系统更容易使用。目的&#xff1a;简化复杂的子系统的使用…...

非范型ArrayList和泛型List<T>

ArrayList 是 C# 中的一个非泛型集合类&#xff0c;它属于 System.Collections 命名空间。它提供了动态数组的功能&#xff0c;允许你在运行时添加、删除和访问元素。然而&#xff0c;需要注意的是&#xff0c;ArrayList 并不是类型安全的&#xff0c;因为你可以向其中添加任何…...

魔众文库系统v7.0.0版本推荐店铺功能,管理菜单逻辑优化

推荐店铺功能&#xff0c;管理菜单逻辑优化 [新功能] RandomImageProvider 逻辑升级重构&#xff0c;支持更丰富的随机图片生成 [新功能] 资源篮订单参数字段 [新功能] 首页推荐店铺功能&#xff0c;需要在后台 文库系统 → 文库店铺 开启推荐 [系统优化] Grid 快捷编辑请求…...

03、流程控制语句

01、位运算符 一、位运算符:是针对二进制数据(补码)的运算。(0看成false&#xff0c;1看成true) &:按位与——求出两个数字对应的二进制&#xff0c;有0则0 | :按位或——求出两个数字对应的二进制&#xff0c;有1则1 ^ :按位异或 ——求出两个数字对应的二进制&#xff0c…...

[Android] [解决]Bottom Navigation Views Activity工程带来的fragment底部遮盖的问题

创建了Bottom Navigation Views Activity之后&#xff0c;在fragment_home.xml&#xff0c;加了一个RecyclerView&#xff0c; 后来添加了item之后发现底部会被盖住一部分。 解决&#xff1a;在layout里面加两句&#xff1a; android:paddingBottom"?attr/actionBarSize&…...

Armv8/Armv9架构中的原子性

B2.2 Arm 架构中的原子性 原子性是内存访问的一个特性,描述为原子访问。Arm 架构描述涉及两种类型的原子性:单次复制原子性和多次复制原子性。在 Arm 架构中,内存访问的原子性要求取决于内存类型,以及访问是显式的还是隐式的。有关更多信息,请参见: 单次复制原子性的要求…...

读零信任网络:在不可信网络中构建安全系统15协议和过滤

1. 协议 1.1. IKE/IPSec 1.1.1. 因特网密钥交换协议&#xff08;Internet Key Exchange,IKE&#xff09;用于执行IPSec认证和密钥交换 1.1.1.1. 通常以后台守护进程的方式实现&#xff0c;使用预共享密钥或X.509证书来认证对端并创建一个安全会话 1.1.2. IKEv1与IKEv2 1.1.2.1…...

C语言学习笔记 Day11(指针--中2)

Day11 内容梳理&#xff1a; 目录 Chapter 7 指针 7.6 指针 & 函数 &#xff08;1&#xff09;形参改变实参的值 &#xff08;2&#xff09;字符数组作为函数参数 1&#xff09;合并字符串 2&#xff09;删掉字符串中空格 &#xff08;3&#xff09;指针作为函数返…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...