Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 아키텍쳐 개선
- 결제서비스
- spring event
- 셀러리
- JPA
- 레디스 동시성
- piplining
- 크롤링
- 구현
- langgraph
- 몽고 인덱스
- 프로그래머스
- 디버깅
- 트랜잭샨
- 백준
- 추천 검색 기능
- 카카오
- 쿠키
- 이분탐색
- AWS
- next-stock
- docker
- ipo 매매자동화
- 검색어 추천
- 누적합
- BFS
- 완전탐색
- jwt 표준
- ai agent
- gRPC
Archives
- Today
- Total
코딩관계론
그래프 기반으로 작성한 상태천이 프로그램 본문
반응형
🚀 1. 개요
문제 해결의 필요성
기존의 시나리오 기반 상태 전이 방식은 외부 간섭(사람의 통행, 예기치 못한 문 상태 변화 등)에 취약했습니다. 로봇이 외부 간섭으로 인해 미션을 수행하지 못하는 경우가 발생하여 보다 견고한 시스템의 필요성이 요구되었습니다.
제안하는 해결 방법
데익스트라(Dijkstra) 알고리즘을 이용한 상태 기계(State Machine)를 구현하여, 현재 문의 상태에서 목표 상태까지 최소 비용의 상태 전이 경로를 탐색합니다. 이를 통해 로봇이 외부 간섭에도 안정적으로 미션을 수행할 수 있도록 했습니다.
⚠️ 2. 문제 정의
문제 상황 설명
로봇이 정해진 waypoint에 도착하면 ROLL-UP DOOR의 상태를 확인하기 위해 아두이노와 통신합니다. 로봇은 초기 상태 정보를 받으면 이를 통해 4가지 CASE 중 하나를 선택하여 적절한 동작을 수행하게 됩니다.
그림 1: 로봇과 ROLL-UP DOOR의 상태 전이 경로
문제의 제약 조건
- 로봇은 모든 문을 반드시 통과해야 하며, 실패 시 미션 전체가 실패로 간주됩니다.
- 일부 문은 비상 스위치를 해제 후 닫힘 버튼을 눌러야 하는 등, 하드웨어마다 동작 방식이 다릅니다.
- 외부 간섭으로 문의 상태가 예상치 못하게 변경되더라도 로봇은 해당 문을 성공적으로 제어해야 합니다.
🛠️ 3. 알고리즘 소개
알고리즘 개요
문의 다양한 상태(열림, 닫힘, 비상 상태 등)를 노드로 간주하고, 각 노드 간의 상태 전이에 데익스트라 알고리즘을 적용하여 최적의 상태 전이 경로를 계산합니다.
그림 2: 데익스트라 알고리즘을 활용한 상태 기계 구조
코드 예시 및 상세 설명
DoorStateMachine 클래스는 문의 상태를 관리하고 상태 전이를 수행하는 클래스입니다.
- 주요 메서드:
- find_route_to(current_state, final_state): 현재 상태에서 목표 상태까지의 경로를 계산합니다.
- get_cost_route(current_state, target_state): 데익스트라 알고리즘을 이용하여 최소 비용 경로를 계산합니다.
- change_cost_to_route(dist, target_state): 계산된 비용 배열을 실제 상태 전이 경로로 변환합니다.
DoorOpenCase 클래스는 DoorStateMachine을 상속받아 문이 열릴 때의 상태 처리를 수행합니다.
- 주요 메서드:
- update(): 현재 문의 상태를 확인하고 목표 상태로 변경하기 위한 명령을 수행하며, 실패 시 재시도하거나 실패 상태를 반환합니다.
DoorCloseCase 클래스도 유사한 방식으로 문이 닫힐 때의 상태 처리를 수행합니다.
📌 4. 결론
알고리즘의 장점
- 상태 기계(State Machine) 방식이므로 다양한 형태의 문에도 쉽게 적용 가능하며, 새로운 상태가 추가되더라도 유지보수와 확장이 용이합니다.
- 최소 비용 경로를 찾는 데익스트라 알고리즘을 통해 최적의 상태 전이 경로를 보장하여 시스템의 효율성을 높일 수 있습니다.
알고리즘의 단점 및 보완점
- 블루투스 통신으로 문 상태를 확인할 때, 최대 약 2초의 신호 송수신 지연이 발생할 수 있습니다. 현재 이 지연 시간이 고정된 상수로 설정되어 있어 동적 환경에서는 프로그램의 강건성을 저하시킬 수 있습니다.
- 따라서 추후 환경과 상황에 맞는 능동적이고 유연한 대기 시간 관리가 필요합니다.
반응형
'개발 > SPOT' 카테고리의 다른 글
사용자의 Custom 설정을 지원하는 비동기 프로그램(feat.Celery) (0) | 2023.04.19 |
---|---|
Celery필요성과 개념 (0) | 2023.04.18 |
미션별로 수신 대상자가 달라지는 SMS 기능 개발 (0) | 2023.04.06 |
[Docker] --no-cache가 시간을 잡아 먹는다 (0) | 2022.10.23 |
[SPOT] RMS(Remote Mission Service)가 너무 늦게 끝나요... Thread 문제인가요? (0) | 2022.10.10 |