액션은 앞서 설명대로 3가지 데이터 세트를 다룬다. 목표치(Goal), 중간결과(Feedback), 최종결과(Result)가 그것이다. 이 3가지 데이터 세트를 처리하기 위해 서비스와 마찬가지로, 서버와 클라이언트 방식으로 노드를 구성한다. 이 서버와 클라이언트간의 관계를 순서에 따라간단히 표현하면 다음과 같다.
- 서버는 요청사항을 수행할 함수를 뛰어(=서비스를 올려) 놓는다.
- 클라이언트는 이 서버에 서비스를 수행할 값을 전달 한다.
여기까지는 앞서 설명한 서비스와 동일하다. 이제 부터 달라진다.
- 서버는 요청받은 값으로 서비스를 수행 중, 중간 결과를 서비스 종료까지 반환하게 되는데, 이를 피드백(feedback) 이라고 한다.
- 서비스가 완전히 종료되면, 최종결과 (Result)를 반환한다.
위 설명이, '정상'적으로 운영되었을 때의 액션이다. 하지만, 이 정도만 수행한다면, 굳이 액션이라는 방식이 별도로 있을 필요는 없다는 생각이 든다. 액션이 진정한 의미를 가지기 위해서는 바로, '서비스를 수행하는 도중 발생할 수 있는 어떤 에러'에 대처할 수 있다는 것이다. 이 점이 앞서 설명했던 서비스 방식과 확연히 다른 점이다.
그럼 이제 코드를 살펴보자. 이번 코드는 아래와 같은 작업을 한다.
- 서버: 하나의 숫자를 받아서, 숫자만 큼 1초 마다 숫자를 세어준다. (예를 들어 3이라는 숫자를 받으면, 0,1,2,3 이라고 세어준다.)
모든 작업이 끝나면, 종료 메시지를 전달해 준다.
- 클라이언트: 하나의 숫자를 서버에 전달하고, 종료 메시지를 전달받아 화면에 출력한다.
앞서 설명했던 서비스 방식과 마찬가지로, 액션도 주고 받을 데이터 세트를 먼저 선언해야 한다.
일반적으로 폴더명 action 아래에 OOOO.action 으로 만들게 되는데, 통상 데이터 세트 파일은 파일명을 기준으로 클래스를 만들기 때문에, '일반적으로 대문자로 시작하는 파일명을 가진다. (이건 오늘 깨달음.)
프로젝트폴더/action/CountNumber.action
# goal
int16 targetNumber
---
# result
string resultMessage
---
# feedback
int16 ongoingNumber
주의 할 점은, 전달값(Goal)과 중간값(Feedback), 종료값(result)의 순서로 되어 있는 것이 아니라, 앞서 설명했던 OOO.srv의 형식에 feedback을 하나 더 붙인 형식으로 '꼭' 순서를 잡아야 한다는 것이다. 즉 전달값(Goal), 종료값(Result), 중간값(Feedback) 순서로 작성을 해야 한다.
이제 우리를 위해 클래스를 만들어줄 catkin_make 를 위해서 CMakeList.txt와 package.xml에서 환경변수를 설정하자. 이때 서비스 및 토픽과 또 다른 것은 actionlib_msgs 라는 '무조건' 패키지를 추가하는 것인데, 이 패키지가 하는 것이 goal과 result, feeback 세개로 구성된 클래스를 잘 만들어 주는 역할이다.
프로젝트폴더/CMakeList.txt
프로젝트폴더/package.xml
이제 catkin_make를 실행하면 우리가 사용할 클래스를 아래와 같이 만들어 준다.
그런데, 특이한 점이 2가지 있다.
첫번째는 서비스에서 작업했을 때는 srv 라는 폴더에 저장되었지만, 이번에는 action이 아니라, 토픽에서 사용했던 msg폴더안에 저장된다는 것이다.
두번째는 Goal, Feedback, Result 3개의 클래스가 아니라, Action 이라고 붙은 클래스가 더 생긴다는 것이다. 그래서 아래 총 7개의 클래스가 만들어 진다.
- CountNumbersGoal
- CountNumbersFeedback
- CountNumbersResult
- CountNumbersAction
- CountNumbersActionGoal
- CountNumbersActionFeedback
- CountNumbersActionResult
간단히 설명하면, 그냥 Goal, Feedback, Result가 붙은 클래스는 각 데이터의 자료형이고, Action이 붙은 것은 Action 이라는 행위와 관련된 클래스이다. (나의 이해는 여기까지~)
'ROS' 카테고리의 다른 글
ROS1-13 액션 예제 3 - 서버 동작 (0) | 2022.07.28 |
---|---|
ROS1-12 액션 예제 2 - 서버/클라이언크 코딩 (0) | 2022.07.28 |
ROS1-11 서비스 예제 - 서비스 코드 (0) | 2022.07.27 |
ROS1-10 서비스 예제 - 서비스 메시지 준비하기 (0) | 2022.07.27 |
ROS1-09 토픽 예제2 - 사용자가 정의한 자료형 (0) | 2022.07.26 |