실험코드! 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.
그래프에서 시각화가 잘 되려면 거즘 시뮬 느낌으로 가는게 좋긴 한데.
나중에 시간이 좀 나면 유니티같은거 배워서 URDF파일 넣어가지고 바로 볼 수 있게 하고.
그 전에 얘의 움직임을 모델링해서 수학적으로 수식을 만들고.
돌돌이의 움직임을 수식화 → 실험용 센서 데이터 수집 → 실험 → 움직임 시각화 by 그래프
어찌 보면 움직임을 재현하거나 가상으로 돌리는 거니까 CPS 영역에도 속할 수 있겠다.
그리고 알아낸 수식과 구성 요소를 사용해서 나중에 아주 나중에 강화학습 배울 때도 기초로 써먹을 수 있을 것으로도 생각되구.
Uploaded by N2T
'Projects > 2021년 기초제어실습' 카테고리의 다른 글
프로젝트 개요 (0) | 2023.01.03 |
---|---|
Line Tracer-코드 정리 (0) | 2023.01.03 |
Line Tracer-센서 데이터 그래프 생성 (0) | 2023.01.03 |
wall follower-코드 정리 (0) | 2023.01.03 |
wall follower- 센서 데이터 그래프 생성하기 (0) | 2023.01.03 |