python小车行驶路线图_基于opencv-Python小车循线学习笔记

基于opencv-Python小车循线学习笔记

加入摄像头模块,让小车实现自动循迹行驶

思路为:摄像头读取图像,进行二值化,将白色的赛道凸显出来

选择下方的一行像素,黑色为0,白色为255

找到白色值的中点

目标中点与标准中点(320)进行比较得出偏移量

根据偏移量,采用PID控制器来控制小车左右轮的转速

# coding:utf-8

import RPi.GPIO as gpio

import time

import cv2

import numpy as np

def sign(x):

if x>0:

return 1.0

else:

return -1.0

# 定义引脚

pin1 = 16

#pin2 = 12

pin3 = 22

#pin4 = 18

# 设置GPIO口为BOARD编号规范

gpio.setmode(gpio.BOARD)

# 设置GPIO口为输出

gpio.setup(pin1, gpio.OUT)

#gpio.setup(pin2, gpio.OUT)

gpio.setup(pin3, gpio.OUT)

#gpio.setup(pin4, gpio.OUT)

# 设置PWM波,频率为500Hz

pwm1 = gpio.PWM(pin1, 500)

#pwm2 = gpio.PWM(pin2, 500)

pwm3 = gpio.PWM(pin3, 500)

#pwm4 = gpio.PWM(pin4, 500)

# pwm波控制初始化

pwm1.start(0)

#pwm2.start(0)

pwm3.start(0)

#pwm4.start(0)

# center定义

center_now = 320

# 打开摄像头,图像尺寸640*480(长*高),opencv存储值为480*640(行*列)

cap = cv2.VideoCapture(0)

# PID 初始数据

error = [0.0] * 3

adjust = [0.0] * 3

# PID 参数配置

kp = 1.5

ki = 0.4

kd = 0.1

target = 320

while (1):

ret, frame = cap.read()

# 转化为灰度图

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

# 大津法二值化

retval, dst = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)

# 膨胀,白区域变大

dst = cv2.dilate(dst, None, iterations=2)

# # 腐蚀,白区域变小

# dst = cv2.erode(dst, None, iterations=6)

# 单看第400行的像素值s

color = dst[400]

# 找到白色的像素点个数

white_count = np.sum(color == 255)

# 找到白色的像素点索引

white_index = np.where(color == 255)

# 防止white_count=0的报错

if white_count == 0:

white_count = 1

# 找到黑色像素的中心点位置

center_now = (white_index[0][white_count - 1] + white_index[0][0]) / 2

# 计算出center_now与标准中心点的偏移量

direction = center_now - 320

print(direction)

# 停止

if abs(direction) > 250:

pwm1.ChangeDutyCycle(0)

# pwm2.ChangeDutyCycle(0)

pwm3.ChangeDutyCycle(0)

# pwm4.ChangeDutyCycle(0)

# 更新PID误差

error[0] = error[1]

error[1] = error[2]

error[2] = center_now - target

# 更新PID输出(增量式PID表达式)

adjust[0] = adjust[1]

adjust[1] = adjust[2]

# adjust(k+2) = adjust(k+1) + kp * (e(k+2) - e(k+1)) + ki * e(k+2) + kd * (e(k+2)-2*e(k+1)+e(k))

adjust[2] = adjust[1] \

+ kp*(error[2] - error[1]) \

+ ki*error[2] \

+ kd*(error[2] - 2*error[1] + error[0]);

# 饱和输出限制在70绝对值之内

if abs(adjust[2]) > 70:

adjust[2] = sign(adjust[2]) * 70

# 执行PID

# 右转

elif adjust[2] > 0:

pwm1.ChangeDutyCycle(30+ adjust[2])

# pwm2.ChangeDutyCycle(0)

pwm3.ChangeDutyCycle(30)

# pwm4.ChangeDutyCycle(0)

# 左转

elif adjust[2] < 0:

pwm1.ChangeDutyCycle(30)

# pwm2.ChangeDutyCycle(0)

pwm3.ChangeDutyCycle(30 + abs(adjust[2]))

# pwm4.ChangeDutyCycle(0)

