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