找回密码
 立即注册

QQ登录

只需一步,快速开始

基于树莓派3的无人水下机器人设计




一、项目简介

海洋占据着地球大部分表面积,蕴藏着大量的资源;且相对于人类对太空的认知,我们对水下世界的认识少之又少。怀着对这片神秘深蓝区域的好奇,我们开发了一款无人水下机器人(UUV)。通常来讲,根据是否由人通过机器人拖拽的线缆进行实时控制,我们可以将无人水下机器人分为遥控水下机器人(ROV)和自主水下机器人(AUV)。本次项目在概念上进行创新,设计了一种具有长续航能力的混合式水下机器人(ARV)。

二、工作环境

本次项目使用经典的Raspbian-Wheezy系统,通过显示器进行初始化设置(这部分就不详细介绍了,网上教程一大堆,推荐本书《爱上Raspberry Pi》,入门超好用)。后面为了开发方便,使用WiFi+putty+VNC+ftp进行调试和程序上传。软件部分主要使用自带shell和Python 2.7.

三、系统搭建

硬件方面,本机器人使用两个无刷直流电机作为推进器,可进行水平面内的直行和转向。机器人腹部有水舱,通过水阀进行吞/吐水操作进而实现上浮下潜。为提高机器人的搭载能力,充分发挥其水下试验平台作用,为后续搭载不同实验设备做准备,其背部设计为平板,便于安放设备。头部带有通讯舱,内含433M通讯模块。前胸部有电器仓,放有主控系统(树莓派)和电机驱动板(Arduino)。为节约成本,本机器人使用有机玻璃搭建了主体结构。
本次项目采用遥控+自主双模式混合方案。遥控过程中通过433M模块与陆地控制端进行通讯。通过提前商定好的通讯协议,岸上通过无线电台给机器人发送控制指令,机器人获取后进行相应动作(直行,转向,上浮/下潜)。机器人接收指令后也会向岸上操作员返回成功信号。机器人默认处于遥控状态,当收到操作员发出的自主运动指令后,根据预设的动作组进行自主动作,结束后返回遥控模式。

四、软件设计

本次项目软件部分较为简单,主要包括树莓派上主控程序和Arduino上底层程序。具体程序见附件。

五、实物图片

展示几张装配和试验过程中的航行器图片。

110.jpg

111.jpg

上面两张是最后成品机器人图片。当然过程十分艰辛,这是我们的试验场地...

112.jpg

113.jpg

六、演示视频

为了更好地进行演示,我们编写了上位机程序,然后对整个系统进行了联机运行


七、附件

代码  

  1. #-*-coding:utf-8-*
  2. import serial
  3. import time
  4. import RPi.GPIO as gpio
  5. ser=serial.Serial("/dev/ttyUSB0",9600)#msg
  6. ser_ard=serial.Serial("/dev/ttyUSB1",9600)#arduino
  7. ser2=serial.Serial("/dev/ttyUSB2",9600)#up
  8. def main():
  9.         time.sleep(0.5)
  10.         ser.write("AT+CMGD=1\r")
  11.         time.sleep(0.5)
  12.         while True:
  13.                 count2=ser2.inWaiting()
  14.                 if count2 != 0:
  15.                         recv2=ser2.read(count2)
  16.                         ser2.write(recv2)
  17.                         ser_ard.write(recv2)
  18.                         print recv2
  19.                 ser2.flushInput()
  20.                 time.sleep(0.1)
  21.                 ser.write("AT+CMGR=1\r")
  22.                 count=ser.inWaiting()
  23.                 if count != 0:
  24.                         recv=ser.read(count)
  25.                         print 'read1' + recv
  26.                         if (len(recv) >= 80):# and (recv.split('\r\n')[0][0:9] == 'AT+CMGR=1'):
  27.                                        count_p=recv.split('\r\n')
  28.                                 header="*CTL,"
  29.                                 end="^"
  30.                                 print '!!!!!!!!countp0'+count_p[2][0:3]
  31.                                 #count_to_ard = str(header) + count_p[3] + str(end)        
  32.                                 count_to_ard = '*CTL,' + count_p[2][0:11] + '^'
  33.                                 ser_ard.write(count_to_ard)
  34.                                 time.sleep(0.5)
  35.                                 ser.write("AT+CMGD=1\r")
  36.                                 time.sleep(0.5)
  37.                 #time.sleep(0.5)
  38.                 #ser.write("AT+CMGD=1\r")               
  39.                 time.sleep(0.1)
  40.                 ser.flushInput()
  41.                 time.sleep(0.1)
  42. if __name__== '__main__':
  43.         try:
  44.                 main()
  45.         except KeyboardInterrupt:
  46.                 if ser2 != None:
  47.                         ser2.close()
  48.                 if ser_ard != None:
  49.                         ser_ard.close()
  50.                 if ser != None:
  51.                         ser.close()
复制代码
分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 立即注册