본문으로 바로가기

지난번 ROS2에서 node의 개념을 이야기한 다음 이야기입니다. 노드에서 뭔가 도닥도닥 만져봤다면 당연히~ 토픽(topic)도 만져봐야죠. 이번에는 토픽에 대해 이야기를 해보고 싶네요.

토픽은 ROS에서 노드간에 전해지는 메세지의 흐름입니다. 어떤 노드에서 토픽을 발행하구요. 또 어떤 노드들은 원하는 토픽을 받을 수 있습니다. 이렇게 해서 메세지가 노드에서 노드로 전해집니다.

이 그림은 Exploring the performance of ROS2라는 논문에 나타난 그림인데요.  카메라를 다루는 노드가 카메라에서 받은 이미지를 발행(publish)합니다. 이 이미지를 쓰고 싶은 노드는 받으면 됩니다. 그래서 자동차도 인식하고 보행자도 인식하는 각각의 노드들이 사용하는 것이죠. 

일단, 현재 터미널에는 turtlesim 패키지의 turtlesim_node와 turtle_teleop_key라는 두 노드를 실행합니다.

이제 ros2 topic을 하고 탭을 두번 연달아 누르면 사용할 수 있는 옵션들이 나타납니다~

topic list를 확인합니다. 현재 실행중인 두 노드가 발행하거나 청취하는 토픽의 목록이 나타납니다.

list를 확인할때 -t 옵션을 사용하면 해당 토픽이 사용하는 메세지의 형(type)도 같이 확인할 수 있습니다. 토픽은 노드가 사용하는 메세지의 흐름이니 데이터의 형(type)도 정의되어 있어야합니다. 위에서 보이듯이 ROS에서 기본 제공하는 토픽도 있고, turtlesim 패키지에서 만들어둔 데이터도 있습니다. 이런건 또 차차 다뤄보도록 하겠습니다.

토픽의 정보를 알고 싶다면 info 옵션을 사용하면 됩니다. 그러면 해당 토픽의 데이터형, 발행, 청취(publish, subscribe)의 노드 수도 확인할 수 있습니다.

토픽의 형을 알고 싶으면 type 옵션을 사용하면 됩니다. turtle1/pose 토픽은 turtlesim에서 정의된 Pose라는 메세지형이네요

보다 더 들여다 보고 싶으면 interface show를 사용하면 됩니다.

토픽을 들여다 보고 싶다면 echo를 사용하면 됩니다.~

현재 teleop_turtle 노드에서 cmd_vel이라는 토픽이 turtlesim 노드로 들어갑니다. 이걸 보면 cmd_vel이라는 토픽이 turtlesim을 움직이는 뭔가 명령같은 역할인가보다~ 할 수 있습니다.

어떤 토픽을 발행하고 싶을때 가장 간단한 방법은 터미널에서 ros2 topic pub을 사용하는 것입니다. turtle1/cmd_vel 토픽은 type에서 확인해본 결과 geometry_msgs/msg/Twist라는 메세지형을 사용한다는 것을 이미 알고 있습니다. 그래서 그걸 지정하구요. 데이터를 넣어주면 됩니다. --once 옵션은 한 번만 실행하라는 것이다.

연속적인 지령을 주고 싶다면 -r 옵션으로 Hz 단위의 숫자를 인가하면 됩니다. 전 1Hz로 직선방향으로 2만큼의 속도, 회전방향으로 1.8만큼의 속도로 움직이라는 명령을 주었습니다. Twist 메세지 타입에 대해서는 다음에 설명할 기회가 있을겁니다.^^

아무튼 turtle은 저렇게 뺑글뺑글 돌고 있을 겁니다.~

현재 터미널에서 인가한 ros2 topic pub 명령을 실행한 것이 하나의 노드가 되었고, 그 노드는 cmd_vel이라는 토픽을 통해서 메세지를 turtlesim으로 전달하는 것입니다.~^^ 위 내용은 동영상으로도 설명을 하고 있습니다~~



댓글을 달아 주세요

  1. BlogIcon 드래곤포토 2020.06.11 11:15 신고

    전 이해가 쉽지 않네요
    즐거운 하루보내세요

  2. BlogIcon 북두협객 2020.06.12 13:39 신고

    본격적으로 동영상 강의를 시작하셨군요~

  3. BlogIcon 잉여토기 2020.06.13 21:32 신고

    로스2 토픽 명령어에 대해 잘 배워보네요.
    거북이가 뱅글뱅글 원을 그리며 도네요.

  4. BlogIcon 핑구야 날자 2020.06.16 06:56 신고

    간단한 사용기지만 저에게는 좀 어렵겠네요 그래도 잘 배우고 갑니다

  5. IdealBME 2020.08.27 21:31

    혹시 rosserial 사용할 때 2개의 MCU(Arduino or STM32) 를 동시에 연결해보셨는지요?