본문 바로가기

Hardware/SBC (rasp, jetson, latte panda)

[RPi5] 3-2. 라즈베리파이에 flask 서버 구성하고 데이터 주고 받기|산.기.정.|민형기 강사님 무료 강의 |

본 글은 제가 직접 쓴  글이 아니라, 저희 PinkLAB의 유투브 채널의 공개 강의 영상들을 읽고, 따라한 한 수강생의 글을 제 블로그에 공유한 내용입니다.

https://youtu.be/YrcXizjTepI?si=NexaVqIe5AdoEzMY

안녕하세요, 

 

오늘은 다시 라즈베리파이 강의로 돌아왔어요. ㅎㅎ 
주제는  [ 라즈베리파이에 flask 서버 구성하고 데이터 주고 받기 ] 랍니다.

지난 시간에는 뭘 했냐면.. 
라즈베리파이에 flask를 설치하고, 1,2,3,4, 이걸 발행했어요.
원격에 있는 내 피씨에서 이 데이터를 확인하는 것까지 확인했어요.

이번 시간엔 데이터 받기, 주기, 그려보기를 했어요. 재밌어요 그래프.ㅋㅋ

데이터를 1,2,3,4 가 아닌, sin 함수로 받았어요. 

그 다음에, 내가  파라미터를 바꾸고싶어요. 
파라미터 바꾸는 방법 , 주기 이런걸 바꾸고싶어요. 

라즈베리파이는 작은 손바닥만해요. 센서 등 여러가지 장치, 또는 로봇에 달려있어요. 
로봇에서 구동 cpu 가 될 수도 있어요.
내pc와는 좀 떨어져있어요. 

와이파이가 연결되어있어요, 

데이터 주고받는건 어떻게 할 건가.. 
각종 센서 데이터들을 받은 다음에 , 혹은 내가 줄 수도 있어요. 그 다음에 값을 그려보고싶을 수 있죠. 
그 이야기를 해 봤어요. 

먼저 라즈베리파이에 구성되는 서버 측 코드 설명을 해 주셨어요.

이건 ! for_ROS2_study repositories, RPi_Study, flask_tutorials, flask_test2.py에 있어요. 

 

이제 코드 뜯어봤어요. 
초기설정! import 할 것들 하고

sin 함수 그리기 위한 초기 파라미터들 들어있어요. 

sin 함수는, 주기가 있고, 높이(amplitude)가 있고, 샘플 타임을 몇 개씩 할 거냐, 몇 개마다 하나씩 만든다고 할 거냐, 

50ms, 그런 것들을 설정 해 두었어요.

 그리고 난 다음에 또 하나의 설정이 들어가요. param lock 이라는 이름으로 threading lock 이라는 걸 하나 가지고 와요. 

여기에 있어요. 

나름 서버예요. 

다수의 클라이언트들이 접근하는걸 생각해봐요. 두개라도 왔어요. 

2개의 1번 클라이언트, 2번 클라이언트가 왔는데,

정말 똑같은 타이밍에, 1번 클라이언트도 도 어떤 설정(period라고 가정),
2번 클라이언트도 어떤 설정(period이라고 가정) 을 건드리는 거예요. 둘다 같은 변수를요.

param_lock: 그걸 제어하는 기능을 제공해요. 그 중에서 가장 중요한건 레이스 컨디션을 방지하는 거예요.

param_lock을 걸어둔 다음에 with 구문으로 param_lock 코드 작성을 하면,
내가 이 코드를 건드리는 동안, 다른 애들이 못 건드리게 돼요. 

Race condition은 뭐냐면요, 
hw가 있고, FPGA로 코드가 작성이 되어있어요. FPGA가 칩 하나예요. 

칩 하나에서 PS, PL 이라고 해서 영역이 구분 돼 있어요.

PS 영역에는 우분투가 들어가고, PL 영역에는 logic이라는게 들어가서 이 GPIO만 수백개예요.

