我的一个树莓派小车项目

如何使用该程序进行开发

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/489224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2G---5G与未来天线技术

本文来源&#xff1a;滤波器过去二十年&#xff0c;我们见证了移动通信从1G到4G LTE的转变。在这期间&#xff0c;通信的关键技术在发生变化&#xff0c;处理的信息量成倍增长。而天线&#xff0c;是实现这一跨越式提升不可或缺的组件。按照业界的定义&#xff0c;天线是一种变…

python操作csv文件第7行开始的数据_Python教程-Python读写CSV文件

前言 本教程学习在Python中使用CSV文件。CSV&#xff08;逗号分隔值&#xff09;格式是在电子表格和数据库中使用的非常流行的导入和导出格式。Python语言包含该模块&#xff0c;该模块具有用于读取和写入CSV格式的数据的类。csv 使用csv.reader&#xff08;&#xff09;读取CS…

leancloud的技术面试指南

面试流程 通常我们的面试分为一次电话面试和一次现场面试。在少数难以决定的时候会多增加一轮电话或现场面试。 面试中的沟通问题 尊重候选人&#xff0c;平等交流&#xff1a;让候选人自我介绍前&#xff0c;先介绍自己和公司&#xff1b;交流的时候双方处于平等的地位&#x…

基于STM32的高精度频率计设计

前言 本文记录了博主完成的一个课设作品&#xff08;学分为3.5分&#xff09;&#xff0c;题目需要利用ARM做出一个高精度频率计。具体要求如下&#xff1a; 1&#xff09;实现对10M以内数字信号频率的高精度测量&#xff0c;频率测量误差不大于0.01%&#xff1b; 2&#xff0…

数学的意义(一)

来源&#xff1a; 数学职业家数学既是一种文化、一种“思想的体操”&#xff0c;更是现代理性文化的核心。马克思说&#xff1a;“一门科学只有当它达到了能够成功地运用数学时&#xff0c;才算真正发展了。”在前几次科技革命中&#xff0c;数学大都起到先导和支柱作用。我们不…

node都会 react_学react需要node吗

学react需要node吗学习react不需要安装node&#xff0c;react.js和node.js没有太大的关联性。完全可以独立的学习react.js。但我们通常都会使用react提供的脚手架搭建项目结构&#xff0c;这个就需要用到node了。但node.js只需要会它的npm安装包就可以了。一、常用工具介绍1. n…

.Net Core 学习资料

官方网站&#xff1a;https://www.microsoft.com/net/core#windows 官方文档&#xff1a;https://docs.asp.net/en/latest/intro.html中文翻译小组&#xff1a;http://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-index.html发布到Jexus&#xff1a;http://www.cnblogs.com/gao…

python弹球小游戏程序_Python实现弹球小游戏

本文主要给大家分享一个实战项目&#xff0c;通过python代码写一款我们儿时大多数人玩过的游戏---小弹球游戏。只不过当时&#xff0c;我们是在游戏机上玩&#xff0c;现在我们通过运行代码来玩&#xff0c;看看大家是否有不一样的体验&#xff0c;是否可以重温当年的乐趣呢&am…

强化学习决策生成-以 Q-learning 为例

强化学习决策生成-以 Q-learning 为例

【数据中台】关于数据中台系统,需要了解哪些技术?

来源&#xff1a;产业智能官国家建材大数据研究中心今天让我们全面解读中台&#xff0c;包括企业为什么要平台化&#xff0c;目前中台都有哪些形式&#xff0c;实施中台系统的优势、面临的问题以及建议都有哪些&#xff1f;中台这个概念早期是由美军的作战体系演化而来的&#…

python自动拨号_Python自动连接ssh的方法

作者&#xff1a;Sephiroth 字体&#xff1a; 类型&#xff1a;转载这篇文章主要介绍了Python自动连接ssh的方法,实例分析了基于Python实现连接ssh的技巧,具有一定参考借鉴价值,需要的朋友可以参考下本文实例讲述了Python自动连接ssh的方法。分享给大家供大家参考。具体实现方法…

数据库 proc编程七

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include "sqlca.h"//定义char [20]数组类型 typedef char ChararrType[20];//oracle外部变量类型string类似varchar2类型&#xff0c;是以\0结尾的…

anaconda+cuda+cudnn+pytorch安装踩坑大全

windows环境下anacondapycharmcudacudnnpytorch安装踩坑大全anaconda安装pycharm安装cudacudnnpytorchgym环境安装anaconda安装 安装时不要勾选添加环境变量&#xff0c;完事后自己去手动添加。添加时注意是用户变量还是系统变量&#xff0c;我这个就搞错了&#xff0c;导致重…

什么是启发式?什么是产生式?

来源&#xff1a;人机与认知实验室一般而言&#xff0c;机器常常被设定从已知推未知&#xff0c;而人们不时会从未知&#xff08;假设&#xff09;推未知&#xff0c;特殊情形下也有从未知推已知的&#xff0c;这些推导中常见的有产生式和启发式&#xff0c;那么究竟什么是产生…

Maven项目错误解决小结

http://blog.csdn.net/typa01_kk/article/details/49185759 Maven项目错误解决小结 注&#xff1a;整理错误&#xff0c;不喜欢为了一个小问题&#xff0c;占篇幅&#xff0c;所以请CtrlF自己查看&#xff0c;定位问题&#xff0c;愿为解决. 注&#xff1a;网络上的错误解决经验…

python的pillow给图片加文字_Python-Pillow库给图片添加文字、水印

apt-get install -y python-PIL在图片右下角添加文字&#xff1a;Python# -*- coding: utf-8 -*-from PIL import Image, ImageDraw, ImageFont# 指定要使用的字体和大小&#xff1b;/Library/Fonts/是macOS字体目录&#xff1b;Linux的字体目录是/usr/share/fonts/font Image…

python交并补_python两个列表求交、并、差

在python中&#xff0c;如果有两个数组&#xff0c;分别要求交集&#xff0c;并集与差集&#xff0c;怎么实现比较方便呢&#xff1f; 当然最容易想到的是对两个数组做循环&#xff0c;即写两个for循环来实现。这种写法大部分同学应该都会&#xff0c;而且也没有太多的技术含量…

论如何快速完成文件汇总和统计任务

论如何快速完成文件汇总和统计任务 咱就是说&#xff0c;大学生和研究生当个班委&#xff0c;一天天杂事可真多&#xff0c;尤其收excel表以及统计人数等&#xff0c;费时费力。那么如何快速解决这些问题&#xff0c;就是我们今天这篇博文的主要目标。 拿我个人的任务来说&am…

可怕!贺建奎论文手稿意外曝光!基因编辑实验充满谎言

来源&#xff1a;学研加中国双胞胎的基因编辑可能已经失败&#xff0c;并产生了意想不到的突变。这是科学家们阅读了原南方科技大学副教授贺建奎论文手稿后&#xff0c;得出的结论。贺建奎基因编辑婴儿事件2018年11月26日&#xff0c;一则《世界首例免疫艾滋病的基因编辑婴儿在…

l360废墨收集垫清零_知识分享003:EPSON L360打印机出现故障-废墨计数清零

故障现象&#xff1a;客户的EPSON L360打印机出现故障&#xff0c;纸张和墨水报警灯交替闪烁。无法打印原因分析&#xff1a;确定纸张和墨水的是处于正常状态&#xff0c;上网查了&#xff0c;可能是废墨收集到达了上限。需要做清零处理。解决方法&#xff1a;根据这个型号EPSO…