机器人制作开源方案 | 网球自动拾取机

作者:柳文浩、李浩杰、苏伟男、贾思萌、张天芸

单位:西安外事学院

指导老师:胡宝权、陈小虎

1. 产品说明

1.1 设计目的

      近年来,网球运动越来越受到老百姓的欢迎,各种规模的比赛层出不穷。然而由于网球运动极为激烈,运动过程中需要大量的跑动,运动员的体力消耗较大,因此人们在运动时,往往会多带一些网球以节省体力,然而这会导致球场散落大量的网球需要拾取。传统的方式往往是通过球童来拾取网球,然而这种方式劳动强度大、工作效率低,尤其是在正式比赛场合,无法满足竞赛需求。为了解决这一问题,目前市场上出现了一种新的网球拾取器,然而这种拾取器仍然是靠人力来进行驱动,需要依靠人的手臂向下压的动作来完成网球拾取任务。由于这种方式需要多次重复手臂的提拉操作,因此依然存在拾取效率低、工作强度大等问题。基于此,本项目拟开发一款室内网球多功能自动拾取机器人,该机器人具有避障、自动识别、检测、对网球进行抓取、运输和存储等功能,可广泛应用于家庭、体育场、网球训练室和网球游戏场地等环境,可以满足让人们的网球运动日常需求,具有一定的经济效益和社会价值。

1.2 设计背景

      随着现代科学技术的发展,服务类机器人在市场越来越受欢迎,它不仅给人们的生活提供了便利,还优化了人们的生活方式。网球机器人作为一款智能的家庭,体育等众多领域,具备一定的人工智能化,能够自主的进行拾取网球,为此人们解放了双手,提高了工作效率。同时网球机器人作为一项重要智能化技术正在迅速变革,从简单的抓取、搬运和存储等功能正在逐步扩展,增加识别分拣,因此设计一种合理的网球机器人具有重大的研究意义。本产品以网球机器人为研究对象,充分调研了目前网球机器人的研究现状,了解了目前网球机器人的发展趋势以及当前存在的不足,整个项目的最终目标是针对目前网球机器人功能单一、结构复杂等缺点进行改造,设计一种能够自主循迹并且准确收取的多功能智能网球机器人。该机器人可按照特定设计的路线并且绕开障碍物,完成规定的拾取任务。机器人精巧灵活,可以用转盘收集、储存、传输网球。

1.3 设计思路

      根据网球搬运机器人研究现状和需求分析,本设计采用“需求分析-关键技术-设计功能”的总体思路,如下图所示:

功能框图

需求分析

      因为在网球训练场地,网球覆盖了整个区域,为此拾取网球是一个费时费力的过程,在这种情况下我们设计了一款可以有效拾取网球的机器人,解放人们的双手,减少了劳动力,提高了经济效益。本产品主要使用了超声波,超声波在一定的距离感受到障碍物后会向后退,再向左转继续行驶,本项目设计的网球搬运机器人包括电机驱动模块、避障模块。

      ① 电机驱动模块:该产品使用了3个电机,用PWM调速,其中一个电机驱动风叶来拾取网球,另外两个电机驱动小车运动。

      ② 避障模块:机器人使用一个超声波,该超声波装在机器人的前方,用来检测前方是否有障碍物,检测出有障碍物时,小车会向后退,再向左转以避开障碍物继续行驶。

1.4 物理原理

      在小车向前走时,会碰到网球,由于惯性网球会通过引导板到达转轮处,旋转杆会带动网球向后滚去,最终到达车后里。小车是由铝合金制成,铝合金摩擦因数为0.3,网球直径为67mm,底板离底面高度为35mm,旋转杆长度为95mm,宽度为10mm,足以将网球带进去,经过测量得当小球离开叶片时离斜坡高为11mm,斜坡长度还有18mm,斜坡倾斜角度为38°。

由能量守恒:

