퍼블리셔

3강에서 손으로 치던 ros2 topic pub, 코드로는 어떻게 할까?

create_publisher

타입, 토픽 이름, 큐 크기

노드의 create_publisher(타입, 토픽 이름, 큐 크기)로 퍼블리셔를 만듭니다. 타입은 from std_msgs.msg import String처럼 가져온 메시지 클래스입니다(4강 3편). 큐 크기는 미처 못 보낸 메시지를 몇 개까지 쌓아 둘지입니다.

큐 크기는 QoS 설정의 하나입니다. 11강에서 자세히 봅니다.

보내기

만들고, 채우고, publish

메시지 클래스로 빈 메시지를 만들고, 필드를 채운 뒤 publish()에 넘깁니다. String의 필드는 data 하나입니다. publish는 메시지를 넘기고 바로 돌아옵니다.

전체 코드

타이머 콜백에서 보냅니다

4편의 Counter에서 로그를 남기던 자리에 보내기를 넣었습니다. 0.5초마다 Hello 0, Hello 1, …이 /chatter로 나갑니다. 공식 튜토리얼의 talker도 같은 구조입니다.

맨 위에는 1편의 import 두 줄과 from std_msgs.msg import String이 있습니다. main은 2편과 같되 HelloNode() 자리에 Talker()를 씁니다.

듣는 이 없이

받는 쪽이 없어도 보냅니다

퍼블리셔는 누가 듣는지 모른 채 토픽에 올립니다(3강 4편). 받는 노드가 없어도 오류가 나지 않습니다. ros2 topic info로 보면 보내는 쪽 1, 받는 쪽 0입니다.

package.xml

가져다 쓴 것은 적어 둡니다

코드에서 가져다 쓰는 패키지는 package.xml에도 적습니다. 공식 튜토리얼은 <exec_depend>rclpy</exec_depend>와 <exec_depend>std_msgs</exec_depend>를 더합니다. rosdep이 이 목록을 보고 빠진 것을 깔아 줍니다(5강 4편).

따라 하기

보내는 것을 echo로 엿듣습니다

setup.py에 talker 명령을 더하고 빌드한 뒤 ros2 run my_package talker를 실행합니다. 이 노드는 로그를 남기지 않아 조용합니다. 새 터미널에서 ros2 topic echo /chatter로 메시지를 확인합니다(3강 5편).

echo는 켠 뒤에 온 메시지부터 보여 줍니다. 그래서 숫자가 0이 아닌 곳에서 시작합니다.

다음 편

echo 대신 내 노드가 받아 보려면?

6편듣는 노드 6강 목록