토픽(Topic) 이해하기
저작권: 쿼드(QUAD) 드론연구소 https://smartstore.naver.com/maponarooo
Last updated
Was this helpful?
저작권: 쿼드(QUAD) 드론연구소 https://smartstore.naver.com/maponarooo
Last updated
Was this helpful?
ROS 2는 복잡한 시스템을 여러 모듈식 노드로 나눕니다. 주제는 노드가 메시지를 교환하는 버스 역할을 하는 ROS 그래프의 중요한 요소입니다.
노드는 여러 토픽에 데이터를 게시하고 동시에 여러 토픽에 대한 구독을 가질 수 있습니다.
토픽은 데이터가 노드 간에, 따라서 시스템의 다른 부분 간에 이동되는 주요 방법 중 하나입니다.
새 터미널을 열고 다음을 실행합니다.
다른 터미널을 열고 다음을 실행합니다.
turtlesim_node와 turtle_teleop_key 두개의 노드를 실행 했습니다.
rqt_graph는 이 튜토리얼 전체에서 변화하는 노드와 주제, 그리고 이들 사이의 연결을 시각화하는 데 사용할 것입니다 .
rqt_graph를 실행하려면 새 터미널을 열고 다음 명령을 입력하십시오.
rqt를 실행하고 Plugins > Introspection > Node Graph 를 선택하여 rqt_graph를 열 수도 있습니다 .
위의 노드와 주제, 그래프 주변의 두 가지 작업이 표시되어야 합니다(지금은 무시하겠습니다). 중앙의 주제에 마우스를 올리면 위 이미지와 같이 색상이 강조되는 것을 볼 수 있습니다.
그래프는 /turtlesim
노드와 /teleop_turtle
노드가 토픽을 통해 서로 통신하는 방법을 보여줍니다. 노드 /teleop_turtle
는 토픽에데이터(거북이를 움직이기 위해 입력하는 키 입력)를 게시하고 /turtle1/cmd_vel
있으며 /turtlesim
노드는 데이터를 수신하기 위해 해당 토픽을 구독합니다.
rqt_graph의 강조 표시 기능은 다양한 방식으로 연결된 많은 노드와 항목이 있는 보다 복잡한 시스템을 검사할 때 매우 유용합니다.
rqt_graph는 그래픽 검사 도구입니다. 이제 주제를 조사하기 위한 몇 가지 명령줄 도구를 살펴보겠습니다.
새 터미널에서 명령을 실행하면 시스템에서 현재 활성화된 모든 토픽 목록이 반환됩니다.
ros2 topic list -t
이번에는 괄호 안에 추가된 주제 유형과 함께 동일한 토픽 목록을 반환합니다.
이러한 속성, 특히 유형은 노드가 주제를 이동할 때 동일한 정보에 대해 이야기하고 있음을 아는 방법입니다.
이러한 모든 항목이 rqt_graph에 있는 위치가 궁금하다면 Hide: 아래의 모든 상자를 선택 취소할 수 있습니다.
토픽에 게시되는 데이터를 보려면 다음을 사용하세요.
/teleop_turtle
가 /turtlesim/turtle1/cmd_velecho
토픽에 대해 데이터를 게시한다는 것을 알고 있으므로 해당 토픽을 출력해 보겠습니다.
처음에 이 명령은 데이터를 반환하지 않습니다. 무언가를 게시하기를 기다리고 있기 때문입니다 .
실행 중인 터미널로 돌아가서 turtle_teleop_key
화살표를 사용하여 거북이를 이동합니다. 동시에 실행 중인 터미널을 보면 모든 움직임에 대해 위치 데이터가 게시되는 것을 볼 수 있습니다.
이제 rqt_graph로 돌아가 Debug 상자를 선택 해제하십시오.
/_ros2cli_26646 는
방금 실행한 echo 명령 으로 생성된 노드입니다. (숫자는 다를 수 있음). 이제 게시자가 cmd_vel
토픽에 대한 데이터를 게시하고 두 명의 구독자가 이를 구독하고 있음을 알 수 있습니다 .
토픽이 일대일 커뮤니케이션일 필요는 없습니다. 일대다, 다대일 또는 다대다일 수 있습니다.
이것을 보는 또 다른 방법은 다음을 실행하는 것입니다.
노드는 메시지를 사용하여 토픽을 통해 데이터를 보냅니다. 게시자와 구독자가 통신하려면 동일한 유형의 메시지를 보내고 받아야 합니다.
ros2 topic list -t
실행 후 앞서 본 cmd_vel
토픽 유형은 각 토픽에 어떤 메시지 유형이 사용되는지 알려줍니다. 토픽의 유형은 다음과 같습니다 .
이제 이 ros2 interface show <msg type>
유형을 실행하여 세부 정보를 알아볼 수 있습니다. 특히 메시지가 기대하는 데이터 구조.
위의 메시지 유형에 대해 다음을 생성합니다.
/tutlesim 노드가 linear와 angular 두개의 백터 타입 엘레멘트를 가지고 있음을 보여줍니다. echo 코맨드를 이용하여 실제 전달되는 데이터를 보면 위와 동일함을 볼 수 있습니다.
이제 메시지 구조를 알고 있으므로 다음을 사용하여 명령줄에서 직접 토픽에 데이터를 게시할 수 있습니다.
인수 '<args>'
는 이전 섹션에서 방금 발견한 구조로 주제에 전달할 실제 데이터입니다.
이 인수는 YAML 구문으로 입력해야 한다는 점에 유의해야 합니다. 다음과 같이 전체 명령을 입력하십시오.
--once
는 "하나의 메시지를 게시한 다음 종료"를 의미하는 선택적 인수입니다.
터미널에 다음 출력이 표시됩니다.
그러면 거북이가 다음과 같이 움직이는 것을 볼 수 있습니다.
거북이(및 일반적으로 에뮬레이션하려는 실제 로봇)는 지속적으로 작동하기 위해 꾸준한 명령 스트림이 필요합니다. 따라서 거북이를 계속 움직이게 하려면 다음을 실행할 수 있습니다.
기서 차이점은 --once
옵션을 제거 하고 --rate 1
옵션을 추가하여 명령을 1Hz의 꾸준한 스트림으로 게시하도록 지시한다는 것입니다 .
rqt_graph를 새로 고쳐서 무슨 일이 일어나고 있는지 그래픽으로 볼 수 있습니다. 이제 노드(/_ros2cli_30358)에서수신 중인 /turtle1/cmd_vel 토픽을통해 노드(/_ros2cli_26646, /turtlesim)에 게시하는 것을 볼 수 있습니다 .
마지막으로 echo 명령을 통해 pose 토픽을 rqt_graph를 통해 다시한번 확인해 보겠습니다.
/turtlesim 노드가 발행한 pose 토픽을 새로운 노드 /ros2cli1682 가 구독하고 있음을 볼 수 있습니다.
이 프로세스에 대한 마지막 검사를 위해 다음을 사용하여 데이터가 게시되는 속도를 볼 수 있습니다.
/turtlesim
노드가 pose 토픽에 데이터를 게시하는 속도에 대한 데이터를 반환합니다.
ros2 topic pub --rate 1
를 사용하여 turtle1/cmd_vel
게시 속도를 일정한 1Hz로 설정했음을 기억하십시오 . 대신에 위의 명령을 실행하면 해당 속도를 반영하는 평균이 표시됩니다.
이 시점에서 많은 노드가 실행 중입니다. Ctrl+C
각 터미널에 입력하여 중지하는 것을 잊지 마십시오.