토픽(Topic) 이해하기

저작권: 쿼드(QUAD) 드론연구소 https://smartstore.naver.com/maponarooo

개요

ROS 2는 복잡한 시스템을 여러 모듈식 노드로 나눕니다. 주제는 노드가 메시지를 교환하는 버스 역할을 하는 ROS 그래프의 중요한 요소입니다.

https://docs.ros.org/en/foxy/_images/Topic-SinglePublisherandSingleSubscriber.gif

노드는 여러 토픽에 데이터를 게시하고 동시에 여러 토픽에 대한 구독을 가질 수 있습니다.

https://docs.ros.org/en/foxy/_images/Topic-MultiplePublisherandMultipleSubscriber.gif

토픽은 데이터가 노드 간에, 따라서 시스템의 다른 부분 간에 이동되는 주요 방법 중 하나입니다.

실습

1. 설정

새 터미널을 열고 다음을 실행합니다.

ros2 run turtlesim turtlesim_node

다른 터미널을 열고 다음을 실행합니다.

ros2 run turtlesim turtle_teleop_key

turtlesim_node와 turtle_teleop_key 두개의 노드를 실행 했습니다.

2. rqt_graph

rqt_graph는 이 튜토리얼 전체에서 변화하는 노드와 주제, 그리고 이들 사이의 연결을 시각화하는 데 사용할 것입니다 .

rqt_graph를 실행하려면 새 터미널을 열고 다음 명령을 입력하십시오.

rqt_graph

rqt를 실행하고 Plugins > Introspection > Node Graph 를 선택하여 rqt_graph를 열 수도 있습니다 .

위의 노드와 주제, 그래프 주변의 두 가지 작업이 표시되어야 합니다(지금은 무시하겠습니다). 중앙의 주제에 마우스를 올리면 위 이미지와 같이 색상이 강조되는 것을 볼 수 있습니다.

그래프는 /turtlesim노드와 /teleop_turtle노드가 토픽을 통해 서로 통신하는 방법을 보여줍니다. 노드 /teleop_turtle는 토픽에데이터(거북이를 움직이기 위해 입력하는 키 입력)를 게시하고 /turtle1/cmd_vel있으며 /turtlesim노드는 데이터를 수신하기 위해 해당 토픽을 구독합니다.

rqt_graph의 강조 표시 기능은 다양한 방식으로 연결된 많은 노드와 항목이 있는 보다 복잡한 시스템을 검사할 때 매우 유용합니다.

rqt_graph는 그래픽 검사 도구입니다. 이제 주제를 조사하기 위한 몇 가지 명령줄 도구를 살펴보겠습니다.

3. ros2 topic list

새 터미널에서 명령을 실행하면 시스템에서 현재 활성화된 모든 토픽 목록이 반환됩니다.

/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

ros2 topic list -t

이번에는 괄호 안에 추가된 주제 유형과 함께 동일한 토픽 목록을 반환합니다.

/parameter_events [rcl_interfaces/msg/ParameterEvent]
/rosout [rcl_interfaces/msg/Log]
/turtle1/cmd_vel [geometry_msgs/msg/Twist]
/turtle1/color_sensor [turtlesim/msg/Color]
/turtle1/pose [turtlesim/msg/Pose]

이러한 속성, 특히 유형은 노드가 주제를 이동할 때 동일한 정보에 대해 이야기하고 있음을 아는 방법입니다.

이러한 모든 항목이 rqt_graph에 있는 위치가 궁금하다면 Hide: 아래의 모든 상자를 선택 취소할 수 있습니다.

4. ros2 topic echo

토픽에 게시되는 데이터를 보려면 다음을 사용하세요.

ros2 topic echo <topic_name>

/teleop_turtle/turtlesim/turtle1/cmd_velecho 토픽에 대해 데이터를 게시한다는 것을 알고 있으므로 해당 토픽을 출력해 보겠습니다.

ros2 topic echo /turtle1/cmd_vel

처음에 이 명령은 데이터를 반환하지 않습니다. 무언가를 게시하기를 기다리고 있기 때문입니다 .

실행 중인 터미널로 돌아가서 turtle_teleop_key화살표를 사용하여 거북이를 이동합니다. 동시에 실행 중인 터미널을 보면 모든 움직임에 대해 위치 데이터가 게시되는 것을 볼 수 있습니다.

linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
  ---

이제 rqt_graph로 돌아가 Debug 상자를 선택 해제하십시오.

/_ros2cli_26646 는방금 실행한 echo 명령 으로 생성된 노드입니다. (숫자는 다를 수 있음). 이제 게시자가 cmd_vel 토픽에 대한 데이터를 게시하고 두 명의 구독자가 이를 구독하고 있음을 알 수 있습니다 .

