Skip to main content

AI 비행 추적기 혁신: 손 제스처로 조작하는 터치리스 인터페이스 만들기 (AI 비행 추적기, 손 제스처 제어, 터치리스 인터페이스)

Published 4 min readMarkdown

# 서론 – “손으로 비행기를 잡는다”?

2025년, 인공지능(AI) 기술이 일상에 스며들면서 터치리스 인터페이스가 새로운 표준이 되고 있습니다.

하지만 “손으로 비행기를 추적한다”는 말은 아직도 많은 사람에게는 낯선 개념이죠.

이번 포스팅에서는 AI 비행 추적기를 손 제스처로 제어하는 프로젝트를 초보자도 따라 할 수 있게 단계별로 풀어봅니다.

왜 손 제스처가 필요할까?

  • 위생 문제: 코로나 이후 비접촉 조작이 선호됩니다.

  • 직관성: 손 움직임 하나로 복잡한 UI를 대체합니다.

  • 접근성: 물리적 마우스·키보드가 어려운 환경에서도 사용 가능하죠.

이제 직접 “손으로 비행기를 잡고, 움직이는” 경험을 만들어 보세요!

# 1️⃣ 프로젝트 개요 – 어떤 기술을 쓸까?

| 요소 | 설명 | 선택 이유 |

|------|------|-----------|

| AI 모델 | MediaPipe Hands (구글 오픈소스) | 실시간 손 랜드마크 추출, 경량화 |

| 프로그래밍 언어 | Python + Flask | 빠른 프로토타입, 웹 기반 UI |

| 지도 API | Google Maps JavaScript API | 풍부한 지도 데이터와 실시간 항공기 위치 |

| 데이터 소스 | OpenSky Network 실시간 ADS‑B | 무료로 전 세계 항공기 정보를 제공 |

위 구성은 초보자도 쉽게 설치하고 실행할 수 있도록 설계되었습니다.

# 2️⃣ 환경 설정 – 준비물부터 설치까지

  1. Python 3.9 이상 설치
bash

   sudo apt-get update

   sudo apt-get install python3 python3-pip
  1. 가상환경 만들기
bash

   python3 -m venv venv

   source venv/bin/activate
  1. 필수 패키지 설치
bash

   pip install mediapipe opencv-python flask requests
  1. Google Maps API 키 발급 – 구글 클라우드 콘솔에서 “Maps JavaScript API”를 활성화하고 키를 복사합니다.

팁: API 키는 config.py 파일에 GOOGLE_MAPS_KEY = 'YOUR_KEY' 형태로 저장하면 보안에 유리합니다.

# 3️⃣ 손 제스처 인식 구현 – MediaPipe 활용하기

MediaPipe Hands는 21개의 손 랜드마크를 30fps 이상 실시간으로 반환합니다. 아래 코드는 웹캠 영상을 받아 손 좌표를 추출하고, ‘손을 펴면 확대, 손을 모으면 축소’ 동작을 매핑합니다.

python

import cv2, mediapipe as mp

mp_hands = mp.solutions.hands

hands = mp_hands.Hands(max_num_hands=1, min_detection_confidence=0.7)

cap = cv2.VideoCapture(0)

while cap.isOpened():

    ret, frame = cap.read()

    if not ret: break

    rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    result = hands.process(rgb)

    if result.multi_hand_landmarks:

        hand = result.multi_hand_landmarks[0]

        # 손목(0)과 중지 끝(12) 거리 계산

        wrist = hand.landmark[0]

        middle_tip = hand.landmark[12]

        distance = ((wrist.x - middle_tip.x)**2 + (wrist.y - middle_tip.y)**2)**0.5

        # 거리 기준으로 확대/축소 신호 전송

        if distance > 0.2:

            gesture = 'zoom_in'

        else:

            gesture = 'zoom_out'

        # 여기서 Flask 서버에 gesture 전송

    cv2.imshow('Hand', frame)

    if cv2.waitKey(1) & 0xFF == 27: break

cap.release()

cv2.destroyAllWindows()

위 코드를 실행하면 손 모양에 따라 gesture 변수가 'zoom_in' 혹은 'zoom_out' 값을 가집니다. 이제 이 값을 Flask를 통해 웹 페이지에 전달하면 지도 UI를 제어할 수 있습니다.

