ROS2 개발서적 완독 챌린지 Week4
2023년 4월 부터 12주 동안, 판교오로카 회원님들과 "ROS2로 시작하는 로봇 프로그램"(표윤석, 임태훈 지음) 을 완독하는 챌린지 입니다. 매주 4개의 Chapter 를 읽고 책의 내용을 블로그에 정리합니다.
서적링크
http://www.yes24.com/Product/Goods/102949767
13장 ROS2 액션
지난 11장, 12장에서 토픽과 서비스에 대해서 배웠습니다. 이번 장에서는 액션에 대해서 알아봅니다.
ROS2 액션
액션은 `클라이언트`와 '서버' 노드간의 메시지 전송 방식 입니다. (동기식 양방향 송수신)
1. `클라이언트`는 액션의 목표를 전송 합니다. 서버는 액션 서비스를 처리 합니다.
2. `서버`는 `클라이언트`에게 피드백을 주기적으로 제공합니다.
3. `서버`는 `클라이언트`에게 액션 결과를 제공합니다.
액션이 왜 필요할까요?
로봇 개발 과정에서는 노드 간의 값을 전송하고 서비스를 수행하며, 중간 피드백과 결과값을 받는 등의 기능이 많이 구현됩니다. ROS2 액션은 이러한 기능을 쉽게 구현할 수 있도록 프레임워크의 일환으로 제공됩니다.
관련 코드는 아래 Github 를 참고합니다.
https://github.com/ros/ros_tutorials/tree/humble/turtlesim
ROS2 액션 예제 실행하기
ROS2 튜토리얼에 포함된 turtlesim 을 실행해보면서 액션에 대해서 알아봅니다. turtlesim_node 와 turtle_teleop_key 노드를 실행하여 액션 서버와 클라이언트를 실행합니다.
- turtlesim_node 는 Qt 로 구현된 거북이 화면 입니다. rotate_absolute 액션을 받으면 목표값(theta) 만큼 회전 합니다.
- turtle_teleop_key 노드는 사용자가 누른 키를 읽어서, 목표값(theta) 을 turtlesim_node 을 전송합니다.
- 예를 들어서, 초기 상태에서 T 를 누르면, 목표값 0.785(45°)이 turtlesim_node 에 전송 됩니다.
명령줄에서 액션 목록 확인하기
액션과 관련된 CLI 기반 명령을 알아봅니다. 현재 환경에서 실행 중인 액션의 목록은 action list 명령어를 통해 확인할 수 있습니다.
~$ ros2 action list -t
/turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]
명령줄에서 액션 정보 확인하기
현재 환경에서 action info를 사용하면 액션 이름과 서버, 클라이언트 노드의 이름과 개수를 확인할 수 있습니다.
$ ros2 action info /turtle1/rotate_absolute
Action: /turtle1/rotate_absolute
Action clients: 1
/teleop_turtle
Action servers: 1
/turtlesim
액션 목표 전달
ros2 action send_goal을 사용하여 목표를 전달할 수 있습니다. (theta: -1.5708 은 -90°)
$ ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: -1.5708}" --feedbac
k
Waiting for an action server to become available...
Sending goal:
theta: -1.5708
Goal accepted with ID: 564b5ffe2fb94806a1511ddd225e1c3f
Feedback:
remaining: 2.342829465866089
14장 ROS2 인터페이스
ROS 노드 간의 통신을 위해서는 토픽, 서비스, 액션 등의 인터페이스를 사용합니다. 여기서 인터페이스란 주고 받는 데이터의 형태를 의미합니다.
ROS2 통신 인터페이스
ROS 애플리케이션은 메시지, 서비스 및 액션의 세 가지 형태의 노드 간 통신을 지원합니다. 인터페이스는 IDL (interface definition language) 형식으로 작성할 수 있습니다. 기존 ROS Classic과 같이 msg, srv 등의 포맷을 지원합니다.
ROS2 메시지 명세하는 방법
다음과 같이 ROS 메시지의 필드를 설명하는 간단한 텍스트 파일을 작성합니다.
fieldtype1 fieldname1
fieldtype2 fieldname2
fieldtype3 fieldname3
예를 들어, GPS 측위 데이터는 다음과 같이 작성할 수 있습니다.
float64 latitude
float64 longitude
ros2 github의 Path.msg 예제를 보면, 기존에 정의된 Message 형태를 재사용하여 다음과 같이 정의할 수 있습니다.
# An array of poses that represents a Path for a robot to follow.
# Indicates the frame_id of the path.
std_msgs/Header header
# Array of poses to follow.
geometry_msgs/PoseStamped[] poses
메시지는 경계가 있는 배열의 형태로 정의할 수 있습니다.
int32[] unbounded_integer_array
int32[5] five_integers_array
int32[<=5] up_to_five_integers_array
string string_of_unbounded_size
string<=10 up_to_ten_characters_string
string[<=5] up_to_five_unbounded_strings
string<=10[] unbounded_array_of_string_up_to_ten_characters each
string<=10[<=5] up_to_five_strings_up_to_ten_characters_each
ROS2 메시지 정의 규칙은 다음과 같습니다.
- 영문 소문자와 숫자를 사용할 수 있으며, 알파벳 문자로 시작해야 합니다.
- 밑줄로 끝나면 안 되며, 밑줄이 연속으로 나오면 안 됩니다.
- 초기값을 지정할 수 있습니다. (위도) 예: float64 latitude 37.532600
- 문자열은 ' 또는 " 로 정의해야 합니다.
- 상수는 대문자로 표기하며, 등호 기호 (=)를 사용하여 정의합니다.
ROS2 서비스 인터페이스
ROS 서비스에서 요청과 응답을 분리하여 작성합니다. 예를 들어, 다음은 문자열을 받아서 문자열을 반환하는 서비스의 매우 간단한 예입니다.
string str
---
string str
ROS2 서비스 정의 규칙은 다음과 같습니다.
- -- 를 사용하여 요청과 응답을 분리한다.
- 서비스 내부에 다른 서비스를 포함할 수 없다.
ROS2 액션 인터페이스
아래 액션의 데이터 타입은 "msg"와 "srv"의 변형으로, 액션 인터페이스라고 합니다. 다음 명령어를 사용하여 인터페이스를 확인할 수 있습니다.
$ ros2 interface show turtlesim/action/RotateAbsolute
# The desired heading in radians
float32 theta
---
# The angular displacement in radians to the starting position
float32 delta
---
# The remaining rotation in radians
float32 remaining
15장 ROS2 토픽, 서비스, 액션 정리 및 비교
토픽, 서비스, 액션은 ROS의 중요한 컨셉입니다. 이 세 가지 요소는 ROS 프로그래밍에서 매우 중요합니다. 연속성, 방향성, 동기성, 다자간 연결, 노드 역할, 동작 트리거, 인터페이스를 각각 토픽, 서비스, 액션의 특징으로 볼 수 있습니다. 자세한 내용은 책에 있는 비교표를 참고 합니다.
16장 ROS2 파라미터
ROS2 파라미터는 외부에서 메시지를 통해 노드의 특정 값을 읽거나 변경하는 서비스의 구현체 입니다.
파라미터 목록 확인 방법
현재 환경의 노드와 파라미터를 확인하려면, ros2 param list 명령을 사용하면 됩니다.
$ ros2 param list
/teleop_turtle:
qos_overrides./parameter_events.publisher.depth
qos_overrides./parameter_events.publisher.durability
qos_overrides./parameter_events.publisher.history
qos_overrides./parameter_events.publisher.reliability
scale_angular
scale_linear
use_sim_time
/turtlesim:
background_b
background_g
background_r
qos_overrides./parameter_events.publisher.depth
qos_overrides./parameter_events.publisher.durability
qos_overrides./parameter_events.publisher.history
qos_overrides./parameter_events.publisher.reliability
use_sim_time
파라미터 내용 확인
ros2 param describe 명령어를 사용하면 파라미터의 내용을 확인할 수 있습니다.
$ ros2 param describe /turtlesim background_b
Parameter name: background_b
Type: integer
Description: Blue channel of the background color
Constraints:
Min value: 0
Max value: 255
Step: 1
파라미터 내용 읽기
$ ros2 param get /turtlesim background_r
Integer value is: 69
파라미터 내용 쓰기
$ ros2 param set /turtlesim background_r 255
Set parameter successful
파라미터 덤프
$ ros2 param dump /turtlesim
/turtlesim:
ros__parameters:
background_b: 255
background_g: 86
background_r: 255
qos_overrides:
/parameter_events:
publisher:
depth: 1000
durability: volatile
history: keep_last
reliability: reliable
use_sim_time: false
'로보틱스' 카테고리의 다른 글
ROS2 완독 챌린지 Week8 (2부 Ch.5~11) (0) | 2023.06.10 |
---|---|
ROS2 완독 챌린지 Week7 (2부 Ch.01~04) (1) | 2023.06.03 |
ROS2 완독 챌린지 Week6 (Ch.21~24) (0) | 2023.05.28 |