将已知物理量代入得出当小球离开叶片时获得的初速度为 0.55。已知初速度,由

可得角速度为1.1rad/s,所以螺旋片的最小转速要大于1.1rad/s才可以达到转动小球,小球可以达到最高高度为35mm,假设与旋转杆发生弹性碰撞没有能量损失。由平抛公式,水平x=vt,竖直s=1/2(g*t^2) 经计算最大速度不大于0.54m/s才不会被反弹出去。

1.5 难题和解决方法

      轮盘如何准确抓取到物体是一个难点,我们通过不断的实验、测量、计算来最终解决这个准确抓取物体的问题。拾球效果差、拾球不彻底的问题也是一个难点,我们通过旋杆不停地转动来获取网球,用什么设备来进行循迹也是一个难点,通过上网搜索和查阅资料以及不断的试验和测量,决定最后用一个超声波来检测障碍物进行避障。如何按照规划的路线并且准确的完成循迹需要我们查阅资料以及不断的进行试验、调整,完成循迹任务。

1.6 创新点

      在本项目中,自动网球拾取机器人的工作原理参考了直升机螺旋桨的工作原理,即

其中网球质量为57g,直径为67mm,到达的高度为35mm,

      网球利用动能,然后克服自身的重力势能和摩擦力做功,最后就顺势进入机器人后部盛放网球的地方。而其它的机器人利用吸附类的容易卡住,夹取类的容易夹取不住或滑掉,铲子类的容易滑跑,而我们的则比它们更简单,更容易安装,即使坏了部分结构,只要更换就可以继续使用。本项目机器人采用1个超声波来避障,相比较其它机器人结构简单、取材少、经济性高。

2. 硬件介绍

2.1 主控板设计

      如下图所示为本系统的总体设计框图。本项目采用了一个BASRA主控板,采用的主控板为基于Arduino开源方案设计的Basra开发板,处理器核心是ATmega328, 具有 14 路数字输入/输出口(其中6路可作为 PWM 输出),6路模拟输入,一个16MHz晶体振荡器,一个USB口,一个电源插座,一个ICSP header 和一个复位按钮.如图3所示,控制板尺寸为55*55mm,便于安装。

系统设计总体框架

主控板接口图

2.2 Arduino控制板

      在Arduino控制板上添加电路是一个比较麻烦的事,所以采用了一个专用于机器人的简单扩展板,能将大部分传感器轻松地和arduino控制板连接,即Arduino 2560。它内置了16个模拟传感器和54个数字传感器接口,支持USART和其他通信模式。内置了RTC等功能,如模拟比较器、高级定时器、控制器唤醒机制中断等,16MHz晶钟可获得16 MIBS,同时它省电、快速度。除此之外,还具有5v、3.3v及vin3种电源接口,便于为各类扩展模块供电。如下图所示为Arduino 2560实物图:

Arduino 2560实物图

2.3 超声波传感器

      超声波传感器是将超声波信号转换成其它能量信号(通常是电信号)的传感器。超声波是振动频率高于20kHz的机械波。它具有频率高、波长短、绕射现象小,特别是方向性好、能够成为射线而定向传播等特点。超声波对液体、固体的穿透本领很大,尤其是在阳光不透明的固体中。超声波碰到杂质或分界面会产生显著反射形成反射回波,碰到活动物体能产生多普勒效应。如下图所示为超声波传感器:

超声波传感器正面

超声波传感器背面

2.4 旋转杆

      转盘由三个杆组成,通过驱动模块来驱动伺服电机带动三个齿轮来带动扫把进行连轴转动来收取网球,风叶长95mm宽10mm,能够转动300g网球。

3. 软件设计

      本次设计的自动水车型乒乓球机器人,代码运行环境是基于win10 Arduino1.5.2,直流电机直连5V电源,舵机步进电机接口采用的是A4988。下图为本次作品的系统软件设计总体流程:

系统软件流程图

