|
【S149】基于辅助运动的智能捡球机器人
作品说明 |
作者:吴科迪 刘凯嘉 王保旭
单位:华北科技学院
指导老师:李孝平 李娟娟
随着机器人技术、电子信息技术、智能控制技术和机电一体化技术的不断发展和融合,智能机器人技术的发展近年来有了长足的进步,服务型机器人作为智能机器人的一个发展方向,由于其受众群体广泛,未来发展潜力巨大,越来越多的学者和研究机构针对服务型机器人进行了大量的研究工作。乒乓球和网球是我国传统的体育运动项目,有着众多的运动爱好者,然而捡球的繁琐困扰着运动爱好者,因为不断的捡球会干扰运动流畅性,大大降低了运动效果。传统的捡球方式主要是人工捡球和人工辅助捡球,前者需要专人手工捡拾球体,后者需要人工操作器械捡球,均无法摆脱专人处理捡球的问题,因此设计一种智能化的自动捡球机器人是解决捡球问题的有效途径。
本项目提出了一种适用于捡取乒乓球和网球的智能捡球机器人的设计案例,详细阐述了智能捡球机器人的机械结构,根据设计方案制作了样机,并对样机进行了测试。通过机器人对周围环境中的目标球信息的收集,并排除周围环境的图像干扰,然后通过各个传感器的融合,处理控制器的信息处理,规划好路径信息并发出指令,以此来完成自动捡球的目的。
作品说明
基于辅助运动的智能捡球机器人
1. 场景调研
随着智能装备技术的不断发展,智能化机器人受到越来越多的关注。智能机器人被广泛应用于智能家居、深海探测和航天航空等各个领域,在工业生产和人类社会中发挥着举足轻重的作用。球类运动作为常见的全民体育运动形式,具有对抗性强、观赏性高等特点,在全球广泛流行。然而运动员在练习过程中会出现大量的重复性捡球运动,大幅度增加了人体的运动损耗,同时散落在场地内的球具也会提高运动事故的发生率。捡球工作一直是一项繁重的体力劳动,人工捡球费时费力,且工作效率也不是很高。在一些发达国家,早已开始采用服务型机器人在球类运动场馆进行捡球工作。目前针对训练场小球类物体捡拾机器人研究主要有气吸式兵乓球、螺旋清扫式网球、叶片夹持式高尔夫球等收球机器人。例如气吸式乒乓球捡球机器人,能够通过压力差吸入小球,但功能单一,只能吸取乒乓球;螺旋清扫式网球机器人,能够通过传动轴转动拾取球类,但结构简单,针对这一系列问题,本项目提出一种用于辅助运动的智能捡球机器人,可以减轻运动员的练习负担和运动事故的发生。
应用场景:用于辅助运动的智能捡球机器人可以在体育馆用于拾捡网球,乒乓球等球类,以减少人力清理工作;在室内游乐中心,机器人可以用于捡拾玩具球,泡泡球等,提高安全性和卫生性;在学校,可以在学校操场上帮助老师或学生清理活动后的球类,节省时间和劳动力。
目标用户和需求:在学校和教育机构层面,需要一个能够帮助学生保持操场整洁的机器人,以降低教师的工作负担;在管理体育场馆的人员层面,可能需要一种机器人来快速清理比赛结束后的球场;家庭用户可能寻求一种简单易用的机器人,以减少孩子们的玩具球散落在屋子里的问题。
竞技对手分析:将人工智能应用于文体领域的相关研究刚刚兴起,前人对于捡球机器人的研究工作相对较少。国内对于捡乒乓球机器人的研究还在起步阶段,没有成熟的系统成果,目前的研究主要集中于机器人的机械结构设计和球类的检测识别等几个方面。
宋安琦等人设计的基于stm32的捡乒乓球机器人,使用摄像头对乒乓球进行识别定位,借助超声波进行避障,此机器人紧紧依靠检测到球类的方向类控制机器人的运动智能性不高。许东伟等人设计的捡乒乓球机器人主要侧重于控制系统的设计,对于乒乓球检测和避障功能仅有简单的实现,可靠性不高。在国外,对于捡球机器人的研究也比较有限。
在捡球机器人大类中,学术领域更多的依然是集中于机器视觉和机械设计,关注识别和拾取乒乓球的能力,也有少量的关于总体系统的研究;在商用领域,捡球机器人蓬勃发展,已有高尔夫捡球机器人The Ball Picker和网球捡球机器人Tennibot等问世,这些场景相对乒乓球场馆来说面积相对较大,机器人的运行限制较小,不需要考虑避障等问题,研发难度较小。如下图所示展示了目前已有的各类捡球机器人:
各式捡球机器人
2. 机器人本体技术路线说明
2.1 机械结构
① 底盘
采用斜三角履带结构有两个独立的履带系统,每个履带由一系列连接的履带板构成。履带板通常是橡胶或橡胶加强的材料,以提供良好的地面抓地力。拥有稳固而不失灵敏的强悍地基,在草地、公路上以及坡地内都可进行基本运动。如下图所示:
底盘机械结构
② 车身结构
采用两层独立式车身结构,侧面加固板材作为保护层,便于稳固车身,并且更方便放置物品,作为货架。每个履带系统都有两个驱动直流电机,电机通过齿轮传动和链传动与履带系统连接,以提供动力。如下图所示:
总体结构图
③ 传感交互与模块
使用引用适配车身程序的特殊传感器,在建模软件中建立传感模型与信号传输系统,优化设计尺寸和形状,多次检测电路传输系统与有限元基本信号值。传感器与车身其他专用模块相结合,辅助机器小车在拾取点位更精准,传输信号更稳定,寻迹运动更灵敏。在车身上加装远近红外感应、灰度测试、超声波感应等多类模块,通过程序调试为模块指定特殊值,以适应不同地点的循迹和避障等功能。模块与车身之间有防护板材,并用进行多重加固,环环相扣的结构也增强了车身的稳定结构,传感系统与模块配合完成多样高难度操作。
2.2 捡球机构
① 捡球机构
主要由机械臂和机械爪构成,采用关节串联的方式,共设计4个自由度。机械臂采用舵机驱动,主体采用关节型,其特点在于结构紧凑,工作范围广,适用于夹取大功率负载。同时该机械臂在外观上整体分布均匀,形态稳定,避免元器件走线过度外露,每个环节的机械臂中一半由舵机直接驱动,另一半则由轴承支承。
捡球机构
② 机械夹持爪设计
机械臂的夹持爪至关重要,决定了机械臂执行任务的通用性和广泛性,好的夹持手爪可以极大地提高捡球机器人的工作效率和可靠性。夹持手爪采用四边形机构冗余设计,保证其开口始终处于平动张开或夹紧状态。夹持爪结构如下图所示:
机械夹持爪设计
2.3 行走及识别检测系统
① 驱动模式
一般的驱动模式有两前轮控制转向,两后轮用来驱动的模式,但是这种转向模式需要添加专门的转向舵机增加额外的机构,因此本捡球机器人采用电机驱动差速转向,每个履带采用两个电机独立驱动,四个电机分别独立为左右履带提供动力,当需要转弯使,由基于Arduino的Basra主控板控制左右电机差速进行转弯,实现方便转弯。
② 检测系统
对于球类的识别与定位,捡球机器人的下底板上有一个摄像头,用于对球类的识别,通过对单目和双目摄像头的分析、编写,本项目选用单目摄像头用于对球类的识别如下图所示,通过拍摄的照片对比进而判断是否为球体,而对于球的定位就需要知道距离球的远近,通过一定的算法对拍摄的照片进行对比分析得出距离,同时上底板左右各有一个可旋转的雷达,捡球机器人在行进过程中难免会遇到一些障碍物,而雷达可以对周边障碍物进行实时快速扫描检测,当需要转向时,雷达也会在程序的控制下,根据转弯角度的大小旋转对应的角度值进行扫描检测,并将信号传递到基于Arduino的Basra主控板控制左右后轮驱动电机进行避障转弯,进而使小车能够避开人和其他障碍物。
单目摄像头
2.4 红外线传感器避障系统
红外线传感器抗干扰能力强,可以避免阳光和电灯等光线中红外线成分的干扰,且具有可见光的反射特性,常作为避障传感器使用。红外线传感器有内置的光滤波器,除了光敏二极管发出的红外线外,其它光线均不允许通过,这就保证了探测的准确性。该捡球机器人采用距离可调节的NPN型光电开关红外避障传感器,可检测距离为3~80 cm。
近红外传感器
捡球机器人的避障控制流程图如下所示:
捡球机器人的避障控制流程
近红外传感器可以实时检测周围环境中的物体,可以很快的做出相应,提供实时避障的功能,同时近红外具有较低的功耗,可以长时间的运行或依赖电池供电,并且近红外的工作不会受到其他电子设备造成的干扰。
2.5 软件设计
捡球机器人应用图像处理技术,由摄像头采集周围的图像数据,摄像头将采集到的数据发送到主控板进行处理,进而控制机器人当前的状态,四个电机根据控制中心发出的信号朝球体运动,实现视觉识别并拾取球体的目的;该机器人采用多传感器数据融合方法来实现感知周围环境信息,通过这些传感器将采集到的数据实时传送到控制板上经过控制班处理后实现避障的效果;同时在车斗上面也配备一个近红外传感器当采集到的球超过一定高度被近红外采集到后,蜂鸣器间隔性发出“滴滴”声,提醒操作者车斗已经装满了。如下图所示:
2.6 机器人控制系统设计
捡球机器人的控制系统硬件框图如下所示:
控制系统硬件框图
其中主控器采用基于Arduino的Basra主控板,具有功能齐全、运算速度快等优点。如下图所示:
Basra开发板
3. 作品创新点
3.1 球类识别与定位
由于乒乓球主要是黄色和白色2种颜色,且有固定的规格大小,本项目机器人采用OpenMV颜色识别对单目摄像头拍摄的照片进行处理,由于球具有特定的大小,根据图像中物体的投影面积、周长、圆度等判断该物体是否为球体,进而排除掉一些非球体的杂物,然后对整张图中的球体进行颜色阈值判断,并对阈值进行设置,将白色以及黄色设置为阈值以内的颜色,其他阈值以外的颜色呈现为黑色。通过连续拍摄的照片判断球的位置,并且不断修正机器人的行进方向和速度,以更精确地到达球的位置。
3.2 转向控制
通过算法对所获取的图片中乒乓球的位置进行计算分析后,得出电机所需要的高电平值,通过主控机构输出对应的PWM波高电平值给驱动电机,使机器人后轮差速运转进行转向,从而实现对机器人的转向控制。
3.3 速度控制
要想高效捡球,捡球机器人必须具有一定的行进速度但同时又能在靠近目标时降低到合适的速度,因此需要设计合适的高要求算法使捡球机器人能更高效地运动到球附近,配合机械臂的机械爪进行一系列捡球的操作,控制其运动速度的合理性。根据摄像头拍摄的照片判断其与球的距离,从而计算出与距离相适应的运行速度,采用一定的控制算法对机器人的速度进行调节,使捡球机器人快速稳定地达到相应的速度,实现速度由它们之间的距离自动调控的模式。
4. 作品难点
4.1图像视觉的困难
在视觉处理部分,前期主要存在算力不足,识别有误差的问题,同时本作品采用的是单目摄像头与双目存在的差异之间的克服问题,以及摄像头感光材料的温度变化和自然光环境等因素使得识别获得的图像存在大量的噪音,同时如果系统只是基于颜色信息的识别,同时小球的颜色多样,需要更复杂的算法区分颜色。
4.2机械臂抓取的困难
准确的识别和定位目标是机械臂抓取的先天条件,同时面对不同大小,形状各不相同的球类,机械臂需要有适应的抓取,配备相应的机械爪,同时对于机械臂的运动轨迹,需要进行一定的规划,调整相应舵机的角度,进行相应的动作。
5. 解决方案
5.1图像视觉
基于上述问题本项目采用单目摄像头和颜色识别对球类进行分类和拾取。
探索者IIC颜色传感器是基于 TCS34725 彩色光数字转换器为芯片设计的颜色识别传感器,传感器提供红色、 绿色、蓝色(RGB )和清晰光感应值的数字输出。集成红外阻挡滤光片,可最大限度地减少入射光的红外光谱成分,并可精确地进行颜色测量。具有高灵敏度、宽动态范围,且配置红外阻隔滤波器。最小化 IR 和 UV 光谱分量效应,以产生准确的颜色测量。带有环境光强检测和可屏蔽中断。通过 l2C 接口通信。在全捡球机器人上,本项目通过传感器读取出的RGB值来区分和判定不同的球体。
将摄像头采回来的图像每10帧进行一次处理,将目标阈值与采回来的阈值进行对比,建立一个坐标系,横轴为x轴,纵轴为y轴,得到x和y值的平均值,而目标球的球面中心的横向坐标可以用来确定球是左还是右相对于机器人的前方,球面中心坐标小于图像中心坐标(相机分辨率为320×240,中心坐标为160,120),以显示机器人左侧的球;反之亦然。球体与机器人之间的距离可以通过球体质心坐标来判断。应当注意,球体与机器人之间的距离与球心坐标不是严格线性的,但是它遵循这样的规则,即球离机器人越远,图像中的球心越大。因此,球相对于机器人的方位和球与机器人之间的距离可以根据球心坐标来确定,机器人的运动状态。
5.2 机械臂抓取
机械臂的运动包括上下移动、机械爪的张合。
为了实现机械臂的精准夹取与放置,使用了三个舵机控制。两个舵机控制机械臂上下移动,末端舵机控制机械爪的张合,在程序中设定偏移量为3度,即舵机每次以3度转动,减少了机械臂因为惯性所产生的误差,保证了机械臂的平稳运行,使精确性大大提高。如下图所示:
6. 示例程序
#include <Servo.h> #include "MH_TCS34725.h" //调用颜色识别传感器库函数
MH_TCS34725 tcs = MH_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X); //设置颜色传感器采样周期50毫秒 //MH_TCS34725 tcs = MH_TCS34725(TCS34725_INTEGRATIONTIME_700MS, TCS34725_GAIN_1X);//设置颜色传感器采样周期700毫秒 //MH_TCS34725 tcs = MH_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_60X);//设置颜色传感器采样周期50毫秒(不推荐) //MH_TCS34725 tcs = MH_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_16X);//设置颜色传感器采样周期50毫秒(不推荐)
Servo myservo1; //底部舵机 Servo myservo2; //中部舵机 Servo myservo3; //爪部舵机
void forward(); void turnL(); void turnR(); void stop(); void back(); void pt(); void zc(); void bz(); void fz();
void setup() { Serial.begin(9600); pinMode(A0, INPUT); //爪部近红外 pinMode(A1, INPUT); //右侧避障近红外 pinMode(A2, INPUT); //左侧避障近红外 pinMode(5, OUTPUT); pinMode(6, OUTPUT); //右轮 pinMode(9, OUTPUT); pinMode(10, OUTPUT); //左轮 myservo1.attach(3); myservo2.attach(8); myservo3.attach(12); pinMode(3, OUTPUT); //底部舵机 pinMode(8, OUTPUT); //中部舵机 pinMode(12, OUTPUT); //爪部舵机 myservo1.write(100); //0 myservo2.write(180); myservo3.write(20); //30 }
void loop() { uint16_t clear, red, green, blue; //分别定义用于存储红、绿、蓝三色值变量 tcs.getRGBC(&red, &green, &blue, &clear); //将原始R/G/B值转换为色温(以度为单位)
uint32_t sum = clear; //=========== float r, g, b; // 计算红 r = red; r /= sum; // 绿、蓝 g = green; g /= sum; // 三色数 b = blue; b /= sum; // 值 r *= 256; g *= 256; b *= 256; //=========== Serial.print("\t"); Serial.print((int)r); Serial.print("\t"); // 在串口中分别打印 Serial.print((int)g); Serial.print("\t"); // 红、绿、蓝三色 Serial.print((int)b); // 值 Serial.println(); if ((r <= 80) && (g <=80) && (b <=80)) //((r >= 0) && (g >= 0) && (b >= 0) && (r >= g) && (r >= b) && (r >= 128)) //如果检测到红色 {
} else if ((r >= 0) && (g >= 0) && (b >= 0) && (r <= g) && (b <= g) && (g >= 115)) //如果检测到绿色 { zc(); //((r >= 0) && (g >= 0) && (b >= 0) && (r <= b) && (g <= b) && (b >= 128)) //如果检测到蓝色 } else { bz(); } }
void forward() { digitalWrite(5, LOW); digitalWrite(6, HIGH); //右轮前进 digitalWrite(9, LOW); digitalWrite(10, HIGH); //左轮前进 }
void turnL() { digitalWrite(5, LOW); digitalWrite(6, HIGH); //右轮前进 digitalWrite(9, HIGH); digitalWrite(10, LOW); //左轮后退 }
void turnR() { digitalWrite(5, HIGH); digitalWrite(6, LOW); //右轮后退 digitalWrite(9, LOW); digitalWrite(10, HIGH); //左轮前进 }
void stop() { digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); }
void back() { digitalWrite(5, HIGH); digitalWrite(6, LOW); //右轮后退 digitalWrite(9, HIGH); digitalWrite(10, LOW); //左轮后退 }
void pt() { myservo1.write(100); //0 myservo2.write(180); myservo3.write(20); //30 }
void zc() { //抓持 myservo1.write(0); myservo2.write(75); delay(1000); forward(); delay(200); if (!(digitalRead(A0))) { delay(300); stop(); myservo3.write(120); delay(1000); fz(); } else bz(); }
void fz() { myservo1.write(80); myservo2.write(30); delay(1000); myservo3.write(20); delay(2000); }
void bz() { pt(); if (digitalRead(A0) == 1 && digitalRead(A1) == 1 && digitalRead(A2) == 1) { forward(); } else if (digitalRead(A1) == 1 && digitalRead(A2) == 0) { turnL(); delay(200); } else if (digitalRead(A1) == 0 && digitalRead(A2) == 1) { turnR(); delay(200); } else if (digitalRead(A1) == 0 && digitalRead(A2) == 0) { turnR(); delay(200); } } |
* 本项目未获得作者开源授权,无法提供资料下载。