Knowhow/ROS2

[ROS2 Foxy Tutorial 한글 번역] 7. Understanding actions

침닦는수건 2023. 2. 2. 15:58
반응형

Link

https://docs.ros.org/en/foxy/Tutorials/Beginner-CLI-Tools/Understanding-ROS2-Actions/Understanding-ROS2-Actions.html

 

Understanding actions — ROS 2 Documentation: Foxy documentation

You're reading the documentation for an older, but still supported, version of ROS 2. For information on the latest version, please have a look at Humble. Understanding actions Goal: Introspect actions in ROS 2. Tutorial level: Beginner Time: 15 minutes Ac

docs.ros.org

 

Background

Action(이해 액션)은 ROS2의 또 하나의 소통 방식 중 하나인데 실행에 시간이 조금 걸리는 일들에 사용된다. 액션은 goal, feedback, result 총 3부분으로 구성되어 있다. 

 

액션은 앞서 배운 토픽과 서비스의 묶음으로 구성된 것이다. 그 기능은 서비스와 비슷하지만 액션은 preemtable하다. 다른 말로 중간에 실행을 멈출 수 있다. 또한 액션은 단발성 response만 있는 서비스 대비 지속성 피드백(꾸준히 지속되는)을 받을 수도 있다. 

(조금 첨언을 하자면, 서비스는 request가 들어가면 response는 무조건 나오는 단발성이다. request가 일단 들어가면 멈출 수 없다. 하지만 액션은 토픽과 서비스의 집합이기 때문에 goal이 설정되고 request가 날아간 이후에 feedback을 받고 다시 request를 날리고 등등 수많은 작업이 연속적으로 이루어지는데 어떤 중간 과정에서 멈출 수 있다. 비유하자면 서비스는 자동응답기랑 통신하는 것이고 액션은 상담원이랑 통신하는 것이라 중간에 다른 행동을 할 자유도가 높은 것과 비슷하다.)

 

액션은 client-server 모델을 사용하며 publisher-subcriber 모델과 유사하다. action client 노드는 goal을 action server로 보내고 action server 노드는 goal을 받아들인 뒤에 feedback과 result를 돌려보낸다. 

 

Prerequisites

이전 튜토리얼들에서 다루어진 노드와 토픽에 대한 지식이 있어야 한다.

 

turtlesim 패키지를 똑같이 쓸 것이고 ROS2 sourcing하는 것을 잊지 말자.

 

Tasks

1. Setup

/turtlesim과 /teleop_turtle 노드를 각자 다른 터미널에서 실행한다.

ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key

 

2. Use actions

/teleop_turtle 노드를 실행시켰을 때 다음과 같은 메시지를 볼 수 있다.

Use arrow keys to move the turtle.
Use G|B|V|C|D|E|R|T keys to rotate to absolute orientations. 'F' to cancel a rotation.

 액션과 연관이 있는 두번째 줄에 집중하자. (첫번째 줄은 "cmd_vel" 토픽에 관한 것이었다.)

 

조작키 G|B|V|C|D|E|R|T는 F 키 주변을 둘러싸는 박스 형태라는 것을 알 수 있다. F키를 기준으로 각 키가 위치한 orientation으로 거북이가 회전하게 된다. 예를 들어, E를 누르면 10시 방향으로 머리가 향하게 회전한다.

 

이 때 /turtlesim 노드가 실행 중인 터미널을 봐라. 키를 누를 때마다 action server 인 /turtlesim으로 goal이 보내진다. goal은 특정 방향으로 거북이가 향하도록 하는 것이다. goal이 달성되었을 때 1번 결과에 대한 메시지가 출력되고 있다.

[INFO] [turtlesim]: Rotation goal completed successfully

F 키는 goal 수행을 중간에 멈출 수 있는데 이것은 앞서 액션은 preemtable하다는 특징을 관찰할 수 있게 해준다. 

 

C키는 한 번 눌러보자. 그리고 거북이가 완전히 회전하기 전에 F키를 눌러봐라. /turtlesim 노드가 실행되고 있는 터미널에 다음과 같은 메시지가 출력될 것이다. 

[INFO] [turtlesim]: Rotation goal canceled

