[Monitoring System] 3. UDP ํ†ต์‹ ์œผ๋กœ ์‹ค์‹œ๊ฐ„ ์ง„๋™ ๋ฐ์ดํ„ฐ Plotting(feat. matplotlib)

2023. 4. 19. 13:43ยท๐ŸŽผ Project/๐ŸงŠ Monitoring System
728x90

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ด์ „ mqtt์—์„œ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ ๋ฐ์ดํ„ฐ๋ณด๋‹ค 2๋งŒ ๋ฐฐ ์ •๋„ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ DAQ์—์„œ ๋ฐ›์•„์˜ค๋Š” UDP ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค. ๊ตฌํ˜„ํ•˜๋ ค๋Š” ์›น ์„œ๋น„์Šค์— ์˜จ๋„ ๋ฐ์ดํ„ฐ ๋ง๊ณ  ์ง„๋™ ๋ฐ์ดํ„ฐ๋„ ๋„ฃ์–ด๋ณด๊ณ  ์‹ถ์€๋ฐ, ๊ทธ๊ฒƒ์„ ์œ„ํ•ด์„œ ์šฐ์„  ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์žกํ•ด์ง€๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์„œ๋ฒ„๋ฅผ ์ œ์™ธํ•˜๊ณ  ์†Œ์ผ“ ํ†ต์‹ ํ•œ ๊ฒฐ๊ณผ๋ฅผ matplotlib๋กœ ๋กœ์ปฌ์— ๊ฐ„๋‹จํ•˜๊ฒŒ ๋„์›Œ๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

์˜ค๋Š˜์˜ ๋ชฉํ‘œ

1. UDP ํ†ต์‹ 

UDP๋Š” ์†Œ์ผ“ ํ†ต์‹ ์˜ ์ผ์ข…์œผ๋กœ, ๋‹ค๋ฅธ ์†Œ์ผ“ ํ†ต์‹ ๋ฐฉ๋ฒ•์ธ TCP์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์—ฐ๊ฒฐ์„ ๋ณด์žฅํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค. ๋‚˜์˜๊ฒŒ ๋“ค๋ฆด ์ˆ˜๋„ ์žˆ๊ฒ ์œผ๋‚˜ client์™€ server์˜ ์—ฐ๊ฒฐ์„ ์š”์ฒญํ•˜๊ณ , ์Šน์ธํ•˜๊ณ  ์—ฐ๊ฒฐํ•œ ํ›„ ํ†ต์‹ ์„ ์‹œ์ž‘ํ•˜๋Š” TCP์™€ ๋‹ฌ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋งค๋ฒˆ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ์˜ ๋ชฉ์ ์ง€(ip, port๋ฒˆํ˜ธ)๋ฅผ ํ•จ๊ป˜ ์‹ค์–ด์„œ ์ผ๋‹จ ๋ƒ…๋‹ค ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ด๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜ ๋ฐ›์•˜๋Š”์ง€ ๊ฒ€์ฆ๋„ ํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค. ์—ฐ๊ฒฐ์ด ์ง€์†์ ์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์žฅ์ ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ์—๋Š” ์žฌ์‹œ๋„ ํ•ด์ฃผ๋Š” TCP์™€ ๋‹ฌ๋ฆฌ ๋ณด๋‚ด๋ฉด ๋์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ์–‘์ด ์–ด๋งˆ๋ฌด์‹œํ•˜๊ฒŒ ๋ฐฉ๋Œ€ํ•˜๊ณ  ์‹ค์‹œ๊ฐ„์œผ๋กœ ์™•์ฐฝ ๋ณด๋‚ด์•ผํ•˜๋ฉฐ, ๋ช‡ ๊ฐœ ์žƒ์–ด๋ฒ„๋ ค๋„ ํฌ๊ฒŒ ์ƒ๊ด€์—†๋Š” ๊ฒฝ์šฐ์—๋Š” UDP๊ฐ€ ๋น ๋ฅด๊ณ  ์ข‹์„ ์ˆ˜ ์žˆ๋‹ค. ๋ฐ”๋กœ ์ง€๊ธˆ! ์ดˆ๋‹น 2๋งŒ์—ฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ง„๋™ ์„ผ์„œ์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ€ ๊ทธ๋ ‡๋‹ค.

