[Dashing][CLI Tools] 7. Understanding ROS 2 actions
이 글은 아래의 자료를 참고로 만들어졌습니다.
docs.ros.org/en/dashing/Tutorials/Understanding-ROS2-Actions.html
Understanding ROS 2 actions
Goal: Introspect actions in ROS 2.
Tutorial level: Beginner
Background
Actions은 ROS 2의 통신 방법 중 하나이며, 장시간 실행되는 작업을 위한 것입니다.
Actions은 세 부분으로 구성되며, 그것은 goal, feedback, result입니다.
Actions은 topics과 services에 기반합니다.
Actions은 services와 기능적으로 유사하지만, actions은 preeemptable하여, 실행 중 작업을 취소할 수 있습니다.
Actions은 feedback을 꾸준하게 주는 반면에, services는 단 하나의 response를 return합니다.
Actions은 client-server model을 사용하며, 이것은 topics의 publisher-subscriber model과 유사합니다.
"action client" node는 "action server" node에 goal을 보내고, stream fo feedback과 result를 return합니다.
Prerequisites
이번 튜토리얼은 이전 튜토리얼에서 다루었던 nodes와 topics과 같은 개념을 기반으로 합니다.
이 튜토리얼에서는 turtlssim package가 사용됩니다.
항상 새로운 터미널에 설정파일을 소싱하는 것을 잊지 마세요.
Tasks
1 Setup
두 turtlesim nodes, /turtlesim과 /teleop_turtle을 실행합니다.
새로운 터미널을 열어 아래의 명령을 실행합니다.
$ ros2 run turtlesim turtlesim_node
또 다른 터미널을 열어 아래의 명령을 실행합니다.
$ ros2 run turtlesim turtle_teleop_key
2 Use actions
만약 /teleop_turtle node를 실행하였다면, 그 터미널에 아래의 메세지를 확인할 수 있습니다.
$ ros2 run turtlesim turtle_teleop_key
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.
action에 해당하는 마지막 줄에 대해 알아봅시다.
(첫번째 줄 메세지는 "cmd_vel" topic에 해당하며, 이전 topics turtorial에서 다루었습니다.)
G|B|V|C|D|E|R|T는 키보드의 F key 주변의 box 형태임을 알 수 있습니다.
F key 주변의 각 키의 위치는 turtlesim에 대한 방향에 해당합니다.
에를 들어, E key를 누르면 turtle의 방향이 좌상단을 바라보도록 회전합니다.
/turtlesim node가 실행되고 있는 터미널을 주의깊게 봅시다.
G|B|V|C|D|E|R|T key 중 하나를 누를 때 마다,
/teleop_turtle은 action server에 해당하는 /turtlesim node에 goal을 보내는 것입니다.
goal은 각 key의 방향으로 turtle의 방향을 회전하는 것입니다.
turtle이 key의 방향으로 회전을 완료하였을 때,
/turtlesim node가 실행 중인 터미널에 result 메세지를 전달합니다.
$ ros2 run turtlesim turtlesim_node
[INFO] [turtlesim]: Rotation goal completed successfully
F key는 goal을 실행 중에 취소를 하는 것으로, actions의 preemptable한 특징을 보여줍니다.
C key를 누르고, turtle이 회전을 완료하기 전에 F key를 눌러봅시다.
/turtlesim node가 실행 중인 터미널에서 아래와 같은 메세지를 확인할 수 있습니다.
$ ros2 run turtlesim turtlesim_node
[INFO] [turtlesim]: Rotation goal canceled
client-side(/teleop_turtle node)만 goals을 preempt할 수 있는 것이 아닌,
server-side(/turtlesim node)도 가능합니다.
server-side에서 action을 preempt할 때, goal을 abort합니다.
D key를 누르고, 회전이 완료되기 전에 G키를 누릅니다.
/turtlesim node가 실행 중인 터미널에 아래의 메세지를 확인할 수 있습니다.
interrupted하였기 때문에 server-side에서 첫 번째 goal을 abort하였습니다.
$ ros2 run turtlesim turtlesim_node
[WARN] [turtlesim]: Rotation goal received before a previous goal finished. Aborting previous goal
3 ros2 node info
/turtlesim node의 actions을 확인하기 위해,
새로운 터미널을 열어 아래의 명령을 실행합니다.
$ ros2 node info /turtlesim
/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:
/turtlesim의 /turtle1/rotate_absolute action은 Action Servers에 해당합니다.
이것은 /turtlesim이 /turtle1/rotate_absolute action에 대해 respond하고, feedback을 제공합니다.
/teleop_turtle node에 대해서 /turtle1/rotate_absolute는 Action Clients에 해당하며,
goals을 보내는 역할을 합니다.
$ 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
4 ros2 action list
ROS graph에서 모든 actions을 알아보기 위해서는
아래의 명령을 실행합니다.
$ ros2 action list
/turtle1/rotate_absolute
현재의 ROS graph에 있는 action이며, 이 action이 이전에 본 것과 같이 turtle을 회전시킵니다.
ros2 node info <node_name> 명령에서 알 수 있었던 것과 같이
action client(/teleop_turtle)과 action server(/turtlesim)으로 이루어져있는 것을 알 수 있습니다.
4.1 ros2 action list -t
topics과 services와 비슷하게 actions도 types을 가지고 있습니다.
/turtle1/rotate_absolute의 type을 찾기위해서,
아래의 명령을 실행합니다.
$ ros2 action list -t
/turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]
action 이름(/turtle1/rotate_absoluet)의 오른쪽에 있는 brackets안에 있는 것이
action type(turtlesim/action/RotateAbsolute)입니다.
이러한 action type은 추후 command line이나 code로 action을 실행할 때, 필요할 것입니다.
5 ros2 action info
action에 대해 더욱 정보를 알고 싶다면, 아래의 명령을 실행합니다.
$ ros2 action info /turtle1/rotate_absolute
Action: /turtle1/rotate_absolute
Action clients: 1
/teleop_turtle
Action servers: 1
/turtlesim
이 명령은 이전의 ros2 node info를 통해 알았던 내용을 비슷하게 나타내줍니다.
/turtle1/rotate_absolute action에 대하여
/teleop_turtle node는 action client이며, /turtlesim node는 action server입니다.
6 ros2 interface show
action goal을 보내거나, 실행하기 위해 더 알아야할 정보는 action type의 구조입니다.
이전의 ros2 action list -t 명령을 이용하여,
/turtle1/rotate_absolute action의 type 정보를 상기하여
아래의 명령을 실행합니다.
$ ros2 action 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
---로 구분되어 있는 message의
첫번째는 goal requeset,
두번째는 result,
세번째는 feedback의 구조를 의미합니다.
7 ros2 action send_goal
아래의 명령을 통해 command line으로 action goal을 보내봅시다.
여기서 <values>는 YAML format을 따릅니다.
$ ros2 action send_goal <action_name> <action_type> <values>
turtlesim window를 바라보며, 아래의 명령을 실행합니다.
$ 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
message에서 보인바와 같이, 모든 goals은 unique한 ID를 가지고 있습니다.
그리고 Result에서 delta는 시작점에서 변위를 의미합니다.
현재 goal까지의 feedback을 보기 위해서, 마지막 명령에 --feedback을 추가합니다.
명령을 실행하기 전, 현재의 turtle의 theta값을 바꾸고 아래의 명령을 실행합니다.
그렇지 않으면, turtle이 회전하지 않을 것입니다.
$ ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: -1.57}" --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
goal에 도착할 때까지, 남은 radian값을 지속적으로 feedback 받은 것을 알 수 있습니다.