【S137】一种远程救援机器人
作品说明 |
作者:廖鲁振 王浩浩 汤志超 张秀容
单位:北方民族大学 机电工程学院
指导老师:穆春阳 张春涛
1. 研究背景以及现状
1.1 研究背景
近些年,战争、恐怖袭击等突发事件,地震、海啸等自然灾害及潜在的核、化、生和爆炸物等严重威胁着人类的生命与财产安全。各种灾难发生次数增多的同时,其严重性、多样性和复杂度也逐渐增加,灾难发生后的72h为黄金抢救时间,但受灾难现场的非结构化环境的影响,救援人员难以快速、高效、安全地进行工作,且救援任务逐渐超出了救援人员的能力范围,因此救援机器人已经成为一个重要的发展方向。
① 采煤过程中
中国煤矿大多数为矿工开采,不安全因素很多,瓦斯煤尘和火灾等灾害事故频繁发生,灾害事故危害严重,伤害人员多,中断生产时间长,损毁井巷工程或生产设备。然而,煤矿事故的救灾方式只是根据事故的类型确定救灾的方案,一般救护人员无法进入危险区域,只能通过提升绞车、移动式风车等设备清除垃圾,向井下通风,然后再搜救遇险矿工。这种方式危险性大,伤亡人数多,救灾周期长,往往效率低。随着科技的发展,机器人将被应用到煤矿救灾领域。机器人具有为井下遇险矿工投放小包食品、药物和通讯装置等辅助功能,能有效地减少遇险矿工的伤亡人数,并且在运送的过程中,如果遇到障碍物,利用摄像头能够轻松的通过机械手,精确的将障碍物移除,然后进行继续运输。
② 核泄漏
2011年3月,里氏9.0级地震导致福岛县两座核电站反应堆发生故障,其中第一核电站中一座反应堆震后发生异常导致核蒸汽泄漏。于3月12日发生小规模爆炸,或因氢气爆炸所致。有业内人士表示,福岛核电站是一个技术上现在已经没人用的单层循环沸水堆,冷却水直接引入海水,安全性本来就没有太大指望。沸水产生的蒸性物质。对于日本这一个地震频繁的地区,使用这样的结构非常不合理。3月14日地震后发生爆炸。在爆炸后,辐射性物质进入风中,通过风传播到中国大陆,台湾,俄罗斯等一些地区。在这样的情形下,人根本无法进入,派遣机器人进入,进行核泄漏的初步控制是最好的选择。本机器人的机械手是读取人动作数据,从而进行运动的,后期进行技术的更近,将算法以及传感器完善,甚至能达到远程维修的地步。
1.2 其它应用以及发展说明
机器人虽然定位在救援,但是实际上能运用在很多方面,如在家庭机器人、工业机器人、服务机器人等。例如家庭机器人:
① 行动不便需要机器人到前面的桌子上拿水,通过左手的摇杆模块,将机器人开到指定目的地,然后右手做出拿水的动作,将水拿起,然后再通过摇杆模块将小车开回来。
② 需要机器人到房间里拿衣服,但是隔着一道墙,这个时候视频模块就起作用了,通过视频模块看到机器人的状态,然后和上述的控制方式一样,甚至做一些复杂的动作,如开门、避开障碍物等,将衣服拿回。
2. 功能介绍以及先进性说明
2.1 功能介绍
① 车体
车体是由MEHARN开发板、BigFish拓展板、NRF24L01无线串口通信模块、wifi模块、探索者平台零部件、舵机、电机、摄像头模块组成。
作品说明
② 机械手
机械手由探索者创新零件搭建而成,4个舵机组成3个自由度的机械臂——左右转、上下抬、旋转。
③ 摄像头
摄像头由摄像头模块、wifi模块以及两个舵机组成。摄像头来向上位机提供图像数据,机器人离开了视线一样能对机器人进行正常的控制。其中,摄像头的两个舵机与机械臂四个舵机的其中两个并联,这样的好处就是无论机械臂怎么转怎么运动,摄像头模块都是对准机械手方向。
④ 电机
小车由四个电机组成,原理和想法很简单,就是想要车能够到处跑。
⑤ 手套
手套是由MEHARN开发板、BigFish拓展板、NRF24L01无线串口通信模块、触碰传感器、加速度传感器、摇杆模块以及上位机组成(图示还没固定在手中)。
⑥ 触碰传感器
定在人的手心之中,当人手闭合的时候触碰到传感器,就会通过无线通信模块进行数据传输从而让机械手闭合。
⑦ 加速度传感器
固定在人手背和手肘处,当人的手臂进行运动的时候,会产生一个加速度,本项目对这个加速度进行算法的简单的开发,从而得到一套运动算法。传感器固定在人手上的时候,人手臂向上抬,机械手也会网上抬,同样的向左向右移动,机械手也会同样的向左向右运动。以上两种传感器固定在手上时,可以粗略的得到人手运动状态数据,如抓取东西、机械手向四周摆动等动作。
⑧ 摇杆模块
摇杆模块就是通过NRF无线通信模块对四个电机进行控制,从而达到小车整体前进后退,向左向右走的目的。
2.2 先进性说明
本项目机器人的主要功能是由一个三自由度的机械手来完成的,通过固定在手上的加速度传感器来控制,这样就能自由的控制机械手,完成各种动作,并且为了防止机器人脱离了视线就无法控制,于是加入了摄像头模块,摄像头模块会一直对准机械手,然后传送到电脑数据端,达到一种无论在哪都能控制的地步。
本作品机器人用最简单的话来阐述就是坐在沙发上,右手穿戴着有传感器的手套,左手拿着摇杆,看着电脑屏,控制着机器人到家里各个地方进行工作。
3. 系统设计
机器人采用NRF的通信模块,对手采集到的数据进行传输,如手体态位置信号、触碰信号、摇杆信号(图中暂用双面胶固定)。
车体部分主要是由机械臂、四个动力电机以及摄像头组成。下图是摄像头模块通过无线路由器传输的信号图像,小车走到哪都通过电脑看到前方的图像。
摄像头下有两个舵机,是与机械臂的舵机并联,不用单独的控制摄像头的舵机,通过机械臂的摆动就能看到四周的图像。
四个电机由遥控模块控制,能轻松的前进后退,左右转。从下图中能看出,机械臂是由四个舵机组成的三自由度的机械臂。
最右端的机械手,是由触碰传感器控制舵机的转动,达到抓取东西的目的。剩下三个舵机是由加速度传感器控制,加速度传感器初步查看资料看到,发现加速度传感器为双轴陀螺仪(实际为三轴),所以完全能够胜任这个工作,人的手怎么动,机械臂也跟着动。
4. 制作过程说明
4.1 制作思路来源以及演变
本作品思路来源于工作室中的baxter双臂协作机器人,这个机器人基于ROS操作系统,通过其强大的仿真功能,根据Kinect的优秀能力,可以完美的实现同步人动作,甚至是识别外骨骼。因为没能有像kiniect一样强大功能,想要机器人跟着你做动作就几乎是不可能的,就寄托于传感器,通过查阅资料发现加速度传感器是由双轴陀螺仪制成(通过库文件的对比发现实际上是三轴陀螺仪),其功能恰好能达到预想的目的,通过团队内部交流写出了一套关于固定在人关节处的加速度传感器的一套算法,此算法主要是针对机械臂能准确的按照手的姿态进行运动。
在上述基础上引入了触碰传感器,wifi路由器、摄像头并给他加了“四条腿”让机器人健步如飞。
4.2 制作过程照片展示
5. 示例程序
由于发送端有四个传感器,所以发送端将数据分为两份进行传输,方便接收端识别,先发送一个数过去告诉接收端,即将到来的是什么数据。
① 发送端
#include <SPI.h> #include <Mirf.h> #include <nRF24L01.h> #include <MirfHardwareSpiDriver.h>
void setup() { pinMode(A0,INPUT); pinMode(A1,INPUT); pinMode(A2,INPUT); pinMode(A3,INPUT); pinMode(A4,INPUT); Mirf.spi = &MirfHardwareSpi; Mirf.init(); Mirf.setRADDR((byte *)"ABCDE"); Mirf.payload = sizeof(value); Mirf.channel = 90; Mirf.config(); } int x=0; int y=0;
void loop() { Mirf.setTADDR((byte *)"FGHIJ"); delay(1000);
int a = analogRead(A4); int b = analogRead(A2); int c = analogRead(A3); int d = analogRead(A0); int e = analogRead(A1);
int x=map(a,0,1023,0,255); int y=map(b,0,1023,0,255);
if(x!=0) { Mirf.send((byte *)&1); 加速度传感器1 delay(30); while(Mirf.isSending()) delay(1); delay(30); Mirf.send((byte *)&x); } if(y!=0) { Mirf.send((byte *)&2); 加速度传感器2 delay(30); while(Mirf.isSending()) delay(1); delay(30); Mirf.send((byte *)&y); } if(c!=0) { Mirf.send((byte *)&3); 触碰传感器数据 delay(30); while(Mirf.isSending()) delay(1); delay(30); Mirf.send((byte *)&c); } if(d!=0) { Mirf.send((byte *)&4); 摇杆模块X轴方向数据 delay(30); while(Mirf.isSending()) delay(1); delay(30); Mirf.send((byte *)&d); } if(e!=0) { Mirf.send((byte *)&y); delay(30); while(Mirf.isSending()) delay(1); 摇杆模块y轴方向数据 delay(30); Mirf.send((byte *)&e); } } |
#include <SPI.h> #include <Mirf.h> #include <nRF24L01.h> #include <MirfHardwareSpiDriver.h> #include <Servo.h> Servo servo1; Servo servo2; Servo servo3; Servo servo4;
int value;
void setup() { Servo1.attach(5); servo2.attach(7); servo3.attach(8); servo4.attach(9);
pinMode(9,OUTPUT); pinMode(10,OUTPUT); pinMode(5,OUTPUT); pinMode(6,OUTPUT)
SerialUSB.begin(9600); Mirf.spi = &MirfHardwareSpi; Mirf.init(); Mirf.setRADDR((byte *)"FGHIJ"); //设置自己的地址(接收端地址),使用5个字符 Mirf.payload = sizeof(value); Mirf.channel = 90; Mirf.config(); SerialUSB.println("Listening..."); //开始监听接收到的数据 } int Y=0; int X=0;
void loop() { if(Mirf.dataReady()) { Mirf.getData((byte *) &value); if(value==3) //触碰传感器 { if(Mirf.dataReady()) { Mirf.getData((byte *) &value); if(value<5) { Servo3.write(0); delay(30); } if(value>100) { Servo3.write(0); delay(30); } }
if(Mirf.dataReady()) { Mirf.getData((byte *) &value); If(value==1) { servo1.write(value-151); delay(30); } }
if(Mirf.dataReady()) { Mirf.getData((byte *) &value); If(value==2) { Servo2.write(value-151); delay(30); } }
if(Mirf.dataReady()) { Mirf.getData((byte *) &value); If(valude==4) { int x = analogRead(A0); int y = analogRead(A1); if(Y!=y) { digitalWrite(9,LOW); digitalWrite(10,LOW); digitalWrite(5,LOW); digitalWrite(6,LOW); } if(X!=x) { digitalWrite(9,LOW); digitalWrite(10,LOW); digitalWrite(5,LOW); digitalWrite(6,LOW); } Y=y; X=x; //////////////////////// if(x>1000) { digitalWrite(9,HIGH); digitalWrite(10,LOW); digitalWrite(5,LOW); digitalWrite(6,HIGH); delay(50); } /////////////////////// if(x<100) { digitalWrite(9,LOW); digitalWrite(10,HIGH); digitalWrite(5,HIGH); digitalWrite(6,LOW); delay(50); } /////////////////////// if(y<100) { digitalWrite(9,LOW); digitalWrite(10,HIGH); digitalWrite(5,LOW); digitalWrite(6,HIGH); delay(50); } ////////////////////// if(y>1000) { digitalWrite(9,HIGH); digitalWrite(10,LOW); digitalWrite(5,HIGH); digitalWrite(6,LOW);
delay(50); } } } } |
② 接收端
* 本项目未获得作者开源授权,无法提供资料下载。
|