์ง„๋™ ๋ฐ์ดํ„ฐ ๊ด€๋ จ ์ด๋ก ์€ ...์•„์ง ์•ˆ ์ผ๊ตฌ๋‚˜(๊นจ๋‹ฌ์Œ) ์กฐ๋งŒ๊ฐ„ ์˜ฌ๋ ค์„œ ๋งํฌ๋ฅผ ๊ฑธ๋„๋ก ํ•˜๊ฒ ๋‹ค. ์‚ฌ์‹ค ์•„์ง ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค^^; ๊ฐ์„คํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

Python ์˜ˆ์ œ

- Server.py

import socket

server = ('YOUR_IP_ADDRESS', 2001)
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serverSocket.bind(server) 

data = serverSocket.recv(1024)

- Client.py

import socket

server = ('YOUR_IP_ADDRESS', 2001)
clientSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

data = dummy_data
clientSocket.sendto(data, server)

๊ฐ„๋‹จํ•˜๋‹ค. YOUR_IP_ADDRESS ์— server(๋ฐ์ดํ„ฐ ๋ฐ›๋Š” ์ชฝ)์˜ ip๋ฅผ ๋„ฃ๊ณ , client์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ณ  server์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด๋“ค์ธ๋‹ค. client์ฝ”๋“œ์˜ sendto๋ถ€๋ถ„์„ ๋ณด๋ฉด ip์™€ port๋ฒˆํ˜ธ๋ฅผ ํ•จ๊ป˜ ์ „์†กํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์˜ํ•ด์•ผํ•  ์ ์€, server์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ๋•Œ ์ •ํ•ด๋‘” ๋ฒ„ํผ์‚ฌ์ด์ฆˆ๋ณด๋‹ค ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ ํฌ๋ฉด ์•ˆ๋œ๋‹ค. ํ˜„์žฌ ์˜ˆ์ œ์—์„œ๋Š” 1024 byte๋กœ ํ•ด๋‘์—ˆ์œผ๋‹ˆ, ํ•œ ๋ฒˆ์— ๋ฐ›๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ด ์‚ฌ์ด์ฆˆ๋ฅผ ๋„˜์–ด๊ฐ€์„œ๋Š” ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

2. ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ 

์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ๋Š” ๊ฐ์ž ๊ฐ€์ง€๊ณ  ์žˆ๋Š” DAQ ์žฅ์น˜์˜ sampling rate ๋“ฑ๋“ฑ ์—ฌ๋Ÿฌ ํ•˜๋“œ์›จ์–ด์ ์ธ ์ŠคํŽ™์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์ผ dummy data๋กœ ํ•œ๋‹ค๋ฉด 5kHz ์ •๋„๋กœ ์ƒ์„ฑํ•ด๋„ ์ข‹์„ ๊ฒƒ์ด๋‹ค. ์ดˆ๋‹น 5000๊ฐœ ์ •๋„์˜ ๋ฐ์ดํ„ฐ์ด๋‹ค.

ํ˜„์žฌ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” DAQ ์žฅ์น˜๋Š” ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด ์œ„์— ์žฅ์ฐฉํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋œ mcc172 DAQ hat์ด๋‹ค. ์ดˆ๋‹น ์•ฝ 18000๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ˜ํ”Œ๋งํ•˜๋„๋ก ์„ค์ •ํ•˜์˜€๋‹ค.