(이건 client-side에서 멈추라는 액션을 새로 덮어써서 멈춘 것이다.)

 

client-side(예시에서는 teleop 입력)에서만 "중간 방해"할 수 있는 것이 아니라 server-side(turtlesim)에서 "중간 방해"할 수 있다. 만약 server-side에서 "중간 방해"가 발생할 경우, 이전 goal을 중단한다.

 

D키를 누르고 완전 회전하기 전에 G 키를 눌러봐라. /turtlesim 노드 터미널에 다음과 같이 출력될 것이다. 

[WARN] [turtlesim]: Rotation goal received before a previous goal finished. Aborting previous goal

이건 결과는 비슷하지만 이전 goal이 달성되지 않았는데 새로운 goal이 설정된 것을 보고 server-side에서 이전 goal을 중단한 모습이다. (사실 뭐 크게 다른지 모르겠다. 이전 F키를 누르는 경우도 sever-side에서 중단했다고 볼 수도 있다. 굳이 구분해서 이해하려고 하지 않아도 될 듯.) 

 

3. ros2 node info

 /turtle 노드의 액션들을 보기 위해 새터미널에 다음 커맨드를 입력해보자.

ros2 node info /turtlesim

/turtlesim의 subcriber, publisher, service, action server, action client 전부 가 출력되는 것을 볼 수 있다.

/turtlesim
  Subscribers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /turtle1/cmd_vel: geometry_msgs/msg/Twist
  Publishers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /rosout: rcl_interfaces/msg/Log
    /turtle1/color_sensor: turtlesim/msg/Color
    /turtle1/pose: turtlesim/msg/Pose
  Services:
    /clear: std_srvs/srv/Empty
    /kill: turtlesim/srv/Kill
    /reset: std_srvs/srv/Empty
    /spawn: turtlesim/srv/Spawn
    /turtle1/set_pen: turtlesim/srv/SetPen
    /turtle1/teleport_absolute: turtlesim/srv/TeleportAbsolute
    /turtle1/teleport_relative: turtlesim/srv/TeleportRelative
    /turtlesim/describe_parameters: rcl_interfaces/srv/DescribeParameters
    /turtlesim/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
    /turtlesim/get_parameters: rcl_interfaces/srv/GetParameters
    /turtlesim/list_parameters: rcl_interfaces/srv/ListParameters
    /turtlesim/set_parameters: rcl_interfaces/srv/SetParameters
    /turtlesim/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
  Action Servers:
    /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
  Action Clients:

/turtle1/rotate_absolute 액션은 Action Servers 하위에 있다. 이것은 /turtlesim이 서버 역할을 하며 /turtle1/rotate_absolute 액션이 발생했을 때 피드백을 주는 위치라는 것을 뜻한다.

 

반대로 /teleop_turtle 노드에 대해 출력해보면 /turtle1/rotate_absolute가 Action client 하위에 있는 것을 볼 수 있다.

ros2 node info /teleop_turtle
/teleop_turtle
  Subscribers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
  Publishers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /rosout: rcl_interfaces/msg/Log
    /turtle1/cmd_vel: geometry_msgs/msg/Twist
  Services:
    /teleop_turtle/describe_parameters: rcl_interfaces/srv/DescribeParameters
    /teleop_turtle/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
    /teleop_turtle/get_parameters: rcl_interfaces/srv/GetParameters
    /teleop_turtle/list_parameters: rcl_interfaces/srv/ListParameters
    /teleop_turtle/set_parameters: rcl_interfaces/srv/SetParameters
    /teleop_turtle/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
  Action Servers:

  Action Clients:
    /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute

이것은 /teleop_turtle은 goal을 던지는 위치라는 것이다.

 

4. ros2 action list

ROS graph 상 모든 액션을 보는 커맨드는 다음과 같다.

ros2 action list

출력 결과는 다음과 같다.

/turtle1/rotate_absolute

지금은 단 한개의 액션만 graph에 있다. 거북이를 회전시키는 액션이다. 앞서 "ros2 node info <node_name>" 커맨드를 설명할 때 보았듯이 action client (/teleop_turtle), action server(/turtlesim) 사이에 이 액션 하나만 있는 것을 보았으니 당연한 결과다.

 

