refactor: PathFinding 폴더 구조 개선 및 도킹 에러 기능 추가

- PathFinding 폴더를 Core, Validation, Planning, Analysis로 세분화
- 네임스페이스 정리 및 using 문 업데이트
- UnifiedAGVCanvas에 SetDockingError 메서드 추가
- 도킹 검증 시스템 인프라 구축
- DockingValidator 유틸리티 클래스 추가
- 빌드 오류 수정 및 안정성 개선

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
ChiKyun Kim
2025-09-16 14:46:53 +09:00
parent debbf712d4
commit ef72b77f1c
37 changed files with 1085 additions and 2796 deletions

View File

@@ -134,8 +134,107 @@ SubProject 내의 GitUpdate.bat을 사용하여 모든 하위 프로젝트를
### RFID 매핑 아키텍처 원칙
**중요**: 물리적 RFID ID는 의미없는 고유값으로 관리하고, 논리적 노드 ID와 별도 매핑 테이블로 분리하여 현장 유지보수성 향상
## AGV 방향 제어 및 도킹 시스템 (2024.12.16)
### 🔄 AGV 방향 체계 및 하드웨어 구조
#### 하드웨어 레이아웃
```
LIFT --- AGV --- MONITOR
↑ ↑ ↑
후진시 AGV본체 전진시
도달위치 도달위치
```
#### 모터 방향과 이동 방향
- **전진 모터 (Forward)**: AGV가 모니터 방향으로 이동 (→)
- **후진 모터 (Backward)**: AGV가 리프트 방향으로 이동 (←)
#### 도킹 방향 규칙
- **충전기 (Charging)**: 전진 도킹 (Forward) - 모니터가 충전기 면
- **장비 (Docking)**: 후진 도킹 (Backward) - 리프트가 장비 면
### 🧭 방향 계산 핵심 파일 및 함수
#### 1. 리프트 방향 계산
**파일**: `AGVNavigationCore\Utils\LiftCalculator.cs`
- **핵심 메서드**: `CalculateLiftAngleRadians(Point currentPos, Point targetPos, AgvDirection motorDirection)`
- **수정된 로직** (2024.12.16):
```csharp
// 후진 모터: 현재→목표 벡터 (리프트가 이동 방향 향함)
var dx = currentPos.X - targetPos.X;
var dy = currentPos.Y - targetPos.Y;
```
#### 2. 도킹 방향 결정
**파일**: `AGVNavigationCore\PathFinding\DirectionChangePlanner.cs`
- **핵심 메서드**: `GetRequiredDockingDirection(string targetNodeId)`
- **로직**:
```csharp
case NodeType.Charging: return AgvDirection.Forward; // 충전기
case NodeType.Docking: return AgvDirection.Backward; // 장비
```
#### 3. 경로 계산 시 방향 고려
**파일**: `AGVNavigationCore\PathFinding\AdvancedAGVPathfinder.cs`
- **핵심 메서드**: `FindAdvancedPath(string startNodeId, string targetNodeId, AgvDirection currentDirection)`
- **로직**:
```csharp
var requiredDirection = _directionChangePlanner.GetRequiredDockingDirection(targetNodeId);
bool needDirectionChange = (currentDirection != requiredDirection);
```
### ⚠️ 현재 발견된 문제점 (2024.12.16)
#### 문제 상황
AGV가 후진 상태로 006 → 005 → 004 이동 중, 037(버퍼)에 도킹 필요한 상황에서:
- **기대**: 006 → 005 → 037 (후진 직진 도킹)
- **실제**: 006 → ... → 041 → 037 (전진으로 잘못 계산)
#### 문제 원인 분석
1. **도킹 방향 계산**: 037은 `NodeType.Docking`이므로 후진 도킹 필요 ✅
2. **현재 방향**: AGV가 후진(Backward) 상태 ✅
3. **경로 계산 오류**: 알고리즘이 현재 후진 상태를 제대로 고려하지 못함 ❌
#### 필요한 수정사항
1. **경로 검증 시스템**: 계산된 경로의 마지막 도킹 방향이 올바른지 검증
2. **UI 피드백**: 잘못된 도킹 방향 시 목적지 노드에 X 표시
3. **알고리즘 개선**: 현재 방향을 유지하며 직진 가능한 경로 우선 탐색
### 🎯 향후 구현 계획
1. **도킹 방향 검증 시스템** 구현
2. **UI 시각적 피드백** (X 표시) 추가
3. **경로 계산 알고리즘** 개선
4. **통합 테스트** 및 검증
## AGV 방향 계산 관련 주요 파일 및 함수 (Legacy)
### 핵심 방향 계산 함수들
1. **LiftCalculator.cs** - 리프트 방향 계산
- `CalculateLiftAngleRadians(Point currentPos, Point targetPos, AgvDirection motorDirection)` :1022행
- `CalculateLiftInfoWithPathPrediction()` :1024행
- 파일 위치: `AGVNavigationCore\Utils\LiftCalculator.cs`
2. **AGVPathfinder.cs** - 모터 방향 결정
- `PlanDirectionChanges(List<string> path)` :414행 - 경로별 모터방향 계획
- `GetRequiredDirectionForNode(MapNode node)` :280행 - 노드타입별 요구방향
- 파일 위치: `AGVNavigationCore\PathFinding\AGVPathfinder.cs`
3. **VirtualAGV.cs** - 시뮬레이터 AGV 위치/방향 관리
- `SetPosition(Point newPosition)` :293행 - ⚠️ TargetPosition 설정 문제 위치
- 파일 위치: `AGVSimulator\Models\VirtualAGV.cs`
4. **UnifiedAGVCanvas.Events.cs** - AGV 시각적 표현
- `DrawAGVLiftAdvanced(Graphics g, IAGV agv)` :1011행 - 리프트 그리기
- 파일 위치: `AGVNavigationCore\Controls\UnifiedAGVCanvas.Events.cs`
### 📋 변경 내역
최신 패치 및 개발 내역은 **[CHANGELOG.md](./CHANGELOG.md)** 파일을 참조하세요.
- **최근 업데이트**: 2024.12.16 - AGV 방향 표시 수정 및 타겟계산 기능 추가
## 개발시 주의사항
- 메인 애플리케이션은 Windows Forms 기반의 터치 인터페이스로 설계됨
- 메인 애플리케이션은 Windows .NetFramework Forms 기반의 터치 인터페이스로 설계됨
- 실시간 AGV 제어 시스템이므로 상태 머신 로직 수정시 신중히 접근
- 통신 관련 코드 변경시 하드웨어 호환성 고려 필요
- **맵 에디터/시뮬레이터**: AGVMapEditor 프로젝트에 의존성이 있으므로 먼저 빌드 필요