[ROS2] 인터페이스(Interface)
인터페이스(Interface) 란?
인터페이스는 노드 간의 데이터 통신을 위한 규약을 정의한다. 이러한 인터페이스는 메시지(Message), 서비스(Service), 및 액션(Action)의 세 가지 주요 형태로 나뉜다.
ROS2 프로그래밍은 메시지 통신을 위해 정수, 부동 소수점, 불린과 같은 기본 변수 타입들이 담긴 std_msgs 인터페이스나 병진 속도와 회전 속도를 표현할 수 있는 geometry_msgs의 Twist.msg 인터페이스, 레지저 스캐닝 값을 담을 수 있는 sensor_msgs의 LaserScan.msg 인터페이스 같이 지정된 인터페이스를 사용하는 것이 일반적이다.
하지만 이러한 인터페이스들은 사용자가 원하는 모든 정보를 담을 수 없고 토픽 인터페이스 이외에 서비스나 액션 인터페이스는 매우 기본적인 인터페이스만 제공하기 때문에 사용자가 필요로 하는 형태가 아니면 새로 만들어야 한다.
1. 설정 파일
1.1. 패키지 설정 파일(package.xml)
일반적인 패키지와 다른 점은 다음과 같다.
<buildtool_depend>rosidl_default_generators</buildtool_depend>
<exec_depend>builtin_interfaces</exec_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
- 빌드 시에 DDS에서 가용되는 IDL(Interface Definition Language) 생성과 관련한 rosidl_default_generators가 사용됨
- 실행 시에 builtin_interfaces와 rosidl_default_runtime이 사용됨
그 이외에는 일반적인 패키지의 설정과 동일하다.
1.2. 빌드 설정 파일(CMakeLists.txt)
일반적인 패키지와 다르게 CMake의 set 명령어로 msg, srv, action 파일을 지정하고 rosidl_generate_interfaces에 해당 set들을 기입하면 된다.
################################################################################
# Find and load build settings from external packages
################################################################################
find_package(builtin_interfaces REQUIRED)
find_package(rosidl_default_generators REQUIRED)
################################################################################
# Declare ROS messages, services and actions
################################################################################
set(msg_files
"msg/<msg 파일>"
)
set(srv_files
"srv/<srv 파일>"
)
set(action_files
"action/<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()
2. 인터페이스(Interface) 파일
2.1. 메시지(Messages)
ROS 2에서 메시지 인터페이스(msg)는 노드 간에 주고받을 수 있는 데이터의 구조를 정의한다. 메시지는 기본적으로 데이터 타입의 집합으로, 각각의 필드에 대한 이름과 타입을 포함한다. 이러한 메시지를 통해 노드들은 정보(예: 센서 데이터, 상태 정보, 명령 등)를 교환할 수 있다.
메시지 정의
- 메시지는 .msg 파일에 정의된다.
- 파일 내 각 줄은 메시지의 한 필드를 정의하며, 타입과 필드 이름으로 구성된다.
- 기본 데이터 타입(int8, uint32, float64 등), 문자열(string), 시간(stamp), 배열([]), 그리고 다른 메시지 타입을 포함할 수 있다.
예를 들어, 로봇의 위치를 나타내는 간단한 메시지는 다음과 같이 정의될 수 있다:
float64 x
float64 y
float64 z
이 경우, x, y, z는 로봇의 3차원 공간 내 위치를 나타내는 데 사용되는 실수형 필드이다.
메시지 사용
메시지는 주로 ROS 2 토픽을 통해 노드 간에 비동기적으로 공유된다. 하나의 노드가 메시지를 퍼블리시하면, 이 메시지를 구독하는 다른 노드들이 그 메시지를 받아 처리할 수 있다.
예를 들어, 센서 노드가 센서 데이터를 메시지 형태로 퍼블리시할 수 있으며, 이 데이터를 사용하는 다른 노드(예: 데이터 처리 노드, 로그 기록 노드 등)가 그 메시지를 구독하여 필요한 작업을 수행할 수 있다.
예시(geometry_msg 패키지)
/turtle1/cmd_vel 토픽은 geometry_msgs/msgs/Twist 형태이다. 기하학 관련 메시지를 모아둔 geometry_msgs 패키지의 msgs 분류의 Twist 데이터 형태라는 것이다.
Twist 데이터 형태를 자세히 보면 Vector3 linear과 Vector3 angular 2가지로 이루어져 있다. 이는 메시지 안에 메시지를 품고 있는 것으로 Vector3 형태에 linear 이라는 이름의 메시지와 Vector3 형태에 angular 이라는 이름의 메시지, 즉 2개의 메시지가 있다는 것이며 Vector3는 다시 float64 형태에 x, y, z 값이 존재한다.
즉, geometry_msgs/msgs/Twist 메시지 형태는 float64 자료형의 linear.x, linear.y, linear.z, angular.x, angular.y, angular.z 라는 이름의 메시지입니다. 따라서 병진속도 3가지, 회전속도 3가지를 표현하게 된다.
$ ros2 interface show geometry_msgs/msg/Twist
# This expresses velocity in free space broken into its linear and angular parts.
Vector3 linear
Vector3 angular
$ ros2 interface show geometry_msgs/msg/Vector3
# This represents a vector in free space.
# This is semantically different than a point.
# A vector is always anchored at the origin.
# When a transform is applied to a vector, only the rotational component is applied.
float64 x
float64 y
float64 z
2.2. 서비스(Service)
ROS 2에서 서비스 인터페이스(srv)는 요청/응답 패턴을 기반으로 하는 노드 간 통신을 위해 사용된다. 서비스는 클라이언트-서버 모델을 사용하여, 한 노드(클라이언트)가 다른 노드(서버)에게 특정 작업을 요청하고, 서버 노드는 그 요청을 처리한 뒤 결과를 클라이언트에게 응답한다.
서비스 정의
- 서비스는 ‘.srv’ 파일에 정의된다.
- ‘.srv’ 파일은 두 부분으로 나뉘어 있다: 요청(request) 부분과 응답(response) 부분, 이 두 부분은 ‘—’ 라인으로 구분된다.
- 각 부분은 메시지 정의와 유사하게, 필드의 타입과 이름을 포함한다.
예를 들어, 두 정수를 받아 그 합을 반환하는 서비스는 다음과 같이 정의될 수 있다:
int64 a
int64 b
---
int64 sum
이 경우, ‘a’와 ‘b’는 요청 부분에 정의된 필드이며, ‘sum’은 응답 부분에 정의된 필드이다.
서비스 사용
서비스를 사용하기 위해, 서버 노드는 특정 서비스 타입에 대한 서비스 서버를 생성하고, 클라이언트 노드는 해당 서비스 타입에 맞는 서비스 클라이언트를 생성한다. 클라이언트가 서비스 요청을 보내면, 서버는 그 요청을 받아 처리한 후 응답을 보낸다.
서비스는 특히 로봇 암의 위치 설정, 센서의 측정값 요청 등과 같이, 어떤 작업을 수행하고 그 결과를 받아야 할 때 유용하게 사용된다.
2.3. 액션(action)
ROS 2에서 액션 인터페이스(action interface)는 비동기적인 명령을 실행하면서 피드백을 제공받을 수 있는 통신 메커니즘을 제공한다. 액션은 서비스와 유사하지만, 명령이 수행되는 동안 연속적인 피드백을 제공받을 수 있다는 점에서 차이가 있다. 이는 오래 걸리는 작업을 처리할 때 유용하며, 클라이언트는 작업의 진행 상황을 모니터링하거나 필요한 경우 작업을 취소할 수 있다.
액션 정의
- 액션은
'.action'
파일에 정의된다. '.action'
파일은 세 부분으로 나뉘어 있다:'목표(goal)'
,'피드백(feedback)'
,'결과(result)'
.- 각 부분은 메시지와 유사하게 필드의 타입과 이름을 포함한다.
- 이 세 부분은 각각 액션을 시작하기 위한
'입력(목표)'
, 액션이 수행되는 동안 주기적으로 받는'업데이트(피드백)'
, 그리고 액션 완료 후의'최종 결과(결과)'
에 해당한다.
액션 사용
액션을 사용하기 위해 서버는 특정 액션 타입에 대해 액션 서버를 생성하고, 클라이언트는 액션 클라이언트를 생성한다. 클라이언트는 목표 메시지를 서버에게 보내 액션을 시작하고, 서버는 작업 수행 도중 피드백 메시지를 클라이언트에게 주기적으로 보낸다. 작업이 완료되면, 서버는 결과 메시지를 클라이언트에게 보내 액션의 완료를 알린다.
3. 인터페이스 관련 명령어
$ ros2 interface show
특정 메시지/서비스/액션 타입의 구조를 보여준다.
사용법: ros2 interface show <interface_type>
예: ros2 interface show std_msgs/msg/String
$ ros2 interface list
시스템에 설치된 모든 인터페이스 타입을 나열한다.
사용법: ros2 interface list
이 명령어는 메시지, 서비스, 액션 인터페이스 타입을 포함한 모든 타입을 나열한다.
$ ros2 interface proto
주어진 인터페이스 타입의 예제 또는 프로토타입 메시지를 생성한다.
사용법: ros2 interface proto <interface_type>
예: ros2 interface proto std_msgs/msg/String
이 명령어는 메시지 타입을 기반으로 기본값을 가진 예제 메시지를 생성한다.
$ ros2 interface package
특정 ROS 패키지에 포함된 모든 인터페이스 타입을 나열한다.
사용법: ros2 interface package <package_name>
예: ros2 interface package std_msgs
이 명령어는 지정된 패키지 내의 모든 메시지, 서비스, 액션 타입을 나열한다.
$ ros2 interface packages
메시지, 서비스, 액션 인터페이스를 제공하는 모든 ROS 패키지를 나열한다.
사용법: ros2 interface packages
References
-
[ROS 2로 시작하는 로봇 프로그래밍 표윤석](“https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwitt6_ryruEAxUCZvUHHV5oA4oQFnoECBEQAQ&url=https%3A%2F%2Fproduct.kyobobook.co.kr%2Fdetail%2FS000001891112&usg=AOvVaw14QJXxcjs_wribUachvF8x&opi=89978449”) - 016 ROS 2 인터페이스 (interface)