Skip to content

heon0120/DART

Repository files navigation

DART - Drone Analytics and Routing Tool

프로젝트 개요

영화를 보다가 드론을 제어하는 미션컨트롤의 소프트웨어를 한번 구현해보고 싶어서 개발하였습니다. 영화 속 첩보/크라임/밀리터리 장면에서 드론을 제어할 때 보이는 멋진 미션 컨트롤 소프트웨어에서 영감을 받았습니다. 이 프로젝트는 그 감성을 현실로 구현한 것입니다.

Important

심심해서 개발한 소프트웨어인 만큼, 추후 지원은 제공하지 않습니다.

주요 기능

미션 관리

사용자는 새로운 미션을 생성하고 기존 미션을 불러올 수 있습니다. 각 미션은 고유한 식별자와 생성 날짜를 가지며, 여러 미션을 동시에 탭 형태로 관리할 수 있습니다. 미션의 마지막 저장 시간은 자동으로 추적됩니다.

웨이포인트 설정

지도 위에서 우클릭하여 웨이포인트를 추가할 수 있습니다. 각 웨이포인트는 위도, 경도, 고도, 속도, 작업 코드, 예상 도착 시간 등을 포함합니다. NATO 포네틱 코드를 자동으로 생성하여 웨이포인트 이름을 설정할 수 있습니다.

지도 시각화

Leaflet.js 기반의 대화형 지도가 제공되며, 여러 타일 레이어(다크 모드, 라이트 모드, OpenStreetMap, 위성 이미지, 하이브리드)를 선택할 수 있습니다. 웨이포인트는 작업 코드에 따른 색상의 군사 기호로 표시되며, 연결된 경로가 선으로 표시됩니다.

항공 데이터 오버레이

공항, 네비게이션 지점, 장애물, 제한 구역, R-Class 구역 등의 GeoJSON 항공 데이터를 지도에 오버레이할 수 있습니다. 각 데이터 항목을 클릭하면 상세 정보를 확인할 수 있습니다. 공항의 경우 관제권이 5NM 반경으로 표시됩니다.

좌표 변환

MGRS 군사 격자 좌표계로의 변환을 지원합니다. 마우스 이동 시 현재 위치의 위도, 경도, MGRS 좌표가 실시간으로 표시됩니다. MGRS 그리드를 지도에 오버레이하여 시각적으로 확인할 수 있습니다.

데이터 내보내기

미션 정보를 JSON 또는 CSV 형식으로 내보낼 수 있습니다. 내보낸 파일은 다른 시스템에서 분석하거나 아카이빙 목적으로 사용할 수 있습니다.

플러그인 시스템

애플리케이션은 세 가지 실행 단계에서 플러그인을 지원합니다. Pre-main 단계에서는 애플리케이션 시작 전에, splash 단계에서는 스플래시 화면 표시 중에, post-main 단계에서는 메인 창 표시 후에 플러그인을 실행할 수 있습니다. 각 플러그인은 권한을 선언하고 메타데이터를 포함할 수 있습니다.

다국어 지원

LocalizationManager를 통해 한국어와 영어를 포함한 다국어 UI를 제공합니다. 사용자 설정에서 언어를 변경할 수 있으며, 모든 UI 요소가 동적으로 번역됩니다.

설치 방법

필수 요구 사항

Python 3.8 이상이 설치되어 있어야 합니다. 또한 다음의 주요 라이브러리가 필요합니다.

  • PyQt5: GUI 프레임워크
  • PyQtWebEngine: 웹 뷰 렌더링
  • geopy: 지리 거리 계산
  • mgrs: MGRS 좌표 변환

설치 절차

  1. 저장소를 클론하거나 파일을 다운로드합니다.

  2. 필요한 Python 패키지를 설치합니다.

  3. openAIP_data 디렉터리에 항공 지리 데이터(GeoJSON 파일)를 배치합니다. 파일명 형식은 '{prefix}_apt.geojson', '{prefix}_nav.geojson' 등이어야 합니다.

openAIP 의 geojson 데이터는 OpenAIP 에서 회원가입후 Data Exports 항목에서 무료로 다운로드 받을수 있습니다.

Important

