- Fix ScreenToWorld coordinate transformation bug in wheel event - Implement proper mouse cursor-centered zoom calculation - Calculate world coordinates before zoom and maintain them after zoom - Adjust pan offset to keep mouse cursor pointing at same world position - Remove matrix-based transformation that was causing coordinate issues Fixes: Wheel zoom now correctly centers on mouse cursor position and no longer causes erratic panning 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
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의 다중 책임 분리 필요
🚀 사용 방법
기본 맵 로딩
var mapLoader = new MapLoader();
var mapNodes = mapLoader.LoadMap("path/to/map.json");
경로 계산
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");
}
캔버스 사용
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월 업데이트