智能捡乒乓球机器人

news2025/1/17 15:47:39

本文素材来源于物理与电子电气工程学院

作者:丁文龙 、王小军、任剑杰、张钊铭

指导老师:康彩

一、项目简介

       随着人们对机器人技术智能化本质认识的加深,机器人技术开始源源不断地向人类活动的各个领域渗透。在这其中,服务机器人作为一个重要分支,在国内外研究领域已经得到普遍重视。服务机器人的应用范围很广,主要从事维护保养、修理、运输、清洗、保安、救援、监护等工作。但至目前为止,乒乓球捡拾器在国内外市场上的发展却较为滞后。文中所述的智能捡乒乓球机器人,正是一种应用于兵乓球体育赛事的自主式移动的服务机器人。智能捡乒乓球机器人可以应用在业余或专业的乒乓球训练基地或训练学校,使用智能捡乒乓球机器人可以减轻训练人员回收乒乓球的负担,能够减少训练时的无效训练时间,提高运动员的训练效率,使运动员可以更好的投入到专业的训练当中,从而取得更好的比赛成绩。

       智能捡乒乓球机器人利用OpenMV对乒乓球进行定位,接着机器人接收到乒乓球的位置前往捡球,到达位置时,升降台降下捡球筐,利用捡球筐底部弹簧,对乒乓球进行拾取,完成捡球。

       本项目涉及机械设计、Solidworks、机械原理等知识以及自动化、传感器、图像处理等先进技术,在实际中应用了Solidworks三维构图,Arduino编程、Python编程和计算机模拟的知识,是多学科综合运用的结果。

       现阶段国内外捡乒乓球机器人的研究有两个方向:一是夹持式,二是吸附式。第一类中机械手的设计过于复杂,且机械手与球之间是硬接触,容易对乒乓球造成机械式的损伤。第二类比第一类在技术上更成熟,但由于在拾取后真空泵要持续工作,耗能比大,不符合当下节能减排的思想。本项目设计的机器人在灵活性与节能减排等方面都有很大的提升,经济与实用效益都非常可观。

二、开发过程

       本设计完全是基于实践考虑,设计之初进行了详细的前期考察和调研;根据考察的结果制定具体的设计方案和要求,初步设计出整体的布局和结构外形; 使用计算机进行虚拟样机的仿真模拟,并优化;根据优化后的数据制作物理样机;进行捡球实验,最终确定样机形式。

(1) 前期考察调研

       各大体育场馆的乒乓球训练、比赛场地进行了实地考察,了解服务人员对捡球车有什么需求和建议,对比目前在用的捡球方法和捡球器械的捡球器械的优缺点。

(2) 捡球车定型

       根据考察的结果,选定本设计的捡球机器人利用升降台升降捡球筐捡球。

(3) 乒乓球捡球车的三维机构设计及优化

       捡乒乓球机器人机构包括底盘的运动机构、捡球结构、储球机构,通过三维建模确定整车设计可行性,并对各零部件做出优化,最终确定整车的数据。

(4) 乒乓球捡球车运动仿真

       利用SolidWorks对所建立的三维模型进行运动仿真,通过软件分析查看整车效果并做优化处理,生成最终的装配图和工程图。

(5) 调试图像识别

       利用OpenMV对乒乓球进行识别,通过一定算法,确定位置。

(6) 调试超声波避障

       利用超声波模块对障碍物进行避障。

(7) 调试捡球装置

       利用升降台升降捡球筐捡球。

 

(8) 调试程序

       对图像识别程序、超声波避障程序、电机驱动程序等一系列程序进行组合,构建OpenMV与Arduino之间的通信。

 

(9) 乒乓球捡球车的制造

       根据零件图和装配图选取探索者套件,完成整机组装,并为捡球车配置整套电控系统,对组装好的捡球车进行调试。

 

三、程序代码

超声波避障部分代码:

const int TrigPin1 = 22;

const int EchoPin1 = 23;

const int TrigPin2 = 24;

const int EchoPin2 = 25;

const int TrigPin3 = 26;

const int EchoPin3 = 27;

const int TrigPin4 = 28;

const int EchoPin4 = 29;

const int TrigPin5 = 30;

const int EchoPin5 = 31;

const int leftMotor1 = 32;

const int leftMotor2 = 34;

const int RightMotor1 =36;

const int RightMotor2 =38;

int distance_cm1 = 0;

int distance_cm2 = 0;

int distance_cm3 = 0;

int distance_cm4 = 0;

int distance_cm5 = 0;

