본문으로 바로가기

ROS 2 Action 정의 만들기

category 강좌/ROS2 2026. 5. 10. 02:03
728x90
728x90

1. ROS 2 Action의 개념

 

ROS 2에서 Action은 시간이 오래 걸리는 작업을 처리할 때 사용하는 통신 방식입니다.
Service는 요청을 보내면 결과가 바로 돌아오는 구조에 가깝지만, Action은 작업이 진행되는 동안 중간 상태를 계속 받을 수 있습니다.

 

Action은 크게 다음과 같은 흐름으로 동작합니다.

Action Client  →  Goal 요청
Action Server  →  Goal 수락
Action Server  →  Feedback 전송
Action Server  →  Result 반환
 

 

예를 들어 turtlesim을 특정 거리만큼 이동시키는 작업을 생각해 보겠습니다.
거북이가 목표 거리까지 이동하는 동안 남은 거리를 계속 알려주고, 이동이 끝나면 최종 위치와 이동 결과를 반환할 수 있습니다.

 

이런 구조가 바로 Action을 사용하는 대표적인 상황입니다.

 

 

 

2. Action 메시지 정의 만들기

 

이번 예제에서는 DistTurtle.action이라는 Action 정의 파일을 만듭니다.

패키지 구조는 다음과 같이 구성합니다.

ros2_study/
└── src/
    ├── my_first_package/
    └── my_first_package_msgs/
        ├── action/
        │   └── DistTurtle.action
        ├── msg/
        ├── srv/
        ├── CMakeLists.txt
        └── package.xml
 

 

action 폴더를 만든 뒤 그 안에 DistTurtle.action 파일을 생성합니다.

 

cd ~/ros2_study/src/my_first_package_msgs
mkdir action
touch action/DistTurtle.action

 

 

Action 파일은 세 구역으로 나뉩니다. DisTurtle.action 파일에 아래의 내용을 추가하고 저장합니다.

 

# Request
float32 linear_x
float32 angular_z
float32 dist
---
# Result
float32 pos_x
float32 pos_y
float32 pos_theta
float32 result_dist
---
# Feedback
float32 remained_dist
 

 

 

 

각 구역의 의미는 다음과 같습니다.

           구역                                                            역할
Request Action Client가 서버에 보내는 목표값입니다.
Result 작업이 끝났을 때 서버가 반환하는 최종 결과입니다.
Feedback 작업 진행 중 서버가 계속 보내는 중간 상태입니다.

 

여기서는 사용자가 선속도 linear_x, 각속도 angular_z, 이동 거리 dist를 요청합니다.

 

서버는 이동이 끝난 뒤 현재 위치 pos_x, pos_y, 자세 pos_theta, 실제 이동 거리 result_dist를 반환합니다.

 

작업 중에는 남은 거리 remained_dist를 Feedback으로 계속 보냅니다.

 

 

 

3. CMakeLists.txt 설정

 

Action 파일을 빌드하려면 my_first_package_msgs 패키지의 CMakeLists.txt에 Action 인터페이스를 등록해야 합니다.

 

핵심은 rosidl_generate_interfaces() 안에 Action 파일을 추가하는 것입니다.

 

rosidl_generate_interfaces(${PROJECT_NAME}
  "msg/CmdAndPoseVel.msg"
  "srv/MultiSpawn.srv"
  "action/DistTurtle.action"
)

 

 

기존에 msg, srv만 등록되어 있었다면 Action 파일도 같은 위치에 추가하면 됩니다.

 

 

 

4. package.xml 설정

 

Action 메시지를 사용하려면 package.xml에도 의존성을 추가해야 합니다.

 

<depend>action_msgs</depend>

 

 

더보기
         인터페이스 종류                                                                       package.xml 추가
.msg 보통 rosidl_default_generators, rosidl_default_runtime
.srv 보통 rosidl_default_generators, rosidl_default_runtime
.action 위 항목 + <depend>action_msgs</depend> 권장/필요

 

 

 

그리고 ROS 2 인터페이스 패키지로 동작하도록 다음 설정도 필요합니다.

 

<member_of_group>rosidl_interface_packages</member_of_group>

 

package.xml에는 최소한 다음 항목들이 포함되어야 합니다.

 

<buildtool_depend>ament_cmake</buildtool_depend>

<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>

<depend>action_msgs</depend>

 

 

 

 

 

5. Action 인터페이스 빌드하기

 

수정이 끝났으면 워크스페이스 루트로 이동해서 빌드합니다.

 

cd ~/ros2_study
colcon build

 

 

 

빌드가 끝나면 환경을 다시 적용합니다.

 

source install/setup.bash

또는 

sl

 

 

 

Action 인터페이스가 제대로 생성되었는지 확인합니다.

 

ros2 interface show my_first_package_msgs/action/DistTurtle

 

 

정상이라면 다음과 비슷한 구조가 출력됩니다.

 

 

 

728x90
728x90