본문 바로가기
ROS2

[ROS2] ROS2 Action 알아보기, 근데 이제 turtlesim을 곁들인

by ykr0919 2024. 10. 22.

 

 

 

ROS2 액션에 대해서 알아보자!!

 

액션은 비동기식, 동기식 양방향 메시지 송수신 방식으로 액션 목표(Goal)를 지정하는 Action Client와 액션 목표를 받아 특정 태스크를 수행하면서 중간 결괏값을 전송하는 액션 피드백(Feedback) 그리고 최종 결괏값을 담은 액션 결과(Result)를 전송하는 Action Server 간의 통신임.

 

 

액션 구현 방식을 더 자세히 살펴보자!!!

 

 

 

Action Client는 Service Client 3개와 Topic Subscriber 2개로 구성되어 있으며, Action Server는 Service Server 3개와 Topic Publisher 2개로 구성됨. 

 

액션 목표, 피드백, 결과 데이터는 msg, srv 인터페이스의 변형인 action 인터페이스를 사용함.

 

 

 

 

클라이언트가 요청을 보내면 서버는 요청을 받았다는 응답을 보냄. 

 

그다음부터는 서버가 피드백정보를 계속 줌!

 

피드백을 받다가 결과에 도달하게 되면, 도달했다고 신호를 보내고 최종 결괏값에 대한 응답을 받음.

 

액션은 서비스와 토픽을 합친 것과 같다고 생각하면 됨. 

 

목푯값을 주는 신호, 목푯값에 도달했다는 신호 두 가지는 서비스와 같은 개념으로 동작함.

 

피드백 정보는 퍼블리셔가 요청을 받고 나서는 지속적으로 정보를 주게 됨. 이건 토픽과 같다고 볼 수 있음.

 

토픽과 서비스를 알고 있다면 어떤 점이 같은 개념인지 감이 올 것이라 생각함!! 

 

 

 

ROS1에서의 액션은 목표, 피드백, 결괏값을 토픽으로만 주고받았는데 ROS2에서는 토픽과 서비스 방식을 혼합하여 사용함. 

 

왜냐하면 ROS2 액션에서 새롭게 선보이는 목표 전달(send_goal), 목표 취소(cancel_goal), 결과받기(get_result)를 위해 서비스 통신을 사용하기 때문.

 

비동기 방식을 이용하다 보면 원하는 타이밍에 적절한 액션을 수행하기 어려운데 이를 해결하기 위해 목표 상태(goal_state)를 ROS2에서 새롭게 선보였음. 

 

목표 상태는 목푯값을 전달한 후 상태 머신을 구동하여 액션의 프로세스를 쫓는 것임.

 

Goal State Machine을 통해 아래 이미지와 같이 액션 목표 전달 이후 액션의 상태값을 액션 클라이언트에게 전달할 수 있어서 비동기, 동기 방식이 혼재된 액션의 처리를 보다 원활하게 해 줌. 

 

 

 

동작을 한번 보자면! 

 

ACCEPTED, EXCUTING, CANCELING는 현재 동작하고 있는 것에 대한 상태이고

 

SUCCEEDED, ABORTED, CANCELED 이 상태가 뜨고 나면 액션 상태가 종료가 되는 것임.

 

어떤 순서로 진행되냐면~~

 

send_goal가 들어오면 EXCUTING을 하고, 실행되고 나서는 SUCCEEDED로 넘어가게 됨.

 

이때 들어가는 execute, succeed는 서버자체에서 ACCEPTED 신호를 받고 나면 계속해서 서버에서 신호를 주게 됨.  

 

만약에 클라이언트에서 중간에 취소한다고 신호가 뜨면 CANCELING으로 감.

 

cancel이 됐으면 CANCELED로 가고, cancel이 안 됐으면 ABORTED로 가게 됨.  

 

동작중에 멈추려고 할 때는 우선 CANCELING으로 가고, cancel 되었으면 CANCELED 취소가 안 됐으면 ABORTED

 

동작중에 갑자기 방해(interrupt)에 의해서 동작이 정지가 된다면 ABORTED로 가게 됨.

 

 

액션 서버 및 클라이언트

 

ros2 액션 실습은 항상 먹던 맛인 turtlesim 노드와 teleop_turtle 노드를 사용해 테스트해 보자!  

 

