5.9 KiB
5.9 KiB
AGV 하드코딩 경로 실행 타이밍 차트 및 동작 분석
본 문서는 7B -> 11B -> 3T -> 3B -> 71B 와 같은 연속된 조향/턴 하드코딩 경로가 주어졌을 때,
현재 구현된 AGVPathfinder, VirtualAGV, _Util.cs 시스템 상에서 AGV가 시간 흐름에 따라 어떠한 동작과 판단을 거치는지 정리한 타이밍 시퀀스 분석입니다.
경로 정의 및 노드 정보
| Seq | Tag | Node ID | 모터 방향 | IsTurn | 동작 목적 |
|---|---|---|---|---|---|
| 1 | 7B | Node 7 | Backward | false | 시작점, 후진 출발 |
| 2 | 11B | Node 11 | Backward | false | 단순 통과(Pass) 노드 |
| 3 | 3T | Node 3 | Stop | true | 180도 좌회전 (Turn) |
| 4 | 3B | Node 3 | Backward | false | 턴 직후의 후진 방향 정렬 |
| 5 | 71B | Node 71 | Stop | false | 최종 목적지 (Loader), 정차 |
Execution Sequence (실행 시퀀스)
1단계: Node 7 출발 (7B)
- 상태: AGV가 7번 노드에 위치함.
- SetPosition:
VirtualAGV는 현재 노드를 7로 설정. - Predict() 판단:
- 현재 노드 정보(
7B)를 기반으로 다음 미완료 노드를 11번으로 추적. - 리턴:
MotorCommand=Backward,Speed=Low(or M),Reason=Normal.
- 현재 노드 정보(
- _Util.cs 처리:
- AGV가 정지 상태(
agv_run == false)이므로, 구동 명령 분기로 진입. AGVMoveSet설정 및AGVMoveRun(Backward)명령 전송.- AGV 후진 이동 시작.
- AGV가 정지 상태(
2단계: Node 11 통과 (11B)
- 상태: AGV가 후진 중 11번 노드의 RFID 태그를 읽음.
- SetPosition:
VirtualAGV는 현재 노드를 11로 갱신.- (이전 노드인
7B노드는IsPass=true로 자동 패스 처리됨)
- (이전 노드인
- Predict() 판단:
- 다음 미완료 타겟인
11B노드 방향(Backward)을 리턴. - 리턴:
MotorCommand=Backward,Reason=Normal. - (참고: 일반 주행 노드는 밟고 즉시 정지하는 것이 아니라 통과하는 것이므로, 다음 태그를 밟을 때까지 계속 이동 상태를 유지합니다.)
- 다음 미완료 타겟인
- _Util.cs 처리:
- 상태 변화 없이 계속 후진 이동(Backward).
3단계: Node 3 도착 및 MarkStop 타겟 인식 (3T)
- 상태: AGV가 후진을 계속하여 노드 3 RFID 태그를 읽음.
- SetPosition:
VirtualAGV는 현재 노드를 3으로 갱신.- (이때
11B까지의 이전 노드들이 모두IsPass=true처리됨)
- (이때
- Predict() 판단:
- 현재 평가 대상(타겟) 노드가 비로소
3T(IsTurn=true)가 됨. IsTurn=true노드는 통과가 아닌 물리적 로직(정지/턴)이 필요하므로:- 리턴:
MotorCommand=Stop,Reason=MarkStop,IsTurn=true.
- 현재 평가 대상(타겟) 노드가 비로소
- _Util.cs 처리:
- AGV는 아직 이동 중(
agv_run == true). Reason == MarkStop분기로 진입.IsTurn == true이지만 실제로 돌고 있지는 않으므로, 정학한 위치 정지를 위해AGVMoveStop(MarkStop)명령 전송.
- AGV는 아직 이동 중(
4단계: 감속 및 턴 대기
- 상태: AGV가 마크 센터에 맞추어 감속 후 멈춤.
- _Util.cs 처리:
agv_run == true기간 동안 아무 추가 명령 없이 대기.
5단계: 정지 완료 및 180도 턴 시작
- 상태:
agv_run == false(AGV 모터 완전 정지 상태 갱신). - _Util.cs 처리:
- 정지 상태 루트로 진입.
IsTurn == true이므로 턴 로직 블럭 진입.TurnInformation.State != Left임을 확인.AGVMoveLeft180Turn()명령 전송.
- AGV 실제 동작:
- 그 자리에서 180도 위치 회전 수행.
6단계: 턴 로직 구동 중
- _Util.cs 처리:
- AGV가 도는 동안
TurnInformation.State == LeftIng로 유지. - 매 틱마다 "턴 진행 중..." 메시지를 띄우고 대기(Return false). 일정 시간(30초) 타임아웃 검사 체제 가동.
- AGV가 도는 동안
7단계: 턴 완료 및 노드 패스 처리 (3T -> 3B 전환)
- 상태: AGV 180도 회전 완료. HMI 쪽으로 완료 패킷 수신됨.
TurnInformation.State = Left상태로 갱신.
- _Util.cs 처리:
- 턴 완료 상태를 인지하고 패스 로직 수행.
PUB._virtualAGV.SetCurrentNodeMarkStop()호출. (이 함수는 현재 가장 먼저 미완료된3T노드를 강제로IsPass=true처리하는 역할).- 다음 루프 영향을 막고자
TurnInformation.State = None초기화 후 대기 리턴.
8단계: 턴 완료 후 3B 방향 이동 재개
- Predict() 판단 (다음 틱):
- 이제
3T가IsPass=true가 되었기 때문에 타겟은3B로 변경됨. - 리턴:
MotorCommand=Backward,IsTurn=false. (AGV 차체가 180도 돌았으므로 시스템상 방향이 반전되어 있어, 다시 후진 명령이 하달됨)
- 이제
- _Util.cs 처리:
agv_run == false상태.MoveSet(방향: Backward) 설정 후,AGVMoveRun(Backward)전송.
- AGV 실제 동작:
- 후진 방향으로(이번에는 노드 71을 향해) 기동 시작.
9단계: 목적지 71 도착 및 완료 (71B)
- 상태: 후진 이동 후 71번 노드(Loader) 태그 인식.
- SetPosition: 71 갱신. 이전
3B노드 자동IsPass=true. - Predict() 판단:
- 타겟은 배열의 최후 노드
71B. - 마지막 노드에 도착했음을 감지하여 리턴:
MotorCommand=Stop,Reason=MarkStop.
- 타겟은 배열의 최후 노드
- _Util.cs 처리:
- 이동 중이므로
MarkStop명령 전송하여 도킹 위치 정밀 정차 유도. - 완전 정지(
agv_run == false) 후,Complete판단 조건에 따라 경로 작업 시퀀스 종료 및 다음 태스크(PickOnEnter등)로 이동.
- 이동 중이므로
결론
새롭게 개선된 로직에서는 VirtualAGV가 3T 와 같은 IsTurn 포인트를 읽어 다음 이동 목표로 할당할지라도 즉시 통과시키지 않고 MarkStop을 유도합니다.
AGV가 해당 노드에서 완벽히 멈춘 상태를 HMI(_Util.cs)가 확인한 후 180도 턴을 시도하며, 턴의 물리적 완료 피드백을 수신하고 나서야 해당 턴 명령(3T)을 Pass 판정 지음으로써 완벽한 시퀀스 제어무결성을 보장합니다.