본문 바로가기

Projects/2021년 기초제어실습

wall follower-실험용 코드

  • 실험코드! ver1.0
    #!/usr/bin/env pybricks-micropython
    import time
    
    # PID parameters
    Kp = 0.13
    Ki = 0.000
    Kd = 0.000
    
    target = 150
    error = 0.0
    last_error = 0.0
    acc_error = 0.0
    dt = 0.004
    
    vel = 180
    
    
    # time
    current_time= time.time()
    start_time = current_time
    
    
    while True:
        dist = int(input())
    
        # Filtering!
        if dist > 600:
            dist = 0
    
        # PID calculation
        error = target - dist
        diff = error - last_error
        acc_error += error
        P_control = Kp * error
        I_control = Ki * acc_error *dt
        D_control = Kd * diff / dt
        control = P_control + I_control + D_control
    
        # Data record
        print("%d " %dist)
        print("%d " %time.time())
    
        # too far
        if dist > 600:
            print("####left: %d" %vel)
            print("####right: %d" %(vel+30))
    
        # normal situation
        else:
            print("##left: %d" %(vel+control))
            print("##right: %d" %(vel-control))
    
        last_error = error
    
        end_time = time.time()
        time_gap = end_time - start_time
    
        if time_gap > 10:
            print("Time Over")
            break
    
    
        #wait(dt*100)
  • 실험코드! ver1.1
    #!/usr/bin/env pybricks-micropython
    import time
    
    # PID parameters
    Kp = 0.13
    Ki = 0.000
    Kd = 0.000
    
    target = 150
    error = 0.0
    last_error = 0.0
    acc_error = 0.0
    dt = 0.004
    
    vel = 180
    
    
    # time
    current_time= time.time_ns() // 1000000
    #current_time = StopWatch.time()
    #current_time = time.time()
    
    start_time = current_time
    
    
    while True:
        dist = int(input())
    
        # Filtering!
        if dist > 600:
            dist = 0
    
        # PID calculation
        error = target - dist
        diff = error - last_error
        acc_error += error
        P_control = Kp * error
        I_control = Ki * acc_error *dt
        D_control = Kd * diff / dt
        control = P_control + I_control + D_control
    
        # too far
        if dist == 0:
            print("####left: %d" %vel)
            print("####right: %d" %(vel+30))
    
        # normal situation
        else:
            print("##left: %d" %(vel+control))
            print("##right: %d" %(vel-control))
    
        last_error = error
    
        end_time = time.time_ns() // 1000000
        #end_time = StopWatch.time()
        #end_time = time.time()
        time_gap = end_time - start_time
    
        # Data record
        print("%d " %dist)
        print("T: %d " %time_gap)
    
    
        if time_gap > 10*1000:
            print("Time Over")
            break
    
    
        #wait(dt*100)

실제 모터 출력값 → print

1회 실험 결과

시간 차이는 잘 작동! goooood

→ 1차적으로 어떻게 작동될지는 되는데, 얘가 어떻게 움직일지는 느낌이 잘 안온단 말이지.

⇒ 텍스트를 받아와서 연속적으로 실행되도록 하고, 그래프에서 볼 수 있도록 하기

2회 실험 결과

  • 터미널 결과 창
    (base) masterpyo@masterpyo-X510UNR:~/mindstroms_exercise/final_term_pre$ python3 exercise.py 
    1
    ##left: 199
    ##right: 160
    1 
    T: 509057268 
    2
    ##left: 199
    ##right: 160
    2 
    T: 1047916438 
    3
    ##left: 199
    ##right: 160
    3 
    T: 1583964183 
    4
    ##left: 198
    ##right: 161
    4 
    T: 2023376130 
    5
    ##left: 198
    ##right: 161
    5 
    T: 2391060756 
    6
    ##left: 198
    ##right: 161
    6 
    T: 2736717179 
    7
    ##left: 198
    ##right: 161
    7 
    T: 3090170704 
    8
    ##left: 198
    ##right: 161
    8 
    T: 3456722009 
    9
    ##left: 198
    ##right: 161
    9 
    T: 3889308109 
    0
    ####left: 180
    ####right: 210
    0 
    T: 4390805966 
    11
    ##left: 198
    ##right: 161
    11 
    T: 5401312180 
    12
    ##left: 197
    ##right: 162
    12 
    T: 6019025373 
    13
    ##left: 197
    ##right: 162
    13 
    T: 6780706895 
    14
    ##left: 197
    ##right: 162
    14 
    T: 7306426552 
    15
    ##left: 197
    ##right: 162
    15 
    T: 8254172920 
    16
    ##left: 197
    ##right: 162
    16 
    T: 9140564405 
    17
    ##left: 197
    ##right: 162
    17 
    T: 9894643226 
    18
    ##left: 197
    ##right: 162
    18 
    T: 10846940386 
    Time Over

시간 기준을 그냥 time.time() → 초 단위로 갈지, 아니면 time.time_ns() → 나노초 단위로 갈지 고민이야. 딱 센티 초 아니면 밀리 초 이렇게 있으면 좋은데. 해결! end_time = time.time_ns() // 1000000 그런데!!!! python3.7에서부터만 지원해주는 기능이다. micropython2.0에서 안될 가능성이 매우 높다는 뜻이다. 때문에 Stopwatch class의 time()을 쓴다. 밀리초를 정수형으로 반환한단다.

tools - Timing and Data logging - ev3-micropython 2.0.0 documentation
Common tools for timing and data logging. wait( time) Pauses the user program for a specified amount of time. Parameters: time ( time: ms ) - How long to wait. class StopWatch A stopwatch to measure time intervals. Similar to the stopwatch feature on your phone.
https://pybricks.com/ev3-micropython/tools.html

그래프에서 시각화가 잘 되려면 거즘 시뮬 느낌으로 가는게 좋긴 한데.

나중에 시간이 좀 나면 유니티같은거 배워서 URDF파일 넣어가지고 바로 볼 수 있게 하고.

그 전에 얘의 움직임을 모델링해서 수학적으로 수식을 만들고.

돌돌이의 움직임을 수식화 → 실험용 센서 데이터 수집 → 실험 → 움직임 시각화 by 그래프

어찌 보면 움직임을 재현하거나 가상으로 돌리는 거니까 CPS 영역에도 속할 수 있겠다.

그리고 알아낸 수식과 구성 요소를 사용해서 나중에 아주 나중에 강화학습 배울 때도 기초로 써먹을 수 있을 것으로도 생각되구.


Uploaded by N2T