ROS2 3일차(3) Action

2024. 9. 23. 13:18ROS2/기초

Fibonacci Action Client, Server

# Terminal 1
ros2 run py_action_pkg fibonacci_action_server

# Terminal 2
ros2 run py_action_pkg fibonacci_action_client

client는 완료 후 자동 종료되고, server는 종료되지 않고 다음 client를 기다린다.

 

ROS2 Action 개념

Action의 특징

  1. action client는 action server가 response를 보내기 전까지 계속해서 기다리지 않고, 다른 일을 할 수 있다.
  2. action client는 request를 보낸 뒤에도 지속적으로 feedback을 받을 수 있다.
  3. feedback을 받고 있다가, 뭔가 잘못 돌아가고 있다는 것을 감지한 경우 cancel을 할 수도 있다.
  4. 하지만, 여러 request를 동시에 작업하는 것은 본질적으로 불가 => 단, 프로그래밍적인 해결이 가능하며, 이에 대해서는 MultiThreadedExecutor라는 것을 배워봅니다.

사진과 같이 Action Client와 Server가 주고받는 내용은 크게 5가지가 있다. 더불어 이들이 전개되는 순서를 살펴보면 다음과 같다.

1. Client => Server, Goal Request (service request와 유사)

2. server => client, Goal Response

3. client => server, Result Request

4. server => client, Feedback Topic

5. server => client, Result Response

 

Action의 예시

우리가 도로를 운전하는 상황을 생각해보자.

  • 원하는 목적지까지 이동
  • 그 과정에서 네비게이션을 보면서 제대로 된 길을 가고 있는지 확인
  • 이는 기본적인 경로 안내와 더불어, 잘못된 길을 가면 경로를 다시 탐색하기도 하고, 도로 상황에 따라 최적의 경로를 안내

Action은 네비게이션과 비슷하게 동작함

  • 목적지를 request받고, 경로 검색을 마치면 안내를 시작
  • 운전 중간 계속해서 Feedback을 준다
  • 목적지에 도착했다면, 경로 안내를 종료하고 다음 Request까지 기다림

실제로, 자율주행을 위한 ROS2의 Nav2라는 프로젝트가 있는데 이러한 Action의 특성이 반드시 필요함

실제 코드를 보아도 Action을 적극 활용하고 있는 모습을 볼 수 있다.

https://github.com/ros-navigation/navigation2/blob/713e47ff1aa3a7509ada1eb50b97267141484541/nav2_bt_navigator/include/nav2_bt_navigator/navigators/navigate_through_poses.hpp#L22

 

navigation2/nav2_bt_navigator/include/nav2_bt_navigator/navigators/navigate_through_poses.hpp at 713e47ff1aa3a7509ada1eb50b97267

ROS 2 Navigation Framework and System. Contribute to ros-navigation/navigation2 development by creating an account on GitHub.

github.com

 

다시 한번 피보나치 예시를 보자면

  1. client가 Goal Request를 보냄
  2. 이에 해당하는 작업을 수행하면서 지속적으로 Feedback을 보내줌
  3. 모든 작업을 수행한 뒤에는 최종 결과를 Result에 담아서 전달

여기서 Goal과 Feedback, Result는 Action의 데이터 타입인 action을 사용

Fibonacci.action

# Goal
int32 order
---
# Result
int32[] sequence
---
# Feedback
int32[] partial_sequence

msg, srv에서와 같이 기본 ROS2 자료형을 조합하여 직접 action 타입을 만들 수 있다.

 

ROS2 Action Commands

action과 상호작용할 수 있는 터미널 커멘드

 

실행중인 모든 Action들을 확인

ros2 run py_action_pkg fibonacci_action_server

#New Terminal
ros2 action list
/fibonacci

 

특정 Action의 정보를 조회

ros2 action info /fibonacci
Action: /fibonacci
Action clients: 0
Action servers: 1
    /fibonacci_action_server

 

Action이 사용하는 action 타입의 상세 정보를 조회

$ ros2 interface show custom_interfaces/action/Fibonacci
int32 order
---
int32[] sequence
---
int32[] partial_sequence

 

Action Server에게 Client 프로그래밍 없이도 곧바로 커멘드 라인을 통해 Goal Request가 가능

ros2 action send_goal <Action-name> <action-type> {actual: value}
ros2 action send_goal fibonacci custom_interfaces/action/Fibonacci "{order: 5}"
Waiting for an action server to become available...
Sending goal:
     order: 5

Goal accepted with ID: b7a5ebb7082b409ea98ee810491c536d

Result:
    sequence:
- 0
- 1
- 1
- 2
- 3
- 5

Goal finished with status: SUCCEEDED

 

이때, feedback을 확인할지의 여부에 따라 추가 옵션이 가능함

ros2 action send_goal --feedback fibonacci custom_interfaces/action/Fibonacci "{order: 5}"

Sending goal:
     order: 5

Goal accepted with ID: 931bc6ab024345148e3db6727b6bf035

Feedback:
    partial_sequence:
- 0
- 1
- 1

Feedback:
    partial_sequence:
- 0
- 1
- 1
- 2

 

Goal Cancel

Request이후 Feedback을 받다가 Cancel이 가능

ros2 run py_action_pkg fibonacci_action_server_cancel

ros2 run py_action_pkg fibonacci_action_client_cancel

위 예제는 특정 시간이 지나면 자동으로 Cancel을 요청한 구현

이런 방식이 아니라, Feedback에 따라서 Cancel의 요청 여부를 결정지을 수도 있다.

 

'ROS2 > 기초' 카테고리의 다른 글

ROS2 4일차(1) Maze World  (0) 2024.09.24
ROS2 3일차(4) Action 프로그래밍  (0) 2024.09.23
ROS2 3일차(2) Service 프로그래밍  (0) 2024.09.23
ROS2 3일차(1) Service  (0) 2024.09.23
ROS2 2일차(5) tf2  (0) 2024.09.20