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

news2024/12/26 20:55:59

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

单位:西安外事学院

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

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 15

void 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 //车轮直径/mm

              const double CWheel = M_PI * D_WHEEL; //车轮周长/mm

              const double Ratio = TOTAL_STEP / CWheel; //step/mm

              AccelStepper stepper_x(1, 2, 5);      //x

              AccelStepper stepper_y(1, 3, 6);      //y

              AccelStepper stepper_z(1, 4, 7);      //z

              AccelStepper stepper_a(1, 12, 13);    //a

             

              MultiStepper 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 / mm

                void 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.coloradmin.cn/o/1260870.html

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

相关文章

滴滴昨晚崩了,看这波还敢不敢降本增效?

起因 截至 2023 年 11 月 27 日晚&#xff0c;中国最大的网约车服务平台滴滴打车遭遇系统崩溃&#xff0c;继阿里云控制台故障之后&#xff0c;再次引发热议。这一事件迅速攀升至热搜榜首&#xff0c;引起广泛关注。 今晚约 10 点&#xff0c;滴滴打车遭遇大范围技术故障。用户…

Spring的三种常见Bean的初始化参数机制,你都用对了吗?

大家好&#xff0c;我是G探险者。 spring这本九阳神功秘籍&#xff0c;我们一点一滴去研读。 在Spring框架中&#xff0c;Bean的实例化与初始化是一个复杂的过程&#xff0c;一个Bean的实例化过程往往伴随着一些属性的初始化动作&#xff0c;有的是在Bean实例化之后才进行的属…

解决VMware VCenter存储上传镜像文件失败

VMware VCSA6.7上传共享文件时提示操作失败&#xff0c;由于不确定的原因&#xff0c;操作失败。通常&#xff0c;当浏览器不信任证书时会发生此问题。如果您使用的是自签名证书或自定义证书&#xff0c;请在新的浏览器选项卡中打开下面的 URL并接受证书&#xff0c;然后重试操…

五、Lua流程控制与函数

一、流程控制 &#xff08;一&#xff09;含义 Lua 编程语言流程控制语句通过程序设定一个或多个条件语句来设定。在条件为 true 时执行指定程序代码&#xff0c;在条件为 false 时执行其他指定代码。 &#xff08;二&#xff09;原型 if (成立) then执行体1else执行体2 end…

蓝桥杯每日一题2023.11.27

题目描述 星系炸弹 - 蓝桥云课 (lanqiao.cn) 题目分析 对于此题目一一枚举即可 #include<bits/stdc.h> using namespace std; bool is_r(int n) {if((n % 4 0 && n % 100 ! 0)|| n % 400 0)return true;return false; } int mm[13] {0, 31, 28, 31, 30, 3…

智能优化算法应用:基于樽海鞘群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于樽海鞘群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于樽海鞘群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.樽海鞘群算法4.实验参数设定5.算法结果6.参考…

图像分类任务

本文记录 北京邮电大学 计算机学院的学习记录 什么是图像分类任务&#xff1f; 图像分类任务是计算机视觉中的核心任务&#xff0c;其目 标是根据图像信息中所反映的不同特征&#xff0c;把不同类别 的图像区分开来 图像分类任务有哪些难点呢&#xff1f; 语义鸿沟视角变化…

【springboot】宝塔简单部署springboot 配置https

宝塔简单部署springboot配置https 需求步骤1. springboot通过maven组件打成jar包2. 将jar包部署到宝塔上3. 下载安装nginx并创建网站节点4. 设置域名或者IP5. 设置反向代理:代理后端服务的ip和端口7. 配置SSL/TLS 需求 宝塔部署springboot项目,用nginx反向代理后端IP端口&…

用Elasticsearch搜索匹配功能实现基于地理位置的查询

1.Redis,MongoDB,Elasticsearch实现地理位置查询比较 1.1 Redis: 优点&#xff1a;Redis提供了地理空间索引功能&#xff0c;可以通过Geo数据类型进行地理位置查询。这使得Redis在处理地理位置查询时非常高效。 缺点&#xff1a; Redis的地理空间索引功能相对简单&#xff0…

