본문 바로가기

Python

실시간 시스템에 파이썬 사용 가능성

일단 실시간 시스템이란 크게 2가지로 나뉜다. 하드리얼타임시스템과 소프트리얼타임시스템.

 

먼저 하드리얼타임 시스템(Hard Real-Time Systems) 은 처리 지연이 절대 허용되지 않는 시스템을 말하는데, 대표적으로 항공기 제어, 차량 ABS, 산업 로봇 제어 같은 것들이다. 이런 시스템은 보통 C/C++ 같은 저수준 언어로 많이 만든다. 이렇게 하드 리얼타임 시스템인 경우에는 파이썬을 사용하는 예를 거의 찾기는 힘들다. 

 

다만 Python으로도 적절한 방법으로 실시간성 요구를 어느 정도 맞추는 어플리케이션에 활용하는 사례가 있기는 하다. 특히 Soft Real-Time 혹은 하드웨어 인터페이스를 C로 구현하고 상위 로직을 Python으로 처리하는 형태이다. 

 

아래는 Python을 이용한 실시간 센서 데이터 수집 및 처리(Soft real time) 예제이다. 

라즈베리파이 같은 임베디드 시스템에서 센서 데이터를 실시간으로 수집하고, 이를 빠르게 처리해 액추에이터로 명령을 내리는 구조에 대한 예제이다. 

 

import time
import RPi.GPIO as GPIO

# GPIO 핀 설정
GPIO.setmode(GPIO.BCM)
sensor_pin = 17
actuator_pin = 18

GPIO.setup(sensor_pin, GPIO.IN)
GPIO.setup(actuator_pin, GPIO.OUT)

def read_sensor():
    return GPIO.input(sensor_pin)

def control_actuator(value):
    GPIO.output(actuator_pin, value)

# 실시간 루프
try:
    while True:
        sensor_value = read_sensor()
        control_actuator(sensor_value)  # 센서 값에 따라 액추에이터 제어
        time.sleep(0.001)  # 1ms 간격으로 루프 실행 (Soft Real-Time)
except KeyboardInterrupt:
    GPIO.cleanup()

 

이건 Soft Real-Time 성격으로, 1ms 주기 루프가 가능하지만, Python의 GIL(Global Interpreter Lock)과 GC(Garbage Collection) 특성상 absolute hard real-time guarantee는 어렵다.

 

아래는 Python + C 하이브리드 예제로 C언어로 하드리얼타임 영역을 구현하고, 

Python으로 상위 AI 분석, 로깅, 네트워크 전송 같은 영역을 담당한다. 

// realtime_control.c
#include <stdio.h>
void control_motor(int value) {
    // 하드리얼타임 제어 로직
    printf("Motor control value: %d\n", value);
}
# Python side
import ctypes

# C 라이브러리 로드
realtime_lib = ctypes.CDLL('./realtime_control.so')

# 함수 호출
realtime_lib.control_motor(5)

 

그 외에도 ROS2 에서 리얼타임성을 지원하기도 한다. 

 

또 다른 예제로 Python으로 드론 제어하는 예제가 있겠다. 드론은 완전 하드 리얼타임은 아니지만, 어플리케이션의 특성 상 리얼타임에 가까운 제어성능이 나와야 한다. 요즘 드론 제어를 Python으로 많이 하기도 한다. 특히 DJI나 Parrot 같은 드론 제조사들이 Python SDK를 제공해서, 제어·영상 수집·미션 플래닝을 Python으로 할 수 있다. 다만, 완전 하드리얼타임 비행제어는 드론 내부 flight controller에서 처리하고, Python은 명령을 보내는 상위 어플리케이션(ground control station 역할)로 많이 쓴다.

 

아래 예제는 DJI Tello 드론 제어 예제이다. Tello 드론은 가벼운 테스트용 드론인데, Python으로 제어하기 좋다. 
기본적으로 UDP 통신으로 명령을 보내서 드론을 움직인다. 

from djitellopy import Tello
import time

# 드론 객체 생성
tello = Tello()

# 연결
tello.connect()

# 배터리 상태 확인
print("배터리:", tello.get_battery(), "%")

# 이륙
tello.takeoff()

# 앞쪽으로 100cm 이동
tello.move_forward(100)

# 90도 회전
tello.rotate_clockwise(90)

# 착륙
tello.land()

# 연결 종료
tello.end()

 

Tello 드론에 OpenCV를 연동하여, 객체 감지 후 회피하는 것도 가능하다. 

아래는 단순히 드론에서 영상을 가져와서 보여주는 간단한 코드이다. 

import cv2
from djitellopy import Tello

tello = Tello()
tello.connect()
tello.streamon()

while True:
    frame = tello.get_frame_read().frame
    cv2.imshow("Drone View", frame)

    key = cv2.waitKey(1)
    if key == ord('q'):
        break

tello.land()
tello.end()
cv2.destroyAllWindows()

 

여기에 YOLO 같은 딥러닝 객체 감지 모델을 추가하면, 장애물 감지 후 회피 명령 전송 등도 가능하다. 

 

Python에서 실시간성을 높이고 싶으면 threading 과 multiprocessing을 활용할 수 있으나, 

GIL 때문에 threading 모듈보다는 multiprocessing 을 활용하는 것을 추천한다. 

 

그럼 이만~