• 大小: 5KB
    文件类型: .py
    金币: 1
    下载: 0 次
    发布日期: 2021-05-10
  • 语言: Python
  • 标签: 树莓派  opencv  巡线  

资源简介

通过opencv完成视觉巡线。 在白色地面上利用摄像头检测黑色的车道线,完成巡线任务。 将小车的行驶速度分为四个等级。当小车行驶在直道上会逐渐加速,当加到最高速时保持匀速行驶。当检测到弯道时小车会立即减速,再根据弯道大小调整速度,使得小车在保证行驶速度的同时能够安全转过弯道。

资源截图

代码片段和文件信息

import RPi.GPIO as GPIO
import time 
import cv2 
import numpy as np 

#小车电机引脚定义(BCM编码)(TB6612FNG驱动芯片)
IN1 = 20
IN2 = 21
IN3 = 19
IN4 = 26
ENA = 16
ENB = 13

#超声波引脚定义
EchoPin = 0
TrigPin = 1

#设置GPIO口为BCM编码方式
GPIO.setmode(GPIO.BCM)

#忽略警告信息
GPIO.setwarnings(False)

#电机引脚初始化操作
global pwm_ENA
global pwm_ENB
global delaytime
GPIO.setup(ENAGPIO.OUTinitial=GPIO.HIGH)
GPIO.setup(IN1GPIO.OUTinitial=GPIO.LOW)
GPIO.setup(IN2GPIO.OUTinitial=GPIO.LOW)
GPIO.setup(ENBGPIO.OUTinitial=GPIO.HIGH)
GPIO.setup(IN3GPIO.OUTinitial=GPIO.LOW)
GPIO.setup(IN4GPIO.OUTinitial=GPIO.LOW)
GPIO.setup(EchoPinGPIO.IN)
GPIO.setup(TrigPinGPIO.OUT)
#设置pwm引脚和频率为500hz
pwm_ENA = GPIO.PWM(ENA 500)
pwm_ENB = GPIO.PWM(ENB 500)
pwm_ENA.start(0)
pwm_ENB.start(0)

speed = 0 # 直道加速的标志 
# 打开摄像头,图像尺寸640*480(长*高),opencv存储值为480*640(行*列)
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_frame_WIDTH640)#设置图像宽度
cap.set(cv2.CAP_PROP_frame_HEIGHT480)#设置图像高度

# 超声波测量障碍物距离
def Distance_test():
    GPIO.output(TrigPinGPIO.HIGH)
    time.sleep(0.000015)
    GPIO.output(TrigPinGPIO.LOW)
    while not GPIO.input(EchoPin):
        pass
    t1 = time.time()
    while GPIO.input(EchoPin):
        pass
    t2 = time.time()
#    print “distance is %d “ % (((t2 - t1)* 340 / 2) * 100)
    time.sleep(0.01)
    return ((t2 - t1)* 340 / 2) * 100

def stop():
    GPIO.output(IN1 GPIO.LOW)
    GPIO.output(IN2 GPIO.LOW)
    GPIO.output(IN3 GPIO.LOW)
    GPIO.output(IN4 GPIO.LOW)
    pwm_ENA.ChangeDutyCycle(0)
    pwm_ENB.ChangeDutyCycle(0)
    time.sleep(0.1)

# 根据采集信息调整方向
# direction表示小车相对于车道线的距离,direction_line表示前方道路趋势
def run(directiondirection_line):
    global speed
    if abs(direction) > 30: 
        stop()
    # 右转 
    elif direction >= 0: 
        if direction > 25: 
            direction = 25
        if abs(direction_line) < 60 and direction_line!=0 and direction<15:
            speed = speed + 1
            if speed > 4:
                speed = 4
            GPIO.output(IN1 GPIO.HIGH)
            GPIO.output(IN2 GPIO.LOW)
            GPIO.output(IN3 GPIO.HIGH)
            GPIO.output(IN4 GPIO.LOW)
            pwm_ENA.ChangeDutyCycle(5 + speed)
            pwm_ENB.ChangeDutyCycle(7 + speed + direction*0.5)
            time.sleep(0.1)
        else:
            if direction_line < 0:
                direction_line = 0
            speed = 0
            temp = 7 - direction_line*0.03
            if temp < 0:
                temp = 0
            GPIO.output(IN1 GPIO.HIGH)
         

评论

共有 条评论