๋ฐ์ดํ„ฐ์˜ sampling rate๋Š” ๊ทธ๋ ‡์ง€๋งŒ ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ 1์ดˆ์— ํ•œ ๋ฒˆ ๋“ค์–ด์˜ค์ง€๋Š” ์•Š๋Š”๋‹ค. ์ด ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ ํ•œ ๋ฒˆ์— ์•ฝ 2045๊ฐœ ๊ฐ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ณ , ์ˆ˜์‹ ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ๋งŽ์œผ๋ฉด float array ํ˜•ํƒœ๋ณด๋‹ค๋Š” byte๋กœ packingํ•ด์„œ ๋ณด๋‚ด๊ณ , ๋ฐ›์•„์„œ unpackํ•˜๋Š” ๊ฒƒ์ด ๋” ์šฉ์ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค.

- Client.py

import socket, struct

server = ('YOUR_IP_ADDRESS', 2001)
clientSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

...

data = struct.pack('%sf' %len(signal), *signal)
socket.sendto(data, server)

clientSocket.sendto(data, server)

float array๋ฅผ byteํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ struct ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

struct.pack('%sf' %len(signal), *signal)

์ด๋Š” signal์˜ ๊ธธ์ด์™€ ๊ฐ™์€ ๊ฐœ์ˆ˜์˜ float ๊ฐ’๋“ค์„ byteํ™”ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

- Server.py

import socket, array

server = ('YOUR_IP_ADDRESS', 2001)
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serverSocket.bind(server) 

data = serverSocket.recv(8192)
signals = array.array('f')
signals.frombytes(data)

์„œ๋ฒ„ ์ชฝ์—์„œ๋Š” ๋ฒ„ํผ ์‚ฌ์ด์ฆˆ๋ฅผ ์ •ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. ๋ณด๋‚ด๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ตœ๋Œ€ 2045๊ฐœ float ๋ฐ์ดํ„ฐ์ด๋ฏ€๋กœ 4byte์”ฉ ๊ณฑํ•˜๊ณ  ์—ฌ์œ ๋ฅผ ์žก์•„ 8192๋กœ ์„ค์ •ํ•˜์˜€๋‹ค. ๋‚ด ๊ฒฝ์šฐ์—๋Š” ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ๋งค๋ฒˆ ์ผ์ •ํ•˜์ง€ ์•Š์•„ struct์˜ unpack์„ ํ™œ์šฉํ•ด์„œ unpackingํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์œˆ๋„์šฐ ์šด์˜์ฒด์ œ๊ฐ€ server์ธ ๊ฒฝ์šฐ, ์ด๋ ‡๊ฒŒ ํ–ˆ์„ ๋•Œ ๋ฒ„ํผ ์‚ฌ์ด์ฆˆ ์˜ค๋ฒ„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ๋ฆฌ๋ˆ…์Šค-๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๋Š”๋ฐ, ์ด์œ ๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค. ์ด์œ ๋ฅผ ์•„์‹œ๋Š” ๋ถ„์€ ๋Œ“๊ธ€๋กœ.......

๊ทธ๋ฆฌ๊ณ  array ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ float ๋‹จ์œ„๋กœ ์ž˜๋ผ์ฃผ๊ณ , byte๋ฅผ ๋‹ค์‹œ ๋ณ€ํ™˜ํ•˜๋ฉด ๋œ๋‹ค.

3. Plotting

๋ฌดํ•œ๋ฃจํ”„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋‹ค๋ณด๋ฉด ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์™•์ฐฝ ์ฒ˜๋ฆฌํ•˜๋А๋ผ ๋ฐ”๋น ์„œ ๊ทธ๋ž˜ํ”„๊นŒ์ง€ ๊ทธ๋ฆด ์—ฌ์œ ๊ฐ€ ์—†๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด multi-thread๋ฅผ ํ™œ์šฉํ–ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ๊ฐฑ์‹ ํ•˜๋Š” ์ชฝ์„ thread๋กœ ๋ถ„๊ธฐ์‹œํ‚ค๊ณ , ๋ฉ”์ธ thread์—์„œ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ฆฐ๋‹ค.