4.1 ros2 action list -t

액션도 토픽이나 서비스처럼 타입이 있다. /turtle1/rotate_absolute 액션을 예시로 다음 커맨드로 확인해보자.

ros2 action list -t

출력 결과는 다음과 같다.

/turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]

[] 안에 있는 내용이 액션 타입이다. 이 타입을 알아야 할 때는 직접 커맨드 라인에서 액션을 호출할 일이 있을 때다. 그 외에는 딱히...

 

5. ros2 action info

다음 커맨드로 액션에 대해서 더 많은 정보를 얻을 수 있다. /turtle1/rotate_absolute 로 살펴보자.

ros2 action info /turtle1/rotate_absolute

출력 결과는 다음과 같다.

Action: /turtle1/rotate_absolute
Action clients: 1
    /teleop_turtle
Action servers: 1
    /turtlesim

"ros2 node info"에서 이미 본 바와 같이 action client (/teleop_turtle), action server(/turtlesim)까지 설명되어 있다.

 

6. ros2 interface show

액션을 직접 호출하면서 goal을 보낼 때에는 액션 타입을 명확히 알아야 한다. 이전에 "ros2 action list -t"에서 보았던 액션 타입을 기억하면서 다음 커맨드를 다시 입력해보자.

ros2 interface show turtlesim/action/RotateAbsolute

출력 결과는 다음과 같다.

The desired heading in radians
float32 theta
---
The angular displacement in radians to the starting position
float32 delta
---
The remaining rotation in radians
float32 remaining

서비스에서 "---"로 구분하여 request, response가 출력되었던 것처럼 액션에서는 goal, result, feedback이 구분되어 출력되는 것을 볼 수 있다. 각각의 구조가 변수명과 함께 출력된다.

 

7. ros2 action send_goal

이제 커맨드 라인을 통해 액션을 호출해보자 (goal을 보내보자)

ros2 action send_goal <action_name> <action_type> <values>

여기서 <values>는 YAML syntax를 따라야 한다.

 

turtlesim 윈도우를 계속 관찰하면서 다음 커맨드를 입력해보자.

ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}"

다음과 같은 메시지가 출력되면서 윈도우의 거북이가 회전하는 것을 볼 수 있을 것이다.

Waiting for an action server to become available...
Sending goal:
   theta: 1.57

Goal accepted with ID: f8db8f44410849eaa93d3feb747dd444

Result:
  delta: -1.568000316619873

Goal finished with status: SUCCEEDED

메세지에 보이는 것처럼 모든 goal은 고유ID가 있다. result 역시 delta라는 이름으로 시작 위치 대비 변위값을 갖는다는 것을 확인할 수 있다.

 

feedback까지 보기 위해선 --feedback 옵션을 마지막에 추가하면 된다. 아래 커맨드를 다시 실행해볼 때 하나 주의할 점은 아까와 같은 theta를 넣으면 이미 거북이가 그만큼 회전해있기 때문에 움직이지 않으니 다른 theta 값을 입력해야 움직이는 모습을 볼 수 있다. 

ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: -1.57}" --feedback

이제 메세지는 feedback을 포함해서 출력될 것이다.

Sending goal:
   theta: -1.57

Goal accepted with ID: e6092c831f994afda92f0086f220da27

Feedback:
  remaining: -3.1268222332000732

Feedback:
  remaining: -3.1108222007751465

…

Result:
  delta: 3.1200008392333984

Goal finished with status: SUCCEEDED

 

Summary

액션을 서비스와 비슷하지만 조금 더 길게 실행되는 task에 적합하다. 주기적으로 피드백을 제공하고 중간에 멈출 수도 있기 때문이다. 

 

로봇 시스템에서 액션을 주행 시 많이 활용된다. 액션 goal을 통해 특정 위치까지 이동하라고 명령하고 그 중간 중간 계속해서 feedback을 받으며 업데이트를 하면서 최종 위치까지 도달시킬 수 있다.

 

turtlesim은 액션 server를 갖고 있고 거북이를 회전시키는 액션 client로부터 goal을 전달받아 동작하는 구조였다. 이는 액션이 어떻게 동작하는지 이해하기 좋은 예제였다. 

 

반응형