본 글은 제가 직접 쓴 글이 아니라, 저희 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에서 원격으로 데이터, 지령을 받는 과정을 봤어요.

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

그래프으으 !
오늘도 고생많으셨습니다 ^-^
'Hardware > SBC (rasp, jetson, latte panda)' 카테고리의 다른 글
| [RPi5] 3-1. 라즈베리파이에 flask 설치하고 데이터 받아보기|산.기.정.| (0) | 2026.02.24 |
|---|---|
| [RPi5] 2-5. 라즈베리파이의 카메라를 이용해서 사진 찍기|산.기.정.|민형기 강사님 무료 강의 (1) | 2025.11.14 |
| [RPi5] 2-4. Picamera config 에서 영상 변환하기 |산.기.정| (0) | 2025.11.12 |
| [RPi5] 2-3. Ubuntu가 설치된 라즈베리파이에서 picamera를 사용하기 위한 준비 3|산.기.정.| (2) | 2025.10.23 |
| [RPi5] 2-2. Ubuntu가 설치된 라즈베리파이에서 picamera를 사용하기 위한 준비 2|산.기.정.| (0) | 2025.10.20 |
| [RPi5] 2-1. Ubuntu가 설치된 라즈베리파이에서 picamera를 사용하기 위한 준비 1|산.기.정.| (0) | 2025.09.19 |
| [RPi5] 1-11. RealVNC 구성해보기|산.기.정.| (1) | 2025.09.17 |