3.1 thread ์ƒ์„ฑํ•˜๊ธฐ

import socket, array
from threading import Thread

def run() -> None:
    print("Connected", flush=True)

    while True:
        data = serverSocket.recv(8192)
        signals = array.array('f')
        signals.frombytes(data)
        entire_data.extend(signals)

if __name__ == "__main__":

    # define socket setting and bind
    server = ('YOUR_IP_ADDRESS', 2001)
    serverSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    serverSocket.bind(server) 

    entire_data = [0]

    # start UDP in another thread
    t = Thread(target=run, args=())
    t.start()

๋จผ์ € thread๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. entire_data์— ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์†์ ์œผ๋กœ ์ €์žฅํ•˜๋„๋ก ํ•ด์ฃผ์—ˆ๋‹ค.

3.2 real time plotting - matplotlib.animation

plotting์€ matplotlib์˜ animation์„ ํ™œ์šฉํ•ด์„œ ๊ทธ๋ฆฌ๊ธฐ๋กœ ํ•˜์˜€๋‹ค.

https://matplotlib.org/stable/api/animation_api.html

 

matplotlib.animation — Matplotlib 3.7.1 documentation

with details to handle 'blitting' (to dramatically improve the live performance), to be non-blocking, not repeatedly start/stop the GUI event loop, handle repeats, multiple animated axes, and easily save the animation to a movie file. 'Blitting' is a stand

matplotlib.org

import matplotlib.pyplot as plt
import matplotlib.animation as animation

class RealTimeAnimation:
    """
    Animate original voltage signal graph and fft result.
    """
    def __init__(self):
        # define plot
        self.fig = plt.figure(figsize=(16, 6))
        self.original = self.fig.add_subplot(1, 1, 1)

        # connect animation method
        self.animation = animation.FuncAnimation(self.fig, self.update, interval=100)

    def update(self, i) -> None:
        """
        Run every interval and update graphs.
        Using lock.

        Args:
            i : interval
        """

        # update original graph
        if len(entire_data) > 110000:
            graph_data = entire_data[len(entire_data) - 100000:]
        else: 
            graph_data = entire_data

        self.original.clear()
        self.original.plot(graph_data)

ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ด์„œ animation์„ ์ •์˜ํ•ด์ฃผ์—ˆ๋‹ค. FuncAnimation์—๋Š” plot์˜ figure, ๊ทธ๋ฆฌ๊ณ  update function, interval์ด ์ฃผ์–ด์ ธ์•ผํ•œ๋‹ค. ์ฐจ๋ก€๋กœ animation์„ ๊ทธ๋ฆด ๊ณต๊ฐ„, interval๋งˆ๋‹ค ์‹คํ–‰๋  ํ•จ์ˆ˜์ด๋‹ค.

update ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด animation์„ ์ „์ฒด ๋‹ค ๊ทธ๋ฆฌ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ 100000๊ฐœ๋งŒ ๊ทธ๋ฆฌ๋„๋ก ์ž˜๋ผ์ฃผ์—ˆ๋‹ค. ์ดˆ๋‹น 2๋งŒ์—ฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ 5์ดˆ ๋‹จ์œ„๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ๋„ˆ๋ฌด ์ž์ฃผ ๋ถˆ๋ ค์„œ ์†๋„๋ฅผ ๋А๋ฆฌ๊ฒŒ ํ•  ๊ฒƒ์„ ์—ผ๋ คํ•˜์—ฌ 11๋งŒ๊ฐœ๊ฐ€ ๋„˜์œผ๋ฉด ์ž๋ฅด๋Š” ๊ฒƒ์œผ๋กœ ํ•ด์ฃผ์—ˆ๋‹ค.

