ROS2 Tutorial (Basic)
  • 교육 안내
  • ROS2 개요
  • ROS2 환경 구성
  • turtlesim, ROS2 rqt
  • 노드(Node) 이해하기
  • 토픽(Topic) 이해하기
  • 서비스(Service) 이해하기
  • 파라메터(Parameter) 이해하기
  • 액션(Action) 이해하기
  • rqt_console 을 이용해 로그 보기
  • 노드 실행하기(launch)
  • 데이터 기록 및 재생
  • ROS2 프로그래밍 시작
  • 작업공간 만들기
  • 패키지 만들기
  • 간단한 게시자와 구독자 노드 만들기
  • 간단한 서비스 및 클라이언트 작성
  • 사용자 정의 msg 및 srv 파일 생성
  • 사용자 정의 인터페이스 구현
  • 파라메터 사용하기
  • 문제 식별에 ros2doctor 사용하기
Powered by GitBook
On this page
  • 개요
  • 실습
  • 1. 설정
  • 2. rqt_graph
  • 3. ros2 topic list
  • 4. ros2 topic echo
  • 5. ros2 topic info
  • 6. ros2 interface show
  • 7. ros2 topic pub
  • 8. ros2 topic hz
  • 9. 종료

Was this helpful?

Export as PDF

토픽(Topic) 이해하기

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

Previous노드(Node) 이해하기Next서비스(Service) 이해하기

Last updated 1 year ago

Was this helpful?

개요

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

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

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

실습

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각 터미널에 입력하여 중지하는 것을 잊지 마십시오.

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