.. Cover Letter

공부#Robotics#자율주행/(ROS2) 기초

(ROS2 기초)3. ROS의 Turtlesim으로 ROS의 인터페이스와 파라미터 이해하기

BrainKimDu 2023. 5. 6. 22:10

참고도서 1. ROS 2로 시작하는 로봇 프로그래밍. 표윤석 .  루비페이퍼 . 2021 
참고도서 2. ROS2 혼자공부하는 로봇SW 직접 만들고 코딩하자 . 민형기 .  잇플 . 2022
참고자료 1. PinkWink(민형기)님의 ROS2 강의자료
참고자료 2. ROS2 humble documeation

ROS2를 복습하는 김에 제대로 다시 한 번 정리하고 넘어가고 싶어서 이 시리즈를 작성합니다. 
이 글은 Turtlebot3 패키지를 제대로 이해하고, 다양한 센서를 부착하면서 활용하는 것을 목표로 합니다.
또한 글이 끝날 때 ROS와 관련된 문제를 하나 만들어서 직접 풀어보도록 합니다.

이번 장에서는 코드 레벨에서 확인하는 것이 아니라, ROS2에서 교육용으로 제공하는 패키지인 Turtlesim을 가지고 노는 것을 목표로 합니다. 


ROS2의 인터페이스

앞에서 보았듯이 ROS2에서 사용되는 메시지 통신 방법으로는 Topic, Service, Action 이 있었습니다. 이외 추가적으로 parameter도 있긴하지만 이는 나중에 알아보도록 합시다. ROS2에서는 이러한 메시지 통신에서 사용하는 데이터 형태를 ROS2 인터페이스라고 합니다. ROS2에서는 IDL(Interface Definition Language)와 Topic의 msg, Service의 srv, 액션의 action interface를 사용하고 있으면서, 정수, 부동소수점, 불리언과 같은 단순 자료형을 기본으로 사용하며, 배열도 사용할 수 있습니다. 

그러면 Turtlesim에 있는 여러 인터페이스들을 뜯어보면서 그 구조를 이해해보는 것도 좋은 공부가 될 것 같습니다.
https://github.com/ros/ros_tutorials/tree/galactic-devel/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

여기서 우리가 사용하고 있는 버전은 humble이기 때문에 왼쪽위에 galactic-devel을 humble-devel로 변경합니다.

여기서 보시겠지만 패키지를 제작할때 보통 msg형식은 msg폴더에 srv는 srv폴더에 모아놓게 됩니다. 그리고 패키지명도 msg만 모은 패키지 형식으로 만듭니다. 그리고 src에는 보통 소스코드들을 집어넣습니다. 뭐 이건 나중에 볼 이야기이니 이쯤하도록 하고

msg폴더를 들어가봅시다. 여기서 pose.msg파일을 살펴보면 이렇게 생겼습니다.

간단하게 C언어 생각하면 됩니다. float32 형식의 x라는 변수 뭐.. 이런 느낌입니다. 그래서 ros에서 사용할 수 있는 기본 자료형은 다음과 같습니다.

bool, byte, char, float32, float64, int8, uint8, int16, uint16, int32, uint32, int64, string, wstring 뭐 이런것들이 있다고 합니다.

다음은 Sapwn.srv의 모습입니다.

위에는 request 그리고 ----을 아래로 response를 나타냅니다. 

다음은 action파일입니다.

action은 다음처럼 구성이 되어 있습니다. 

 

메시지 인터페이스 (message interface, msg)

이전 글에서 우리는 Twist.msg파일을 뜯어본 적이 있습니다.

이 파일은 다음의 폴더에 있습니다.

일단 이 파일이 뭔지 설명부터 하자면 기하학 관련 메시지를 모아놓은 패키지입니다. 근데, 한가지 이상합니다. vector는 ros의 기본 자료형이 아닙니다. 그럼 도대체 vector는 어디서 온 친구인가요?

