# AGVNavigationCore 프로젝트 기능 설명 ## 📋 개요 AGVNavigationCore는 AGV(Automated Guided Vehicle) 시스템을 위한 전문적인 경로 계산 및 네비게이션 라이브러리입니다. 실제 AGV의 물리적 제약사항과 운영 요구사항을 고려한 지능형 경로 탐색 기능을 제공합니다. ## 🏗️ 핵심 구조 ### **Models 패키지** - **MapNode**: 맵의 논리적 노드 정보 (위치, 타입, 연결 정보, RFID 매핑) - **RfidMapping**: RFID와 논리적 노드 ID 간의 매핑 정보 - **Enums**: 노드 타입, AGV 방향, 도킹 방향, 장비 타입 등 열거형 정의 ### **PathFinding 패키지** 경로 계산의 핵심 엔진들이 포함된 패키지 ## 🎯 주요 기능 ### 1. **기본 경로 탐색 (A* 알고리즘)** **AStarPathfinder 클래스**: - 표준 A* 알고리즘 구현으로 최적 경로 탐색 - 유클리드 거리 기반 휴리스틱 사용 - 설정 가능한 파라미터: - `HeuristicWeight`: 휴리스틱 가중치 (기본 1.0) - `MaxSearchNodes`: 최대 탐색 노드 수 (기본 1000개) **제공 기능**: ```csharp // 단일 경로 탐색 PathResult FindPath(string startNodeId, string endNodeId) // 다중 목표 중 최단 경로 탐색 PathResult FindNearestPath(string startNodeId, List targetNodeIds) // 노드 연결 상태 확인 bool AreNodesConnected(string nodeId1, string nodeId2) ``` ### 2. **AGV 전용 지능형 경로 계산** **AGVPathfinder 클래스**: AGV의 실제 움직임 제약사항을 고려한 전문 경로 계산기 **AGV 제약사항 고려**: - **방향성 제약**: 전진/후진만 가능, 좌우 이동 불가 - **회전 제약**: 특정 노드(회전 가능 지점)에서만 180도 회전 가능 - **도킹 방향**: - 충전기: 전진 도킹만 가능 - 장비 (로더, 클리너 등): 후진 도킹만 가능 **전용 기능**: ```csharp // AGV 경로 계산 (방향성 고려) AGVPathResult FindAGVPath(string startNodeId, string endNodeId, AgvDirection? targetDirection) // 가장 가까운 충전소 경로 AGVPathResult FindPathToChargingStation(string startNodeId) // 특정 장비 타입 도킹 스테이션 경로 AGVPathResult FindPathToDockingStation(string startNodeId, StationType stationType) ``` ### 3. **RFID 기반 경로 계산 (실제 운영용)** **RfidBasedPathfinder 클래스**: 실제 AGV가 RFID를 읽어서 위치를 파악하는 현장 운영 방식에 최적화 **RFID 기반 제약사항**: - **물리적 RFID**: 의미 없는 고유 식별자 (현장 유지보수 편의성) - **논리적 매핑**: RFID ↔ NodeId 분리로 맵 변경 시 유연성 확보 - **실시간 변환**: RFID 입력을 내부적으로 NodeId로 변환하여 처리 **RFID 전용 기능**: ```csharp // RFID 기반 AGV 경로 계산 RfidPathResult FindAGVPath(string startRfidId, string endRfidId, AgvDirection? targetDirection) // RFID 기반 충전소 경로 RfidPathResult FindPathToChargingStation(string startRfidId) // RFID 기반 도킹 스테이션 경로 RfidPathResult FindPathToDockingStation(string startRfidId, StationType stationType) // RFID 매핑 관리 RfidMapping GetRfidMapping(string rfidId) string GetNodeIdByRfid(string rfidId) string GetRfidByNodeId(string nodeId) ``` ### 4. **상세한 결과 분석** **PathResult (기본 결과)**: - 성공/실패 여부 - 노드 ID 시퀀스 - 총 거리 및 계산 시간 - 탐색한 노드 수 **AGVPathResult (AGV 전용 결과)**: - **실행 가능한 명령어 시퀀스**: `[전진, 전진, 우회전, 후진, 정지]` - **상세 메트릭**: - 회전 횟수 계산 - 예상 소요 시간 (이동 + 회전 시간) - 명령어 요약 (`전진×3 → 우회전×1 → 후진×2`) **RfidPathResult (RFID 기반 결과)**: - **RFID 경로 시퀀스**: `[RFID001, RFID045, RFID067, RFID123]` - **AGV 명령어**: NodeId 기반 결과와 동일한 명령어 시퀀스 - **현장 친화적 정보**: - RFID 경로 요약 (`RFID001 → ... (2개 경유) → RFID123`) - 실행 정보 (`[실행준비] → [명령어] → [예상시간]`) - 운영자용 상세 정보 ### 5. **실시간 검증 및 최적화** **경로 검증**: ```csharp // 경로 유효성 실시간 검증 bool ValidatePath(List path) // 네비게이션 가능 노드 필터링 (라벨/이미지 노드 제외) List GetNavigationNodes() ``` **성능 최적화**: - 메모리 효율적인 노드 관리 - 조기 종료 조건으로 불필요한 탐색 방지 - 캐시된 거리 계산 ## 🔧 설정 가능한 파라미터 **AGV 동작 파라미터**: - `CurrentDirection`: AGV 현재 방향 - `RotationCostWeight`: 회전 비용 가중치 (기본 50.0) - `DockingApproachDistance`: 도킹 접근 거리 (기본 100픽셀) **알고리즘 파라미터**: - `HeuristicWeight`: A* 휴리스틱 강도 - `MaxSearchNodes`: 탐색 제한으로 무한루프 방지 **RFID 매핑 파라미터**: - `RfidMappings`: RFID ↔ NodeId 매핑 테이블 - `IsActive`: 매핑 활성화 상태 - `Status`: RFID 상태 (정상, 손상, 교체예정) ## 🎯 실제 활용 시나리오 ### **시나리오 1: 일반 이동 (NodeId 기반)** ``` 현재위치(N001) → 목적지(N010) 결과: [N001, N003, N007, N010] + [전진, 전진, 전진] ``` ### **시나리오 2: 일반 이동 (RFID 기반)** ``` 현재위치(RFID123) → 목적지(RFID789) 결과: [RFID123, RFID456, RFID789] + [전진, 우회전, 전진] AGV는 RFID를 읽으면서 실제 위치 확인 후 이동 ``` ### **시나리오 3: 충전 필요** ``` 배터리 부족 → 가장 가까운 충전소 자동 탐색 결과: 충전소까지 최단경로 + 전진 도킹 명령어 ``` ### **시나리오 4: 화물 적재** ``` 로더 스테이션 접근 → 후진 도킹 필수 결과: 로더까지 경로 + 후진 도킹 시퀀스 ``` ## 🌟 차별화 포인트 1. **실제 AGV 제약사항 반영**: 이론적 경로가 아닌 실행 가능한 경로 제공 2. **명령어 레벨 출력**: 경로뿐만 아니라 실제 AGV 제어 명령어 생성 3. **RFID 기반 현장 운영**: 물리적 RFID와 논리적 노드 분리로 현장 유지보수성 향상 4. **다양한 장비 지원**: 충전기, 로더, 클리너, 버퍼 등 각각의 도킹 요구사항 처리 5. **이중 API 제공**: NodeId 기반(개발용) + RFID 기반(운영용) 동시 지원 6. **확장성**: 새로운 AGV 타입이나 제약사항 쉽게 추가 가능 7. **성능 최적화**: 실시간 운영에 적합한 빠른 응답속도 ## 🚀 사용 방법 ### 기본 사용법 ```csharp // 1. 경로 탐색기 초기화 var pathfinder = new AGVPathfinder(); pathfinder.SetMapNodes(mapNodes); // 2. AGV 경로 계산 var result = pathfinder.FindAGVPath("N001", "N010"); // 3. 결과 확인 if (result.Success) { Console.WriteLine($"경로: {string.Join(" → ", result.Path)}"); Console.WriteLine($"명령어: {result.GetCommandSummary()}"); Console.WriteLine($"예상시간: {result.EstimatedTimeSeconds}초"); } ``` ### 충전소 경로 탐색 ```csharp var chargingResult = pathfinder.FindPathToChargingStation("N001"); if (chargingResult.Success) { // 충전소까지 자동 이동 ExecuteAGVCommands(chargingResult.Commands); } ``` ## 📦 의존성 - .NET Framework 4.8 - Newtonsoft.Json 13.0.3 - System.Drawing ## 🔗 통합 프로젝트 이 라이브러리는 다음 프로젝트에서 사용됩니다: - **AGVMapEditor**: 맵 편집 및 경로 시뮬레이션 - **AGV4**: 메인 AGV 제어 시스템 - **AGVSimulator**: AGV 동작 시뮬레이터 --- *AGVNavigationCore는 ENIG AGV 시스템의 핵심 네비게이션 엔진입니다.*