다대다 토픽

키보드 하나로 거북이 두 마리를 한꺼번에 몰 수 있을까?

모양

토픽은 몇 대 몇이든 됩니다

지금까지는 퍼블리셔 하나에 서브스크라이버 하나였습니다. 토픽에는 퍼블리셔도 서브스크라이버도 여럿 붙을 수 있습니다. 5편에서 echo를 붙였을 때 이미 구독이 둘이었습니다.

하나가 여럿에게

한 번 보내면 모두 받습니다

2편처럼 새 터미널에서 이름을 바꿔 거북이 창을 하나 더 띄웁니다. 새 노드 /my_turtle도 /turtle1/cmd_vel을 구독하므로, 키보드 노드가 보낸 메시지를 두 노드가 똑같이 받습니다.

ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle

결과

두 창의 거북이가 똑같이 움직입니다

두 노드는 같은 메시지를 각자 받아 각자 자기 거북이를 움직입니다. 보내는 /teleop_turtle은 받는 쪽이 둘로 늘어난 것을 모릅니다(4편).

거북이 모양은 창마다 무작위로 정해져서 다를 수 있습니다.

여럿이 하나에게

여럿이 한 토픽에 보내도 됩니다

키보드 노드도 하나 더 띄웁니다. 이름이 겹치지 않게 --ros-args --remap __node:=teleop2를 붙입니다. 이제 두 키보드 터미널 어디서 키를 눌러도 같은 토픽으로 가고, 두 거북이 창이 함께 받습니다.

키는 그 노드를 띄운 터미널을 눌러 고른 뒤 입력합니다.

세어 보기

info로 몇 대 몇인지 셉니다

5편의 ros2 topic info로 확인합니다. 보내는 쪽이 키보드 노드 둘, 받는 쪽이 거북이 노드 둘이라 둘 다 2입니다.

5편의 echo를 아직 켜 두었다면 Subscription count는 3입니다.

주의

누가 보냈는지 가리지 않습니다

서브스크라이버는 메시지가 어느 퍼블리셔에서 왔는지 따지지 않고 온 차례대로 처리합니다. 두 키보드에서 다른 키를 번갈아 누르면 거북이는 명령이 섞여 갈팡질팡합니다. 그래서 속도 명령 토픽에는 보통 보내는 쪽을 하나만 둡니다.

15강 6편에서 Nav2를 쓰기 전에 키보드 노드를 끄는 까닭이 이것입니다.

다음 편

토픽 이름이 다른 두 노드를 이어 줄 수 있을까요?

9편이름을 바꿔 연결하기 3강 목록