OpenAIP_data 디렉터리에 geojson데이터가 존재하지 않는다면 관제권, 공항등 특정 오버레이가 표시되지 않습니다.

  1. locales 디렉터리에 다국어 번역 파일이 포함되어 있습니다. 필요에 따라 추가 언어를 지원하도록 수정할 수 있습니다.

  2. 애플리케이션을 실행합니다.

python main.py

사용 방법

미션 생성

메인 창 좌측 패널의 '새 미션 추가' 버튼을 클릭하여 새로운 미션을 생성합니다. 미션 이름을 입력하면 자동으로 타임스탬프 기반의 기본값이 제공됩니다.

웨이포인트 추가

지도 위에서 우클릭하면 해당 위치에 웨이포인트가 추가됩니다. 웨이포인트는 자동으로 NATO 포네틱 이름이 할당됩니다.

웨이포인트 편집

지도의 웨이포인트 마커를 우클릭하면 편집 다이얼로그가 열립니다. 여기서 고도, 작업 코드, 속도, 예상 도착 시간을 수정할 수 있습니다. 웨이포인트의 이름을 NATO 포네틱으로 변환하거나 직접 입력할 수 있습니다.

웨이포인트 이동

지도의 웨이포인트 마커를 드래그하여 위치를 변경할 수 있습니다. 좌표는 자동으로 업데이트됩니다.

웨이포인트 삽입

두 웨이포인트 사이에 새로운 웨이포인트를 삽입할 수 있습니다. 새 웨이포인트의 위치와 속도는 인접한 웨이포인트의 중간값으로 계산됩니다.

좌표 표시

우측 상단의 '좌표' 버튼을 클릭하여 마우스 위치의 위도, 경도, MGRS 좌표를 실시간으로 표시할 수 있습니다. 좌표는 화면 좌하단에 표시됩니다.

MGRS 그리드 표시

'MGRS GRID' 버튼을 클릭하여 지도에 MGRS 격자를 오버레이할 수 있습니다. 줌 레벨에 따라 격자 간격이 자동으로 조정됩니다.

항공 데이터 확인

상단 드롭다운에서 항공 데이터 레이어(공항, 네비게이션, 장애물, 제한 구역 등)를 선택하여 지도에 표시할 수 있습니다. 각 항목을 클릭하면 상세 정보 팝업이 나타납니다.

데이터 저장 및 내보내기

좌측 패널의 '로컬 저장' 버튼을 클릭하여 미션을 데이터베이스에 저장합니다. 'JSON' 또는 'CSV' 버튼으로 미션을 해당 형식으로 내보낼 수 있습니다.

파일 구조

  • main.py: 애플리케이션의 메인 파일입니다. 모든 핵심 로직과 UI를 포함합니다.
  • modules/: 애플리케이션의 기능을 확장하는 모듈들이 위치합니다.
    • splash.py: 스플래시 화면 구현
    • plugin_loader.py: 플러그인 로딩 및 실행 시스템
    • localization.py: 다국어 지원 시스템
    • PLUGIN_GUIDE.md: 플러그인 개발 가이드
    • LOCALIZATION_GUIDE.md: 다국어 추가 가이드
    • plugins/: 샘플 플러그인들이 위치합니다.
      • sample.py, sample_pre_main.py, sample_post_main.py, sample_splash.py: 플러그인 샘플
      • sample_permission_request.py: 권한 요청 플러그인 샘플
  • locales/: 다국어 번역 파일들이 위치합니다.
    • en/: 영어 번역
    • ko/: 한국어 번역
  • openAIP_data/: 항공 지리 데이터(GeoJSON 파일)가 위치합니다.
    • 공항, 네비게이션, 장애물, 제한 구역 등의 데이터 파일
  • missions.db: SQLite 데이터베이스 파일입니다. 미션과 웨이포인트 정보를 저장합니다.
  • manage_permissions.py: 플러그인 권한 관리 도구입니다.

기술 스택

  • Python 3.8+: 프로그래밍 언어
  • PyQt5: 데스크톱 GUI 프레임워크
  • PyQtWebEngine: 웹 기술 기반 뷰
  • Leaflet.js: 대화형 지도 라이브러리
  • geopy: 지리 거리 계산 라이브러리
  • mgrs: MGRS 좌표 변환 라이브러리
  • SQLite3: 경량 데이터베이스

데이터 모델

Waypoint 클래스

