4.4 KiB
4.4 KiB
Home Move Sequence 분석 (Home Move Sequence Analysis)
1. 개요 (Overview)
이 문서는 AGV의 "Home Move" 기능에 대한 분석 결과를 기술합니다. UI 트리거부터 내부 상태 머신(State Machine) 로직 및 이동 제어 흐름을 포함합니다.
2. UI 트리거 (UI Trigger)
- 버튼 컨트롤:
btHome(infMain.Designer.cs) - 이벤트 핸들러:
brHome_Click(infMain.cs) - 동작:
- 사용자가 "홈" 버튼 클릭 시 실행됩니다.
- 이미 Home 이동 중인 경우: "홈 이동을 취소 할까요?" 팝업 → 확인 시
IDLE상태로 전환 및 정지 (AGVMoveStop). - 대기 상태인 경우: "홈 이동을 실행 할까요?" 팝업 → 확인 시
GOHOMERunStep으로 설정 및RUN상태 시작. - 조건: 자동 충전 중이거나 수동 충전 모드가 아니어야 함 (
PUB.CheckManualChargeMode).
3. 상태 머신 로직 (State Machine Logic)
- 핵심 파일:
Project\StateMachine\Step\_SM_RUN_GOHOME.cs - 함수:
_SM_RUN_GOHOME(bool isFirst, TimeSpan stepTime) - 상태 흐름:
초기 검사
- 하드웨어 연결:
PUB.AGV.IsOpen체크. 연결 끊김 시 에러 처리. - 충전 상태:
_SM_RUN_CHGOFF를 호출하여 충전기가 분리되었는지 확인. - 장애물 감지:
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(inProject\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)
-
장애물 감지 시 정지 처리:
_SM_RUN_GOHOME에서 장애물 감지 시(stop_by_front_detect), 음성 출력 후return false만 수행합니다.- 이전에 이동 명령이 전송된 상태라면, 소프트웨어에서 명시적으로
AGVMoveStop을 보내지 않으므로 AGV가 계속 이동하려 할 수 있습니다. (단, 하드웨어 센서가 직접 모터를 차단하도록 설계되었을 가능성이 높음) - 권장: 안전을 위해 장애물 감지 루틴 내에서도 명시적으로
AGVMoveStop을 호출하는 것을 검토할 필요가 있습니다.
-
경로 재생성 시 멈춤:
UpdateMotionPositionForMark에서 경로를 재생성해야 할 경우,AGVMoveStop("경로재생성")을 호출하여 일시 정지 후 경로를 다시 계산합니다. 이는 안전한 동작입니다.