fix: Add motor direction parameter to magnet direction calculation in pathfinding
- Fixed critical issue in ConvertToDetailedPath where motor direction was not passed to GetRequiredMagnetDirection - Motor direction is essential for backward movement as Left/Right directions must be inverted - Modified AGVPathfinder.cs line 280 to pass currentDirection parameter - Ensures backward motor direction properly inverts magnet sensor directions feat: Add waypoint support to pathfinding system - Added FindPath overload with params string[] waypointNodeIds in AStarPathfinder - Supports sequential traversal through multiple intermediate nodes - Validates waypoints and prevents duplicates in sequence - Returns combined path result with aggregated metrics feat: Implement path result merging with DetailedPath preservation - Added CombineResults method in AStarPathfinder for intelligent path merging - Automatically deduplicates nodes when last of previous path equals first of current - Preserves DetailedPath information including motor and magnet directions - Essential for multi-segment path operations feat: Integrate magnet direction with motor direction awareness - Modified JunctionAnalyzer.GetRequiredMagnetDirection to accept AgvDirection parameter - Inverts Left/Right magnet directions when moving Backward - Properly handles motor direction context throughout pathfinding feat: Add automatic start node selection in simulator - Added SetStartNodeToCombo method to SimulatorForm - Automatically selects start node combo box when AGV position is set via RFID - Improves UI usability and workflow efficiency 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
233
Cs_HMI/AGVLogic/QUICK_REFERENCE.md
Normal file
233
Cs_HMI/AGVLogic/QUICK_REFERENCE.md
Normal file
@@ -0,0 +1,233 @@
|
||||
# GetNextNodeId() 구현 - 빠른 참조 가이드
|
||||
|
||||
**최종 업데이트**: 2025-10-23
|
||||
**상태**: 🟢 완료
|
||||
|
||||
---
|
||||
|
||||
## 🎯 핵심 정보
|
||||
|
||||
### 구현 메서드
|
||||
```csharp
|
||||
public string GetNextNodeId(AgvDirection direction, List<MapNode> allNodes)
|
||||
```
|
||||
|
||||
**위치**: `AGVNavigationCore\Models\VirtualAGV.cs` (라인 628-821)
|
||||
|
||||
### 사용 방법
|
||||
```csharp
|
||||
// 위치 설정 (최소 2회)
|
||||
agv.SetPosition(node001, new Point(65, 229), AgvDirection.Forward);
|
||||
agv.SetPosition(node002, new Point(206, 244), AgvDirection.Forward);
|
||||
|
||||
// 다음 노드 조회
|
||||
string nextNodeId = agv.GetNextNodeId(AgvDirection.Forward, allNodes);
|
||||
// 결과: "N003"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚡ 핵심 수정사항
|
||||
|
||||
### Backward 로직 수정
|
||||
**파일**: `VirtualAGV.cs` (라인 755-767)
|
||||
|
||||
**변경 전**:
|
||||
```csharp
|
||||
if (dotProduct < -0.9f) // ❌ 반대 방향
|
||||
baseScore = 100.0f;
|
||||
```
|
||||
|
||||
**변경 후**:
|
||||
```csharp
|
||||
if (dotProduct > 0.9f) // ✅ 같은 방향
|
||||
baseScore = 100.0f;
|
||||
```
|
||||
|
||||
### 이유
|
||||
모터 방향(Forward/Backward)은 경로 선택에 영향을 주지 않음
|
||||
→ Forward/Backward 모두 같은 경로 선호
|
||||
|
||||
---
|
||||
|
||||
## 🧪 검증 결과
|
||||
|
||||
### 4가지 시나리오 - 모두 패스 ✅
|
||||
|
||||
| # | 이동 | 방향 | 결과 | 상태 |
|
||||
|---|-----|------|------|------|
|
||||
| 1 | 001→002 | Forward | N003 | ✅ |
|
||||
| 2 | 001→002 | Backward | N003 | ✅ |
|
||||
| 3 | 002→003 | Forward | N004 | ✅ |
|
||||
| 4 | 002→003 | Backward | N004 | ✅ FIXED |
|
||||
|
||||
---
|
||||
|
||||
## 📊 기술 개요
|
||||
|
||||
### 벡터 계산
|
||||
```
|
||||
1. 이동 벡터 = 현재 위치 - 이전 위치
|
||||
2. 정규화
|
||||
3. 각 후보와 내적/외적 계산
|
||||
4. 방향별 점수 결정
|
||||
5. 최고 점수 노드 반환
|
||||
```
|
||||
|
||||
### 점수 기준
|
||||
```
|
||||
Forward/Backward (수정 후 동일):
|
||||
dot > 0.9 → 100점
|
||||
dot > 0.5 → 80점
|
||||
dot > 0 → 50점
|
||||
dot > -0.5 → 20점
|
||||
else → 0점
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 관련 파일
|
||||
|
||||
### 핵심 파일
|
||||
- **VirtualAGV.cs** - GetNextNodeId() 구현
|
||||
- **MapLoader.cs** - 양방향 연결 자동 설정
|
||||
- **GetNextNodeIdTest.cs** - 테스트 코드
|
||||
|
||||
### 문서 파일
|
||||
- **BACKWARD_FIX_SUMMARY_KO.md** - 수정 요약 (한글)
|
||||
- **STATUS_REPORT_FINAL.md** - 최종 보고서
|
||||
- **BACKWARD_FIX_VERIFICATION.md** - 검증 보고서
|
||||
|
||||
---
|
||||
|
||||
## 📝 요구사항 충족 현황
|
||||
|
||||
### 사용자 요청
|
||||
✅ Forward/Backward 지원
|
||||
✅ Left/Right 지원
|
||||
✅ 벡터 기반 계산
|
||||
✅ 2-위치 히스토리 필요
|
||||
✅ 양방향 연결 자동 설정
|
||||
✅ 002→003 Backward → 004 반환
|
||||
|
||||
### 테스트
|
||||
✅ 4가지 시나리오 모두 패스
|
||||
✅ 사용자 피드백 반영 완료
|
||||
✅ 버그 수정 완료
|
||||
|
||||
---
|
||||
|
||||
## 💬 주요 개념
|
||||
|
||||
### Forward vs Backward
|
||||
```
|
||||
❌ 틀림: Forward(앞) vs Backward(뒤) - 경로 방향
|
||||
✅ 맞음: Forward(정방향) vs Backward(역방향) - 모터 방향
|
||||
경로 선택은 동일!
|
||||
```
|
||||
|
||||
### 양방향 연결
|
||||
```
|
||||
맵 저장: 단방향 (002→003)
|
||||
메모리: 양방향 (002↔003)
|
||||
자동 복원됨!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 사용 시나리오
|
||||
|
||||
### 경로 계산
|
||||
```csharp
|
||||
// AGV가 002에서 003으로 이동 (Forward 모터)
|
||||
agv.SetPosition(node002, new Point(206, 244), AgvDirection.Forward);
|
||||
agv.SetPosition(node003, new Point(278, 278), AgvDirection.Forward);
|
||||
|
||||
// 다음 노드 조회
|
||||
string nextForward = agv.GetNextNodeId(AgvDirection.Forward, allNodes);
|
||||
// 결과: N004 (경로 계속)
|
||||
|
||||
string nextBackward = agv.GetNextNodeId(AgvDirection.Backward, allNodes);
|
||||
// 결과: N004 (경로 계속, 모터만 역방향)
|
||||
```
|
||||
|
||||
### 방향 확인
|
||||
```csharp
|
||||
// 이전 모터 방향
|
||||
AgvDirection prev = agv._currentDirection; // Forward/Backward
|
||||
|
||||
// 현재 위치 확인
|
||||
Point current = agv._currentPosition;
|
||||
|
||||
// 이동 벡터 계산 가능
|
||||
// 다음 노드 결정 가능
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ 내부 동작
|
||||
|
||||
### SetPosition() 호출 시
|
||||
1. _prevPosition ← _currentPosition
|
||||
2. _currentPosition ← newPosition
|
||||
3. _prevNode ← _currentNode
|
||||
4. _currentNode ← newNode
|
||||
5. _currentDirection ← direction
|
||||
|
||||
### GetNextNodeId() 호출 시
|
||||
1. 2-위치 히스토리 검증
|
||||
2. 이동 벡터 계산
|
||||
3. 정규화
|
||||
4. 각 후보 노드에 대해:
|
||||
- 벡터 계산
|
||||
- 정규화
|
||||
- 내적/외적 계산
|
||||
- 점수 결정
|
||||
5. 최고 점수 노드 반환
|
||||
|
||||
---
|
||||
|
||||
## 🔍 디버깅 팁
|
||||
|
||||
### 예상과 다른 결과가 나올 때
|
||||
1. ConnectedNodes 확인
|
||||
```csharp
|
||||
var connected = currentNode.ConnectedNodes;
|
||||
// 모든 이웃 노드가 포함되어 있나?
|
||||
```
|
||||
|
||||
2. 위치 좌표 확인
|
||||
```csharp
|
||||
var pos = agv._currentPosition;
|
||||
var prevPos = agv._prevPosition;
|
||||
// 좌표가 올바른가?
|
||||
```
|
||||
|
||||
3. 벡터 계산 확인
|
||||
```csharp
|
||||
var vec = (prevPos.X - currentPos.X, prevPos.Y - currentPos.Y);
|
||||
// 벡터가 맞는 방향인가?
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📚 추가 리소스
|
||||
|
||||
**상세 분석**: `GETNEXTNODEID_LOGIC_ANALYSIS.md`
|
||||
**검증 결과**: `BACKWARD_FIX_VERIFICATION.md`
|
||||
**전체 보고서**: `STATUS_REPORT_FINAL.md`
|
||||
|
||||
---
|
||||
|
||||
## ✅ 체크리스트
|
||||
|
||||
프로젝트 통합 시:
|
||||
- [ ] VirtualAGV.cs 확인 (GetNextNodeId 메서드)
|
||||
- [ ] MapLoader.cs 확인 (양방향 연결 설정)
|
||||
- [ ] 테스트 실행 (GetNextNodeIdTest)
|
||||
- [ ] 맵 파일 확인 (NewMap.agvmap)
|
||||
- [ ] 실제 경로 테스트
|
||||
|
||||
---
|
||||
|
||||
**최종 상태**: 🟢 **준비 완료**
|
||||
Reference in New Issue
Block a user