void setup() {

pinMode(TrigPin1,OUTPUT);

pinMode(EchoPin1,INPUT);

pinMode(TrigPin2,OUTPUT);

pinMode(EchoPin2,INPUT);

pinMode(TrigPin3,OUTPUT);

pinMode(EchoPin3,INPUT);

pinMode(TrigPin4,OUTPUT);

pinMode(EchoPin4,INPUT);

pinMode(TrigPin5,OUTPUT);

pinMode(EchoPin5,INPUT);

pinMode(leftMotor1, OUTPUT);

pinMode(leftMotor2, OUTPUT);

pinMode(RightMotor1, OUTPUT);

pinMode(RightMotor2, OUTPUT);

Serial.begin(9600);

}

void loop() {

digitalWrite(TrigPin1,LOW);

delayMicroseconds(2);

digitalWrite(TrigPin1,HIGH);

delayMicroseconds(10);

digitalWrite(TrigPin1,LOW);

distance_cm1 = pulseIn(EchoPin1,HIGH)/58;

digitalWrite(TrigPin2,LOW);

delayMicroseconds(2);

digitalWrite(TrigPin2,HIGH);

delayMicroseconds(10);

digitalWrite(TrigPin2,LOW);

distance_cm2 = pulseIn(EchoPin2,HIGH)/58;

digitalWrite(TrigPin3,LOW);

delayMicroseconds(2);

digitalWrite(TrigPin3,HIGH);

delayMicroseconds(10);

digitalWrite(TrigPin3,LOW);

distance_cm3 = pulseIn(EchoPin3,HIGH)/58;

digitalWrite(TrigPin4,LOW);

delayMicroseconds(2);

digitalWrite(TrigPin4,HIGH);

delayMicroseconds(10);

digitalWrite(TrigPin4,LOW);

distance_cm4 = pulseIn(EchoPin4,HIGH)/58;

digitalWrite(TrigPin5,LOW);

delayMicroseconds(2);

digitalWrite(TrigPin5,HIGH);

delayMicroseconds(10);

digitalWrite(TrigPin5,LOW);

distance_cm5 = pulseIn(EchoPin5,HIGH)/58;

Serial.print(distance_cm1);

Serial.print("cm");

Serial.print("   ");

Serial.print(distance_cm2);

Serial.print("cm");

Serial.print("   ");

Serial.print(distance_cm3);

Serial.print("cm");

Serial.print("   ");

Serial.print(distance_cm4);

Serial.print("cm");

Serial.println("   ");

Serial.print(distance_cm5);

Serial.print("cm\n");

delay(10);

if( distance_cm3>25)

{

if( distance_cm1<25)

{

right();

delay(250);}

if( distance_cm2<20)

{

right();

delay(200);}

if( distance_cm5<25)

{

left();

delay(250);}

if( distance_cm4<20)

{

left();

delay(200);}

}

if( distance_cm3<25)

{

back();

delay(250);

right();

delay(250);

}

else

{

forward();

delay(50);

}

}

void forward()

{

digitalWrite(leftMotor1,HIGH);

digitalWrite(leftMotor2,LOW);

digitalWrite(RightMotor1,HIGH);

digitalWrite(RightMotor2,LOW);

}

void left()

{

digitalWrite(leftMotor1,HIGH);

digitalWrite(leftMotor2,LOW);

digitalWrite(RightMotor1,LOW);

digitalWrite(RightMotor2,HIGH);

}

void right()

{

digitalWrite(leftMotor1,LOW);

digitalWrite(leftMotor2,HIGH);

digitalWrite(RightMotor1,HIGH);

digitalWrite(RightMotor2,LOW);

}

void stop()

{

digitalWrite(leftMotor1,LOW);

digitalWrite(leftMotor2,LOW);

digitalWrite(RightMotor1,LOW);

digitalWrite(RightMotor2,LOW);

}

void back()

{

digitalWrite(leftMotor1,LOW);

digitalWrite(leftMotor2,HIGH);

digitalWrite(RightMotor1,LOW);

digitalWrite(RightMotor2,HIGH);

}

升降台部分代码:

int x;

void setup()

{

pinMode(6,OUTPUT);

pinMode(5,OUTPUT);

pinMode(4,OUTPUT);

digitalWrite(6,LOW);

}

void loop()

{

digitalWrite(4,HIGH);

for(x = 0; x < 800; x++)

{

digitalWrite(5,HIGH);

delayMicroseconds(1000);

digitalWrite(5,LOW);

delayMicroseconds(1000);

}

delay(100);

digitalWrite(4,LOW);

for(x = 0; x < 800; x++)

{

digitalWrite(5,HIGH);

delayMicroseconds(1000);

digitalWrite(5,LOW);

delayMicroseconds(1000);

}

delay(100);

}

图像识别部分代码:

