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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

發布時間:2024/7/23 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

如您對本文有疑問或者有任何想說的,請點擊進行留言回復,萬千網友為您解惑!

總結

以上是生活随笔為你收集整理的python小车行驶路线图_基于opencv-Python小车循线学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

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