【单调栈】最大宽度坡

public int maxWidthRamp(int[] nums) {/* 此方法思路正确&#xff0c;但超时int n nums.length;Deque<Integer> stack;int max 0;for (int i 0; i < n; i) {stack new LinkedList<>();stack.push(nums[i]);int j i 1;while (j < n) {stack.push(nums…

华为拆分零部件业务,长安入股,赛力斯接洽中

作者 |德新 编辑 |王博 11月26日&#xff0c;长安汽车官宣与华为在智能汽车零部件业务上的投资与合作&#xff1a; 华为拟成立一家新的公司&#xff0c;并将其在智能汽车解决方案业务上的核心技术和资源注入新公司&#xff0c;长安汽车及关联方有意投资该新公司。 参照目前长…

如何保护PPT文件禁止修改?

PPT文件会应用在会议、演讲、课件等工作生活中&#xff0c;当我们制作好了PPT之后&#xff0c;保护内容防止在演示时出错是很重要的&#xff0c;那么如何将PPT文件设置成禁止修改模式呢&#xff1f;今天分享几个方法给大家。 方法一 将PPT文件直接保存或者另存为一份文件&…

Gitea和Jenkins安装

Gitea Gitea&#xff1a;https://dl.gitea.com/gitea/1.21.0/ Jenkins&#xff1a;https://www.jenkins.io/download/ 数据库配置 可以参考官方文档-https://docs.gitea.cn/1.20/installation/database-prep&#xff0c;这里以MySQL作为讲解 MySQL 在数据库实例上&#xf…

小航助学题库蓝桥杯题库stem选拔赛(21年1月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSD…

电子学会C/C++编程等级考试2022年03月(三级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:和数 给定一个正整数序列,判断其中有多少个数,等于数列中其他两个数的和。 比如,对于数列1 2 3 4, 这个问题的答案就是2, 因为3 = 2 + 1, 4 = 1 + 3。 时间限制:10000 内存限制:65536输入 共两行,第一行是数列中数的个数…

使用vscode中编写c语言——无法打开 源 文件 “stdlib.h“C/C++(1696)问题

出现这个问题原因如下&#xff1a; 1、没有下载编辑器或者是没有配置好该编辑器的环境变量。 可以通过如下方法检查是否安装并配置好编辑器&#xff1a;打开终端&#xff1a;按winR cmd&#xff0c;然后输入gcc-v&#xff0c;查看是否有mingw64编辑器&#xff0c;如下图是已经…

HNU 练习八 结构体编程题1. 评委打分

【问题描述】 校园卡拉OK比赛设置了7名评委&#xff0c;当一名选手K完歌之后&#xff0c;主持人报出歌手名字后&#xff0c;7位评委同时亮分&#xff0c;按照惯例&#xff0c;去掉一个最高分和一个最低分后&#xff0c;其余5位评委评分总和为该选手的最终得分。 一共有n组选手参…

【面试题】JavaScript高级循环方法

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;web前端面试题库 除了for循环♻️&#xff0c;for-of,for-each循环♻️也是一个不错的选择 先说for-of循环♻️ 认识for-of循环♻️…

bmp文件操作和详解

一 BMP文件格式 BMP&#xff08;Bitmap&#xff09;是Windows操作系统中的标准图像文件格式。 由于windows操作系统的发布时机远早于Linux、Android、IOS等操作系统&#xff0c;因此windows中很多数据格式和算法的标准也是当今所有操作系统必须要兼容的标准数据结构和算法。BM…

推动企业数字化转型,如何更好地规避失败风险?

随着科技的飞速发展&#xff0c;数字化转型已成为企业持续发展的必然选择&#xff0c;然而有相关数据显示&#xff0c;超过80%的企业在数字化转型过程中都遭遇失败。本文将揭示企业数字化转型常见的失败原因&#xff0c;并探讨如何帮助企业规避转型失败风险。 一、企业数字化转…