앞에서 알아본 토픽과 서비스에서는 teleop_turtle 노드가 실행된 터미널 창에서 화살표 키를 눌러 turtlesim의 거북이를 움직여 봄.

 

이번에는 G, B, V, C, D, E, R, T키를 사용해 보자! 이 키들은 거북이의 rotate_absolute 액션을 수행함에 있어서 액션의 목푯값을 전달하는 목적으로 사용함.

 

F키를 누르면 전달한 목푯값을 취소하여 동작을 바로 멈추게 함. 

 

 

거북이가 목표 각도 값에 도달하면 아래와 같이 표시됨.

 

 

하지만 액션 목표 theta 값에 도달하기 전에 turtle_teleop_key가 실행된 터미널 창에서 F키를 눌러 액션 목표를 취소하면 turtlesim_node는 실행된 터미널 창에 아래와 같이 목표가 취소되었음을 알리면서 거북이는 그 자리에서 멈춤.

 

 

 

 

노드 정보(ros2 node info)

 

 

각 실행된 노드의 액션 정보를 확인하기 위해서는 노드 정보 명령어ros2 node info를 사용함.

 

turtlesim 노드는 turtlesim/action/RotateAbsolute(action 인터페이스)를 사용하는 /turtle1/rotate_absolute 액션 서버를 가지고 있음을 확인할 수 있음.

 

 

teleop_turtle 노드는 /turtle1/rotate_absolute 액션 클라이언트를 가지고 있음.

 

 

 

여기에 추가로 더 설명하자면 rotate_absolute 액션은 다음과 같이 send_goal, cancel_goal, status, feedback, get_result로 더 세분화되어 있음.

 

/turtle1/rotate_absolute/_action/send_goal: turtlesim/action/RotateAbsolute_SendGoal

/turtle1/rotate_absolute/_action/cancel_goal: action_msgs/srv/CancelGoal

/turtle1/rotate_absolute/_action/status: action_msgs/msg/GoalStatusArray

/turtle1/rotate_absolute/_action/feedback: turtlesim/action/RotateAbsolute_FeedbackMessage

/turtle1/rotate_absolute/_action/get_result: turtlesim/action/RotateAbsolute_GetResult

 

 

액션 목표, 피드백, 결과에 대한 처리는 프로그래밍을 할 때 작성하게 되는데 그건 추후에 더 알아보자!! 

 

 

액션 목록(ros2 action list -t)

 

ros2 action list -t를 이용해 현재 개발환경에서 실행 중인 액션 목록을 확인할 수 있음.

 

 

 

액션 정보(ros2 action info)

 

검색된 액션 목록을 더 자세히 확인하기 위해서는 액션 정보 명령어ros2 action info를 이용하면 됨.

사용되는 액션 이름과 해당 액션의 서버 및 클라이언트 노드 이름 및 개수를 확인할 수 있음.

 

 

액션 목표(action goal) 전달

 

 

액션 서버 및 클라이언트에서는 teleop_turtle의 Action client를 사용해 액션 목표를 전달해 봄.

 

이번에는 ros2 action send_goal 명령어를 사용해 액션 목표를 전달해 보겠음. 

 

이 명령어는 아래와 같이 ros2 action send_goal 명령어에 액션 이름, 액션 형태, 목푯값을 차례대로 입력하면 됨.

 

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

 

예를 들어 거북이에게 12시 방향인 theta: 1.5708의 목푯값을 주게 되면 아래 사진과 같이 이동하게 되며 다음처럼 전달한 목푯값과 액션 목표의 UID(Unique ID)를 표시함.

 

액션 통신이 끝나면 이동 시작 자세로부터 변위 값인 delta를 표시함.

 

 

 

 

위 명령에서는 피드백이 포함되지 않았는데 이를 화면에 표시하기 위해서는 --feedback 옵션을 붙여주면 됨. 

 

이를 통해 거북이는 정해진 theta(-1.5708, 시계 6시 방향)로 회전하며 앞에서 언급한 목푯값, UID, 결괏값, 상태값 이외에도 Feedback 값으로 남은 회전량을 피드백으로 표시해 줌. 

 

 

 

 

 

 

참고자료 

 

https://roomedia.tistory.com/entry/63%EC%9D%BC%EC%B0%A8-ROS-2-%EC%95%A1%EC%85%98-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-%EC%98%A4%EB%A1%9C%EC%B9%B4-ROS-%EC%9C%A0%EC%A0%80%EB%AA%A8%EC%9E%84