4. 调试过程

      ① 整体方案确定好以后,项目组成员开始组装基础的零部件。

② 将组装好的零部件拼接,以形成各部分的主体结构,然后进行整体拼装。

③ 组装好的网球拾取旋转头。

④ 指导老师在帮忙解决组装和调试过程中遇到的问题。

⑤ 项目组成员在进行紧张的编程调试工作。

⑥ 初步组装完成的系统在桌面进行调试。

⑦ 调试完成的系统在地面进行试验,达到了预期的效果。在后期设计过程中,本项目将在既有水平的基础上根据项目设计方案进行进一步的优化和调整,以使得我们的产品功能更为完善,性能更为优越。

5. 示例程序

#define V_MAX 9600 //步进电机速度#define ECHOPIN 14#define TRIGPIN 15void setup() {Serial.begin(9600);initMotor();pinMode(ECHOPIN, INPUT);pinMode(TRIGPIN, OUTPUT);//test// moveTest();}void loop() {//     moveTest();digitalWrite(TRIGPIN, LOW);delayMicroseconds(2);digitalWrite(TRIGPIN, HIGH);delayMicroseconds(10);digitalWrite(TRIGPIN, LOW);float distance = pulseIn(ECHOPIN, HIGH);distance= distance/58;if (distance >= 20){forward();}if(distance < 20){gostop();goback();goback();goback();goback();turn_left();turn_left();turn_left();}delay(50);}//============================================================void moveTest(){move( 80, 80, 80, 80); //前进move(-80, -80, -80, -80); //后退move(-80, 80, 80, -80); //左平移move( 80, -80, -80, 80); //右平移move(-80, 80, -80, 80); //左转move( 80, 80, -80, -80); //右转}void forward(){move(80,80,80,0);move(80,80,80,0);delayMicroseconds(2);}void turn_left(){move(80,80,-80,0);}void turn_right(){move(80,-80,80,0);}void gostop(){move(80,0,0,0);}void goback(){move(80,-80,-80,0);}#include "Arduino.h"#include <AccelStepper.h>#include <MultiStepper.h>#define EN 8#define MAIN_STEP 200 //步进电机每圈步数#define MICRO_STEP 16 //驱动细分数 (gaile 16->2)#define TOTAL_STEP (MAIN_STEP * MICRO_STEP) //16 细分下每圈步数#define D_WHEEL 56.5 //车轮直径/mmconst double CWheel = M_PI * D_WHEEL; //车轮周长/mmconst double Ratio = TOTAL_STEP / CWheel; //step/mmAccelStepper stepper_x(1, 2, 5);      //xAccelStepper stepper_y(1, 3, 6);      //yAccelStepper stepper_z(1, 4, 7);      //zAccelStepper stepper_a(1, 12, 13);    //aMultiStepper steppers;void initMotor(){pinMode(EN, OUTPUT);digitalWrite(EN, LOW);steppers.addStepper(stepper_x);steppers.addStepper(stepper_y);steppers.addStepper(stepper_z);steppers.addStepper(stepper_a);stepperSet(V_MAX);}//x ; y ; w / mmvoid move(double x, double y, double z, double a){double step_x, step_y, step_z, step_a;x *= Ratio;y *= Ratio;z *= Ratio;a *= Ratio;step_x = x;step_y = -y;step_z = z;step_a = -a;stepperMove(step_x, step_y,step_z,step_a);}void stepperSet(double _v){stepper_x.setMaxSpeed(_v);stepper_y.setMaxSpeed(_v);stepper_z.setMaxSpeed(_v);stepper_a.setMaxSpeed(_v);}void stepperMove(long _x, long _y, long _z, long _a){long positions[4];positions[0] = _x;positions[1] = _y;positions[2] = _z;positions[3] = _a;steppers.moveTo(positions);steppers.runSpeedToPosition();stepper_x.setCurrentPosition(0);stepper_y.setCurrentPosition(0);stepper_z.setCurrentPosition(0);stepper_a.setCurrentPosition(0);}

