[ROS] State Machine – Smach library

State Machine

State Machine에 대해 글을 쓴 적이 있다.

이 때는 직접 구현을 했었는데, 상태가 많아질수록 복잡하다.

특히, 여러 쓰레드에서 상태를 접근하고 상태를 수정하는 과정이 생기면서 복잡해졌다.

  • 물론 멀티 쓰레드에서 상태머신을 활용하는 기법도 이미 있을 것이다. 찾아보지는 않았다.
  • 하지만, 확실히 복잡하며, 일이 많아질 것이다.

거기다가 현재 어떤 상태인지 시각적으로 확인하기는 더욱더 어렵다. 확인하기 위해서 특정 상태일 때 Log를 남길 뿐이다.


로봇에서의 State Machine

내 프로젝트는 ROS 기반에서 동작하며, 많은 전문가, 개발자들이 비슷한 상황을 겪었을거라 생각하게 됐다.

즉, 로봇이 하나의 임무를 수행하기 위해서 여러 모듈들을 활용하여 특정 동작들을 해야하는데, 이를 상위 레벨에서 제어할 수 있는게 필요하다.

예를 들어, DARPA에서 로봇이 문을 여는 것을 생각해보자. 이 때, 로봇은 문을 인식해야하고, 그 다음으로 문고리를 찾아야 한다. 그리고 손을 어떻게 움직일지 생각도 해야한다.

여러 단계를 걸쳐 문을 열텐데, 중간에 하나가 실패하면 어떻게 할 것이고, 동작들의 스케줄러가 필요하다.


SMACH Library

내가 찾게된 이 SMACH 라이브러리는 위의 문제들을 해결하는데 큰 도움을 준다.

Smach, which stands for “State Machine”, is a powerful and scalable Python-based library for hierarchical state machines. The Smach library does not depend on ROS, and can be used in any Python project. The executive_smach stack however provides very nice integration with ROS, including smooth actionlib integration and a powerful Smach viewer to visualize and introspect state machines.

이 라이브러리는 파이썬 기반의 State mahcine 라이브러리이다.

이 라이브러리를 활용하여 상태에 따른 특정 동작을 수행하게 할 수 있다.

거기다가 현재 활성화된 상태 (active state)가 무엇인지도 시각적으로 보여준다.

위에서 말한 동작을 수행할 수 있는데, 영상을 한번 보자.

아래는 SMACH에 대한 간단한 설명과 로봇이 상태머신을 활용하여 문을 여는 영상이다.


예제 실행

나도 한번 직접 사용해봤다.

예제가 있어서 한 번 돌려봤다.

Foo, Bar를 3번 반복 후, END로 가도록 해봤다.

이정도는 직접 코드 작성을 해도 괜찮다.

상태머신을 만들고, 그에 따라 특정 동작을 하게 할 수 있다.


로봇 시뮬레이션에서 활용

상태 머신을 로봇 시뮬레이션에 활용해봤다.

로봇은 각 상태에서 수행해야할 동작을 한다.

평소에는 랜덤으로 쳐다본다. (IDLE)

초기화를 수행할 때는 가운데를 본다. (RESET)

사람 얼굴을 발견하면, 얼굴을 본다. (WATCHING)

돌발 상황이 발생할 때 수행할 동작을 한다. 아직 구현 X (EVENT)


마이크로소프트 Scheduler 에이전트 감독자 패턴를 참고하여

ROS 상에서 상태머신, 스케줄러, 에이젼트(agent)를 구성해봤다.

코드가 보기 좋으며!! 확장도 쉽게 할 수 있겠다.

 

 

참고 문서

  • http://wiki.ros.org/smach
  • http://wiki.ros.org/smach/Documentation
  • https://docs.microsoft.com/en-us/windows/desktop/taskschd/task-scheduler-start-page
  • https://docs.microsoft.com/ko-kr/azure/architecture/patterns/scheduler-agent-supervisor

 

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다