각 웨이포인트는 다음 정보를 포함합니다.

  • lat: 위도
  • lon: 경도
  • alt: 고도(기본값: 100m)
  • task_code: 작업 코드(기본값: "CRUISE")
  • wp_id: 웨이포인트 고유 식별자
  • speed: 비행 속도(기본값: 50.0 km/h)
  • eta: 예상 도착 시간
  • distance: 이전 웨이포인트로부터의 거리
  • name: 웨이포인트 이름

Mission 클래스

각 미션은 다음 정보를 포함합니다.

  • mission_id: 미션 고유 식별자
  • mission_name: 미션 이름
  • waypoints: 웨이포인트 목록
  • created_at: 생성 날짜 및 시간
  • last_saved_at: 마지막 저장 날짜 및 시간

FAQ (자주 묻는 질문)

기본 사용

Q. 웨이포인트를 어떻게 추가하나요?

A. 지도 위의 원하는 위치에서 우클릭하면 자동으로 웨이포인트가 추가됩니다. NATO 포네틱 알파벳이 자동으로 할당되며, 웨이포인트를 클릭해서 편집할 수 있습니다.

Q. 두 웨이포인트 사이에 새로운 웨이포인트를 삽입하려면?

A. 좌측 패널의 "웨이포인트 삽입" 버튼을 클릭하고, 시작 및 종료 웨이포인트를 선택하세요. 새 웨이포인트의 위치와 속도는 인접한 웨이포인트의 중간값으로 자동 계산됩니다.

Q. 웨이포인트를 삭제하려면?

A. 지도의 웨이포인트 마커를 우클릭하여 편집 다이얼로그를 열고, "DELETE" 버튼을 클릭하면 삭제됩니다.

데이터 및 저장

Q. 미션 데이터는 어디에 저장되나요?

A. 모든 미션과 웨이포인트는 missions.db SQLite 데이터베이스에 저장됩니다. 이 파일은 애플리케이션과 같은 디렉터리에 위치합니다.

Q. 이전에 만든 미션을 불러올 수 있나요?

A. 네, 애플리케이션을 시작할 때 자동으로 저장된 모든 미션이 로드됩니다. 탭 형태로 여러 미션을 동시에 관리할 수 있습니다.

Q. 미션을 다른 형식으로 내보낼 수 있나요?

A. JSON과 CSV 형식으로 내보낼 수 있습니다. 좌측 패널의 버튼을 사용하면 내보낸 파일은 다른 분석 도구에서 활용할 수 있습니다.

Q. 내보낸 JSON/CSV 파일을 다시 불러올 수 있나요?

A. 현재 버전에서는 지원하지 않습니다. 향후 버전에서 추가할 예정입니다.

지도 및 좌표

Q. MGRS 좌표가 뭔가요?

A. MGRS(Military Grid Reference System)는 군사 표준 격자 좌표계입니다. 일반 위도/경도보다 빠르고 정확하게 위치를 지정할 수 있습니다.

Q. MGRS 그리드를 항상 표시할 수는 없나요?

A. "MGRS GRID" 버튼으로 토글할 수 있습니다. 지도를 이동하거나 줌할 때 자동으로 그리드가 업데이트됩니다.

Q. 지도 타일을 변경할 수 있나요?

A. 네, 지도 좌상단의 레이어 컨트롤에서 다크 모드, 라이트 모드, 위성 이미지, 하이브리드 등 다양한 타일을 선택할 수 있습니다.

Q. 좌표 표시는 어디서 켤 수 있나요?

A. 상단의 "COORDS" 버튼을 클릭하면 마우스 위치의 위도, 경도, MGRS 좌표가 화면 좌하단에 실시간으로 표시됩니다.

항공 데이터

Q. 공항 데이터(APT)가 표시되지 않습니다.

A. openAIP_data 디렉터리에 *_apt.geojson 파일이 있는지 확인하세요. 파일이 없으면 드롭다운에서 비활성화됩니다.

Q. 공항의 관제권이 뭔가요?

A. 공항 관제권은 공항 중심에서 5NM(약 9.3km) 반경의 원형 구역입니다. 대부분의 국가에서 드론 비행이 제한됩니다.

Q. 제한 구역(RAA)에서는 비행할 수 없나요?

A. 네, 제한 구역은 군사 훈련, 공역 이용 등의 이유로 비행이 금지됩니다. 실제 드론 운영 시에는 반드시 최신 규정을 확인하세요.

성능 및 기술

