# AGVNavigationCore

ENIG AGV 시스템을 위한 핵심 네비게이션 및 경로 탐색 라이브러리

## 📋 개요

AGVNavigationCore는 자동 유도 차량(AGV) 시스템의 경로 계획, 맵 편집, 시뮬레이션, 실시간 모니터링 기능을 제공하는 .NET Framework 4.8 라이브러리입니다.

## 🏗️ 프로젝트 구조

### 📁 Controls/
**AGV 관련 사용자 인터페이스 컨트롤 및 AGV 추상화 계층**

- **AGVState.cs** - AGV 상태 열거형 (Idle, Moving, Rotating, Docking, Charging, Error)
- **IAGV.cs** - AGV 인터페이스 정의 (가상/실제 AGV 통합)
- **UnifiedAGVCanvas.cs** - 통합 AGV 캔버스 컨트롤 메인 클래스
- **UnifiedAGVCanvas.Events.cs** - 그리기 및 렌더링 로직 (AGV, 노드, 경로 시각화)
- **UnifiedAGVCanvas.Mouse.cs** - 마우스 이벤트 처리 (클릭, 드래그, 줌, 팬)

### 📁 Models/
**데이터 모델 및 핵심 비즈니스 엔티티 정의**

- **Enums.cs** - 핵심 열거형 정의 (NodeType, DockingDirection, AgvDirection, StationType)
- **MapNode.cs** - 맵 노드 엔티티 클래스 (논리적 노드 ID, 위치, 타입, 연결 정보, RFID 정보)
- **MapLoader.cs** - 맵 파일 로딩/저장 유틸리티 (JSON 직렬화, 데이터 마이그레이션, 검증)

### 📁 PathFinding/
**AGV 경로 탐색 및 계산 알고리즘**

#### 🟢 활발히 사용되는 클래스
- **AGVPathfinder.cs** - 메인 AGV 경로 계획기 (물리적 제약사항 고려)
- **AGVPathResult.cs** - 경로 계산 결과 데이터 클래스
- **DockingValidationResult.cs** - 도킹 검증 결과 데이터 클래스

#### 🟡 내부 구현 클래스
- **AStarPathfinder.cs** - A* 알고리즘 기반 기본 경로 탐색
- **DirectionChangePlanner.cs** - AGV 방향 전환 경로 계획 시스템
- **JunctionAnalyzer.cs** - 교차점 분석 및 마그넷 센서 방향 계산
- **NodeMotorInfo.cs** - 노드별 모터방향 정보 (방향 전환 지원 포함)
- **PathNode.cs** - A* 알고리즘용 경로 노드

### 📁 Utils/
**유틸리티 및 계산 헬퍼 클래스**

- **DockingValidator.cs** - AGV 도킹 방향 검증 유틸리티
- **LiftCalculator.cs** - AGV 리프트 방향 계산 유틸리티

### 📁 Properties/
- **AssemblyInfo.cs** - 어셈블리 정보 및 버전 관리

## 🎯 주요 기능

### 🗺️ 맵 관리
- **논리적 노드 시스템**: 물리적 RFID와 분리된 논리적 노드 ID 관리
- **노드 타입**: Normal, Rotation, Docking, Charging 등 다양한 노드 타입 지원
- **연결 관리**: 노드 간 방향성 연결 관리
- **JSON 저장/로드**: 표준 JSON 형식으로 맵 데이터 관리

### 🧭 경로 탐색
- **A* 알고리즘**: 효율적인 최단 경로 탐색
- **AGV 물리적 제약**: 전진/후진 모터 방향, 회전 제약 고려
- **방향 전환 계획**: 마그넷 센서 위치에서의 방향 전환 최적화
- **도킹 검증**: 목적지 타입에 따른 도킹 방향 검증

### 🎮 시각화 및 편집
- **통합 캔버스**: 맵 편집, 시뮬레이션, 모니터링 모드 지원
- **실시간 렌더링**: AGV 위치, 경로, 상태 실시간 표시
- **인터랙티브 편집**: 드래그앤드롭 노드 편집, 연결 관리
- **줌/팬**: 대형 맵 탐색을 위한 줌/팬 기능

## 🔧 아키텍처 특징

### ✅ 장점
- **계층화 아키텍처**: Models → Utils → PathFinding → Controls 의존성 구조
- **관심사 분리**: 각 폴더별 명확한 책임 분담
- **인터페이스 기반**: IAGV 인터페이스로 가상/실제 AGV 통합
- **확장성**: 새로운 알고리즘, AGV 타입 추가 용이

### ⚠️ 개선 영역
- **코드 크기**: 일부 클래스가 과도하게 큼 (UnifiedAGVCanvas.Events.cs: 1,699행)
- **복잡도**: DirectionChangePlanner 등 복잡한 로직 포함
- **분할 필요**: UnifiedAGVCanvas의 다중 책임 분리 필요

## 🚀 사용 방법

### 기본 맵 로딩
```csharp
var mapLoader = new MapLoader();
var mapNodes = mapLoader.LoadMap("path/to/map.json");
```

### 경로 계산
```csharp
var pathfinder = new AGVPathfinder();
pathfinder.SetMapNodes(mapNodes);

var result = pathfinder.FindPath("START_NODE", "TARGET_NODE", AgvDirection.Forward);
if (result.Success)
{
    Console.WriteLine($"경로: {string.Join(" -> ", result.Path)}");
    Console.WriteLine($"거리: {result.TotalDistance:F1}px");
}
```

### 캔버스 사용
```csharp
var canvas = new UnifiedAGVCanvas();
canvas.Nodes = mapNodes;
canvas.CurrentPath = result;
canvas.CurrentEditMode = UnifiedAGVCanvas.EditMode.Select;
```

## 📈 최근 업데이트 (2024.12)

### ✅ 완료된 개선사항
- **중복 코드 정리**: PathResult, RfidPathResult 등 중복 클래스 제거
- **아키텍처 통합**: AdvancedAGVPathfinder → AGVPathfinder 통합
- **좌표 정확성**: 줌/팬 시 노드 선택 정확도 개선
- **미사용 코드 제거**: PathfindingOptions 등 미사용 클래스 삭제

### 🔄 진행 중인 개선사항
- **방향 계산 최적화**: 리프트 방향 계산 로직 개선
- **도킹 검증**: 도킹 방향 검증 시스템 강화
- **성능 최적화**: 대형 맵 처리 성능 개선

## 🏃‍♂️ 향후 계획

### 우선순위 1 (즉시)
- UnifiedAGVCanvas 분할 (Rendering, Editing, Simulation 분리)
- [완료] PathFinding 폴더 세분화 (Core, Validation, Planning, Analysis)

### 우선순위 2 (중기)
- 인터페이스 표준화 (I접두사 통일)
- Utils 폴더 확장 (Calculations, Validators, Converters)

### 우선순위 3 (장기)
- 의존성 주입 도입
- 성능 모니터링 시스템
- 단위 테스트 확충

## 📦 의존성
- .NET Framework 4.8
- Newtonsoft.Json 13.0.3
- System.Drawing
- System.Windows.Forms

## 🔗 관련 프로젝트

- **AGVMapEditor**: 맵 편집 전용 애플리케이션
- **AGVSimulator**: AGV 시뮬레이션 애플리케이션
- **AGVCSharp**: 메인 AGV 제어 시스템

## 📞 연락처

ENIG AGV 개발팀 - 2024년 12월 업데이트