이론

- 액션이란?
- 다소 시간이 걸릴 수 있는 작업이 처리되는 동안 피드백과 업데이트를 제공
로봇을 목표로 이동하거나 복잡한 계산을 수행하는 등 시간이 오래 걸리는 작업에 유용
- 구성요소 (해당 그림에서는 클라이언트 측에 3개의 서비스 클라이언트와 2개의 토픽 구독자, 서버 측에 2개의 토픽 게시자가 있는 3개의 서비스 서버가 포함됨)
- 작업 클라이언트 (Node A)
- 목표 요청 보내기 : ex) 로봇을 특정 위치로 이동
- 피드백 수신 : 작업 서버는 작업이 어떻게 진행되고 있는지 클라이언트에 알리기 위해 정기적인 피드백을 보냄
- 결과 수신 : 작업이 완료되면 '작업 성공' 같은 메시지를 보냄
- 작업 서버 (Node B)
- 목표 수신 및 처리 : 서버로 들어오는 목표 요청을 처리하고 작업 시작
- 피드백 보내기 : 작업의 현재 상태를 클라이언트에게 보냄 ex) 50% 완료
- 결과 보내기 : 작업이 완료되면 서버는 최종 결과를 클라이언트에게 보냄

ROS2 Action과 ROS1 Action의 차이점
- 서비스 목표 요청(send_goal()), 목표 취소(cancel_goal()), 결과 요청(get_result())을 처리
- 프로세스 전반에 걸쳐 피드백과 상태 업데이트를 보낼 수 있음
Goal sate machine 다이어그램
- ACCEPTED
- 액션 서버에서 goal을 받아 수락한 초기 상태
- 클라이언트가 목표를 보내고 서버가 이를 승인한 후에 목표가 승인
- 목표가 승인되면 다음 상태인 EXECUTING으로 이동
- EXECUTING
- 액션 서버가 goal에서 요청한 작업을 수행중 ex) 로봇이 움직이는게 goal라면, 로봇이 움직이고 있음
- 진행 상황을 나타내기 위해 피드백이 클라이언트에게 계속 전송됨
- goal가 완료되었는지 또는 취소 요청이 되었는지에 따라 SUCCEEDED 또는 CANCELING으로 가게됨
- SUCCEEDED
- 작업을 성공하면 goal가 SUCCEEDED로 전환됨
- 목표가 달성되었을 알리기 위해 결과가 클라이언트로 전송됨
- CANCELING
- 클라이언트가 목표 취소를 요청하면 작업 서버가 성공적으로 작업을 중지시키면 goal이 CANCELED로 전환됨
- 작업이 중단되었으나 오류 없이 성공적으로 수행되었음을 의미
- ABORTED
- 서버가 어떤 이유로 작업을 완료할 수 없는 경우 goal이 ABORTED로 전환
- 작업이 실패한것임. 결과는 실패로 표시
실습
# 터미널 1
$ ros2 run turtlesim turtlesim_node
# 터미널 2
$ ros2 run turtlesim turtle_teleop_key

- G, B, V, C, D, E, R, T 키를 사용하여 움직일 수 있음
- 해당 키들은 각 거북이들의 rotate_absolute 액션을 수행함에 있어서 액션의 목표값을 전달하는 목적으로 사용
- F키를 중심으로 8개의 버튼을 사용
- 키들은 위치별로 0.7854 radian 값씩 반시계 방향으로 각도를 회전
- ex) R을 누르면 1.5708 radian 목표 값이 전달되어 12시 방향으로 회전

- 액션 목표는 F를 눌러 도중에 취소할 수 있음
- 액션이 취소없이 goal에 도달하면 '[INFO]: Rotation goal completed successfully' 가 표시
- 액션 도중 f를 눌러 취소한다면 '[INFO]: Rotation goal canceled'
# 노드 정보를 알 수 있음
$ ros2 node info /turtlesim
$ ros2 node info /teleop_turtle
# 액션 목록
$ ros2 action list -t
# 액션 정보
$ ros2 action info /turtle1/rotate_absolute

# 액션 goal 전달
# turtle1 거북이를 절대 각도로 회전하라는 소리
# "{theta: 1.5708}" 는 전송되는 goal 메시지. 1.5708 라디안 값으로 회전하라는 소리
$ ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.5708}"
$ ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: -1.5708}" --feedback
- 터미널 결과값을 보면 메시지 전송 후 goal을 이루기 위해서 -2.992 라디안을 회전했다고 볼 수 있음
action interface
- 액션 인터페이스는 메시지 및 서비스 인터피에스의 확장형이라고 볼 수 있음
- 'ros2 interface show turtlesim/action/RotateAbsolute.action' 코드를 이용해 확인 가능
- theta, delta, remaining 이라는 세개의 데이터 존재
ROS2의 jazzy 버전은 지원을 안하나 실행 시 오류가 발생한다.