왕다방

인공지능 & 로봇 사용자들의 자유게시판입니다. 인공지능, 가정용로봇, 서비스로봇, 인공지능스피커 등 자유롭게 올려주세요. 질문과답변도 이곳에 올려주세요.

제목ROS2 : 노드와 패키지 / 토픽2021-11-28 05:58
작성자user icon Level 4

88x31.png


1. 노드(Node)와 패키지(Package)


노드(Node)실행가능한 최소한의 프로세서 단위입니다. ROS는 노드 단위로 프로그램을 작성하며 노드사이에 메시지를 주고 받으면서 통신합니다. 예를 들어 지난번 글에서는 구독 노드와 발행 노드 2개의 노드를 실행켜서 토픽 메시지를 주고 받는 것을 확인했습니다.

mb-file.php?path=2021%2F11%2F11%2FF4226_8.png

타원형으로 표시 된 것이 노드이고 사각형으로 표시된 것이 토픽입니다.


하나 이상의 노드가 기능적 단위로 묶인 것을 패키지(Package)라고 합니다.

패키지 목록을 확인하려면 다음 명령어를 입력하면 됩니다.

  $ ros2 pkg list


데스크탑 버전으로 설치하여 이미 많은 패키지가 설치되어 있는 것을 확인할 수 있습니다.

mb-file.php?path=2021%2F11%2F28%2FF4261_1.png
 

패키지에 포함된 노드를 확인하려면 다음 명령어를 입력하면 됩니다.

turtlesim 이라는 튜토리얼 패키지에 포함된 노드를 확인해보겠습니다.

  $ ros2 pkg executables turtlesim

mb-file.php?path=2021%2F11%2F28%2FF4262_2.png
 

4개의 노드가 포함된 패키지라는 것을 확인할 수 있습니다.

이제 노드를 실행시켜 보겠습니다.

노드를 실행하려면 다음과 같이 명령어를 입력합니다.

  $ ros2 run [패키지 이름] [노드 이름]


여기서는 가장 널리 이용되는 turtle_teleop_key 노드와 turtlesim_node 노드를 실행시켜 보겠습니다.


turtle_teleop_key 노드는 키보드를 통해 속도값을 발행(publish)하는 노드입니다.

turtlesim_node 노드는 속도값을 구독(subscribe)하여 거북이를 움직이게 하는 2D 시뮬레이터 노드입니다.


 ​ $ ros2 run turtlesim turtlesim_node

mb-file.php?path=2021%2F11%2F28%2FF4263_3.png
turtlesim_node 노드만으로는 거북이가 움직이 않습니다.


  $ ros2 run turtlesim turtle_teleop_key

mb-file.php?path=2021%2F11%2F28%2FF4264_4.png

turtle_teleop_key 노드를 실행한 터미널에서 키보드를 눌러보세요!


mb-file.php?path=2021%2F11%2F28%2FF4265_5.png
mb-file.php?path=2021%2F11%2F28%2FF4266_6.gif
 

현재 실행중인 노드를 확인하기 위해서는 다음 명령어를 입력합니다.

  $ ros2 node list

mb-file.php?path=2021%2F11%2F28%2FF4271_11.png 


노드 정보를 확인하기 위해서는 다음과 같은 명령어를 입력합니다.

  $ ros2 node info [노드 이름]

mb-file.php?path=2021%2F11%2F28%2FF4272_12.png
 


2. 토픽(TOPIC)


위에 거북이는 단순히 키보드의 입력을 전달받아 움직이는 것이 아닙니다.

turtle_teleop_key 노드에서 키보드의 입력값을 인식하여 속도값을 가지는 메시지를 토픽으로 발행하고

turtlesim_node 노드에서 속도값을 가지는 메시지 토픽을 구독하면서 움직이는 것입니다.


토픽(topic)은 노드 사이에 통신을 하는 방법 중 하나입니다. 즉, 통신채널입니다.

메시지(message)는 노드사이에 정보를 주고 받을때 사용하는 데이터의 포맷형식입니다. 

토픽은 msg 형태의 메시지를 사용합니다.


발행자(publisher)가 msg 형태의 메시지를 토픽을 통해 발행(publish)하고  토픽을 구독(subscribe)하고 있는 구독자(subscriber)가 메시지를 받으면서 통신할 수 있습니다.


mb-file.php?path=2021%2F11%2F28%2FF4273_12.gif


하나의 토픽에 여러 노드가 연결할 수 있으므로 n:n 통신이 가능합니다.
mb-file.php?path=2021%2F11%2F28%2FF4274_13.gif
출처: https://docs.ros.org/en/foxy/Tutorials/Topics/Understanding-ROS2-Topics.html


토픽에 대한 정보를 확인하기 위해 다음 명령어를 입력해봅시다.

  $ ros2 topic -h

mb-file.php?path=2021%2F11%2F28%2FF4267_7.png
 

우선 list로 현재 사용가능한 토픽 리스트를 확인하겠습니다.

  $ ros2 topic list

mb-file.php?path=2021%2F11%2F28%2FF4268_8.png
 

-t 옵션을 주면 메시지 타입도 확인가능합니다.

  $ ros2 topic list -t

mb-file.php?path=2021%2F11%2F28%2FF4269_9.png


옵션없이 다음과 같은 명령어로도 메시지 타입을 확인할 수 있습니다.

  $ ros2 topic type [토픽 이름]

mb-file.php?path=2021%2F11%2F28%2FF4270_10.png
 

/turtle1/cmd_vel 토픽은 geometry_msgs/msg/Twist 타입의 메시지를 사용합니다.

geometry_msgs/msg/Twist 타입은 ROS에서 제공하는 표준 메시지 타입입니다.


메시지 타입에 대한 세부사항을 확인하기 위해 다음 명령어를 입력합니다.

  $ ros2 interface show [메시지 타입]

mb-file.php?path=2021%2F11%2F28%2FF4275_13.png
geometry_msgs/msg/Twist 메시지는 선형속도와 각속도의 정보를 가지고 있다는 것을 확인할 수 있습니다.


발행되고 있는 메시지를 실시간으로 확인하기위해서 다음과 같은 명령어를 입력하세요.

  $ ros2 topic echo [토픽 이름]


이제 turtle_teleop_key 노드에서 키보드를 누르면 발행되는 메시지를 실시간으로 모니터링 할 수 있습니다.

아래 사진은 위(↑) 키보드를 한번 눌렀을때 발행되는 메시지 입니다. 

mb-file.php?path=2021%2F11%2F28%2FF4276_14.png

x축 방향으로 2만큼 전진하라는 명령을 한 것입니다.


다음 명령어를 입력하면 노드와 토픽의 관계를 그림으로 확인할 수 있습니다.

  $ rqt_graph 


mb-file.php?path=2021%2F11%2F28%2FF4277_15.png
 

메시지를 직접 발행할 수도 있습니다.

  $ ros2 topic pub [토픽 이름] [메시지 타입] "전달할 인수"

--once 옵션을 넣으면 메시지를 한번만 발행합니다.

  $ ros2 topic pub -once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"


mb-file.php?path=2021%2F11%2F28%2FF4278_16.gif


--rate 옵션을 넣으면 주기로 메시지를 발행합니다.

  $ ros2 topic pub -rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"


mb-file.php?path=2021%2F11%2F28%2FF4279_17.gif
 

#ROS2# Robot Operating System# 노드# 패키지# 토픽# 메시지
댓글
자동등록방지
(자동등록방지 숫자를 입력해 주세요)