if cv2.waitKey(1) & 0xFF == ord('q'):

break

else:

time.sleep(0.05)

# 释放清理

cap.release()

cv2.destroyAllWindows()

pwm1.stop()

#pwm2.stop()

pwm3.stop()

#pwm4.stop()

gpio.cleanup()

本文地址:https://blog.csdn.net/weixin_45215354/article/details/107153899

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

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

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

相关文章

python 字符串大小写转换 其它不变_python字符串大小写如何转换

平常开发过程中对字符串的一些操作&#xff1a;#字母大小写转换#首字母转大写#去除字符串中特殊字符(如&#xff1a;_&#xff0c;.&#xff0c;,&#xff0c;;)&#xff0c;然后再把去除后的字符串连接起来#去除hello_for_our_world中的_,并且把从第一个_以后的单词首字母大写…

java读取文件夹_Java读取某个文件夹下的所有文件(支持多级文件夹)

packagecom.vocy.water.batch;importjava.io.FileNotFoundException;importjava.io.IOException;importjava.io.File;public classCopyOfReadFile {publicCopyOfReadFile() {}/*** 读取某个文件夹下的所有文件(支持多级文件夹)*/public static boolean readfile(String filepat…

武汉大学信息管理学院java上机考试_java上机试题

展开全部import javax.swing.*;import java.awt.*;import java.awt.event.*;public class Main extends JFrame implements ActionListener{LabledText upperBase new LabledText("上底&#xff1a;"),62616964757a686964616fe59b9ee7ad9431333337373561lowerBase …

python中cmd全称_【转】Python中执行cmd的三种方式

原文链接&#xff1a;http://blog.csdn.net/menglei8625/article/details/7494094目前我使用到的python中执行cmd的方式有三种&#xff1a;1. 使用os.system("cmd")这是最简单的一种方法&#xff0c;特点是执行的时候程序会打出cmd在linux上执行的信息。使用前需要im…

数据库字段 到类 java bean_将数据库中表的字段自动转换为javaBean实体类

具体代码如下&#xff1a;package param;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.Resul…

el-drawer点击的时候为什么有边框_剪映教学之视频拍摄加剪辑【一】:出视频上下黑色边框模糊效果,视频广告配音...

抖音小视频已经成为风靡全国的一个app了&#xff0c;很多人都喜欢看抖音来打发时间&#xff0c;而经常看小视频的应该都见到过这种现象&#xff0c;就是有一些小视频我们在观看的时候&#xff0c;发现这个小视频的上下都有黑色边框或者模糊的效果&#xff0c;实际这都是一些拍摄…

java swt 下拉列表_求助:SWT 下拉列表

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼public class HelloWorldCombo {//下拉列表项 private static final String[] ITEMS { "Alpha", "Bravo", "Charlie", "Delta","Echo", "Foxtrot", "Golf"…

python html转换为普通文本_将HTML表转换为可读的纯文本的Python解决方案

用这个怎么样&#xff1a;但是&#xff0c;使用collections.OrderedDict()而不是简单字典来保持顺序。有了字典之后&#xff0c;很容易从中获取和格式化文本&#xff1a;使用Colt 45溶液&#xff1a;import xml.etree.ElementTreeimport collectionss """\Heig…

java synchronized 静态_Java之Synchronized修饰实例方法和静态方法

一、Synchronized修饰实例方法&#xff0c;实际上是对调用该方法的对象加锁&#xff0c;俗称“对象锁”情况一&#xff1a;​同一个对象在两个线程中分别访问该对象的两个同步实例方法结果&#xff1a;会产生互斥​原因&#xff1a;因为锁针对的是对象&#xff0c;当对象调用​…

网站漏洞扫描工具_如何实现免费网站漏洞扫描?推荐一款神器给你

网站漏洞想必有网站的人都比较了解&#xff0c;想要了解网站漏洞&#xff0c;最好的办法就是给网站做一次漏洞扫描&#xff0c;网站漏扫产品比较多&#xff0c;费用也从几十/次到几千/次不等&#xff0c;但是对于我这种小企业来说&#xff0c;几千一次也是非常贵的&#xff0c;…

java mvc设计模式_JavaEE知识点:MVC设计模式

MVC全名是Model View Controller&#xff0c;是模型(model)-视图(view)-控制器(controller)的缩写&#xff0c;是一种软件设计典范&#xff0c;用一种业务逻辑、数据、界面显示分离的方法组织代码&#xff0c;将业务逻辑聚集到一个部件里面&#xff0c;在改进和个性化定制界面及…

mysql 导出数据字典_操作MySQL?这个库比pymysql香一百倍

原创&#xff1a; 阿亮 Python极客社区操作MySQL&#xff0c;我们都习惯于用pymsq&#xff0c;基本流程就是创建连接创建游标执行SQL关闭连接代码是这样的import pymysql# 1.创建连接conn pymysql.connect(host127.0.0.1, port3306, userroot, passwordroot, charsetutf8)# 2.…

java putifabsent_java8中Map的一些骚操作总结

一 前言本篇内容是关于 map 新特性的一些方法使用上的介绍&#xff0c;如果有不足之处欢迎补充&#xff01;&#xff01;二 map新特性关于以下函数式编程的函数的计算知识追寻者都使用 简单字符串代替了&#xff0c;参数无非就是Key,value&#xff1b;2.1 forEachforEach迭代&a…

python对操作系统要求_python之--并发编程__操作系统

操作系统1.操作系统的发展史1)手工操作 —— 穿孔卡片1946年第一台计算机诞生--20世纪50年代中期&#xff0c;计算机工作还在采用手工操作方式。此时还没有操作系统的概念。程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机&#xff0c;然后启动输入机把程序和数据输…

macd 公式 java_EMA指标和MACD指标的JAVA语言实现

最近做的项目需要实现EMA和MACD&#xff0c;但苦于网上没有具体的实现算法。所以自己尝试着编写了一套。已经和通达信等主流股票分析软件核对过结果&#xff0c;并将其开源放在GitHub上&#xff0c;含Junit 测试用例。GitHub地址&#xff1a;https://github.com/wizardbyron/fi…

java 注解 target_详解JDK 5 Annotation 注解之@Target的用法

前言目前&#xff0c;越来越多的架构设计在使用注解&#xff0c;例如spring3.0、struts2等框架。让我们先来看看注解的定义。如下是一段使用了JDK 5 Annotation Target的代码&#xff1a;Target({ElementType.METHOD})Retention(RetentionPolicy.RUNTIME)InheritedDocumentedpu…

python现在时间减去过去时间等于20分钟怎么写_获取当前时间减去10分钟的话SQL语句怎么写...

展开全部对于每个类型拥有的值范围以及并且指定日期e68a84e8a2ad62616964757a686964616f31333363353834何时间值的有效格式的描述见7.3.6 日期和时间类型。这里是一个使用日期函数的例子。下面的查询选择了所有记录&#xff0c;其date_col的值是在最后30天以内&#xff1a;mysq…

java 并发测试main方法_Java并发测试

要求&#xff1a;模拟200个设备&#xff0c;尽量瞬间并发量达到200。思路第一种&#xff1a;线程池模拟200个线程——wait等待线程数达200——notifyAll唤醒所有线程第二种&#xff1a;线程池模拟200个线程——阻塞线程——达到200条件释放比较两种方案都可以实现瞬时高并发的模…

pajek软件使用方法_使用Jco远程连接SAP软件系统方法

作者&#xff1a;JongWill声明&#xff1a;本文章仅用于SAP软件的应用与学习&#xff0c;不代表SAP公司。(注&#xff1a;文中所示截图来源SAP软件&#xff0c;相应著作权归SAP所有。)SAP公司的ERP系统是一套成熟的套装软件&#xff0c;它是博大精深的&#xff0c;但也不是无所…

linux mysql 安装innodb_在ubuntu Mysql 5.7 安装InnoDB Memcached 插件

在ubuntu Mysql 5.7 安装Memcached 插件参考&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/innodb-memcached-setup.htmlMySQL 5.7 Reference Manual / The InnoDB Storage Engine / InnoDB memcached Plugin15.20 InnoDB memcached Plugin15.20.1 Benefits of the Inn…