import sensor, image, time

from pyb import UART

yellow_threshold   = (24, 100, 68, -24, 34, 86)

sensor.reset()

sensor.set_pixformat(sensor.RGB565)

sensor.set_framesize(sensor.QQVGA)

sensor.skip_frames(10)

sensor.set_auto_whitebal(False)

clock = time.clock()

uart = UART(3, 115200)

K=1000

while(True):

img = sensor.snapshot()

blobs = img.find_blobs([yellow_threshold])

if len(blobs) == 1:

#if blobs:

b = blobs[0]

img.draw_rectangle(b[0:4])

img.draw_cross(b[5], b[6])

Lm = (b[2]+b[3])/2

length = K/Lm

output_str ="%d" %   (length)

print('you send:',output_str)

uart.write(output_str+'\n')

else:

print('not found!')

智能捡乒乓球机器人的详细资料内容请参考智能捡乒乓球机器人

------------------------------------------------------- 完 ---------------------------------------------------

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

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

相关文章

数字图像处理(十二)最大熵算法

文章目录前言一、熵是什么&#xff1f;1.信息量如何计算&#xff1f;2.熵如何计算&#xff1f;二、最大熵方法1.设计思想2.算法步骤3.C代码4.实验结果参考资料前言 在图像分析中&#xff0c;通常需要将所关心的目标从图像中提取出来&#xff0c;这种从图像中某个特定区域与其他…

JAVA中的集合类型的理解及应用

目录 概述 List和Queue Map和Set HashTable和HashMap的区别 Queue和Deque BlockingQueue 并发集合 概述 写程序免不了处理一些批量数据&#xff0c;不同数据结构和算法&#xff0c;会带来不同的性能效果。大学的计算机课程中就有一门叫《数据结构》的课程&#xff0c;这门…

总结我的 MySQL 学习历程,给有需要的人看

作者| 慕课网精英讲师 马听 你好&#xff0c;我是马听&#xff0c;现在是某零售公司的 MySQL DBA&#xff0c;身处一线的我表示有很多话要讲。 我的MySQL学习历程 在我大三的时候&#xff0c;就开始接触到 MySQL 了&#xff0c;当时我也是从最基础的 MySQL 知识&#xff08;…

6、项目第六阶段——用户名登录显示和注册验证码

第六阶段——用户名登录显示和注册验证码 1、登陆—显示用户名 UserServlet 程序中保存用户登录的信息 UserServlet程序中&#xff1a; //保存用户登录信息到Session域中 req.getSession().setAttribute("user",loginUser);修改 login_succuess_menu.jsp&#xf…

2019 国际大学生程序设计竞赛(ICPC)亚洲区域赛(银川) 7题

文章目录N.Fibonacci SequenceB.So EasyI.Base62G.Pot!!F.Function!K.Largest Common Submatrix补题链接&#xff1a;https://codeforces.com/gym/104021 难得VP打出这么好的成绩&#xff0c;虽然是有争议的西部枢纽银川站&#xff0c;虽然没能早生几年。。。。 N.Fibonacci Se…

【数据结构】基础:堆

【数据结构】基础&#xff1a;堆 摘要&#xff1a;本文主要介绍数据结构堆&#xff0c;分别介绍其概念、实现和应用。 文章目录【数据结构】基础&#xff1a;堆一、概述1.1 概念1.2 性质二、实现2.1 定义2.2 初始化与销毁2.3 入堆2.4 出堆2.5 堆的创建2.6 其他三、应用3.1 堆排…

《前端》css总结(下)

文章目录元素展示格式displaywhite-spacetext-overflowoverflow内边距和外边距marginpadding盒子模型box-sizing位置position&#xff1a;用于指定一个元素在文档中的定位方式浮动flex布局flex-directionflex-wrapflex-flowjustify-contentalign-itemsalign-contentorderflex-g…

你最少用几行代码实现深拷贝?

问题分析 深拷贝 自然是 相对 浅拷贝 而言的。 我们都知道 引用数据类型 变量存储的是数据的引用&#xff0c;就是一个指向内存空间的指针&#xff0c; 所以如果我们像赋值简单数据类型那样的方式赋值的话&#xff0c;其实只能复制一个指针引用&#xff0c;并没有实现真正的数…

计算机组成原理4小时速成:存储器,内存ROM,RAM,Cache,高速缓存cache,外存,缓存命中率,效率

计算机组成原理4小时速成&#xff1a;存储器&#xff0c;内存ROM,RAM,Cache&#xff0c;高速缓存cache&#xff0c;外存&#xff0c;缓存命中率&#xff0c;效率 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法…

MYSQL事务原理分析