์ด ์ •๋„ ๋˜๋ฉด ์ด์ œ ์Šฌ์Šฌ ๋ญ”๊ฐ€ ํ•˜๋‚˜ ๋น ์ง„ ๊ธฐ๋ถ„์ด ๋“ ๋‹ค. ๋ฐ”๋กœ entire_data ์˜ ์ ‘๊ทผ ๋ฌธ์ œ์ด๋‹ค. entire_data๋Š” ์†Œ์ผ“ ํ†ต์‹ ์„ ํ•˜๋Š” thread์—์„œ ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด์ฃผ๊ณ  ์žˆ๋Š”๋ฐ, ๋™์‹œ์— animation์—์„œ ์ฝ์–ด๋“ค์—ฌ์„œ ์ž๋ฅด๊ฑฐ๋‚˜ ๋ณต์‚ฌํ•œ๋‹ค. ๋‘ thread ๋ชจ๋‘ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋™์‹œ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด lock์„ ๊ฑธ์–ด์ค„ ๊ฒƒ์ด๋‹ค. ๊ณง์žฅ ๊ฑธ๊ณ , ์ „์ฒด ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

4. ์™„์„ฑ

import socket, array
from threading import Lock, Thread

import matplotlib.pyplot as plt
import matplotlib.animation as animation

class RealTimeAnimation:
    """
    Animate original voltage signal graph and fft result.
    """
    def __init__(self):
        # define plot
        self.fig = plt.figure(figsize=(16, 6))
        self.original = self.fig.add_subplot(1, 1, 1)
        # connect animation method
        self.animation = animation.FuncAnimation(self.fig, self.update, interval=100)

    def update(self, i) -> None:
        """
        Run every interval and update graphs.
        Using lock.

        Args:
            i : interval
        """

        # update original graph
        data_lock.acquire()
        if len(entire_data) > 110000:
            graph_data = entire_data[len(entire_data) - 100000:]
        else: 
            graph_data = entire_data
        data_lock.release()

        self.original.clear()
        self.original.plot(graph_data)

def run() -> None:
    """
    UDP data receive function.
    Using lock.
    """

    print("Connected", flush=True)

    while True:
        data = serverSocket.recv(16384)
        signals = array.array('f')
        signals.frombytes(data)
        data_lock.acquire()
        entire_data.extend(signals)
        data_lock.release()


if __name__ == "__main__":
    
    # define socket setting and bind
    server = ('10.0.0.119', 2001)
    serverSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    serverSocket.bind(server) 

    # set data / data lock
    entire_data = [0]
    data_lock = Lock()

    # start UDP in another thread
    t = Thread(target=run, args=())
    t.start()
    
    # start animation 
    animation = RealTimeAnimation()
    plt.show()

y์— ๋Œ€ํ•ด auto scaling์ด ๋˜๊ณ , 10๋งŒ ๊ฐœ ์”ฉ ๋ฐ์ดํ„ฐ๋ฅผ plotting ํ•ด์ฃผ๋Š” udp ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋žจ์ด ์™„์„ฑ๋˜์—ˆ๋‹ค. 

์ฐธ๊ณ ๋กœ keyboard interrupt ๋“ฑ์„ ํ†ตํ•ด์„œ๋Š” ์ด ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•  ์ˆ˜ ์—†๋‹ค(์ฐฝ์€ ๊บผ์ง„๋‹ค) ์™œ๋ƒํ•˜๋ฉด thread ๋’ค์ชฝ์—์„œ ์†Œ์ผ“ ํ†ต์‹ ์ด ๋ฌดํ•œ๋ฃจํ”„๋ฅผ ๋Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค(...) ์ง์ ‘ ์‹คํ–‰ ์ค‘์ธ ์ปค๋„์„ ์‚ญ์ œํ•ด์„œ ์ข…๋ฃŒํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. ์ข€ ๋” ์œ ์—ฐํ•œ ๊ธฐ๋ฒ•์œผ๋กœ thread๋ฅผ join ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„... ์ฐพ์•„๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ๋Š” ์‹ค์‹œ๊ฐ„ fft, ๊ทธ๋ฆฌ๊ณ  ์ •์ง€/์ด์–ด์„œ ์‹คํ–‰, ๋ฐ์ดํ„ฐ ์ €์žฅ, ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ fft, stft๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ถ”๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.  