같은 폴더내에 있는 Vector3라는 메시지 타입을 불러오는 것입니다. 보시는 것처럼 기본자료형으로 구성된것을 볼 수 있습니다. 

이와 같은 과정은 다음처럼 진행해도 손쉽게 볼 수 있습니다.

아니면 이런식으로 내 컴퓨터에 설치된 Ros의 모든 interface를 표시하게 한다거나, package를 표시하게 한다거나, 특정패키지만 본다거나 할 수 있습니다.

ros2 interface list
ros2 interface packages

 

ros2 interface package turtlesim

 

다음의 명령어로 기본형태도 볼 수 있습니다.

ros2 interface proto geometry_msgs/msg/Twist

 

 

서비스 인터페이스 (Service interface, srv)

위에처럼 ---위로는 Request(요청)시에 보내느 데이터 형식이며, Respose(응답)시에 받는 데이터를 뜻합니다.

 

액션 인터페이스 (Action interface, action)

 Theta (맨위)는 액션 목표, delta는 액션 결과, remaining은 액션 피드백에 해당합니다.

 

ROS2의 토픽/서비스/액션 정리 및 비교

다음의 표는 표윤석님의 책 "ROS2로 시작하는 로봇 프로그래밍"의 15장 165페이지의 표를 발췌하였습니다.

  토픽 서비스 액션
연속성 연속성 일회성 복합(토픽 + 서비스)
방향성 단방향 양방향 양방향
동기성 비동기 동기 동기 + 비동기
다자간연결 1:1, 1:N, N:1, N:N 1:1 1:1
노드역할 Publisher, Subscriber Server, Client Server, Client
동작트리거 퍼블리셔 클라이언트 action 인터페이스
인터페이스 msg srv action
CLI명령어 ros2 topic ros2 service ros2 action
사용 예 센서 데이터, 로봇 상태,
로봇 좌표, 로봇 속도 명령 등
LED 제어, 모터 토크 On/Off
IK/FK 계산, 이동 경로 계산 등
목적지로 이동, 물건 파지, 복합 테스크

 

 

ROS2의 파라미터

도큐먼트에서는 파라미터를 노드의 구성값이라고 표현합니다. 노드의 파라미터는 integer, float, string, list로 저장할 수 있습니다.

표윤석님의 책에서는 파라미터를 서비스와 동일한 방법으로 변경한다고 합니다. 즉 외부의 parameter 클라이언트를 이용해서 파라미터를 변경하는 것입니다. 서비스 통신 방법으로 노드 내부 또는 외부에서 노드 내 매개변수를 쉽게 지정하거나 변경할 수 있고, 쉽게 가져와서 사용할 수 있게 하는 점에서 사용목적이 서비스와 다릅니다. 

쉽게 설명하면 각 노드의 파라미터를 변경할 수 있게 뭐 이런 의미로 일단 받아드리고 진행합시다.

ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key

다음처럼 터틀심을 실행합니다.

ros2 param list

다음을 입력하여 파라미터를 조회할 수 있습니다.

두 노드에 대한 파라미터가 조회됩니다. 

여기서 background 파라미터가 

이 화면에서 파란색을 의미합니다. 그래서 /turtlesim background_b 다음의 파라미터가 어떤건지 조회할 수 있습니다.

ros2 param describe /turtlesim background_b

여기서 Min값은 최소값  Max값은 최대값을 의미합니다. Desciption은 이 파라미터에 대한 설명을 나타냅니다. 다음으로는 parameter값을 읽어오는 방법입니다.

ros2 param get /turtlesim background_b

 

그러면 값을 바꾸는 것도 가능합니다.

ros2 param set /turtlesim background_b 100

색이 바뀐 것을 볼 수 있습니다. 이처럼 별도의 코딩이 필요없이 외부에서 파라미터만 수정해도 다른 형태로 상황을 바꿀 수 있습니다.  

ros2 param dump /turtlesim

이를 입력하면 yaml파일을 만들어준다고 하는데, 저는 안되는 것 같습니다. humble이라 안되는건가.