1. YOLOv4 model training

  2. PID 제어

    Bounding Box 차이(Aref - A) 를 통해 Error를 계산하고 PID 제어를 한다.

    Vref = a * (Aref - A)

    #Aref = 목표 속도에서의 바운딩 박스 면적

    #A = 현재 속도의 바운딩 박스 면적

    #a = 속도로 환산 하기위한 비례상수

    면적에서 속도로 변환하기 위해 비례 상수인 a를 두었고 이는 huristic 하게 최적의 값을 찾는다.

    위의 수식에서 얻은 error로 P,I,D를 각 구하여 sum을 구하고 재귀적으로 반복되는 PID 코드를 작성

    P = error * Kp ⇒ 비례항 I += errorKidt ⇒ 적분항 D = [error(2)-error(1)] / dt*Kd ⇒ 미분항

    PID = P + I + D ⇒ 조작량



    import numpy as np
    import matplotlib.pyplot as plt
    import sympy as sym
    
    dt = np.arange(0, 20, 2) #t(2) - t(1)을 2s 로 두어 0초부터 20초까지 진행되는 행렬 만듬
    
    #계산식 
    #P = error * Kp
    #I += error*Ki*dt
    #D = [error(2) - error(1)] / dt *Kd
    #주어지는 변수 dt 
    Kp = 6.0 #비례 계수
    Ki = 0.4 #적분 계수
    Kd = 2.0 #미분 계수
    
    P = list()          #P = error * Kp
    I = [0]             #I += error*Ki*dt
    D = [0]             #D = [error(2)-error(1)] / dt*Kd
    PID = list()        #P+I+D 저장할 리스트 
    velocity = list()   #PID*alpha를 통해 속력으로 환산한 값을 저장 
    
    #alpha = 3
    GOAL = 20                           #commend variable(목표값)
    error = list()                      #error
    value = [0,3,7,13,20,19,21,23,20,20]#측정값
    
    for i in range(0, len(value)):
        error.append(GOAL - value[i])
    
    for i in range(0, len(error)):
    
        P.append(error[i]*Kp) 
        if i == 0:
            D[i] = 0
            I[i] = 0
        else:
            I.append((error[i] * Ki)*dt[i] + I[i-1])
            D.append(((error[i] - error[i-1]) / dt[i]) * Kd)
        
        PID.append(P[i]+I[i]+D[i])
    
        velocity.append(PID[i])
    
    plt.figure()
    plt.subplot(4,1,1)
    plt.plot(dt, P)
    plt.xlabel('dt')
    plt.ylabel('P')
    
    plt.subplot(4,1,2)
    plt.plot(dt, I)
    plt.xlabel('dt')
    plt.ylabel('I')
    
    plt.subplot(4,1,3)
    plt.plot(dt, D)
    plt.xlabel('dt')
    plt.ylabel('D')
    
    plt.subplot(4,1,4)
    plt.plot(dt, PID)
    plt.xlabel('dt')
    plt.ylabel('PID')
    
    plt.show()
    


    PID_결과.jpg


결과값입니다. 맨 아래항은 조작량에 대한 그래프입니다. 값들을 모두 임의로 넣었고, 비례계수, 적분계수, 미분계수를 측정값과 상관없이 임의로 넣었기 때문에, 그래프의 개형만 참고하시면 될 것 같습니다.

조작량.jpg

*실제 PID제어에서의 조작량 추이

실제 테스트를 반복해서 진행하여 계수값을 조정하고, 조작량 결정.

+현재 출력값으로 입력 속도만 나오게 식을 작성하였는데 감속에 brake를 어떻게 적용할지 연구

  1. kalmanfilter

    이론은 알지만 코드로 구현하기 어려움이 있어서 더 자료 조사 후 진행 예정

    SORT 논문 과 DeepSORT논문 읽고 정보 취득 및 다른 정보 조사 진행 (~11/09(화))