728x90
์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐ŸŽผ Project > ๐ŸงŠ Monitoring System' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Monitoring System] 5. Fast API ๋กœ ์ดํ‹€๋งŒ์— ๋ฐฑ์—”๋“œ ๊ตฌ์ถ•ํ•˜๊ธฐ(feat. SQLAlchemy, PostgreSQL) (1)  (0) 2023.06.13
[Monitoring System] 4.1 ์„ธ์ƒ์— ๋” ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ด - pyqtgraph  (2) 2023.04.27
[Monitoring System] 4. UDP ํ†ต์‹ ์œผ๋กœ ์‹ค์‹œ๊ฐ„ ์ง„๋™ ๋ฐ์ดํ„ฐ FFT / STFT์‹œ๊ฐํ™”(numpy, tensorflow, pytorch)  (0) 2023.04.25
[Monitoring System] 2. MQTT ํ†ต์‹   (0) 2023.04.06
[Monitoring System] 1. ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ๋ฐ ๋ชฉํ‘œ  (1) 2023.04.06
'๐ŸŽผ Project/๐ŸงŠ Monitoring System' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Monitoring System] 4.1 ์„ธ์ƒ์— ๋” ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ด - pyqtgraph
  • [Monitoring System] 4. UDP ํ†ต์‹ ์œผ๋กœ ์‹ค์‹œ๊ฐ„ ์ง„๋™ ๋ฐ์ดํ„ฐ FFT / STFT์‹œ๊ฐํ™”(numpy, tensorflow, pytorch)
  • [Monitoring System] 2. MQTT ํ†ต์‹ 
  • [Monitoring System] 1. ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ๋ฐ ๋ชฉํ‘œ
darly213
darly213
ํ˜ธ๋ฝํ˜ธ๋ฝํ•˜์ง€ ์•Š์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ณด์ž
  • darly213
    ERROR DENY
    darly213
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (97)
      • ๐Ÿฌ ML & Data (50)
        • ๐ŸŒŠ Computer Vision (2)
        • ๐Ÿ“ฎ Reinforcement Learning (12)
        • ๐Ÿ“˜ ๋…ผ๋ฌธ & ๋ชจ๋ธ ๋ฆฌ๋ทฐ (8)
        • ๐Ÿฆ„ ๋ผ์ดํŠธ ๋”ฅ๋Ÿฌ๋‹ (3)
        • โ” Q & etc. (5)
        • ๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹ (20)
      • ๐Ÿฅ Web (21)
        • โšก Back-end | FastAPI (2)
        • โ›… Back-end | Spring (5)
        • โ” Back-end | etc. (9)
        • ๐ŸŽจ Front-end (4)
      • ๐ŸŽผ Project (8)
        • ๐ŸงŠ Monitoring System (8)
      • ๐Ÿˆ Algorithm (0)
      • ๐Ÿ”ฎ CS (2)
      • ๐Ÿณ Docker & Kubernetes (3)
      • ๐ŸŒˆ DEEEEEBUG (2)
      • ๐ŸŒ  etc. (8)
      • ๐Ÿ˜ผ ์‚ฌ๋‹ด (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ๋ฐฉ๋ช…๋ก
    • GitHub
    • Notion
    • LinkedIn
  • ๋งํฌ

    • Github
    • Notion
  • ๊ณต์ง€์‚ฌํ•ญ

    • Contact ME!
  • 250x250
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
darly213
[Monitoring System] 3. UDP ํ†ต์‹ ์œผ๋กœ ์‹ค์‹œ๊ฐ„ ์ง„๋™ ๋ฐ์ดํ„ฐ Plotting(feat. matplotlib)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”