Files
ENIG/Cs_HMI/docs/Home_Move_Analysis.md

67 lines
4.4 KiB
Markdown

# Home Move Sequence 분석 (Home Move Sequence Analysis)
## 1. 개요 (Overview)
이 문서는 AGV의 "Home Move" 기능에 대한 분석 결과를 기술합니다. UI 트리거부터 내부 상태 머신(State Machine) 로직 및 이동 제어 흐름을 포함합니다.
## 2. UI 트리거 (UI Trigger)
* **버튼 컨트롤**: `btHome` (in `fMain.Designer.cs`)
* **이벤트 핸들러**: `brHome_Click` (in `fMain.cs`)
* **동작**:
* 사용자가 "홈" 버튼 클릭 시 실행됩니다.
* **이미 Home 이동 중인 경우**: "홈 이동을 취소 할까요?" 팝업 → 확인 시 `IDLE` 상태로 전환 및 정지 (`AGVMoveStop`).
* **대기 상태인 경우**: "홈 이동을 실행 할까요?" 팝업 → 확인 시 `GOHOME` RunStep으로 설정 및 `RUN` 상태 시작.
* **조건**: 자동 충전 중이거나 수동 충전 모드가 아니어야 함 (`PUB.CheckManualChargeMode`).
## 3. 상태 머신 로직 (State Machine Logic)
* **핵심 파일**: `Project\StateMachine\Step\_SM_RUN_GOHOME.cs`
* **함수**: `_SM_RUN_GOHOME(bool isFirst, TimeSpan stepTime)`
* **상태 흐름**:
### 초기 검사
1. **하드웨어 연결**: `PUB.AGV.IsOpen` 체크. 연결 끊김 시 에러 처리.
2. **충전 상태**: `_SM_RUN_CHGOFF`를 호출하여 충전기가 분리되었는지 확인.
3. **장애물 감지**: `PUB.AGV.system1.stop_by_front_detect` (Lidar 감지)
* 감지 시 "전방에 물체가 감지되었습니다" 음성 출력.
* **주의**: 이 단계에서 명시적인 소프트웨어 정지 명령(`AGVMoveStop`)은 코드상에 보이지 않으며, 함수가 `false`를 리턴하여 이동 로직 진입을 막습니다. (하드웨어 자체 정지 기능에 의존하는 것으로 추정됨)
### 시퀀스 단계 (Sequence Steps)
상태 머신은 `PUB.sm.RunStepSeq`를 통해 단계별로 진행됩니다.
**단계 1: 이동 준비**
* 음성 안내: "홈으로 이동합니다"
* **목표 설정**: `PUB.setting.NodeMAP_RFID_Home` 값을 읽어 목표 노드(`TargetNode`)로 설정.
* 에러 처리: 홈 위치 설정이 없는 경우 에러 로그 기록 후 `READY` 상태로 복귀.
**단계 2: 이동 (Moving)**
* **이동 함수**: `UpdateMotionPositionForMark("funcName")` 호출 (in `_Util.cs`)
* 이 함수가 `true`를 반환할 때까지 반복 호출됨.
* 이동 완료 시 `AGVMoveStop` 호출 후 다음 단계로 진행.
**단계 3: 완료 (Completion)**
* 음성 안내: "홈 검색 완료"
* 로그 기록: 홈 위치 도착 기록.
* 상태 종료: `true` 반환 → 메인 루프에서 `READY` 상태로 전환.
## 4. 이동 제어 상세 (Movement Control Details)
* **핵심 함수**: `UpdateMotionPositionForMark` (in `Project\StateMachine\Step\_Util.cs`)
* **경로 계산**: 현재 위치와 목표 노드 간의 경로(`CalcPath`)를 계산.
* **주행 예측 (Predict)**: `PUB._virtualAGV.Predict()`를 사용하여 다음 동작(직진, 회전, 정지 등)을 결정.
* **제어 명령**:
* `Predict` 결과에 따라 모터(`Forward/Backward`), 분기(Magnetic Guide), 속도를 설정.
* 변경된 명령이 있을 경우에만 `PUB.AGV.AGVMoveSet`으로 하드웨어에 전송.
* AGV가 정지 상태라면 `PUB.AGV.AGVMoveRun`으로 구동 시작.
* **정지 조건**:
* `Predict``Stop` 명령을 반환하고,
* 위치가 확정(`IsPositionConfirmed`)되었으며,
* 현재 노드가 목표 노드와 일치하고,
* 실제 AGV 하드웨어가 정지(`agv_run == false`)한 경우.
## 5. 잠재적 이슈 (Potential Issues)
1. **장애물 감지 시 정지 처리**:
* `_SM_RUN_GOHOME`에서 장애물 감지 시(`stop_by_front_detect`), 음성 출력 후 `return false`만 수행합니다.
* 이전에 이동 명령이 전송된 상태라면, 소프트웨어에서 명시적으로 `AGVMoveStop`을 보내지 않으므로 AGV가 계속 이동하려 할 수 있습니다. (단, 하드웨어 센서가 직접 모터를 차단하도록 설계되었을 가능성이 높음)
* **권장**: 안전을 위해 장애물 감지 루틴 내에서도 명시적으로 `AGVMoveStop`을 호출하는 것을 검토할 필요가 있습니다.
2. **경로 재생성 시 멈춤**:
* `UpdateMotionPositionForMark`에서 경로를 재생성해야 할 경우, `AGVMoveStop("경로재생성")`을 호출하여 일시 정지 후 경로를 다시 계산합니다. 이는 안전한 동작입니다.