lou 发表于 2020-4-30 15:22:15

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

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



一、项目简介
海洋占据着地球大部分表面积,蕴藏着大量的资源;且相对于人类对太空的认知,我们对水下世界的认识少之又少。怀着对这片神秘深蓝区域的好奇,我们开发了一款无人水下机器人(UUV)。通常来讲,根据是否由人通过机器人拖拽的线缆进行实时控制,我们可以将无人水下机器人分为遥控水下机器人(ROV)和自主水下机器人(AUV)。本次项目在概念上进行创新,设计了一种具有长续航能力的混合式水下机器人(ARV)。
二、工作环境
本次项目使用经典的Raspbian-Wheezy系统,通过显示器进行初始化设置(这部分就不详细介绍了,网上教程一大堆,推荐本书《爱上Raspberry Pi》,入门超好用)。后面为了开发方便,使用WiFi+putty+VNC+ftp进行调试和程序上传。软件部分主要使用自带shell和Python 2.7.
三、系统搭建
硬件方面,本机器人使用两个无刷直流电机作为推进器,可进行水平面内的直行和转向。机器人腹部有水舱,通过水阀进行吞/吐水操作进而实现上浮下潜。为提高机器人的搭载能力,充分发挥其水下试验平台作用,为后续搭载不同实验设备做准备,其背部设计为平板,便于安放设备。头部带有通讯舱,内含433M通讯模块。前胸部有电器仓,放有主控系统(树莓派)和电机驱动板(Arduino)。为节约成本,本机器人使用有机玻璃搭建了主体结构。本次项目采用遥控+自主双模式混合方案。遥控过程中通过433M模块与陆地控制端进行通讯。通过提前商定好的通讯协议,岸上通过无线电台给机器人发送控制指令,机器人获取后进行相应动作(直行,转向,上浮/下潜)。机器人接收指令后也会向岸上操作员返回成功信号。机器人默认处于遥控状态,当收到操作员发出的自主运动指令后,根据预设的动作组进行自主动作,结束后返回遥控模式。
四、软件设计
本次项目软件部分较为简单,主要包括树莓派上主控程序和Arduino上底层程序。具体程序见附件。
五、实物图片
展示几张装配和试验过程中的航行器图片。


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


六、演示视频
为了更好地进行演示,我们编写了上位机程序,然后对整个系统进行了联机运行
27
七、附件
代码
#-*-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') == 'AT+CMGR=1'):
                                       count_p=recv.split('\r\n')
                              header="*CTL,"
                              end="^"
                              print '!!!!!!!!countp0'+count_p
                              #count_to_ard = str(header) + count_p + str(end)      
                              count_to_ard = '*CTL,' + count_p + '^'
                              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()
页: [1]
查看完整版本: 基于树莓派3的无人水下机器人设计