Q. 많은 웨이포인트를 추가해도 괜찮나요?

A. 현재 최대 수백 개의 웨이포인트를 지원합니다. 수천 개 이상은 성능 저하가 발생할 수 있습니다.

Q. 인터넷이 필요한가요?

A. 지도 타일(OpenStreetMap, CartoDB, Esri)을 로드하기 위해 필요합니다. 오프라인 모드는 현재 미지원입니다.

Q. 어떤 Python 버전을 사용해야 하나요?

A. Python 3.8 이상이 필요합니다. Python 3.10 이상을 권장합니다.

Q. 다른 운영체제에서도 실행되나요?

A. Windows, macOS, Linux 모두 지원됩니다. 단, PyQt5의 의존성에 따라 설치 과정이 다를 수 있습니다.

플러그인 및 확장

Q. 플러그인을 만들 수 있나요?

A. 네, DART는 플러그인 시스템을 지원합니다. modules/plugins/ 디렉터리에 있는 샘플 플러그인을 참고하세요. 자세한 가이드는 modules/PLUGIN_GUIDE.md를 확인하세요.

Q. 새로운 언어를 추가하려면?

A. locales/ 디렉터리에 언어 코드 폴더를 만들고 JSON 번역 파일을 추가하세요. 자세한 가이드는 modules/LOCALIZATION_GUIDE.md를 확인하세요.

실제 운영

Q. 실제 드론과 연동할 수 있나요?

A. 현재는 미션 계획 도구입니다. 드론 API 통합은 생각해보고 있으나 아직은 미정입니다.

Q. 다른 좌표계를 지원하나요?

A. MGRS와 Lat/Lon을 지원합니다. UTM 등은 추가 개발이 필요합니다.

Q. 실제 드론 운영 시 주의사항은?

A. 본 소프트웨어는 계획 도구일 뿐입니다. 실제 드론 운영 시에는 해당 국가의 항공 규정을 준수하세요.

Q. 예상 비행 시간(ETA)은 정확한가요?

A. ETA는 웨이포인트 간 거리와 입력한 속도를 기반으로 계산됩니다. 실제 비행 시간은 날씨, 지형, 드론 특성 등에 따라 달라질 수 있습니다.

문제 해결

Q. 지도가 로드되지 않습니다.

A. 인터넷 연결을 확인하세요. 방화벽이 CDN 접근을 차단하고 있을 수도 있습니다.

Q. GeoJSON 파일을 추가했는데도 나타나지 않습니다.

A. 파일명 형식을 확인하세요: {prefix}_apt.geojson, {prefix}_nav.geojson 등 애플리케이션을 재시작해야 파일이 인식됩니다.

Q. 웨이포인트를 드래그할 수 없습니다.

A. 지도가 완전히 로드될 때까지 기다려주세요. 스플래시 화면에서 "로딩 완료!" 메시지가 표시되면 사용할 수 있습니다.

Q. 데이터베이스가 손상되었습니다.

A. missions.db 파일을 삭제하면 다음 시작 시 새로 생성됩니다. 기존 미션 데이터는 손실됩니다.

라이선스

본 프로젝트는 GPLv3 라이선스 하에 배포됩니다. 자세한 내용은 LICENSE 파일을 참고하시기 바랍니다.

버전 정보

현재 버전은 1.3 BETA입니다.

요구사항 및 피드백

기능 추가, 버그 리포트, 또는 개선 사항에 대한 피드백은 환영합니다. 프로젝트 저장소의 이슈 섹션을 통해 요청사항을 제출할 수 있습니다.

주의사항

본 애플리케이션은 드론 미션 계획 및 분석을 위한 도구입니다. 실제 드론 운영 시에는 해당 국가의 항공 규정을 준수해야 하며, 필요한 허가와 승인을 사전에 획득해야 합니다. 공항 관제권, 제한 구역, 그 외 비행 금지 구역에 대한 정보는 정확성을 위해 최신 데이터를 확인하고 확인해야 합니다. 본 프로그램은 한국을 기준으로 개발되었습니다. 관련 법규, 정책은 모두 한국을 기반으로 개발되었으며 다른 국가에서 사용할 경우 본 소프트웨어의 항공 정보, 법규, 정책이 해당 국가와 일치하지 않을 수 있습니다.

About

Drone Analytics and Routing Tool

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors