static_transform_publisher와 /tf_static
나사로 박아 둔 라이다의 위치도 계속 알려야 할까?
두 가지 관계
변하는 관계와 안 변하는 관계
로봇이 달리면 odom → base_link는 쉬지 않고 바뀝니다. 하지만 base_link → base_scan은 라이다를 떼어 내지 않는 한 그대로입니다. 이렇게 바뀌지 않는 변환을 정적 변환(static transform)이라고 합니다.
(-0.032, 0, 0.172)는 TurtleBot3 burger 모델 파일에 적힌 라이다 자리입니다. 단위는 미터입니다.
토픽 둘
/tf는 계속, /tf_static은 한 번
그래서 TF는 토픽을 둘로 나눕니다. 바뀌는 변환은 /tf로 계속 보내고, 정적 변환은 /tf_static으로 처음에 한 번 보냅니다. 바뀌지 않는 값을 초마다 다시 보내는 낭비가 없어집니다.
늦게 와도
나중에 켠 노드도 받습니다
한 번만 보내면, 나중에 켠 RViz는 그 값을 놓치지 않을까요? /tf_static은 QoS의 Durability를 Transient Local로 씁니다(11강 4편). 퍼블리셔가 보낸 값을 들고 있다가 늦게 온 구독자에게도 다시 줍니다.
값을 들고 있는 쪽은 퍼블리셔입니다. 그 노드를 끄면 새로 켠 노드는 받지 못합니다.
따라 하기
명령 한 줄로 정적 변환을 냅니다
ros2 run tf2_ros static_transform_publisher에 이동 --x --y --z, 회전 --yaw --pitch --roll, 부모 --frame-id, 자식 --child-frame-id를 이름 붙여 넘깁니다. 각도는 라디안이고, 빠뜨린 값은 0으로 칩니다. 두 프레임 이름은 꼭 적습니다.
이름 없이 숫자만 늘어놓던 예전 형식은 Jazzy에서 쓰지 말라는 경고가 납니다.
확인
/tf_static을 엿들어 봅니다
정적 변환을 낸 터미널은 그대로 두고, 새 터미널에서 ros2 topic echo /tf_static을 실행합니다. 나중에 켰는데도 메시지가 한 번 나타납니다. ros2 topic echo는 퍼블리셔의 QoS에 맞춰 구독하므로 Transient Local로 받기 때문입니다.
출력 일부만 보였습니다. 줄인 곳은 …으로 표시했습니다.
실제로는
런치 파일에 넣어 함께 띄웁니다
명령줄 도구는 런치 파일(10강)의 Node로도 띄울 수 있습니다. 다만 로봇 모델이 있으면 직접 쓸 일이 적습니다. 모델(URDF)에 적힌 고정 관절은 robot_state_publisher가 /tf_static으로 내 주기 때문입니다(13강 5편).
모델에 없는 센서를 잠깐 달아 볼 때 static_transform_publisher가 편합니다.
다음 편