5. ros2 topic info

토픽이 일대일 커뮤니케이션일 필요는 없습니다. 일대다, 다대일 또는 다대다일 수 있습니다.

이것을 보는 또 다른 방법은 다음을 실행하는 것입니다.

ros2 topic info /turtle1/cmd_vel

Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 2

6. ros2 interface show

노드는 메시지를 사용하여 토픽을 통해 데이터를 보냅니다. 게시자와 구독자가 통신하려면 동일한 유형의 메시지를 보내고 받아야 합니다.

ros2 topic list -t 실행 후 앞서 본 cmd_vel토픽 유형은 각 토픽에 어떤 메시지 유형이 사용되는지 알려줍니다. 토픽의 유형은 다음과 같습니다 .

geometry_msgs/msg/Twist

이제 이 ros2 interface show <msg type>유형을 실행하여 세부 정보를 알아볼 수 있습니다. 특히 메시지가 기대하는 데이터 구조.

ros2 interface show geometry_msgs/msg/Twist

위의 메시지 유형에 대해 다음을 생성합니다.

# This expresses velocity in free space broken into its linear and angular parts.

    Vector3  linear
    Vector3  angular

/tutlesim 노드가 linear와 angular 두개의 백터 타입 엘레멘트를 가지고 있음을 보여줍니다. echo 코맨드를 이용하여 실제 전달되는 데이터를 보면 위와 동일함을 볼 수 있습니다.

linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
  ---

7. ros2 topic pub

이제 메시지 구조를 알고 있으므로 다음을 사용하여 명령줄에서 직접 토픽에 데이터를 게시할 수 있습니다.

ros2 topic pub <topic_name> <msg_type> '<args>'

인수 '<args>'는 이전 섹션에서 방금 발견한 구조로 주제에 전달할 실제 데이터입니다.

이 인수는 YAML 구문으로 입력해야 한다는 점에 유의해야 합니다. 다음과 같이 전체 명령을 입력하십시오.

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}}"

--once는 "하나의 메시지를 게시한 다음 종료"를 의미하는 선택적 인수입니다.

터미널에 다음 출력이 표시됩니다.

publisher: beginning loop
publishing #1: geometry_msgs.msg.Twist(linear=geometry_msgs.msg.Vector3(x=2.0, y=0.0, z=0.0), angular=geometry_msgs.msg.Vector3(x=0.0, y=0.0, z=1.8))

그러면 거북이가 다음과 같이 움직이는 것을 볼 수 있습니다.

거북이(및 일반적으로 에뮬레이션하려는 실제 로봇)는 지속적으로 작동하기 위해 꾸준한 명령 스트림이 필요합니다. 따라서 거북이를 계속 움직이게 하려면 다음을 실행할 수 있습니다.

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}}"

기서 차이점은 --once옵션을 제거 하고 --rate 1옵션을 추가하여 명령을 1Hz의 꾸준한 스트림으로 게시하도록 지시한다는 것입니다 .

rqt_graph를 새로 고쳐서 무슨 일이 일어나고 있는지 그래픽으로 볼 수 있습니다. 이제 노드(/_ros2cli_30358)에서수신 중인 /turtle1/cmd_vel 토픽을통해 노드(/_ros2cli_26646, /turtlesim)에 게시하는 것을 볼 수 있습니다 .

마지막으로 echo 명령을 통해 pose 토픽을 rqt_graph를 통해 다시한번 확인해 보겠습니다.

ros2 topic echo /turtle1/pose

/turtlesim 노드가 발행한 pose 토픽을 새로운 노드 /ros2cli1682 가 구독하고 있음을 볼 수 있습니다.

8. ros2 topic hz

이 프로세스에 대한 마지막 검사를 위해 다음을 사용하여 데이터가 게시되는 속도를 볼 수 있습니다.

ros2 topic hz /turtle1/pose

/turtlesim노드가 pose 토픽에 데이터를 게시하는 속도에 대한 데이터를 반환합니다.

average rate: 59.354
  min: 0.005s max: 0.027s std dev: 0.00284s window: 58

ros2 topic pub --rate 1 를 사용하여 turtle1/cmd_vel게시 속도를 일정한 1Hz로 설정했음을 기억하십시오 . 대신에 위의 명령을 실행하면 해당 속도를 반영하는 평균이 표시됩니다.

9. 종료

이 시점에서 많은 노드가 실행 중입니다. Ctrl+C각 터미널에 입력하여 중지하는 것을 잊지 마십시오.

Last updated

Was this helpful?