V2.0 자동 복귀 시스템 아키텍처

시스템 개요: 경로 이탈 감지 및 자동 복귀 기능이 포함된 자율주행 시스템입니다. 외부 영향(바람, 해류, 수동 조타)에 의한 경로 이탈을 실시간으로 감지하고, 자동으로 목적지로 복귀합니다.

전체 시스템 구성도

graph TB subgraph Browser["사용자 브라우저"] UI["V2 웹 UI
- Leaflet 지도
- 경유지/경로 생성
- 외부 영향 슬라이더
- 실제 이동 경로 시각화"] end subgraph Flask["Flask 서버"] ARC["AutoRecoveryController
- 자율주행 상태 관리
- GPS 스레드
- 경유지 도달 감지
- 경로 이탈 감지
- 자동 복귀 로직"] API["REST API 엔드포인트
상태 조회 및 제어"] LOG["Logger
- 콘솔/파일 로깅
- 로그 순환 버퍼"] MC["MotorController
- GPIO/PWM 제어
- 모터 아밍/스로틀
- 좌/우 모터 분리 제어"] WM["WaypointManager
- 경유지 관리
- 상세 경로 저장
- 현재 경유지 추적"] VGPS["VirtualGPSSimulator
- GPS 위치 시뮬레이션
- 헤딩 계산
- 외부 영향 보정"] end subgraph Files["파일 시스템"] LOG_FILE["로그 파일"] ROUTE_FILE["경로 생성 로그"] end UI -->|"HTTP/JSON"| API API --> ARC ARC --> LOG ARC --> MC ARC --> WM ARC <--> VGPS LOG --> LOG_FILE UI -.->|"경로 생성 로그"| ROUTE_FILE UI -->|"경유지 설정"| API API -->|"waypoints + detailed_route"| WM ARC -->|"target_position"| VGPS VGPS -->|"current_position/heading"| ARC ARC -->|"status"| API API -->|"JSON"| UI UI -->|"external_effects"| API API -->|"wind/current/steering"| ARC ARC -->|"외부 영향 적용"| VGPS VGPS -->|"보정된 헤딩"| ARC style UI fill:#4ecdc4 style ARC fill:#ff6b6b style API fill:#95e1d3 style LOG fill:#ffe66d style MC fill:#f38181 style WM fill:#a8e6cf style VGPS fill:#ffd93d

모듈별 상세 구성

1. AutoRecoveryController (메인 컨트롤러)

주요 책임:
  • 상태 관리: 자율주행 모드, 복귀 모드, 현재/목적지 위치
  • GPS 스레드 관리: 정기적으로 위치 업데이트 및 자동 복귀 처리
  • 경유지 도달 처리: 목적지 도달 시 다음 경유지로 이동
  • 경로 이탈 감지: 상세 경로와의 최근접 거리 계산
  • 복귀 모드 제어: 이탈 시 복귀 모드 진입, 복귀 시 정상 모드 복귀
  • 외부 영향 통합: 바람/해류/조타 효과를 가상 GPS에 전달
기술 스택: Python Flask Threading

2. WaypointManager (경유지 관리)

주요 기능:
  • 경유지 저장: 사용자 설정 경유지 배열 관리
  • 상세 경로 저장: 일정 간격으로 생성된 상세 경로 포인트
  • 현재 경유지 추적: 진행 상태 관리
  • 목적지 설정: 현재 목적지 관리
  • 다음 경유지 이동: 인덱스 증가 및 목적지 업데이트

3. VirtualGPSSimulator (GPS 시뮬레이션)

주요 기능:
  • 위치 시뮬레이션: 시간 기반 위치 업데이트
  • 헤딩 계산: 목적지 방향 계산 (Haversine 기반)
  • 외부 영향 적용: 바람, 해류, 조타 보정
  • 속도 제어: 정지/재가속 제어
  • 방향 제어: 회전 제어
시뮬레이션 파라미터:
  • 최대 속도: 5.0 m/s
  • 가속도: 1.0 m/s²
  • 회전 속도: 30.0 deg/s

4. MotorController (모터 제어)

주요 기능:
  • GPIO 초기화: PWM 설정
  • 모터 아밍: 좌/우 모터 분리 아밍
  • 스로틀 제어: 스로틀 범위 설정
  • 안전 정지: 긴급 정지 기능
기술 스택: RPi.GPIO PWM

핵심 알고리즘

1. 다단계 접근 알고리즘

graph LR A[일반 주행
원거리
고속] -->|접근| B[접근 모드
중거리
중속] B -->|정밀 접근| C[정밀 모드
근거리
저속] C -->|도달| D[정확한 도달
목적지
정지] D -->|미션 수행| E[다음 경유지
이동]
V2.0 개선 사항:
  • 정밀 도달 기준: 목적지 정확도 향상
  • 제자리 방향 전환: 도달 시 정지 → 회전 → 재가속
  • 방향 전환 지점 = 경유지점: 정확한 지점 도달 보장

2. Haversine 거리 계산

거리 계산 알고리즘:
  • 지구의 곡률을 고려한 대원 거리(Great Circle Distance) 계산
  • 위도/경도 좌표 간의 정확한 거리 측정
  • 실시간 위치 추적 및 목적지 도달 판정에 사용

3. 경로 포인트 생성

경로 샘플링:
  • 출발지와 목적지 사이를 일정 간격으로 샘플링
  • 상세 경로 포인트 배열 생성
  • 경로 이탈 감지 및 복귀 알고리즘에 활용

데이터 흐름 상세

자율주행 시작 ~ 경유지 도달 흐름

sequenceDiagram participant UI as 웹 UI participant API as Flask API participant ARC as AutoRecoveryController participant WM as WaypointManager participant VGPS as VirtualGPS participant MC as MotorController UI->>API: 자율주행 시작 요청 API->>ARC: start_autonomous() ARC->>MC: 모터 아밍 확인 ARC->>WM: target_position 확인 ARC->>VGPS: 시뮬레이션 시작 ARC->>VGPS: 목적지 설정 ARC->>MC: 스로틀 설정 API-->>UI: 성공 응답 loop GPS 스레드 (정기적 업데이트) VGPS->>VGPS: 위치/헤딩 업데이트 VGPS->>ARC: current_position ARC->>ARC: 경로 이탈 계산 ARC->>ARC: 복귀 처리 alt 경유지 도달 ARC->>ARC: 경유지 도달 처리 ARC->>VGPS: 속도 설정 (정지) ARC->>ARC: 다음 목적지 계산 ARC->>VGPS: 방향 설정 ARC->>WM: 다음 경유지로 이동 ARC->>VGPS: 새 목적지 설정 ARC->>VGPS: 속도 설정 (재가속) end ARC->>API: 상태 업데이트 API-->>UI: JSON status UI->>UI: 지도 마커 업데이트
실제 이동 경로 추가 end

경로 이탈 감지 및 복귀 흐름

sequenceDiagram participant ARC as AutoRecoveryController participant VGPS as VirtualGPS participant UI as 웹 UI loop GPS 스레드 ARC->>ARC: 경로 이탈 거리 계산 Note over ARC: 가장 가까운 경로 포인트
거리 계산 ARC->>ARC: 외부 영향 증폭
(바람/해류/조타) alt 이탈 거리 > 임계값 ARC->>ARC: 복귀 모드 진입 ARC->>UI: 복귀 모드 표시 ARC->>ARC: 복귀 목적지 조정 ARC->>ARC: 외부 영향 보정 적용 ARC->>VGPS: 보정된 헤딩 적용 else 복귀 거리 ≤ 임계값 ARC->>ARC: 정상 모드 복귀 ARC->>UI: 정상 모드 표시 end end

자동 복귀 시스템

복귀 알고리즘 플로우

stateDiagram-v2 [*] --> IDLE: 시스템 시작 IDLE --> READY: 모터 아밍 READY --> CONFIGURED: 경유지 설정 CONFIGURED --> AUTONOMOUS: 자율주행 시작 AUTONOMOUS --> CRUISING: 정상 주행 CRUISING --> RECOVERY: 경로 이탈 RECOVERY --> CRUISING: 경로 복귀 CRUISING --> APPROACHING: 경유지 접근 APPROACHING --> PRECISION: 정밀 접근 PRECISION --> ARRIVED: 정확한 도달 ARRIVED --> ROTATING: 정지 후 회전 ROTATING --> NEXT_WAYPOINT: 다음 목적지 설정 NEXT_WAYPOINT --> CRUISING: 이동 재개 ARRIVED --> COMPLETE: 모든 경유지 완료 COMPLETE --> IDLE: 자율주행 종료 RECOVERY --> IDLE: 긴급 정지
복귀 시스템 설정:
  • 이탈 임계값: 복귀 모드 진입 거리
  • 복귀 임계값: 정상 모드 복귀 거리
  • 최대 허용 이탈: 안전 한계 거리
  • 외부 영향 증폭: 이탈 거리 계산 시 외부 영향 고려

외부 영향 시뮬레이션

외부 영향 보정 알고리즘

graph LR A[기본 헤딩
목적지 방향 계산] --> B[바람 보정] B --> C[해류 보정] C --> D[수동 조타 보정] D --> E[보정된 헤딩
0-360도 정규화] E --> F[가상 GPS 적용]
외부 영향 파라미터:
영향 범위 최대 보정각 설명
바람 강도 -1.0 ~ 1.0 ±15° 측풍에 의한 표류
해류 강도 -1.0 ~ 1.0 ±10° 해류에 의한 표류
수동 조타 -1.0 ~ 1.0 ±30° 사용자 조타 입력

외부 영향 적용 흐름

sequenceDiagram participant UI as 웹 UI participant API as Flask API participant ARC as AutoRecoveryController participant VGPS as VirtualGPS UI->>UI: 슬라이더 조정
(바람/해류/조타) UI->>API: 외부 영향 설정 요청 API->>ARC: set_external_effects(effects) ARC->>VGPS: set_external_effects(effects) loop GPS 시뮬레이션 VGPS->>VGPS: 기본 헤딩 계산
(목적지 방향) VGPS->>VGPS: 외부 영향 보정각 계산 VGPS->>VGPS: 보정된 헤딩 적용 VGPS->>ARC: 보정된 헤딩 반영 ARC->>ARC: 경로 이탈 거리 증폭
(외부 영향 고려) end

시각화 시스템

지도 마커 종류:
  • 출발지: 초록색 원
  • 목적지: 빨간색 원
  • 경유지: 주황색 원
  • 계획 경로: 회색 원
  • 실제 이동 경로: 빨간색 작은 점 (외부 영향 시각화)
  • 보트 마커: 방향 표시 삼각형 (헤딩 반영)
실제 이동 경로 기록:
  • 자율주행 중 일정 거리 이상 이동 시마다 경로 포인트 추가
  • 최대 포인트 수 제한으로 메모리 관리
  • 외부 영향으로 인한 경로 이탈 시각화
기술 스택: Leaflet JavaScript WebSocket/HTTP

성능 최적화

최적화 전략:
  • GPS 업데이트 주기: 실시간성과 성능의 균형
  • 경로 검색: 최근접 포인트 효율적 검색
  • 마커 관리: 최대 포인트 수 제한
  • 로깅 최적화: 순환 버퍼로 메모리 관리
  • 단일 프로세스: 리소스 충돌 방지