自駕車循軌跡行動




自駕車循紅線行駛

  1. cam1.py:開啟攝像鏡頭並且擷取影像
  2. cam1.py
    import cv2
    from PARAM import *
    cap = cv2.VideoCapture(0)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, Lx)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, Ly)
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    out = cv2.VideoWriter('cam1.avi', fourcc, 20.0, (Lx,Ly))
    t=0
    while(t < 501 and cap.isOpened()):
        ret, frame = cap.read()
        t+=1
        if ret == True:
            out.write(frame)
            cv2.imshow('frame',frame)
            if cv2.waitKey(1) & 0xFF == ord('q'): break
        else: break
    cap.release()
    out.release()
    cv2.destroyAllWindows()
    
    PARAM.py
    Lx=640; Ly=480; F=8; 
    Lx2=int(Lx/F); Ly2=int(Ly/F)
    X1=int(Lx2/8); X2=X1*2; 
    X3=X1*3; X4=X1*4; 
    X5=X1*5; X6=X1*6; X7=X1*7
    XX1=X1*F; XX2=X2*F
    XL=X2; XR=X6; 
    



  3. 循紅色軌跡而行
  4. cam3.py
    from PARAM import *
    from  motorm import turn
    import cv2
    from RED1 import RED
    cap = cv2.VideoCapture(0)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, Lx)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, Ly)
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    out = cv2.VideoWriter('cam3.avi', fourcc, 10.0, (Lx,Ly))
    t=0
    while(t < 1401 and cap.isOpened()):
        ret,frame = cap.read(); t+=1
        if ret == True:
            DR,LRED,MIDL,img1,img2=RED(frame)
            print(t,DR); out.write(img1); cv2.imshow('img1',img1)
            if(DR==1): turn(0.4,0.4,0.05); turn(0,0,0.01);
            if(DR==-2): turn(-0.4,-0.4,0.05); turn(0,0,0.01);
            if(DR==3): turn(0.0,0.4,0.05); turn(0,0,0.01);
            if(DR==7): turn(0.4,0.0,0.05); turn(0,0,0.01);
            if cv2.waitKey(1) & 0xFF == ord('q'): break
        else: break
    cap.release()
    out.release()
    cv2.destroyAllWindows()
    
    


    RED1.py
    import numpy as np
    import cv2
    from PARAM import *
    def RED(img):
        img1=np.copy(img)
        img2 = cv2.resize(img1, (Lx2,Ly2), interpolation=cv2.INTER_AREA)
        Y=Ly2-1; XM=int(Lx2/2); RED=[]
        for x in range(Lx2):
            if(img2[Y][x][2] > 255*0.4 and img2[Y][x][2] > 1.5*img2[Y][x][1]
                and img2[Y][x][2] > 1.5*img2[Y][x][0]):
                RED.append(x)
        LRED=len(RED)
        if(LRED > 0): MIDL=int(np.median(RED))
        else: MIDL=0
        img2[:,XR,:]=[0,255,255]; img1[:,F*XR-1:F*XR+2,:]=[0,255,255]
        img2[:,XL,:]=[0,255,255]; img1[:,F*XL-1:F*XL+2,:]=[0,255,255]
        if(LRED < 1):
            DR=-2
        else:
            if(XL <= MIDL <= XR): DR=1
            elif(MIDL < XL): DR=3
            elif(MIDL > XR): DR=7
        return DR,LRED,MIDL,img1,img2
    
    motorm.py
    import RPi.GPIO as GPIO
    from time import sleep
    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)
    
    def turn(LS,RS,t):
        EnaA=22
        In1A=3
        In2A=23
        EnaB=17
        In1B=22
        In2B=27
        GPIO.setmode(GPIO.BCM)
        GPIO.setwarnings(False)
        PA = 2
        PB = 3
        PC = 15
        MAP = 22
        MAN = 23
        MBP = 17
        MBN = 27
        pwmf= 100
        dc  = 20
        PR  = 18
        PL  = 21
        GPIO.setup(PA, GPIO.IN)
        GPIO.setup(PB, GPIO.IN)
        GPIO.setup(PC, GPIO.IN)
        GPIO.setup(PR, GPIO.IN)
        GPIO.setup(PL, GPIO.IN)
        GPIO.setup(MAP, GPIO.OUT)
        GPIO.setup(MAN, GPIO.OUT)
        GPIO.setup(MBP, GPIO.OUT)
        GPIO.setup(MBN, GPIO.OUT)
        pwmap=GPIO.PWM(MAP, pwmf)
        pwman=GPIO.PWM(MAN, pwmf)
        pwmbp=GPIO.PWM(MBP, pwmf)
        pwmbn=GPIO.PWM(MBN, pwmf)
        pwmap.start(0)
        pwman.start(0)
        pwmbp.start(0)
        pwmbn.start(0)
        #TURN(LS,RS,t); LS < RS for a left turn
        LS *=100
        RS *=100
        if(LS > 0):
            pwmap.start(LS)
            pwman.start(0)
        else:
            pwmap.start(0)
            pwman.start(-LS)
        if(RS > 0):
            pwmbp.start(RS)
            pwmbn.start(0)
        else:
            pwmbp.start(0)
            pwmbn.start(-RS)
        sleep(t)