* 更多详情请参考 【S029】网球自动拾取机

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

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

相关文章

Python3基础

导包 在 python 用 import 或者 from...import 来导入相应的模块。 将整个模块(somemodule)导入&#xff0c;格式为&#xff1a; import somemodule 从某个模块中导入某个函数,格式为&#xff1a; from somemodule import somefunction 从某个模块中导入多个函数,格式为&#…

C++基础 -4- C/C++混合编程

引用格式(图片代码段呈现) extern "C" {#include "string.h" }代码验证 &#xff08;分别使用了C/C 的标准输出&#xff09; #include "iostream"using namespace std;extern "C" { #include "stdio.h" #include "…

Win11修改用户名(超详细图文)

新买的电脑一般预装Windows11系统&#xff08;家庭与学生版&#xff09;&#xff0c;新电脑初次开机使用微软邮箱账号登录&#xff0c;则系统将用户名自动设置成邮箱前5位字符。我的用户名便是一串数字【231xx】&#xff08;qq邮箱前5位&#xff09;&#xff0c;看着很不舒服&a…

属性级情感分析

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 属性级情感分析 简介数据集介绍数据加载和预处理&#xff08;data_utils.py&#xff09;预训练模型&#xff08;skep&#xff09;模型定义模块&#xff08;model.py&#xff09;训练配置&#xff08;config.py&am…

element 的 Notification 通知,自定义内容

通知事件&#xff1a; // 商户后台通知 MerchantBackgroundNotice() {// 禁止消息通知弹出多条if(this.notifyInstance) {this.notifyInstance.close();}const h this.$createElement; // 创建文本节点this.notifyInstance this.$notify({showClose: false, // 禁止关闭按钮…

vue随意置换页面元素位置

写在前面&#xff0c;博主是个在北京打拼的码农&#xff0c;从事前端工作5年了&#xff0c;做过十多个大大小小不同类型的项目&#xff0c;最近心血来潮在这儿写点东西&#xff0c;欢迎大家多多指教。 对于文章中出现的任何错误请大家批评指出&#xff0c;一定及时修改。有任何…

Redis Cluster主从模式详解

在软件的架构中&#xff0c;主从模式&#xff08;Master-Slave&#xff09;是使用较多的一种架构。主&#xff08;Master&#xff09;和从&#xff08;Slave&#xff09;分别部署在不同的服务器上&#xff0c;当主节点服务器写入数据时&#xff0c;同时也会将数据同步至从节点服…

图解算法数据结构-LeetBook-树03_层序遍历奇数偶数行方向不同

一棵圣诞树记作根节点为 root 的二叉树&#xff0c;节点值为该位置装饰彩灯的颜色编号。请按照如下规则记录彩灯装饰结果&#xff1a; 第一层按照从左到右的顺序记录 除第一层外每一层的记录顺序均与上一层相反。即第一层为从左到右&#xff0c;第二层为从右到左。 示例 1&…

自动化测试-Selenium

一. Selenium介绍 selenium 是用来做web自动化测试的框架,支持各种浏览器,各种,支持各种语言 原理: 二. 元素定位 2.1 XPath 定位 绝对路径: /html/head/title 相对路径以双斜杠开头,常见的相对路径定位有以下几种: <1>相对路径索引: 索引是从1开始的 <2>相…

探索深度学习:从理论到实践的全面指南

探索深度学习&#xff1a;从理论到实践的全面指南 摘要&#xff1a; 本文旨在提供一个关于深度学习的全面指南&#xff0c;带领读者从理论基础到实践应用全方位了解这一技术。我们将介绍深度学习的历史、基本原理、常用算法和应用场景&#xff0c;并通过Python代码示例和Tens…

讯飞星火知识库文档问答Web API的使用(二)

上一篇提到过星火spark大模型&#xff0c;现在有更新到3.0&#xff1a; 给ChuanhuChatGPT 配上讯飞星火spark大模型V2.0&#xff08;一&#xff09; 同时又看到有知识库问答的web api&#xff0c;于是就测试了一下。 下一篇是在ChuanhuChatGPT 中单独写一个基于星火知识库的内容…

【Android Jetpack】Navigation的使用

引入 单个Activity嵌套多个Fragment的UI架构模式&#xff0c;非常非常普遍。但是&#xff0c;对Fragment的管理一直是一件比较麻烦的事情。工程师需要通过FragmentManager和FragmentTransaction来管理Fragment之间的切换。页面的切换通常还包括对应用程序App bar的管理、Fragme…

[个人笔记] Zabbix实现Webhook推送markdown文本

系统工程 - 运维篇 第四章 Zabbix实现Webhook推送markdown文本 系统工程 - 运维篇系列文章回顾Zabbix实现Webhook推送markdown文本前言实施步骤 Zabbix新增报警媒介类型Zabbix给用户新增报警媒介Zabbix修改动作的执行操作和恢复操作验证&测试 参考来源 系列文章回顾 第一章…

探索RockPlus SECS/GEM平台 - 赋能半导体行业设备互联

SECS/GEM协议&#xff0c;全称为半导体设备通讯标准/通用设备模型&#xff08;SECS/Generic Equipment Model&#xff09;&#xff0c;是一种广泛应用于半导体制造行业的通信协议。它定义了半导体设备与工厂主控系统&#xff08;如MES&#xff09;之间的通信方式&#xff0c;使…

PGP 遇上比特币

重复使用 PGP 密钥作为比特币密钥 介绍 在数字安全领域&#xff0c;密码学在确保数据的完整性和真实性方面发挥着至关重要的作用。 一种广泛使用的加密技术是使用 Pretty Good Privacy (PGP1)。 PGP 为安全通信&#xff08;例如电子邮件、文件传输和数据存储&#xff09;提供加…

解密Spring Cloud微服务调用:如何轻松获取请求目标方的IP和端口

公众号「架构成长指南」&#xff0c;专注于生产实践、云原生、分布式系统、大数据技术分享。 目的 Spring Cloud 线上微服务实例都是2个起步&#xff0c;如果出问题后&#xff0c;在没有ELK等日志分析平台&#xff0c;如何确定调用到了目标服务的那个实例&#xff0c;以此来排…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑氢储一体化协同的综合能源系统低碳优化》

这个标题涉及到考虑了多个方面的能源系统优化&#xff0c;其中关键的关键词包括"氢储一体化"、"协同"、"综合能源系统"和"低碳优化"。以下是对这些关键词的解读&#xff1a; 氢储一体化&#xff1a; 氢储存&#xff1a; 指的是氢气的存…

计算机组成原理-Cache替换算法

文章目录 总览随机算法&#xff08;RAND&#xff09;先进先出算法&#xff08;FIFO&#xff09;近期最少使用算法&#xff08;LRU&#xff09;最不经常使用算法&#xff08;LFU&#xff09;总结 总览 随机算法&#xff08;RAND&#xff09; 没有选择性地考虑替换哪一块Cache&a…

功率整流器的作用是什么?SURS8340T3G车规级功率整流器的介绍

汽车级功率整流器是一种用于汽车电子系统的功率电子器件&#xff0c;用于将交流电转换为直流电以供电子设备使用。汽车级功率整流器需要具有高效率、高可靠性、高稳定性和高温度工作能力等特点。其中&#xff0c;SURS8340T3G 是一种常见的汽车级功率整流器。 SURS8340T3G 是一…

基于单片机寻迹巡线避障智能小车系统设计

**单片机设计介绍&#xff0c; 基于单片机寻迹巡线避障智能小车系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的寻迹巡线避障智能小车系统是一种能够自动跟随线路并避开障碍物的智能小车。下面是一个简要的系…