리매핑

남이 만든 노드의 토픽 이름이 내 것과 다르면, 코드를 고쳐야 할까?

리매핑

코드는 그대로, 이름만 바꿉니다

리매핑(remapping)은 노드를 실행할 때 그 안에서 쓰는 이름을 바꿔 주는 것입니다. 코드에 /turtle1/cmd_vel로 보내도록 적혀 있어도, 실행할 때 /turtle2/cmd_vel로 바꾸면 그쪽으로 보냅니다.

3편에서 본 대로 이름이 같아야 이어집니다. 리매핑은 그 이름을 맞춰 주는 방법입니다.

준비

거북이를 한 마리 더 부릅니다

거북이 창에 turtle2를 하나 더 만듭니다. 서비스를 부르는 명령인데(7강 3편), 지금은 그대로 복사해 씁니다. 새 거북이는 /turtle2/cmd_vel을 구독합니다.

ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"

8편에서 띄운 노드들은 Ctrl+C로 끄고, /turtlesim 하나만 남깁니다.

따라 하기

실행할 때 이름을 바꿔 띄웁니다

ros2 run 뒤에 --ros-args를 쓰고, 그 뒤에 --remap 원래이름:=새이름을 붙입니다. 이제 이 키보드 노드는 화살표 키로 turtle2만 움직입니다.

ros2 run turtlesim turtle_teleop_key --ros-args --remap turtle1/cmd_vel:=turtle2/cmd_vel

--remap은 -r로 줄여 쓸 수 있습니다. 회전 키(g, b, v…)까지 turtle2로 보내려면 액션 이름도 바꿔야 합니다(9강).

그래프로

키보드 노드가 다른 통로로 이어집니다

rqt_graph(2강 6편)로 보면 키보드 노드가 /turtle2/cmd_vel로 이어져 있습니다. /turtlesim은 두 토픽을 모두 구독하지만, /turtle1/cmd_vel에는 이제 보내는 쪽이 없습니다.

더 바꾸기

노드 이름과 네임스페이스도

같은 방법으로 노드 이름(__node)도 바꿉니다. __ns를 쓰면 노드가 쓰는 이름 앞에 /robot1 같은 앞머리, 곧 네임스페이스(namespace)가 붙습니다. 같은 로봇 여러 대를 함께 띄울 때 씁니다.

네임스페이스는 10강 3편, 런치 파일 안의 리매핑은 10강 6편에서 다시 봅니다.

정리

노드나 토픽이 안 보일 때

목록에 노드나 토픽이 없거나 echo에 아무것도 오지 않으면 위에서부터 차례로 봅니다. 새 터미널에서 source를 했는지, 터미널끼리 ROS_DOMAIN_ID가 같은지, 리매핑 뒤의 이름과 타입이 정확히 같은지 확인합니다. 그래도 안 되면 QoS(11강)를 의심합니다.

다른 컴퓨터의 노드라면 탐색 범위와 네트워크도 봅니다(2강 8편). 그래도 이상하면 ros2 daemon stop 뒤 다시 확인합니다.

다음 강

토픽 위를 흐르는 메시지는 어떤 모양일까요?

4강 1편토픽에는 모양이 있다 3강 목록