日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

我的一个树莓派小车项目

發布時間:2024/7/23 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我的一个树莓派小车项目 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如何使用該程序進行開發

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

總結

以上是生活随笔為你收集整理的我的一个树莓派小车项目的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。