我的一个树莓派小车项目
生活随笔
收集整理的這篇文章主要介紹了
我的一个树莓派小车项目
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
如何使用該程序進行開發
1.尋找串口
查看識別串口號
ls -l /dev/tty*找到相應的串口并在程序里修改
ser = serial.Serial("/dev/ttyUSB0",9600)2.攝像頭
括號里是0還是1取決于攝像頭是內部還是外部
不確定的話就挨著嘗試,反正就是二選一嘛
#視頻捕獲口:1為本機筆記本,0為外接攝像頭 #視頻捕獲:只有本機一個攝像頭,默認為0 cap = cv2.VideoCapture(0)3.設置某一程序開機自啟
意思就是:樹莓派一開機,相應的程序就會自動運行起來。
4.程序環境
上位機:樹莓派4b
下位機:stm32大疆a板
5.主程序使用邏輯
主程序一直在死循環里。
每次循環都會讀串口寄存器傳來的數值,這里不能使用阻塞型串口,要使用延時三秒的串口進行工作,模仿硬件的串口寄存器原理
根據相應的數值進行if語句的判斷,進而執行相應的命令
板子初始發送1
樹莓派執行二維碼操作,返回結果a123321z
隨后板子收到這個結果發送5,樹莓派停止工作
隨后板子發送2或者3或者4
樹莓派進行顏色識別,返回識別結果ggggz或rrrrz或者bbbbz
隨后板子收到這個結果發送5,樹莓派停止工作
周而復始,循環往復
接下來是主程序
''' 這是肖巨龍物流車的上位機程序 此程序運行環境是 樹莓派4b 下位機是大疆A板,經過USB轉ttl模塊,識別出串口號為"/dev/ttyUSB0" 查找串口號需要使用 ls -l /dev/ttyUSB* 命令 ''' import cv2 import numpy as np import math import time import imutils from imutils.video import VideoStream import numpy import pyzbar.pyzbar as pyzbar import argparse import datetime from PIL import Image,ImageEnhance import serial import binasciidef port_open():# # ser.port = 12345 #設置端口號# ser.baudrate = 9600 #設置波特率# ser.bytesize = 8 #設置數據位# ser.stopbits = 1 #設置停止位# ser.parity = "N" #設置校驗位if (ser.isOpen()==False):ser.open()if(ser.isOpen()):print("打開成功")else:print("打開失敗")def port_close():if (ser.isOpen()):ser.close()if (ser.isOpen()==False):print("關閉成功")else:print("關閉失敗")def send(send_data):if (ser.isOpen()==False):port_open()if (ser.isOpen()):ser.write(send_data.encode('utf-8')) #utf-8 編碼發送#ser.write(binascii.a2b_hex(send_data)) #Hex發送print("發送成功",send_data)else:print("發送失敗")port_close()def barcode_recog():print("開始二維碼識別")vs = VideoStream(0).start() time.sleep(2.0)flag=False#后面的break用到這一條件while True:# 循環來自視頻流的幀frame = vs.read()frame = imutils.resize(frame, width=1000)#找到視頻中的條形碼,并解析所有條形碼barcodes = pyzbar.decode(frame)# 循環所有檢測到的條形碼for barcode in barcodes:# 提取條形碼的邊界框位置# 繪出圍繞圖像上條形碼的邊界框(x, y, w, h) = barcode.rectcv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)# 條形碼數據為字節對象# 需要先把它轉換成字符串barcodeData = barcode.data.decode("utf-8")#barcodeData二維碼信息barcodeType = barcode.type#barcodeType二維碼信息的類別#print(barcodeData)#輸出二維碼信息barcodeData = list(barcodeData)barcodeData.pop(3)barcodeData = ''.join(barcodeData)barcodeData = 'a' + barcodeData + 'z'print(barcodeData)send(barcodeData)if barcodeData != "":flag=Truecv2.imshow("barcode", frame)#圖形化窗口展示結果cv2.waitKey(5)if flag :#跳出while循環print("二維碼函數結束")time.sleep(2)#用兩秒時間來展示圖形化窗口結果breakvs.stop()cv2.destroyAllWindows()def barcode_recog_new():print("[INFO] starting video stream...")vs = VideoStream(0).start()time.sleep(2.0)flag=False#后面的break用到這一條件 # 循環來自視頻流的幀# 抓取來自單線程視頻流的幀, # 將大小重新調整為最大寬度400像素frame = vs.read()frame = imutils.resize(frame, width=1000)# 找到視頻中的條形碼,并解析所有條形碼barcodes = pyzbar.decode(frame)# 循環所有檢測到的條形碼for barcode in barcodes:# 提取條形碼的邊界框位置# 繪出圍繞圖像上條形碼的邊界框(x, y, w, h) = barcode.rectcv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)# 條形碼數據為字節對象# 需要先把它轉換成字符串barcodeData = barcode.data.decode("utf-8")#barcodeData二維碼信息barcodeType = barcode.type#barcodeType二維碼信息的類別barcodeData = list(barcodeData)barcodeData.pop(3)barcodeData = ''.join(barcodeData)barcodeData = 'a' + barcodeData + 'z'print(barcodeData)#輸出二維碼信息send(barcodeData)if barcodeData != "":flag=Truecv2.imshow("Barcode Scanner", frame)#圖形化窗口展示結果cv2.waitKey(5)if flag :#跳出while循環print("識別成功,解析成功")#time.sleep(2)#用兩秒時間來展示圖形化窗口結果cv2.destroyAllWindows()vs.stop()def recognizeByColor(ball_color):#視頻捕獲口:1為本機筆記本,0為外接攝像頭#視頻捕獲:只有本機一個攝像頭,默認為0#cap = cv2.VideoCapture(0)ret, frame = cap.read()frame = imutils.resize(frame, width=300)frame = frame[60:120, 120:200]gs_frame = cv2.GaussianBlur(frame, (5, 5), 0) # 高斯模糊hsv = cv2.cvtColor(gs_frame, cv2.COLOR_BGR2HSV) # 轉化成HSV圖像erode_hsv = cv2.erode(hsv, None, iterations=2) # 腐蝕 粗的變細inRange_hsv = cv2.inRange(erode_hsv, color_dist[ball_color]['Lower'], color_dist[ball_color]['Upper'])cnts = cv2.findContours(inRange_hsv.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]cv2.imshow("color", frame)#圖形化窗口展示結果cv2.waitKey(5)if(len(cnts)==0):time.sleep(0.5) #節省系統開銷print("無該顏色")return Falseelse:#definite the "color" acording to the color recognizedif ball_color == 'blue':color="bbbbz"print(color)#port_open()send(color)#port_close()if ball_color=='red':color="rrrrz"print(color)#port_open()send(color)#port_close()if ball_color=='green':color="ggggz"print(color)#port_open()send(color)#port_close()#下面四句話展示矩形框選效果,正式比賽時可以去掉,節省資源c = max(cnts, key=cv2.contourArea)rect = cv2.minAreaRect(c)box = cv2.boxPoints(rect)cv2.drawContours(frame, [np.int0(box)], -1, (0, 255, 255), 2)cv2.imshow('color', frame)cv2.waitKey(1)return Truevs.stop()cv2.destroyAllWindows()#主程序運行前的初始化 ser = serial.Serial("/dev/ttyUSB0",9600,timeout=3)#這一語句默認會打開串口 recogTime = 5 #識別時間 gapTime = 3 #機械臂旋轉調整時間 a=1 color_dist = {'red': {'Lower': np.array([156, 43, 60]), 'Upper': np.array([180, 255, 255])},'blue': {'Lower': np.array([100, 43, 46]), 'Upper': np.array([124, 255, 255])},'green': {'Lower': np.array([35, 43, 35]), 'Upper': np.array([77, 255, 255])},}while True:port_open()time.sleep(2)print("等待曾巨發送...")us=ser.read(10)long_of_us=len(us)print("信號length:",long_of_us)if (long_of_us):us=us[0]#因為是字節的方式,所以取第一個字節else:us=1print("這是第 ",a," 次while循環")a=a+1print("曾巨發送過來的是:",us)if us==2 or us==3 or us==4:cap = cv2.VideoCapture(0)#cv2.namedWindow('color', cv2.WINDOW_AUTOSIZE)#cv2.namedWindow('color', cv2.WINDOW_FREERATIO)for i in "pa":ball_color = 'green'#print("aaaa")time0 = time.time()print("識別綠色")while time.time()-time0 < recogTime:#表示這個while循環運行五秒ret, frame = cap.read()if ret:#該條件表示讀取到攝像頭if frame is not None:#該條件表示可以讀取攝像頭的畫面if(recognizeByColor(ball_color)):#如果顏色識別函數返回tureprint("成功識別綠色")breakelse:print("無畫面")else:print("無法讀取攝像頭!")ball_color = 'red'#print("bbbb")time1 = time.time()time.sleep(gapTime)print("識別紅色")while time.time()-time1 < recogTime:ret, frame = cap.read()if ret:if frame is not None:if(recognizeByColor(ball_color)):print("成功識別紅色")breakelse:print("無畫面")else:print("無法讀取攝像頭!")ball_color = 'blue'#print("cccc")time2 = time.time()time.sleep(gapTime)print("識別藍色")while time.time()- time2 < recogTime:ret, frame = cap.read()if ret:if frame is not None:if(recognizeByColor(ball_color)):print("成功識別藍色")breakelse:print("無畫面")else:print("無法讀取攝像頭!")cap.release()if us==0x01:barcode_recog_new()if us==0x05:cv2.destroyAllWindows()time.sleep(5)if (us!=0x01) and (us!=0x02) and (us!=0x03) and (us!=0x04) and (us!=0x05):send('a123321z')send('a123321z')print('串口通信有誤,受到干擾')us=0x04總結
以上是生活随笔為你收集整理的我的一个树莓派小车项目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mAP与IOU的简单介绍
- 下一篇: numpy方法读取加载mnist数据集