2024. 9. 23. 13:18ㆍROS2/기초
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의 특징
- action client는 action server가 response를 보내기 전까지 계속해서 기다리지 않고, 다른 일을 할 수 있다.
- action client는 request를 보낸 뒤에도 지속적으로 feedback을 받을 수 있다.
- feedback을 받고 있다가, 뭔가 잘못 돌아가고 있다는 것을 감지한 경우 cancel을 할 수도 있다.
- 하지만, 여러 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을 적극 활용하고 있는 모습을 볼 수 있다.
다시 한번 피보나치 예시를 보자면
- client가 Goal Request를 보냄
- 이에 해당하는 작업을 수행하면서 지속적으로 Feedback을 보내줌
- 모든 작업을 수행한 뒤에는 최종 결과를 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 |