본문 바로가기

로보틱스

ROS2 완독 챌린지 Week4 (Ch.13~16)

ROS2 개발서적 완독 챌린지 Week4

2023년 4월 부터 12주 동안, 판교오로카 회원님들과 "ROS2로 시작하는 로봇 프로그램"(표윤석, 임태훈 지음) 을 완독하는 챌린지 입니다. 매주 4개의 Chapter 를 읽고 책의 내용을 블로그에 정리합니다.

서적링크

http://www.yes24.com/Product/Goods/102949767

 

ROS 2로 시작하는 로봇 프로그래밍 - YES24

이 책은 ROS 공식 플랫폼인 TurtleBot3의 개발자이자 10여 년간 ROS 기반 프로젝트를 진행한 로보틱스 엔지니어인 필자들이 실무에서 얻은 경험과 커뮤니티 활동을 바탕으로 작성한 ROS 로봇 프로그래

www.yes24.com


13장 ROS2 액션

지난 11장, 12장에서 토픽과 서비스에 대해서 배웠습니다. 이번 장에서는 액션에 대해서 알아봅니다.

ROS2 액션

액션은 `클라이언트`와 '서버' 노드간의 메시지 전송 방식 입니다. (동기식 양방향 송수신)

1. `클라이언트`는 액션의 목표를 전송 합니다. 서버는 액션 서비스를 처리 합니다.

2. `서버`는 `클라이언트`에게 피드백을 주기적으로 제공합니다.

3. `서버`는 `클라이언트`에게 액션 결과를 제공합니다.

액션이 왜 필요할까요?

로봇 개발 과정에서는 노드 간의 값을 전송하고 서비스를 수행하며, 중간 피드백과 결과값을 받는 등의 기능이 많이 구현됩니다. ROS2 액션은 이러한 기능을 쉽게 구현할 수 있도록 프레임워크의 일환으로 제공됩니다.

관련 코드는 아래 Github 를 참고합니다.

https://github.com/ros/ros_tutorials/tree/humble/turtlesim

 

GitHub - ros/ros_tutorials: Code used in tutorials found on ROS wiki

Code used in tutorials found on ROS wiki. Contribute to ros/ros_tutorials development by creating an account on GitHub.

github.com

ROS2 액션 예제 실행하기

ROS2 튜토리얼에 포함된 turtlesim 을 실행해보면서 액션에 대해서 알아봅니다. turtlesim_node 와 turtle_teleop_key 노드를 실행하여 액션 서버와 클라이언트를 실행합니다.

  1. turtlesim_node 는 Qt 로 구현된 거북이 화면 입니다. rotate_absolute 액션을 받으면 목표값(theta) 만큼 회전 합니다.
  2. turtle_teleop_key 노드는 사용자가 누른 키를 읽어서, 목표값(theta) 을 turtlesim_node 을 전송합니다.
  3. 예를 들어서, 초기 상태에서 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