우분투에서 GPIO에 붙어서 값을 읽거나 쓰거나 그래요.

그런데 다수의 소프트웨어 엔지니어들이 작성한 어떤 기능이 있었고,,

user1, user2 가 있어요. 
그런데 파라미터가 딱 하나 있는데, 1번 파라미터가 있어요.

여기에 동시에 접근을 하면.. 어떤일이생기냐면, (미세한 한타임 한 타임이 0.1ms 이래요)
한 타임 먼저 도착한 애가 이 파라미터를 가져가 버리면 뒤늦게 도착한 애는 빈 땅에 헤딩하는 거예요.

 

이게 Race Condition이랍니다. 디버그 하기 어렵다고 해요. . 

한 번은 강사님이 참여하셨던 프로젝트에 많은 sw engineer가 모여있었는데,
원인을 아무도 모르다가, 누군가 "이거 레이싱 이슈같은데", 했대요.
알아듣는 사람이 적었다 해요.

점검을 해 보고 가능성이 있는 방어 코드를 넣어서 해결을 하셨다 해요. 

Lock이라는 기능이 있어요. 

그리고 sin 함수의 결과를 계산해주는 아이가 있어야해요.
그래서 아까 이야기했듯이 sin 함수를 계산 할 때에는 파라미터의 변경,amplitude 와 period예요.

Lock - 파라미터의 변경을 허락하지 않는다,

 

그리고 난 다음에 sin value가 계산이 되고 나면 sample_time도 50ms예요.

지정된 건 50ms동안 쉬고 그 다음에 사인함수를 계산하기 위한건데, 이 T는 사인함수를 계산하기 위한 거예요. 그러고 계산을 해요. 

그 다음에... period가 0보다 작은 값이 나오면 이상한거예요. 0보다 큰 값이 나올 때에만 쓰도록 해 줬어요. 

