基于树莓派3的无人水下机器人设计
一、项目简介
海洋占据着地球大部分表面积,蕴藏着大量的资源;且相对于人类对太空的认知,我们对水下世界的认识少之又少。怀着对这片神秘深蓝区域的好奇,我们开发了一款无人水下机器人(UUV)。通常来讲,根据是否由人通过机器人拖拽的线缆进行实时控制,我们可以将无人水下机器人分为遥控水下机器人(ROV)和自主水下机器人(AUV)。本次项目在概念上进行创新,设计了一种具有长续航能力的混合式水下机器人(ARV)。
二、工作环境
本次项目使用经典的Raspbian-Wheezy系统,通过显示器进行初始化设置(这部分就不详细介绍了,网上教程一大堆,推荐本书《爱上Raspberry Pi》,入门超好用)。后面为了开发方便,使用WiFi+putty+VNC+ftp进行调试和程序上传。软件部分主要使用自带shell和Python 2.7.
三、系统搭建
硬件方面,本机器人使用两个无刷直流电机作为推进器,可进行水平面内的直行和转向。机器人腹部有水舱,通过水阀进行吞/吐水操作进而实现上浮下潜。为提高机器人的搭载能力,充分发挥其水下试验平台作用,为后续搭载不同实验设备做准备,其背部设计为平板,便于安放设备。头部带有通讯舱,内含433M通讯模块。前胸部有电器仓,放有主控系统(树莓派)和电机驱动板(Arduino)。为节约成本,本机器人使用有机玻璃搭建了主体结构。 本次项目采用遥控+自主双模式混合方案。遥控过程中通过433M模块与陆地控制端进行通讯。通过提前商定好的通讯协议,岸上通过无线电台给机器人发送控制指令,机器人获取后进行相应动作(直行,转向,上浮/下潜)。机器人接收指令后也会向岸上操作员返回成功信号。机器人默认处于遥控状态,当收到操作员发出的自主运动指令后,根据预设的动作组进行自主动作,结束后返回遥控模式。
四、软件设计
本次项目软件部分较为简单,主要包括树莓派上主控程序和Arduino上底层程序。具体程序见附件。
五、实物图片
展示几张装配和试验过程中的航行器图片。
上面两张是最后成品机器人图片。当然过程十分艰辛,这是我们的试验场地...
六、演示视频
为了更好地进行演示,我们编写了上位机程序,然后对整个系统进行了联机运行
七、附件
代码
- #-*-coding:utf-8-*
- import serial
- import time
- import RPi.GPIO as gpio
- ser=serial.Serial("/dev/ttyUSB0",9600)#msg
- ser_ard=serial.Serial("/dev/ttyUSB1",9600)#arduino
- ser2=serial.Serial("/dev/ttyUSB2",9600)#up
- def main():
- time.sleep(0.5)
- ser.write("AT+CMGD=1\r")
- time.sleep(0.5)
- while True:
- count2=ser2.inWaiting()
- if count2 != 0:
- recv2=ser2.read(count2)
- ser2.write(recv2)
- ser_ard.write(recv2)
- print recv2
- ser2.flushInput()
- time.sleep(0.1)
- ser.write("AT+CMGR=1\r")
- count=ser.inWaiting()
- if count != 0:
- recv=ser.read(count)
- print 'read1' + recv
- if (len(recv) >= 80):# and (recv.split('\r\n')[0][0:9] == 'AT+CMGR=1'):
- count_p=recv.split('\r\n')
- header="*CTL,"
- end="^"
- print '!!!!!!!!countp0'+count_p[2][0:3]
- #count_to_ard = str(header) + count_p[3] + str(end)
- count_to_ard = '*CTL,' + count_p[2][0:11] + '^'
- ser_ard.write(count_to_ard)
- time.sleep(0.5)
- ser.write("AT+CMGD=1\r")
- time.sleep(0.5)
- #time.sleep(0.5)
- #ser.write("AT+CMGD=1\r")
- time.sleep(0.1)
- ser.flushInput()
- time.sleep(0.1)
- if __name__== '__main__':
- try:
- main()
- except KeyboardInterrupt:
- if ser2 != None:
- ser2.close()
- if ser_ard != None:
- ser_ard.close()
- if ser != None:
- ser.close()
复制代码 |