# 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("경로재생성")`을 호출하여 일시 정지 후 경로를 다시 계산합니다. 이는 안전한 동작입니다.