1. 노드(Node)와 패키지(Package)
노드(Node)는 실행가능한 최소한의 프로세서 단위입니다. ROS는 노드 단위로 프로그램을 작성하며 노드사이에 메시지를 주고 받으면서 통신합니다. 예를 들어 지난번 글에서는 구독 노드와 발행 노드 2개의 노드를 실행켜서 토픽 메시지를 주고 받는 것을 확인했습니다. 타원형으로 표시 된 것이 노드이고 사각형으로 표시된 것이 토픽입니다.
하나 이상의 노드가 기능적 단위로 묶인 것을 패키지(Package)라고 합니다. 패키지 목록을 확인하려면 다음 명령어를 입력하면 됩니다.
데스크탑 버전으로 설치하여 이미 많은 패키지가 설치되어 있는 것을 확인할 수 있습니다.
패키지에 포함된 노드를 확인하려면 다음 명령어를 입력하면 됩니다. turtlesim 이라는 튜토리얼 패키지에 포함된 노드를 확인해보겠습니다.
$ ros2 pkg executables turtlesim |
4개의 노드가 포함된 패키지라는 것을 확인할 수 있습니다. 이제 노드를 실행시켜 보겠습니다. 노드를 실행하려면 다음과 같이 명령어를 입력합니다.
$ ros2 run [패키지 이름] [노드 이름] |
여기서는 가장 널리 이용되는 turtle_teleop_key 노드와 turtlesim_node 노드를 실행시켜 보겠습니다.
turtle_teleop_key 노드는 키보드를 통해 속도값을 발행(publish)하는 노드입니다. turtlesim_node 노드는 속도값을 구독(subscribe)하여 거북이를 움직이게 하는 2D 시뮬레이터 노드입니다.
$ ros2 run turtlesim turtlesim_node |
turtlesim_node 노드만으로는 거북이가 움직이 않습니다.
$ ros2 run turtlesim turtle_teleop_key |
turtle_teleop_key 노드를 실행한 터미널에서 키보드를 눌러보세요!
현재 실행중인 노드를 확인하기 위해서는 다음 명령어를 입력합니다.
노드 정보를 확인하기 위해서는 다음과 같은 명령어를 입력합니다.
$ ros2 node info [노드 이름] |
2. 토픽(TOPIC)
위에 거북이는 단순히 키보드의 입력을 전달받아 움직이는 것이 아닙니다. turtle_teleop_key 노드에서 키보드의 입력값을 인식하여 속도값을 가지는 메시지를 토픽으로 발행하고 turtlesim_node 노드에서 속도값을 가지는 메시지 토픽을 구독하면서 움직이는 것입니다.
토픽(topic)은 노드 사이에 통신을 하는 방법 중 하나입니다. 즉, 통신채널입니다. 메시지(message)는 노드사이에 정보를 주고 받을때 사용하는 데이터의 포맷형식입니다. 토픽은 msg 형태의 메시지를 사용합니다.
발행자(publisher)가 msg 형태의 메시지를 토픽을 통해 발행(publish)하고 토픽을 구독(subscribe)하고 있는 구독자(subscriber)가 메시지를 받으면서 통신할 수 있습니다.
하나의 토픽에 여러 노드가 연결할 수 있으므로 n:n 통신이 가능합니다.
출처: https://docs.ros.org/en/foxy/Tutorials/Topics/Understanding-ROS2-Topics.html
토픽에 대한 정보를 확인하기 위해 다음 명령어를 입력해봅시다.
우선 list로 현재 사용가능한 토픽 리스트를 확인하겠습니다.
-t 옵션을 주면 메시지 타입도 확인가능합니다.
옵션없이 다음과 같은 명령어로도 메시지 타입을 확인할 수 있습니다.
$ ros2 topic type [토픽 이름] |
/turtle1/cmd_vel 토픽은 geometry_msgs/msg/Twist 타입의 메시지를 사용합니다. geometry_msgs/msg/Twist 타입은 ROS에서 제공하는 표준 메시지 타입입니다.
메시지 타입에 대한 세부사항을 확인하기 위해 다음 명령어를 입력합니다.
$ ros2 interface show [메시지 타입] |
geometry_msgs/msg/Twist 메시지는 선형속도와 각속도의 정보를 가지고 있다는 것을 확인할 수 있습니다.
발행되고 있는 메시지를 실시간으로 확인하기위해서 다음과 같은 명령어를 입력하세요.
$ ros2 topic echo [토픽 이름] |
이제 turtle_teleop_key 노드에서 키보드를 누르면 발행되는 메시지를 실시간으로 모니터링 할 수 있습니다. 아래 사진은 위(↑) 키보드를 한번 눌렀을때 발행되는 메시지 입니다. x축 방향으로 2만큼 전진하라는 명령을 한 것입니다.
다음 명령어를 입력하면 노드와 토픽의 관계를 그림으로 확인할 수 있습니다.
메시지를 직접 발행할 수도 있습니다.
$ 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}}" |
--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}}" |
|