ROS2 프로그래밍은 메시지 통신을 위해 정수, 부동 소수점, 불린과 같은 기본 변수 타입들이 담긴 std_msgs
인터페이스나 병진 속도와 회전 속도를 표현할 수 있는 geometry_msgs
의 Twist.msg
인터페이스, 레이저 스캐닝 값을 담을수 있는 sensor_msgs
의 LaserScan.msg
인터페이스와 같이 지정된 인터페이스를 사용하는 것이 일반적이다.
하지만 이러한 인터페이스들은 사용자가 원하는 모든 정보를 담을 수 없고 토픽 인터페이스 이외에 서비스나 액션 인터페이스는 매우 기본적으로 인터페이스만 제공하기 때문에 사용자가 필요로 하는 형태가 아니라면 새로 만들어 사용해야 한다.
그렇기 때문에 이번 장에서는 ROS2 프로그래밍에서 사용할 토픽(Topic), 서비스(Service), 액션(Action) 관련 ROS2 인터페이스를 신규로 작성하려고 한다.
우리는 이 장에서 msg_srv_action_interface_example
패키지를 만들고 이 인터페이스 전용 패키지에는 다음과 같은 msg 인터페이스, srv 인터페이스, action 인터페이스를 포함시킬 것이다.
- ArithmeticArgument.msg
- ArithmeticOperator.srv
- ArithmeticChecker.action
워크스페이스의 src 폴더로 이동한 후 ros2 pkg create
명령어를 사용해 msg_srv_action_interface_example
패키지를 만든다. 그 뒤에 다음과 같이 인터페이스 파일을 담을 msg, srv, action
폴더를 생성한다.
$ cd ~/robot_ws/src
$ ros2 pkg create --build-type ament_cmake msg_srv_action_interface_example
$ cd msg_srv_action_interface_example
$ mkdir msg srv action
그리고 인터페이스 파일을 ArithmeticArgument.msg
, ArithmeticOperator.srv
, ArithmeticChecker.action
이라는 이름으로 신규로 작성하여 각각 msg, srv, action 폴더에 파일을 만들어 넣어주자.
├── action
│ └── ArithmeticChecker.action
├── msg
│ └── ArithmeticArgument.msg
└── srv
└── ArithmeticOperator.srv
# Messages
builtin_interfaces/Time stamp
float32 argument_a
float32 argument_b
# Constants
int8 PLUS = 1
int8 MINUS = 2
int8 MULTIPLY = 3
int8 DIVISION = 4
# Request
int8 arithmetic_operator
---
# Response
float32 arithmetic_result
# Goal
float32 goal_sum
---
# Result
string[] all_formula
float32 total_sum
---
# Feedback
string[] formula
msg_srv_action_interface_example
패키지의 설정 파일(package.xml)은 다음과 같이 작성한다.
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>msg_srv_action_interface_example</name>
<version>0.2.0</version>
<description>
ROS 2 example for message, service and action interface
</description>
<maintainer email="passionvirus@gmail.com">Pyo</maintainer>
<license>Apache 2.0</license>
<author email="passionvirus@gmail.com">Pyo</author>
<author email="routiful@gmail.com">Darby Lim</author>
<buildtool_depend>ament_cmake</buildtool_depend>
<buildtool_depend>rosidl_default_generators</buildtool_depend>
<exec_depend>builtin_interfaces</exec_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
일반적인 패키지와 다른점은 다음과 같이 빌드 시에 DDS에서 사용되는 IDL(Interface Definition Language) 생성과 관련한 rosidl_default_generators
가 사용된다는 점과 실행 시에 builtin_interface
와 rosidl_default_runtime
이 사용된다는 점이다. 그 이외에는 일반적인 패키지의 설정과 동일하다. 인터페이스 전용 패키지를 만들 때에는 필수적인 의존성 패키지이니 기억해두자.
⭐️
<buildtool_depend>rosidl_default_generators</buildtool_depend>
<exec_depend>builtin_interfaces</exec_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
msg_srv_action_interface_example
패키지의 빌드 설정 파일(CMakeLists.txt) 은 다음과 같이 작성한다.
################################################################################
# Set minimum required version of cmake, project name and compile options
################################################################################
cmake_minimum_required(VERSION 3.5)
project(msg_srv_action_interface_example)
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 14)
endif()
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic")
endif()
################################################################################
# Find and load build settings from external packages
################################################################################
find_package(ament_cmake REQUIRED)
find_package(builtin_interfaces REQUIRED)
find_package(rosidl_default_generators REQUIRED)
################################################################################
# Declare ROS messages, services and actions
################################################################################
set(msg_files
"msg/ArithmeticArgument.msg"
)
set(srv_files
"srv/ArithmeticOperator.srv"
)
set(action_files
"action/ArithmeticChecker.action"
)
rosidl_generate_interfaces(${PROJECT_NAME}
${msg_files}
${srv_files}
${action_files}
DEPENDENCIES builtin_interfaces
)
################################################################################
# Macro for ament package
################################################################################
ament_export_dependencies(rosidl_default_runtime)
ament_package()
일반적인 패키지와 다른 점은 아래와 같이 set
명령어로 msg, srv, action 파일을 지정해주고 rosidl_generate_interfaces
에 해당 셋들을 기입해주면 끝이다.
set(msg_files
"msg/ArithmeticArgument.msg"
)
set(srv_files
"srv/ArithmeticOperator.srv"
)
set(action_files
"action/ArithmeticChecker.action"
)
rosidl_generate_interfaces(${PROJECT_NAME}
${msg_files}
${srv_files}
${action_files}
DEPENDENCIES builtin_interfaces
)
$ cd ~/robot_ws
$ colcon build --symlink-install --packages-select msg_srv_action_interface_example
$ source install/setup.bash
빌드 후 문제가 없다면 빌드한 후 빌드에 문제가 없다면 ~/robot_ws/install/msg_srv_action_interface_example
폴더 안에 우리가 작성한 ROS 인터페이스를 사용하기 위한 파일들이 저장되게 된다. 예를 들어 C는 위한 h, C++을 위한 hpp, 파이썬 모듈, IDL 파일들이다. 빌드 후에 참고삼아 해당 폴더의 파일들을 확인해보도록 하자.
예) msg_srv_action_interface_example의 변환된 인터페이스 파일 (.h, hpp, .py, idl)
~/robot_ws/install/msg_srv_action_interface_example
├── include
│ └── msg_srv_action_interface_example
│ ├── action
│ ├── msg
│ └── srv
├── lib
│ └── python3.6
│ └── site-packages
│ └── msg_srv_action_interface_example
│ ├── action
│ ├── msg
│ └── srv
└── share
└── msg_srv_action_interface_example
├── action
├── msg
└── srv
인터페이스 패키지의 작성은 딱히 어렵지 않다. 앞서 설명한 바와 같이 사용할 인터페이스 파일을 신규로 작성하여 지정된 폴더에 넣어주고 패키지 설정 파일(package.xml)과 빌드 설정 파일(CMakeLists.txt)만 작성해주면 된다.
우리가 작성한 인터페이스를 프로그램에서 사용하는 방법에 대해서는 추후에 설명하겠다.