# 4️⃣ Flask 서버와 지도 연동 – 손 제스처가 지도에 반영되다

app.py 파일을 만들고 아래와 같이 작성합니다.

python

from flask import Flask, render_template, jsonify, request

import threading, time

app = Flask(__name__)

# 전역 변수: 현재 제스처 상태

current_gesture = None

@app.route('/')

def index():

    return render_template('index.html')   # 지도와 UI가 들어간 HTML

@app.route('/gesture', methods=['POST'])

def receive_gesture():

    global current_gesture

    data = request.get_json()

    current_gesture = data['gesture']

    return jsonify(status='ok')

@app.route('/status')

def status():

    return jsonify(gesture=current_gesture)

if __name__ == '__main__':

    app.run(debug=True)

templates/index.html 은 Google Maps와 간단한 JavaScript 로직을 포함합니다.

html

<!DOCTYPE html>

<html>

<head>

  <meta charset='utf-8'>

  <title>손 제스처 비행 추적기</title>

  <script src='https://maps.googleapis.com/maps/api/js?key={{ key }}&libraries=visualization'></script>

  <style>#map{height:90vh; width:100%;}</style>

</head>

<body>

<div id='map'></div>

<script>

let map = new google.maps.Map(document.getElementById('map'), {

  center: {lat: 37.5665, lng: 126.9780},

  zoom: 5

});

// 실시간 항공기 표시 (OpenSky API 예시)

function loadFlights(){

  fetch('https://opensky-network.org/api/states/all')

    .then(r=>r.json())

    .then(data=>{

      data.states.forEach(s=>{

        new google.maps.Marker({

          position:{lat:s[6], lng:s[5]},

          map,

          title:s[1]

        });

      });

    });

}
loadFlights();

// 제스처에 따라 지도 확대/축소

setInterval(()=>{

  fetch('/status')

    .then(r=>r.json())

    .then(d=>{

      if(d.gesture==='zoom_in'){

        map.setZoom(map.getZoom()+1);

      }else if(d.gesture==='zoom_out'){

        map.setZoom(map.getZoom()-1);

      }

    });

},500);

</script>

</body>

</html>

이제 손을 펴면 지도 확대, 손을 모으면 축소가 실시간으로 동작합니다. 비행기 마커는 OpenSky에서 5초마다 업데이트되니, 실제 항공 흐름을 눈으로 확인할 수 있습니다.

# 5️⃣ 프로젝트 확장 아이디어 – 더 풍부한 경험 만들기

| 아이디어 | 구현 방법 | 기대 효과 |

|----------|----------|-----------|

| 다중 제스처 (예: 손가락 2개 → 특정 항공편 고정) | MediaPipe 손가락 개수 판단 로직 추가 | 사용자 맞춤형 정보 제공 |

| 음성 피드백 (제스처 인식 시 “확대합니다”) | Google Text‑to‑Speech API 연동 | 접근성 향상 |

| AR 모드 (스마트폰 카메라에 비행기 라인 오버레이) | ARCore 혹은 WebXR 활용 | 몰입감 높은 시각화 |

위와 같은 확장은 AI 비행 추적기를 단순 도구가 아닌 스마트 여행 어시스턴트로 발전시킬 수 있습니다.

# 결론 – 손끝에서 시작되는 AI 비행 추적기의 미래

이번 포스팅을 통해 AI 비행 추적기와 손 제스처 제어, 터치리스 인터페이스라는 세 가지 핵심 키워드를 연결해 보았습니다.

  1. MediaPipe Hands 로 손을 인식하고,

  2. Flask 로 실시간 제스처를 웹에 전달하며,

  3. Google Maps 와 OpenSky 데이터를 결합해 비행기를 시각화합니다.

시작은 간단하지만, 위에서 제시한 확장 아이디어를 적용하면 맞춤형 항공 정보 서비스를 직접 만들 수 있습니다.

지금 바로 코드를 복제하고, 손을 들어 당신만의 터치리스 비행 추적기를 실행해 보세요!

행동 유도: 레포지토리를 포크하고, README.md에 있는 설치 가이드를 따라 실행해 보세요. 실행 후 느낀 점이나 개선 아이디어를 댓글로 남겨주시면, 다음 업데이트에 반영하겠습니다. 🚀

No comments yet. Be the first to comment.

More from this blog