- Reorganized AGVMapEditor, AGVNavigationCore, AGVSimulator into AGVLogic folder - Removed deleted project files from root folder tracking - Updated CLAUDE.md with AGVLogic-specific development guidelines - Clean separation of independent project development from main codebase - Projects now ready for independent development and future integration 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
190 lines
6.9 KiB
Markdown
190 lines
6.9 KiB
Markdown
# AGV HMI 시스템 변경 로그
|
|
|
|
이 파일은 AGV HMI 시스템의 주요 변경 사항을 기록합니다.
|
|
|
|
## [2025.10.22] - VirtualAGV를 코어 라이브러리로 마이그레이션
|
|
|
|
### ⚠️ 중요 변경
|
|
- **VirtualAGV를 AGVNavigationCore 라이브러리로 이동**
|
|
- 이전: `AGVSimulator\Models\VirtualAGV.cs` (시뮬레이터 전용)
|
|
- 현재: `AGVNavigationCore\Models\VirtualAGV.cs` (공용 코어 라이브러리)
|
|
- **의미**: 실제 AGV 제어 시스템과 시뮬레이터에서 동일한 비즈니스 로직 사용
|
|
|
|
### ✨ 새로운 기능
|
|
- **IMovableAGV 인터페이스 추가**
|
|
- **위치**: `AGVNavigationCore\Models\IMovableAGV.cs` (신규)
|
|
- **목적**: 실제 AGV와 시뮬레이션 AGV의 계약 정의
|
|
- **주요 메서드**:
|
|
```csharp
|
|
// 센서 입력
|
|
void SetCurrentPosition(Point position); // 위치 센서
|
|
void SetDetectedRfid(string rfidId); // RFID 센서
|
|
void SetMotorDirection(AgvDirection direction); // 모터
|
|
void SetBatteryLevel(float percentage); // BMS
|
|
|
|
// 프레임 업데이트 (외부에서 호출)
|
|
void Update(float deltaTimeMs);
|
|
```
|
|
|
|
### 🔧 기술적 개선사항
|
|
- **타이머 의존성 제거**
|
|
- System.Windows.Forms.Timer 제거
|
|
- 외부에서 Update(deltaTimeMs)를 주기적으로 호출하는 방식으로 변경
|
|
- 장점: 타이머 없이도 동작 가능, 실제 시스템과 시뮬레이터 모두 적용 가능
|
|
|
|
- **UI 의존성 제거**
|
|
- EventHandler 이외의 UI 라이브러리 제거
|
|
- 순수 .NET 라이브러리로 변환 (System 네임스페이스만 사용)
|
|
|
|
- **프레임 업데이트 방식 개선**
|
|
- 이전: 내부 타이머로 자동 업데이트
|
|
- 현재: 외부에서 Update(100)을 정기적으로 호출
|
|
```csharp
|
|
// AGVSimulator\Forms\SimulatorForm.cs의 OnSimulationTimer_Tick
|
|
foreach (var agv in _agvList)
|
|
{
|
|
agv.Update(100); // 100ms 간격으로 업데이트
|
|
}
|
|
```
|
|
|
|
### 📝 아키텍처 변화
|
|
```
|
|
Before:
|
|
AGVSimulator (시뮬레이터 전용)
|
|
└── VirtualAGV (시뮬레이터용)
|
|
└── System.Windows.Forms.Timer
|
|
|
|
After:
|
|
AGVNavigationCore (공용 코어)
|
|
├── IMovableAGV (인터페이스)
|
|
└── VirtualAGV (구현체)
|
|
└── Update(deltaTime) 메서드만
|
|
|
|
AGVSimulator (시뮬레이터)
|
|
└── SimulatorForm.OnSimulationTimer_Tick
|
|
└── agv.Update(100)
|
|
|
|
Project (실제 AGV)
|
|
└── AgvController
|
|
└── agv.Update(deltaTime)
|
|
```
|
|
|
|
### 🎯 향후 활용
|
|
1. **실제 AGV 시스템에서**:
|
|
```csharp
|
|
var agv = new VirtualAGV("AGV1", startPos);
|
|
|
|
// 하드웨어 센서에서
|
|
agv.SetCurrentPosition(sensorData.Position);
|
|
agv.SetDetectedRfid(rfidSensor.Value);
|
|
agv.SetMotorDirection(motorController.Direction);
|
|
agv.SetBatteryLevel(bms.Level);
|
|
|
|
// 제어 루프에서
|
|
agv.Update(deltaTime);
|
|
```
|
|
|
|
2. **시뮬레이션 테스트**:
|
|
- 시뮬레이터에서 완벽하게 동작한 VirtualAGV
|
|
- 실제 AGV에 그대로 적용 가능
|
|
- 테스트 신뢰도 향상
|
|
|
|
### 📋 변경 파일
|
|
- ✨ 추가: `AGVNavigationCore\Models\VirtualAGV.cs`
|
|
- ✨ 추가: `AGVNavigationCore\Models\IMovableAGV.cs`
|
|
- 📝 수정: `AGVNavigationCore\AGVNavigationCore.csproj` (프로젝트 파일 업데이트)
|
|
- 📝 수정: `AGVSimulator\Forms\SimulatorForm.cs` (Update 호출 추가)
|
|
|
|
---
|
|
|
|
## [2024.12.16] - AGV 방향 표시 수정 및 타겟계산 기능 추가
|
|
|
|
### 🐛 버그 수정
|
|
- **AGV 후진 모터 시 리프트 방향 표시 오류 수정**
|
|
- **문제**: 008→007→006 후진 이동 시 리프트가 동남쪽으로 잘못 표시
|
|
- **원인**: LiftCalculator에서 후진 모터 방향 계산 로직 오류
|
|
- **수정파일**: `AGVNavigationCore\Utils\LiftCalculator.cs`
|
|
- **수정메서드**: `CalculateLiftAngleRadians()` :32-39행
|
|
- **수정내용**:
|
|
```csharp
|
|
// 이전 (잘못된 계산)
|
|
var dx = targetPos.X - currentPos.X;
|
|
var dy = targetPos.Y - currentPos.Y;
|
|
|
|
// 수정 (올바른 계산)
|
|
var dx = currentPos.X - targetPos.X;
|
|
var dy = currentPos.Y - targetPos.Y;
|
|
```
|
|
- **결과**: 후진 시 리프트가 AGV 이동 방향(북서쪽)을 올바르게 표시
|
|
|
|
### ✨ 새로운 기능
|
|
- **타겟계산 버튼 추가**
|
|
- **위치**: AGV 시뮬레이터 → 경로 제어 그룹박스
|
|
- **기능**:
|
|
- 버튼 클릭 후 맵에서 노드 클릭 시 자동 경로 계산
|
|
- 시작 RFID가 비어있으면 AGV 현재 위치로 자동 설정
|
|
- 연속 테스트 지원
|
|
- **구현파일**:
|
|
- `AGVSimulator\Forms\SimulatorForm.Designer.cs` - UI 컨트롤 추가
|
|
- `AGVSimulator\Forms\SimulatorForm.cs` - 이벤트 핸들러 구현
|
|
- **주요메서드**:
|
|
- `OnTargetCalc_Click()` - 타겟계산 버튼 이벤트
|
|
- `SetStartNodeFromAGVPosition()` - AGV 위치에서 시작 노드 자동 설정
|
|
- `SetTargetNodeInCombo()` - 목적지 콤보박스 설정
|
|
- `FindClosestNode()` - 가장 가까운 노드 찾기
|
|
|
|
### 📝 문서 업데이트
|
|
- **CLAUDE.md 문서 개선**
|
|
- AGV 하드웨어 구조 및 방향 체계 설명 추가
|
|
- 방향 계산 관련 주요 파일 및 함수 매핑 정보 추가
|
|
- 해결된 문제점과 새로운 기능 기록
|
|
- 다음 세션에서의 빠른 참조를 위한 구조화
|
|
|
|
### 🔧 기술적 개선사항
|
|
- **AGV 방향 시스템 이해도 향상**
|
|
- `LIFT --- AGV --- MONITOR` 하드웨어 구조 명확화
|
|
- 모터 방향과 리프트 위치 관계 정립
|
|
- 전진/후진에 따른 리프트 방향 로직 통일
|
|
|
|
- **마우스 클릭 감지 개선**
|
|
- **문제**: 줌/팬 상태에서 노드 클릭 시 좌표 오차로 감지되지 않는 문제
|
|
- **원인**: 렌더링 Matrix 변환과 마우스 좌표 변환이 불일치
|
|
- **수정파일**: `AGVNavigationCore\\Controls\\UnifiedAGVCanvas.Mouse.cs`
|
|
- **수정메서드**: `ScreenToWorld()` 좌표 변환 함수
|
|
- **수정내용**:
|
|
```csharp
|
|
// 수정 전: 수동 계산
|
|
var worldX = (int)((screenPoint.X - _panOffset.X) / _zoomFactor);
|
|
|
|
// 수정 후: Matrix 역변환 사용
|
|
transform.Scale(_zoomFactor, _zoomFactor);
|
|
transform.Translate(_panOffset.X, _panOffset.Y);
|
|
transform.Invert();
|
|
transform.TransformPoints(points);
|
|
```
|
|
- **결과**: 줌/팬 상태에서도 정확한 노드 클릭 감지 가능
|
|
|
|
---
|
|
|
|
## 변경 로그 형식
|
|
|
|
### 버전 표기
|
|
- `[YYYY.MM.DD]` - 날짜 기반 버전 관리
|
|
|
|
### 변경 유형
|
|
- 🐛 **버그 수정**: 기존 기능의 오류 수정
|
|
- ✨ **새로운 기능**: 새로 추가된 기능
|
|
- 🔧 **기술적 개선**: 성능 향상, 리팩토링 등
|
|
- 📝 **문서**: 문서 추가/수정
|
|
- 🗑️ **제거**: 기능 또는 파일 제거
|
|
- ⚠️ **중요 변경**: 호환성에 영향을 주는 변경
|
|
|
|
### 기록 원칙
|
|
- 사용자에게 영향을 주는 모든 변경사항 기록
|
|
- 수정된 파일과 메서드명 명시
|
|
- 문제의 원인과 해결 방법 설명
|
|
- 테스트 결과나 검증 방법 포함
|
|
|
|
---
|
|
|
|
*이 체인지로그는 [Keep a Changelog](https://keepachangelog.com/) 형식을 따릅니다.* |