그리고 난 다음에 라우팅 데코레이터..
(플라스크에서 사용하고 있는 데코레이팅으로 쌓인 경로에서 요청이 오면 값을 줘야한대요.
거기에 사용되는 것으로써...## 이건 제가 다시 공부를 해 보기로..)

아까 만들어둔 sign updater, 여기에서 

sine_value가 만들어 진단 말이죠. 

그래서 sine_value, period, amplitude를 json 파일로 json 형식으로 보내어주면 됩니다. 

그 다음에, 클라이언트가 바꾸길 희망하는 걸 수도 있어요. period, amplitude를요..

그래서 그 경로를 update_params라고 잡아줘요. 이 update_params에다 요청을 하면 파라미터를 업데이트 시켜주는 거예요.
이렇게 제이슨으로 받아와서 response 해 주면 돼요.

그리고 update params는 끝이 아니예요. 여기가 지금 50번 줄이고... 
51번째 줄 여기에서 with_param_lock 걸고, period가 데이터에서 바뀌었다면, 

period를 바꾸어주는데, 이상증상이 보이면 이런 메시지를 출력. 
정상이면 그대로 출력. 

주기가 변경되면

 시간을 0부터 계산을 하기. 

amplitude쪽 변화가 있다면, amplitude 도 바꾸어주기. 

main쪽 threading.Thread 걸어주기. 그리고 START! 빠밤ㅋㅋ 
그리고 접근IP - 79번째줄에 있어요. 

이제 클라이언트코드도 받아야해요. 

Pinkwink

for_ROS2_study - RPi_Study - flask_tutorials - flask_server_test2.py 경로입니다 !

목표는 값을 받아서 200개 정도 값을 보여주고, shift 시켜서 애니메이션 효과를 주는거라고 하셔요. 

 

접근하는 API 주소 , 

받아와야하는 경로 sine , 준비해주고

matplot library에 animation을 집어넣어요, 그래서 애니메이션을 쓰기 전에 
xlabe, ylabel, title좀 잡아주었구요, 

다음, 그래프를 업데이트 하는 함수를 만들어줘야해요. 
animation 기법을 쓸 때의 규칙이랍니다. 

이거 하나 더 들어갔는데요, 
요청을 할 때의 시간을 기록해요. start_time = time.time() 여기. 
받은 다음에도 시간을 기록해요. rec(ei)v(e)_time()
그러고 생각을 해 봤더니, 내가 생각했던 것보다 너무 길어요, 그러면 에러를 내는거랍니다. -> latency = recv_time - start_time
아니면 그 데이터는 안 받은 걸로 치는거라 해요. 

그걸 지금은 100ms로 잡았어요.
네트워크의 알수없는 떨림 등으로 인해 그래프가 엉망으로 보이는 걸 방어하는것이에요. 
그리고 append 시키고, append(sine_value)
max의 길이보다 커지면(max_length)
끝에있는 건 하나씩 지워나가고.
data_buffer.pop(0) - pop 명령은 제일 앞의 것을 지우는 명령, pop(0)하면 제일 앞의 것을 지운답니다. 

그걸 그리면 이렇게 그려지고, 

한 칸 밀리면, 또 그리고. 이렇게 돼요. 

업데이트 함수의 마지막 부분이랍니다. 

그리고 Animation function을 지정했고, 

show 해라! 입니다. 

그러면, 이렇게 나타납니다. 

이거 보여주신다고했어요. 
강사님은 라즈베리파이 ssh로 접근하셨어요. 
윈도우유저라면 명령프롬프트로 접근을 하셔도 된답니다. 

강사님은 Document - code 라는 폴더에 있으신가봅니다. 

 flask_test2 여기서

python3 flask_test2.py 실행해요. 

새 창을 열고, 여기서 강사님께서는 python\ code/DeepLearning\ Basic

요기에 클라이언트 코드가 있어요. - flask_server_test2.py

맞는지 확인 해 보기. (matplot lib 에서 받아와서 어쩌고저쩌고. 그코드예요.)

강사님께서는 opencv라는 환경에서 테스트코드를 실행하셨어요. 

그럼 왼쪽부분에 값을 받아오고있고

창이 열려요, 잘 그리고있어요. 

네트워크 떨림이라고 보시면 되는부분.. 

그래프 매우 잘 그리고있다. 착하다. 

실행 확인 했고, 

네트워크가 너무 떨리면 이런 메시지가 나오고, 그 데이터들은 버려요. 

파라미터 바꾸는걸 해 볼거예요. 

파라미터 바꾸는 함수, 

경로는...

두구두구 PinkWink - for_ROS2_study - RPi_Study - flask_tutorials - flask_test_set_paramas.py

코드 카피해서 쓰면 돼요. 

update_server_params. 이게 전부.
주소 지정했고,period랑 amplitude를 jason파일 형태로 던진다 고 적혀있는거예요. 

이건.. 파이썬으로 코드를 실행할 때 파이썬 입력받도록 하는거예요.  라즈베리파이 수업 초창기에 했어요. 

period, amplitude, 

server_ip도 바꿀 수 있도록 했어요. 

 

실행 해 하면 

잘 나와요 

새 창을 띄워서, conda activate opencv 했어요 . 

여기서 cd Documents/python\ code/DeepLearning\ Basic 

 

python flask_test_set_params.py --amplitude 4.0 --period 3.0 

실행! 이렇게 amplitude, period가 바뀌면서 그래프 높이 폭이 바뀌었답니다.
뚜 우 둥 저는 여기만 재밌어요. ㅋㅋ 

여기서, period, amplitude 값을 1, 3으로 바꾸어보면

그래프가 바뀐답니다.

지금까지, 
flask server 를 RPi에 구성하고, 내 pc에서 원격으로 데이터, 지령을 받는 과정을 봤어요. 

이렇게 하면 센서데이터들의 파형을 관찰하거나 세팅을 전달하거나 할 때 유용하게 사용할 수 있게 된다고 해요. 

그래프으으 !

오늘도 고생많으셨습니다 ^-^

반응형