**Autonomous driving tech./*ROS2

[ROS2] Concept of the Node, Topic, Service( client, server )

2wnswoo 2024. 12. 24. 17:00

Qt Creator

Qt Creator는 Qt 프레임워크를 기반으로 한 크로스 플랫폼 개발 환경(IDE)입니다. 주로 C++로 애플리케이션을 개발하는 데 사용되며, 다음과 같은 주요 기능을 제공합니다:

 

--

환경변수 일치

ROS 2에서는 UDP 멀티캐스트로 통신이 이루어지기 때문에 별도의 설정을 하지 않으면 동일 네트워크상에 있는 모든 노드가 연결되게 된다. 예를들어 같은 연구실에서 동일 네트워크를 사용한다면 다른 연구원들이 사용하는 노드의 데이터에 접근이 가능하게 된다. 이를 방지하려면 서로 다른 네트워크를 이용하거나 ROS namespace를 추가하여 사용하면 되는데 DDS_DOMAIN_ID라 하며 환경변수로 설정하게 되어 있다.

환경변수를 0으로 일치 시킨 후 실행 모습

export DISPLAY=:0

--

TurtleBot

ROS의 공식 모바일 로봇 플랫폼 TurtleBot 시리즈

 

거북이( turtle )을 많이 사용하는데는, 거북이라는 친숙한 동물을 통해 ROS를 처음 다루는 사람들도 쉽게 배울 수 있게 하자는 의미가 있다. 

--

노드( Node ) , 하나의 최소 단위 실행 가능 프로그램

ROS 에서는 프로그램의 재사용성을 극대화하기 위해 최소 단위의 실행 가능한 프로세스라고 정의하는 노드( Node ) 단위로 프로그램을 작성하게 된다. 이는 하나의 실행 가능한 프로그램으로 생각하면 된다. 그리고 하나 이상의 노드 또는 노드 실행을 위한 정보 등을 묶어 놓은 것을 패키지( Package )라고 하며, 패키지의 묶음을 메타패키지( Metapackage )라 부른다.

 

노드( Node )는 최소 단위의 실행 가능한 프로세스를 가리키는 용어이다. ROS에서는 보통 최소한의 실행 단위로 프로그램을 나누어 작업하게 된다.

 

예를 들어 노드는 원본 영상을 출력하는 카메라 드라이버, 원본 영상에 필터링 하는 필터 노드, 필터링된 영상에서 특징점을 추출하는 노드, 특징점을 이용해 물건을 검출하는 노드,  검출된 물건의 위치로 로봇의 경로를 만들어 내는 노드, 모터 드라이버 노드, 경로대로 이동하는 노드 등 각 노드의 역할을 목적에 맞추어 세분화시켜 각 노드들 간의 의존성은 줄이고 독립성을 높여 다른 목적의 작업에서도 일부 노드를 재사용할 수 있도록 한다.

 

이처럼 수많은 노드들이 연동되는 ROS 시스템을 위해서는 노드와 노드 사이에 입출력 데이터를 서로 주고받을 수 있도록 설계해야만 한다. 여기서 주고받는 데이터를 ROS에서는 메시지( Message )라고 하고 주고받는 방식을 메시지 통신( Message Communication )이라고 한다. 여기서 데이터에 해당되는 메시지( Message )는 Integer, Floating point, Boolean, String과 같은 데이터 형태이며 메시지 안에 메시지를 품고 있는 데이터 구조 또는 배열로도 사용할 수 있다. 그리고 메시지를 주고 받는 통신 방법에 따라 토픽( Topic ), 서비스( Service ), 액션( Action ), 파라미터( Parameter )로 나눌 수 있다.

 

--

노드와 노드 간의 메시지 통신을 그래프 형태로 표시하는 툴인 rqt_graph

- 원 : 노드 / 사각형 : 토픽 / 화살표 : 진행 방향

- rqt 그래프는 ROS에서 노드와 토픽 간의 관계를 시각적으로 나타내는 도구

 

패키지 ( Package )

- 하나 이상의 노드, 노드 실행을 위한 정보 등을 묶어 놓은 것

메시지 ( Message )

- 메시지를 통해 노드간의 데이터를 주고받음. 메시지는  integer, floating point, boolean 와 같은 변수형태이다.

토픽 ( Topic )

- ROS 프로그래밍을 할 때 70% 이상이 토픽으로 사용될 정도로 토픽은 메시지 통신 방식 중에 가장 기본이 되며 가장 널리 쓰이는 방법이다.

- 기본 특징으로 비동기성과 연속성을 가지기에 센서 값 전송 및 항시 정보를 주고 받아야 하는 부분에서 주로 사용된다.

 

비동기식 단방향 메시지 송수신 방식으로 일방적으로 메시지를 일방적으로 계속해서 보낼 때 사용한다. 주로 센서 데이터에 많이 사용된다.  메시지를 퍼블리시하는 퍼블리셔( Publisher )와 메시지를 서브스크라이브하는 서브스크라이버( Subscriber ) 간의 통신이다. 이는 1:1 통신을 기본으로 하지만 복수의 노드에서 하나의 토픽을 송수신하는 1:N도 가능하고 그 구성 방식에 따라 N:1, N:N 통신도 가능하다. 이는 ROS 메시지 통신에서 가장 널리 사용되는 통신 방법이다.

 

 

--

rosbag, 저장된 토픽을 다시 불러와 재생하는 기능

ROS 2에서는 퍼블리시되는 토픽을 파일 형태로 저장하고 필요할 때 저장된 토픽을 다시 불러와 동일한 주기로 재생할 수 있는 기능이 있다. 이를 rosbag이라고 한다. ROS 2 기능 중의 하나로 매우 유용한 기능으로 디버깅에 큰 도움을 준다.

* 디버깅 : 디버깅(Debugging)은 소프트웨어 개발 과정에서 발생하는 오류나 버그를 찾아내고 수정하는 과정을 의미

 

예를 들어 SLAM 알고리즘을 개발한다면 알고리즘 개발에 집중하기 위해서 SLAM에 필요한 센서정보와 로봇의 위치 정보인 오도메트리 정보가 필요하다. 매번 로봇을 구동시켜 데이터를 취득하기도 힘들고 데이터 취득을 하여 테스트를 하더라도 센서 정보 및 로봇 상태 값에 따라 결과 값이 달라져서 알고리즘이 좋아진 것인지 운이 좋게 나온 것인지 구분하기 어렵다. 이럴 때 알고리즘의 입력 값을 고정하고 반복하여 테스트하여 알고리즘 개선 작업 및 성능 검증 테스트가 필요한데, rosbag은 이러한 상황에서 원하는 토픽을 기록하고 재생하는 도구이다.

 

서비스( Service ), 요청을 하고 요청을 받은 일을 처리하는 방식

동기식 양방향 메시지 송수신 방식으로 서비스 요청( Request )을 하는 쪽을 Service Client, 요청받은 서비스를 수행한 후 서비스 응답( Response ) 하는 쪽을 Service Server라고 한다. 결국 서비스는 특정 요청을 하는 클라이언트단과 요청받은 일을 수행한 후에 결과 값을 전달하는 서버 단과의 통신이다. 서비스 요청 및 응답( Request/Response )은 앞에서 언급한 msg 인터페이스의 변형인 srv 인터페이스를 사용한다.

 

- 서비스에는 서비스 서버( Service Server )와 서비스 클라이언트( Service Client )로 나뉜다.

- 서비스 클라이언트( Service Client )는 요청, 수행 하고 응답하는 것은 서비스 서버( Service Server )

 

--

액션( Action )

- 중간 결과( Feedback ) 전달 받음

Kill Service에 의해 거북이가 사라진 모습