TransformBroadcaster

움직이는 거북이의 프레임은 누가, 언제 알려 줄까?

하는 일

Pose를 받아 변환으로 바꿔 냅니다

1편 데모의 broadcaster1은 거북이 자리를 알리는 /turtle1/pose를 구독합니다. Pose가 올 때마다 그것을 world→turtle1 변환으로 바꿔 /tf에 냅니다. 이 일을 맡는 부품이 tf2_ros의 TransformBroadcaster입니다.

준비

브로드캐스터를 만들고 Pose를 구독

노드의 __init__에서 TransformBroadcaster(self)를 하나 만들어 둡니다. 그리고 거북이 Pose를 구독해 handle_turtle_pose 콜백을 겁니다. 거북이 이름은 파라미터(8강)로 받아서, 같은 코드로 turtle1과 turtle2를 모두 알립니다.

공식 튜토리얼 turtle_tf2_broadcaster.py의 일부입니다. 줄인 곳은 ...입니다.

채우기

시각, 부모, 자식, 이동을 적습니다

콜백 안에서 3편의 TransformStamped를 채웁니다. 시각은 지금, 부모는 world, 자식은 거북이 이름입니다. 거북이는 바닥 위에서만 움직이므로 이동은 Pose의 x, y를 그대로 쓰고 z는 0입니다.

회전과 보내기

theta를 쿼터니언으로 바꿔 보냅니다

거북이는 z축으로만 돌므로 roll과 pitch는 0, yaw는 msg.theta입니다. 이를 쿼터니언으로 바꿔 넣고 sendTransform(t)로 보내면 끝입니다. Pose가 올 때마다 콜백이 불리니, 변환도 그만큼 자주 나갑니다.

quaternion_from_euler는 tf2_ros의 함수가 아니라 튜토리얼 파일 안에 numpy로 짠 작은 함수입니다.

시각

변환에는 찍힌 시각이 붙습니다

header.stamp는 이 변환이 언제의 모습인지 알려 줍니다. 받는 쪽은 변환을 시각별로 쌓아 두고(기본 10초), 물어본 시각의 앞뒤 값으로 계산합니다. 아직 오지 않은 미래 시각을 물으면 오류가 납니다.

시뮬레이터에서는 시계가 따로 가므로 use_sim_time을 맞춥니다(14강 7편).

따라 하기

world 기준 turtle1을 지켜봅니다

1편 데모와 키보드 노드를 띄운 채 ros2 run tf2_ros tf2_echo world turtle1을 실행합니다. 거북이를 몰면 Translation의 x, y가 따라 바뀝니다. 브로드캐스터가 Pose를 받을 때마다 새 변환을 내고 있다는 뜻입니다.

출력은 공식 튜토리얼의 예시이고 일부만 보였습니다. 직접 짠 노드는 패키지에 넣어 빌드(5강)한 뒤 같은 방법으로 확인합니다.

다음 편

이렇게 쌓인 변환을, 쫓아가는 거북이는 어떻게 꺼내 쓸까요?

8편변환 받아 쓰기 12강 목록