TF 트리와 view_frames
프레임이 수십 개라면, 변환은 몇 개나 적어 둬야 할까?
다 적지 않는다
이웃한 프레임끼리만 적습니다
모든 프레임 짝마다 변환을 적으면 프레임이 늘수록 개수가 폭발합니다. TF는 이웃한 프레임 사이의 변환만 적고, 나머지는 3편처럼 이어 붙여 구합니다. 프레임이 n개면 변환은 n−1개면 됩니다.
규칙
자식의 부모는 하나뿐입니다
이렇게 이어진 모양을 TF 트리(TF tree)라고 합니다. 부모는 자식을 여럿 둘 수 있지만, 자식의 부모는 꼭 하나입니다. 맨 위의 프레임만 부모가 없습니다. 한 프레임에 부모가 둘이면 TF가 어느 쪽을 믿을지 몰라 트리가 깨집니다.
map과 odom이 실제로 어떻게 이어지는지는 5편에서 봅니다.
물어보면
트리를 따라 길을 찾아 계산합니다
"turtle2 기준으로 turtle1은?"이라고 물으면, TF2는 두 프레임에서 위로 올라가 만나는 공통 조상을 찾습니다. 올라갈 때는 변환을 거꾸로, 내려갈 때는 그대로 이어 붙입니다. 1편의 listener가 받은 답이 이렇게 나옵니다.
끊기면
이어지지 않으면 답이 없습니다
중간의 변환 하나를 아무도 내지 않으면 트리가 둘로 갈라집니다. 그러면 갈라진 양쪽 프레임 사이는 계산할 길이 없어 오류가 납니다. 로봇 화면이 텅 비거나 내비게이션이 안 될 때 가장 먼저 의심할 곳입니다.
흔한 원인은 그 변환을 내는 노드를 안 띄운 것입니다. 오류 문장은 줄여 보였습니다.
따라 하기
지금 트리를 그림으로 뽑습니다
1편의 데모를 띄운 채 ros2 run tf2_tools view_frames를 실행합니다. 5초 동안 TF를 듣고, 지금 폴더에 트리 그림을 PDF로 저장합니다. 파일 이름에는 만든 날짜와 시각이 붙습니다.
실제 줄 앞에는 [INFO] [시각] [view_frames]: 가 붙고, 중간의 Result 줄은 뺐습니다.
결과
PDF에 트리 그림이 나옵니다
타원 하나가 프레임, 화살표 하나가 부모에서 자식으로 가는 변환입니다. 화살표 옆에는 평균 발행 빈도, 버퍼에 든 기간, 가장 최근에 받은 시각이 적혀 있어서 "이 변환이 지금 들어오고 있나"를 확인할 수 있습니다.
Broadcaster 칸은 ROS 2에서는 늘 default_authority라 누가 냈는지는 나오지 않습니다.
다음 편