目录事务是什么ACID特性原子性&#xff08;A&#xff09;隔离性&#xff08;I&#xff09;持久性&#xff08;D&#xff09;一致性&#xff08;C&#xff09;隔离级别简介有些什么READ UNCOMMITTED&#xff08;读未提交&#xff09;READ COMMITTED&#xff08;读已提交&#xf…

【17】Java常见的面试题汇总(设计模式)

目录 1. 说一下你熟悉的设计模式&#xff1f; 2. 简单工厂和抽象工厂有什么区别&#xff1f; 1. 说一下你熟悉的设计模式&#xff1f; 单例模式&#xff1a;保证被创建一次&#xff0c;节省系统开销。 工厂模式&#xff08;简单工厂、抽象工厂&#xff09;&#xff1a;解耦…

力扣(LeetCode)60. 排列序列(C++)

枚举 枚举每一位可能的数字。 如图。算法流程如上图。 思路分析 : 一个数 nnn &#xff0c;可以组成的排列数量有 n!n!n! 。当首位确定&#xff0c;剩余位能组成的排列数量 (n−1)!(n-1)!(n−1)! &#xff0c;依次类推 (n−2)!/(n−3)!/(n−4)!/…/2!/1!/0!(n-2)!/(n-3)!/(n…

CentOS7安装MYSQL8.X的教程详解

1-首先查看系统是否存在mysql&#xff0c;无则不返回 1 # rpm -qa|grep mysql 2-安装wget 1 # yum -y install wget 3-抓取mariadb并删除包&#xff0c;无则不返回 1 # rpm -qa|grep mariadb 4-删除mariadb-libs-5.5.68-1.el7.x86_64 1 # rpm -e --nodeps mariadb-libs-…

本节作业之数组求和及其平均值、求数组最大值、最小值、数组转换为分割字符串、新增数组案例、筛选数组案例、删除指定数组元素、翻转数组、数组排序(冒泡排序)

本节作业之数组求和及其平均值、求数组最大值、最小值、数组转换为分割字符串、新增数组案例、筛选数组案例、删除指定数组元素、翻转数组、数组排序<冒泡排序>求数组[2,6,1,7,4]里面所有的元素的和以及平均值求数组[2,6,1,77,52,25,7]中的最大值求数组[2,6,1,77,52,25,7…

Linux - netstat 查看系统端口占用和监听情况

文章目录功能语法示例显示 tcp&#xff0c;udp 的端口和进程Show both listening and non-listening socketsList all tcp ports.List all udp portsList only listening portsList only listening TCP ports.List only listening UDP ports.List only the listening UNIX port…

Android 性能优化方法论【总结篇】

作为一位多年长期做性能优化的开发者&#xff0c;在这篇文章中对性能优化的方法论做一些总结&#xff0c;以供大家借鉴。 性能优化的本质 首先&#xff0c;我先介绍一下性能优化的本质。我对其本质的认知是这样的&#xff1a;性能优化的本质是合理且充分的使用硬件资源&#x…

分享感恩节联系客户话术

看了一眼在手边的日历&#xff0c;发现今天是11月24日&#xff0c;一年一度的感恩节又到了&#xff0c;不得不感叹时间过得真快&#xff0c;每年十一月的第四个星期四是感恩节。 随着各国多元文化的发展&#xff0c;感恩节也越来越被世界各地传颂&#xff0c;多少都会有一些影…

WANLSHOP 直播短视频种草多用户电商系统源码自营+多商户+多终端(H5+小程序+APP)

WANLSHOP高级版 可用于自营外包项目(多主体)、 可用于外包定制开发项目、 提供开源源码&#xff0c;私有化部署、一款基于 FastAdmin Uni-APP 开发的 多终端&#xff08;H5移动端、APP、微信小程序、微信公众号&#xff09;、多用户商城系统拥有多种运营模式B2B2C/B2C&#xf…

python安装依赖库

一、安装pip 1、打开终端&#xff0c;输入&#xff1a; pip3 install tushare -i https://pypi.douban.com/simple 2、验证是否安装成功 打开终端&#xff0c;输入&#xff1a;pip3 出现以上页面&#xff0c;则安装成功 二、安装flask 1、打开终端&#xff0c;输入&…

mybatis-plus学习笔记

文章目录1 简介2 初始化项目2.1引入pom2.2 引入lombok插件2.3 配置信息2.4 创建实体类2.5 创建mapper2.6 配置注解MapperScan2.7 编写测试类2.8 配置MyBatis日志3 测试基本的CRUD3.1 新增3.2 查询3.3 修改3.4 删除4 自定义动态sql5 Service 层使用mybatis-plus方法5.1 service层…