|
【S132】全地形捡球机器人
作品说明 |
作者:金鑫 王凯威 魏敏华 王凯壮
单位:苏州大学
指导老师:张正霞 李强伟
1. 市场调研及市场前景说明
随着社会科技文明的不断发展,智能化逐渐走进人们日常生活中。由于人们一系列身体问题逐渐引起人们对体育运动的重视,如果能将体育运动中一些服务性的工作交给机器人来完成,那么体育运动就达到了一种自动化加娱乐性双重效果了。介于此,本项目由球场上散乱的球类入手,开发了此款智能捡球机器人。此机器人以ARM7高性能主控芯片为主控,多个灰度传感器、白标传感器、触须传感器、超声波测距传感器、触碰传感器、近红外传感器、声控传感器配合使用作为寻找小球的“眼睛”,并能通过车载的小型摄像机搜集小车周围的图像信息,还可以通过无线传输到电脑上实时显示,真正达到一种智能捡球的功能。其次,随着科学技术的发展社会的发展,移动机器人技术的研究越来越受到人们的重视和关注。而双足机器人和轮式移动机器人相比较,轮式移动机器人的底盘在速度方面,运行平稳,利用范围,装载能力具有明显的优势,尤其是在服务机器人、巡检机器人、探测机器人等领域,轮式移动模式的利用就更为普遍。移动机器人能够持续,快速,准确的操作运行,因此,本项目采用了更有优势的轮式移动模式,机器人的整体形象为小车型,速度快,准确度高,平稳性好,不容易翻倒,而且在小车上加装机械臂也更为便利,机械臂的活动范围也相应较大,实际表现明显较好。
由于目前市场上捡球机器人尚未有非常成熟的产品,而本项目设计的捡球机器人能够完美地完成球类的夹取和放置任务,它可以运用在羽毛球场、乒乓球场、网球场甚至是高尔夫球场上,而且只需要换不同类型的机械手爪和不同大小的车轮,它就可以适应不同的场地和球型,这样的设计极其方便,也拥有着更大的适用范围,因此这将会有很大的市场效果。并且本项目设计的小车成本低、车型小、质量轻,非常适用于批量生产;对于消费者来说,他们更青睐于价格不高且实用性强的产品,而此产品不仅符合这些特点,而且其趣味性强,更加受青年人的欢迎;中老年人捡球不便或者不愿捡球,也不容易携带重物,这类人群也会选择此款产品,安全性高且携带方便。基于以上几点,我们相信此产品一定会拥有广大的市场。
作品说明
全地形捡球机器人
2. 作品功能介绍及先进性说明
2.1 主要内容
设计一台自动捡球机器人,代替现在的人工,大大提高我们的工作效率,降低工作人员的劳动强度。所以将捡球机器人运用在羽毛球场、乒乓球场、网球场甚至是高尔夫球场上,这将会有很大的市场效果。
2.2 功能介绍
该捡球机器人以ARM7高性能主控芯片作为主控芯片,利用多个灰度传感器、白标传感器、触须传感器、超声波测距传感器、触碰传感器、近红外传感器、声控传感器配合使用采集场上所有敏感点(包括图像信号、色彩信号、声信号、触碰信号、测距信号等)并将其返回到ARM7主控板中,然后主控板中已有的程序对收到的信号经过一系列分析操作后,控制车型机器人运动到目标小球的后方,在运动过程中一般将长手臂折叠在车体上方,通过超声波传感器或者是近红外传感器返回距离信号,让车在距离球较近位置时,主控板控制长手臂上的四个270度舵机,是长手臂折叠至车前,机械手爪向正前方方向张开,此时手爪前端应稍低于后端(经测试,这种情况下夹取球类最稳定),然后小车前进至球位置,利用小车前端的固定手爪将球随车前进一小段距离,确保球已经位于手爪中间,并由主控板发出指令转动机械手爪上的270度舵机将收入到手爪内,再由主控板控制舵机将长手臂再次折叠于车体上方(为将重心后移,保证车在行走工程中的平稳性)。搜寻过程中,该机器人需在不同方位进行搜寻,因此加入一个控制舵机,这样便可以全方位,无死角的对各个方向进行检测和控制,以此便完成了一个智能捡球的任务。
以上介绍的是本作品的主体小车,为防止地形过于特殊,自动小车无法行驶或没有信号可以识别的特殊情况,本作品还设计了一辆遥控的辅助车。遥控小车可以通过蓝牙与手机连接,由手机控制小车完成前进、后退、左转、右转、长手臂的弯曲与伸直、机械手爪的夹取与松开等指令;而自主小车不需要由人控制,只需要预先编好程序输入主控板即可,小车按照写好的程序可实现沿黑线循迹、撞墙后退、用长手爪夹取和放置物件(可以在任何地形实现)等指令。本作品的遥控小车车体设计比较利于灵活的作业,一般是用大型的车轮,这样可以试用在不同的路面上,即使路面不平或者有很多障碍物,本作品的辅助遥控车也可以平稳地通过。用遥控小车和自主小车配合作业,可以实现全场无死角的捡球任务。
2.3 作品先进性
探索者机器人的设计思路是采用多种具备“积木”特点的基础机械零件,搭建出各种各样的机械结构。其中包含大量传动机构零件,以及各样的固定和旋转结构。而我们的作品不仅包含自己设计的固定前爪,可用于执行简单的拾取任务(将球推回目的地),还有用于灵活作业的长手臂以及可夹放的机械手爪。固定前爪位于车的正前方偏下位置,用于在平整地面上推走前方可以滚动的球类,比如乒乓球;长手爪在车行驶过程中一般为保证小车行驶的平稳性都会折叠于小车上方,在需要夹取球类时根据指令将手臂折叠至小车合适的位置,保证长手臂前端的机械手爪可以夹取目标球类。长手爪的设计保证小车可以夹取到各个地方、各个高度的球类,基本没有死角,即使是小车行驶不到的角落位置,长手爪也可以夹取到;并且,在小车把球类运回篮筐或者其他箱体内时,需要将球类先放置于高处,这点长手爪可以实现。还有,我们的在机械手爪前端设计了柔性结构,既可以夹住球,又不会损坏球和舵机,比如羽毛球是不能用硬性手爪直接夹持的,那样会导致羽毛球变形,而我们的机械手爪前端的柔性结构可以保证球的完整性。
其次,本项目作品不仅可以使用两车配合作业,也可以在自动小车上加蓝牙串口,实现自动小车的遥控操作。比如高尔夫球场面积太大,小车不可能很远地就检测到小球的位置,但是如果在自动小车上加装蓝牙串口,就可以人为地遥控小车行驶至高尔夫球的附近位置,接下来便可以启动自动模式,将高尔夫球夹取并送回目的地。此外,本作品小车上加装了多种传感器,可以根据不同的情况采用不同的传感器配合,最大化的实现捡球小车的适用性。比如拾取羽毛球时可以采用颜色传感器和超声波传感器,以此来实现羽毛球的定位。最后总体来说,本项目设计的捡球小车有以下几大特点:
① 适用范围大(全地形、各种球类)
② 平稳性好(轮式结构设计)
③ 灵活性高(可以选择两车配合或者使用自动小车上的蓝牙串口来实现遥控功能)
④ 成本低(整体小车需要的器件不多,成本有限)
⑤ 易于携带(车体小、质量低、效率高)
⑥ 趣味性强(可以自由选择自动模式或者遥控模式)
⑦ 改装空间大(可以根据情况加传感器或者手爪等)
⑧ 安全性高等等
3. 作品制作过程说明
3.1 思路来源
随着时代发展,人们的一系列身体问题逐渐引起人们对体育运动的重视。其中球类运动最受欢迎,但打球是愉快的,捡球却成了苦差事。乒乓球、羽毛球、网球、高尔夫球运动都是如此,尤其是高尔夫球,捡球非常麻烦,因此本项目就想设计一款可以适用于这四种球类的通用的捡球机器人,来减轻人力负担,降低人力成本。
3.2 方案选择过程
我们先是研究了这四种球类运动的场地和球的形状特点,排除了用吸管吸球、用小车推球、用小车黏住球等方案,因为以上方案一方面不适应复杂的地形,另一方面会对球产生一定的损害。我们最终选择用长手臂衔接机械手爪的方案,又基于降低成本和车体重量的想法,我们将车的结构设计紧凑,使小车的整体体型小,并且长手臂上我们加装了三个舵机,实现三个自由度,是长手爪在抓取时有更大的调整空间,显得更加灵活,在携带时长手臂可以折叠在车体上方,节省空间,易于携带。长手臂的设计、长手臂前端机械手爪的设计、机械手爪前端柔性结构的设计以及车体前端的固定手爪的设计,都是经过反复测试得到的最佳设计,手爪摆放的位置、舵机的角度也是经过测试得出来的。
由于实地拍摄效果不佳,所以我们采用了夹取不同形状工件来代替球类,将工件放入低处和高处的空洞中来代替球框,这样展示效果比较好!因此本项目小车实现的任务就是抓取工件和摆放工件。
3.3 作品结构设计
① 自主小车结构图
② 遥控车结构图
3.4 控制程序源代码
① 自动小车源代码
#include <Servo.h>
Servo servo_pin_7; double _ABVAR_1_i = 0.0 ; double _ABVAR_2_t = 0.0 ; Servo servo_pin_3; Servo servo_pin_8; Servo servo_pin_11;
void tingzhi(); void jiaqu(); void houtui(); void chushizhuangtai(); void zuozhuan(); void fangxia(); void qianjin(); void shuzhi(); void panduan(); void youzhuan(); void jiaqu2(); void qushang(); void dierduan();
void setup() { pinMode( 4, INPUT); pinMode( 12, INPUT); pinMode( 10, OUTPUT); pinMode( 6, OUTPUT); pinMode( 5, OUTPUT); pinMode( 9, OUTPUT); servo_pin_7.attach(7); servo_pin_3.attach(3); servo_pin_8.attach(8); servo_pin_11.attach(11); }
void loop() { chushizhuangtai(); servo_pin_7.write( 90 ); delay( 1000 ); _ABVAR_1_i = 700.0 ; _ABVAR_2_t = ( _ABVAR_1_i - 100 ) ; while ( !( ( ( ( analogRead(14) ) <= ( _ABVAR_1_i ) ) && ( ( analogRead(18) ) <= ( _ABVAR_1_i ) ) ) ) ) { panduan(); }
qianjin(); delay( 400 ); tingzhi(); delay( 1000 ); while ( !( ( ( ( analogRead(14) ) > ( _ABVAR_2_t ) ) && ( ( analogRead(18) ) <= ( _ABVAR_2_t ) ) ) ) ) { youzhuan(); }
delay( 100 ); while ( !( ( ( ( analogRead(14) ) <= ( _ABVAR_1_i ) ) && ( ( analogRead(16) ) <= ( _ABVAR_1_i ) ) ) ) ) { panduan(); }
qianjin(); delay( 350 ); tingzhi(); delay( 1000 ); while ( !( ( ( ( analogRead(14) ) <= ( _ABVAR_2_t ) ) && ( ( analogRead(18) ) > ( _ABVAR_2_t ) ) ) ) ) { zuozhuan(); }
delay( 50 ); while ( !( ( ( ( analogRead(14) ) <= ( _ABVAR_1_i ) ) && ( ( analogRead(16) ) <= ( _ABVAR_1_i ) ) ) ) ) { panduan(); }
qianjin(); delay( 350 ); tingzhi(); delay( 1000 ); while ( !( ( ( ( analogRead(14) ) <= ( _ABVAR_2_t ) ) && ( ( analogRead(18) ) > ( _ABVAR_2_t ) ) ) ) ) { zuozhuan(); }
delay( 100 ); tingzhi(); delay( 1000 ); jiaqu(); delay( 1000 ); servo_pin_7.write( 90 ); delay( 1000 ); while ( digitalRead(12) ) { tingzhi(); }
delay( 1000 ); while ( !( ( ( ( analogRead(14) ) <= ( _ABVAR_1_i ) ) && ( ( analogRead(18) ) <= ( _ABVAR_1_i ) ) ) ) ) { panduan(); }
tingzhi(); delay( 1000 ); servo_pin_7.write( 20 ); delay( 1000 ); chushizhuangtai(); delay( 1000 ); qianjin(); delay( 300 ); while ( digitalRead(4) ) { panduan(); }
qianjin(); delay( 300 ); tingzhi(); delay( 500 ); shuzhi(); delay( 1500 ); fangxia(); delay( 1000 ); servo_pin_7.write( 90 ); delay( 1000 ); chushizhuangtai(); delay( 500 ); while ( !( ( ( ( analogRead(14) ) <= ( _ABVAR_1_i ) ) && ( ( analogRead(18) ) <= ( _ABVAR_1_i ) ) ) ) ) { houtui(); }
houtui(); delay( 700 ); while ( digitalRead(12) ) { tingzhi(); }
delay( 1000 ); while ( !( ( ( ( analogRead(14) ) <= ( _ABVAR_1_i ) ) && ( ( analogRead(18) ) <= ( _ABVAR_1_i ) ) ) ) ) { panduan(); }
tingzhi(); delay( 500 ); qianjin(); delay( 300 ); while ( digitalRead(4) ) { panduan(); }
qianjin(); delay( 300 ); dierduan(); }
void tingzhi() { analogWrite(9 , 0); analogWrite(10 , 0); analogWrite(5 , 0); analogWrite(6 , 0); }
void qushang() { while ( !( ( ( ( analogRead(14) ) <= ( _ABVAR_1_i ) ) && ( ( analogRead(16) ) <= ( _ABVAR_1_i ) ) ) ) ) { panduan(); }
qianjin(); delay( 400 ); tingzhi(); delay( 500 ); servo_pin_7.write( 20 ); delay( 1000 ); chushizhuangtai(); delay( 1000 ); while ( !( ( ( ( analogRead(14) ) <= ( _ABVAR_2_t ) ) && ( ( analogRead(18) ) > ( _ABVAR_2_t ) ) ) ) ) { zuozhuan(); }
delay( 100 ); while ( !( ( ( ( analogRead(14) ) <= ( _ABVAR_1_i ) ) && ( ( analogRead(16) ) <= ( _ABVAR_1_i ) ) ) ) ) { panduan(); }
qianjin(); delay( 400 ); tingzhi(); delay( 1000 ); zuozhuan(); delay( 150 ); while ( !( ( ( ( analogRead(14) ) <= ( _ABVAR_2_t ) ) && ( ( analogRead(18) ) > ( _ABVAR_2_t ) ) ) ) ) { zuozhuan(); }
delay( 250 ); tingzhi(); delay( 500 ); while ( digitalRead(4) ) { panduan(); }
qianjin(); delay( 300 ); tingzhi(); delay( 500 ); while ( !( ( ( ( analogRead(14) ) <= ( _ABVAR_1_i ) ) && ( ( analogRead(18) ) <= ( _ABVAR_1_i ) ) ) ) ) { houtui(); }
delay( 300 ); tingzhi(); delay( 500 ); while ( !( ( ( ( analogRead(14) ) <= ( _ABVAR_1_i ) ) && ( ( analogRead(18) ) <= ( _ABVAR_1_i ) ) ) ) ) { qianjin(); }
delay( 150 ); tingzhi(); delay( 500 ); jiaqu2(); delay( 1000 ); servo_pin_7.write( 90 ); delay( 500 ); houtui(); delay( 1000 ); tingzhi(); delay( 300 ); chushizhuangtai(); delay( 1500 ); while ( !( ( ( ( analogRead(14) ) <= ( _ABVAR_1_i ) ) && ( ( analogRead(18) ) <= ( _ABVAR_1_i ) ) ) ) ) { qianjin(); }
delay( 200 ); while ( digitalRead(4) ) { panduan(); }
qianjin(); delay( 300 ); tingzhi(); delay( 1000 ); houtui(); delay( 10000 ); }
void shuzhi() { servo_pin_3.write( 90 ); servo_pin_8.write( 90 ); servo_pin_11.write( 120 ); }
void chushizhuangtai() { servo_pin_3.write( 47 ); servo_pin_8.write( 165 ); servo_pin_11.write( 150 ); }
void fangxia() { servo_pin_3.write( 108 ); delay( 1000 ); servo_pin_8.write( 115 ); delay( 1000 ); servo_pin_11.write( 82 ); }
void houtui() { analogWrite(9 , 0); analogWrite(10 , 135); analogWrite(5 , 0); analogWrite(6 , 165); }
void jiaqu() { servo_pin_3.write( 110 ); servo_pin_8.write( 160 ); servo_pin_11.write( 130 ); }
void panduan() { if (( ( ( analogRead(14) ) > ( _ABVAR_2_t ) ) && ( ( analogRead(18) ) > ( _ABVAR_2_t ) ) )) { qianjin(); } if (( ( ( analogRead(14) ) <= ( _ABVAR_2_t ) ) && ( ( analogRead(18) ) > ( _ABVAR_2_t ) ) )) { zuozhuan(); } if (( ( ( analogRead(14) ) > ( _ABVAR_2_t ) ) && ( ( analogRead(18) ) <= ( _ABVAR_2_t ) ) )) { youzhuan(); } }
void jiaqu2() { servo_pin_3.write( 110 ); servo_pin_8.write( 160 ); servo_pin_11.write( 125 ); }
void zuozhuan() { analogWrite(9 , 0); analogWrite(10 , 200); analogWrite(5 , 200); analogWrite(6 , 0); }
void qianjin() { analogWrite(9 , 120); analogWrite(10 , 0); analogWrite(5 , 120); analogWrite(6 , 0); }
void dierduan() { while ( !( ( ( ( analogRead(14) ) <= ( _ABVAR_1_i ) ) && ( ( analogRead(18) ) <= ( _ABVAR_1_i ) ) ) ) ) { houtui(); }
tingzhi(); delay( 1000 ); qianjin(); delay( 500 ); tingzhi(); delay( 300 ); youzhuan(); delay( 150 ); while ( !( ( ( ( analogRead(14) ) > ( _ABVAR_2_t ) ) && ( ( analogRead(18) ) <= ( _ABVAR_2_t ) ) ) ) ) { youzhuan(); }
delay( 150 ); tingzhi(); delay( 500 ); jiaqu2(); delay( 1500 ); while ( digitalRead(12) ) { tingzhi(); }
qushang(); }
void youzhuan() { analogWrite(9 , 200); analogWrite(10 , 0); analogWrite(5 , 0); analogWrite(6 , 200); } |
#include <Servo.h>
double _ABVAR_1_jiaodu1 = 0.0 ; double _ABVAR_2_jiaodu2 = 0.0 ; double _ABVAR_3_jiaodu3 = 0.0 ; int _ABVAR_4_data = 0 ; Servo servo_pin_3; Servo servo_pin_8; Servo servo_pin_12;
void setup() { pinMode( 10, OUTPUT); pinMode( 5, OUTPUT); Serial.begin(9600); pinMode( 9 , OUTPUT); pinMode( 5 , OUTPUT); pinMode( 10 , OUTPUT); pinMode( 6 , OUTPUT); servo_pin_3.attach(3); servo_pin_8.attach(8); servo_pin_12.attach(12); _ABVAR_1_jiaodu1 = 90.0 ;
_ABVAR_2_jiaodu2 = 90.0 ;
_ABVAR_3_jiaodu3 = 90.0 ;
}
void loop() { _ABVAR_4_data = Serial.parseInt() ; if (( ( _ABVAR_4_data ) == ( 4 ) )) { digitalWrite( 9 , HIGH ); digitalWrite( 5 , HIGH ); digitalWrite( 10 , LOW ); digitalWrite( 6 , LOW ); } if (( ( _ABVAR_4_data ) == ( 3 ) )) { digitalWrite( 10 , HIGH ); digitalWrite( 6 , HIGH ); digitalWrite( 9 , LOW ); digitalWrite( 5 , LOW ); } if (( ( _ABVAR_4_data ) == ( 1 ) )) { analogWrite(5 , 240); analogWrite(10 , 255); digitalWrite( 9 , LOW ); digitalWrite( 6 , LOW ); } if (( ( _ABVAR_4_data ) == ( 2 ) )) { digitalWrite( 6 , HIGH ); digitalWrite( 9 , HIGH ); digitalWrite( 10 , LOW ); digitalWrite( 5 , LOW ); } if (( ( _ABVAR_4_data ) == ( 5 ) )) { digitalWrite( 9 , LOW ); digitalWrite( 5 , LOW ); digitalWrite( 10 , LOW ); digitalWrite( 6 , LOW ); } if (( ( _ABVAR_4_data ) == ( 6 ) )) { _ABVAR_1_jiaodu1 = ( _ABVAR_1_jiaodu1 - 5 ) ; servo_pin_3.write( _ABVAR_1_jiaodu1 ); } if (( ( _ABVAR_4_data ) == ( 7 ) )) { _ABVAR_1_jiaodu1 = ( _ABVAR_1_jiaodu1 + 5 ) ; servo_pin_3.write( _ABVAR_1_jiaodu1 ); } if (( ( _ABVAR_4_data ) == ( 8 ) )) { _ABVAR_2_jiaodu2 = ( _ABVAR_2_jiaodu2 - 5 ) ; servo_pin_8.write( _ABVAR_2_jiaodu2 ); } if (( ( _ABVAR_4_data ) == ( 9 ) )) { _ABVAR_2_jiaodu2 = ( _ABVAR_2_jiaodu2 + 5 ) ; servo_pin_8.write( _ABVAR_2_jiaodu2 ); } if (( ( _ABVAR_4_data ) == ( 10 ) )) { _ABVAR_3_jiaodu3 = ( _ABVAR_3_jiaodu3 - 5 ) ; servo_pin_12.write( _ABVAR_3_jiaodu3 ); } if (( ( _ABVAR_4_data ) == ( 11 ) )) { _ABVAR_3_jiaodu3 = ( _ABVAR_3_jiaodu3 + 5 ) ; servo_pin_12.write( _ABVAR_3_jiaodu3 ); } if (( ( _ABVAR_4_data ) == ( 13 ) )) { _ABVAR_1_jiaodu1 = ( _ABVAR_1_jiaodu1 - 5 ) ; servo_pin_3.write( _ABVAR_1_jiaodu1 ); } if (( ( _ABVAR_4_data ) == ( 14 ) )) { _ABVAR_1_jiaodu1 = ( _ABVAR_1_jiaodu1 + 5 ) ; servo_pin_3.write( _ABVAR_1_jiaodu1 ); } if (( ( _ABVAR_4_data ) == ( 15 ) )) { _ABVAR_2_jiaodu2 = ( _ABVAR_2_jiaodu2 - 15 ) ; servo_pin_8.write( _ABVAR_2_jiaodu2 ); } if (( ( _ABVAR_4_data ) == ( 16 ) )) { _ABVAR_2_jiaodu2 = ( _ABVAR_2_jiaodu2 + 15 ) ; servo_pin_8.write( _ABVAR_2_jiaodu2 ); } if (( ( _ABVAR_4_data ) == ( 17 ) )) { _ABVAR_3_jiaodu3 = 5.0 ; servo_pin_12.write( _ABVAR_3_jiaodu3 ); } if (( ( _ABVAR_4_data ) == ( 18 ) )) { _ABVAR_3_jiaodu3 = 120.0 ; servo_pin_12.write( _ABVAR_3_jiaodu3 ); } if (( ( _ABVAR_4_data ) == ( 19 ) )) { _ABVAR_1_jiaodu1 = 130.0 ; servo_pin_3.write( _ABVAR_1_jiaodu1 ); } } |
② 辅助遥控小车源代码
3.5 实验测试夹乒乓球
* 本项目未获得作者开源授权,无法提供资料下载。