로봇 좌표계와 TF2: map·odom·base·tool 프레임이 어긋나는 이유

로봇 좌표계 문제는 숫자 하나가 틀린 것이 아니라 서로 다른 시각의 변환을 잘못 이어 붙일 때 생깁니다. map·odom·base_link·sensor·tool 프레임의 역할과 TF2 시간 버퍼를 함께 확인해야 합니다.

아래에서는 용어의 차이를 실제 시스템 경계, 실패 조건과 검증 순서로 나눠 살펴봅니다.

TF2 오류는 좌표값보다 프레임·방향·시각의 불일치에서 시작한다

점 하나의 x, y, z만 보면 그것이 지도 기준인지 로봇 본체 기준인지 알 수 없습니다. 같은 좌표라도 프레임이 다르면 실제 위치가 달라지고, 움직이는 로봇에서는 같은 프레임 관계도 시각에 따라 바뀝니다.

TF2는 여러 좌표 프레임의 관계를 시간 버퍼가 있는 트리로 관리합니다. 이는 TCP·핸드아이·관절 영점 보정과 구분해야 합니다. 보정은 변환값을 추정하는 절차이고, TF2는 그 값을 다른 동적 변환과 시간에 맞춰 전달·조회하는 체계입니다.

변환은 좌표를 어느 기준에서 어느 기준으로 표현할지 정한다

한 프레임에서 다른 프레임으로 점을 옮기려면 회전과 이동을 함께 적용합니다. 여기서 `A에서 본 B의 자세`와 `B의 점을 A로 변환하는 연산`을 말로 섞으면 역변환을 잘못 넣기 쉽습니다.

코드와 문서에는 부모 프레임, 자식 프레임, 변환의 의미와 단위를 한 문장으로 적는 편이 좋습니다. 축 방향은 ROS 좌표 규약과 센서 제조사 규약이 다를 수 있으므로 장착 변환에서 명시적으로 연결합니다.

map·odom·base_link는 전역 정확도와 연속성을 나눈다

REP-105는 이동 플랫폼에서 base_link, odom, map, earth 프레임의 의미를 정리합니다. odom은 단기적으로 연속적이지만 누적 오차가 생길 수 있고, map은 전역적으로 보정되지만 위치 재인식 때 값이 불연속적으로 바뀔 수 있습니다.

제어기가 연속 속도와 짧은 구간 움직임을 계산할 때는 odom 계열이 유리하고, 전역 경로와 장소 의미는 map 계열을 사용할 수 있습니다. 두 역할을 하나의 프레임에 억지로 넣으면 전역 보정 순간에 로컬 제어 목표가 튀거나 지도 오차가 계속 누적됩니다.

프레임주요 의미허용되는 특성
map전역 위치 기준보정으로 불연속 변화 가능
odom연속 로컬 주행 기준장기 드리프트 가능
base_link로봇 본체 기준로봇과 함께 이동
sensor/tool센서 광학축·작업점장착·공구 관계를 표현

TF 트리는 각 자식 프레임에 하나의 부모를 둔다

ROS 2 tf2 개요는 좌표 프레임 관계를 시간에 따라 버퍼링된 트리로 유지한다고 설명합니다. 한 자식에 서로 다른 두 노드가 부모 변환을 발행하면 값이 번갈아 나타나거나 트리 의미가 깨질 수 있습니다.

전역 위치 추정기는 map→odom, 로컬 오도메트리는 odom→base_link, robot_state_publisher는 관절에 따른 링크 변환, 정적 발행자는 센서 장착과 같은 고정 변환을 맡도록 소유권을 정합니다. 같은 변환을 여러 곳에서 발행하지 않는 것이 첫 규칙입니다.

map odom base_link sensor flange tool 프레임이 부모 자식 관계로 이어지는 로봇 TF2 트리
map에서 tool까지 이어지는 TF 트리. 출처: 피지컬 AI Lab.

정적 변환과 동적 변환은 갱신 책임이 다르다

센서가 본체에 단단히 고정됐거나 플랜지와 공구의 관계가 바뀌지 않는다면 정적 변환으로 표현할 수 있습니다. 관절 각도, 이동 플랫폼 자세와 SLAM 보정처럼 시간에 따라 변하는 관계는 동적 변환으로 계속 발행해야 합니다.

교환식 공구는 물리적으로 고정돼 있어도 장착 이벤트마다 값과 유효성이 달라집니다. 공구 ID와 보정 버전을 확인한 뒤 해당 변환을 활성화하고, 분리된 공구의 오래된 변환이 남지 않도록 수명주기를 관리해야 합니다.

타임스탬프가 버퍼 밖이면 extrapolation 오류가 난다

TF2는 특정 시각의 프레임 관계를 질의합니다. 센서 메시지 시각이 변환 버퍼보다 오래됐거나 미래로 찍혀 있으면 필요한 변환이 없어 과거 또는 미래 extrapolation 오류가 발생할 수 있습니다.

`latest` 변환을 무조건 사용하면 오류 메시지는 줄어도 움직이는 로봇에서 센서 측정과 자세의 시각이 어긋납니다. 카메라 노출·드라이버 수신·발행 시각의 의미를 정하고, 여러 컴퓨터의 시계를 동기화하며, 허용 지연을 측정해야 합니다.

센서 프레임은 광학축과 장착 프레임을 구분한다

카메라는 하우징 기준 프레임과 optical frame의 축 규약이 다를 수 있고, 라이다도 스캔 평면과 커넥터 방향이 일치하지 않을 수 있습니다. URDF 모양이 맞아 보여도 축 변환이 틀리면 포인트클라우드가 뒤집히거나 회전합니다.

이 문제는 카메라·IMU·엔코더 센서 퓨전에서 더 크게 드러납니다. 시간은 맞지만 축과 부호가 틀리면 필터가 편향을 보정하려다 흔들리고, 좌표는 맞지만 시간이 틀리면 회전 중 물체가 휘어 보일 수 있습니다.

tool 프레임은 플랜지가 아니라 실제 작업점을 나타낸다

로봇 팔의 마지막 링크나 flange는 기계 인터페이스이고, tool 또는 TCP 프레임은 그리퍼 손끝, 용접점, 흡착 중심처럼 작업 명령을 적용할 지점입니다. 공구 길이와 방향이 바뀌면 같은 플랜지 자세에서도 작업점 위치가 달라집니다.

공구 교환 뒤에는 ID와 TCP 보정값을 함께 확인하고, 잘못된 tool 변환에서 동작을 시작하지 않도록 인터록을 둡니다. 계획·제어·비전이 서로 다른 tool 이름을 쓰지 않게 공구 레지스트리를 단일 원천으로 운영하는 편이 좋습니다.

디버깅은 프레임 존재에서 값 검증으로 내려간다

먼저 메시지의 `frame_id`와 필요한 프레임이 실제로 존재하는지 봅니다. 다음으로 트리가 한 경로로 연결되는지, 같은 자식의 중복 발행자가 없는지, 질의 시각이 버퍼 범위 안인지 확인한 뒤 마지막에 수치와 보정을 의심합니다.

정지 상태에서는 알려진 표적의 좌표, 이동 상태에서는 일정한 벽이나 바닥이 프레임 변환 후에도 고정돼 보이는지 검사합니다. x축으로 10 cm 이동, z축으로 90도 회전 같은 단순 동작을 넣으면 역변환·부호·단위 오류를 빠르게 구분할 수 있습니다.

프레임 이름 트리 방향 타임스탬프 보정을 순서대로 점검하는 TF2 오류 진단표
TF2 오류를 찾는 네 단계. 출처: 피지컬 AI Lab.

다중 로봇은 프레임 이름과 전역 기준의 소유권을 분리한다

여러 로봇이 모두 `base_link`와 `odom`을 그대로 쓰면 같은 TF 그래프에서 이름이 충돌할 수 있습니다. 로봇별 네임스페이스 또는 프레임 접두사를 정하고, 지도와 설비 기준처럼 공유할 프레임만 명시적으로 연결해야 합니다.

각 로봇의 map이 같은 물리 세계를 뜻하는지, 별도 로컬 지도인지도 정해야 합니다. 공유 전역 기준을 만들 때는 초기 정렬, 재위치 추정과 보정 점프의 소유 노드를 하나로 두고 프레임 간 루프를 만들지 않습니다.

좌표계 검증은 정적·동적·재시작 조건을 나눠 한다

정적 시험에서는 표적과 공구의 알려진 위치로 방향·단위·보정값을 확인합니다. 동적 시험에서는 회전과 가속 중 센서 데이터를 변환해 고정 환경이 움직이지 않는지 보고, 지연을 바꿔 오류가 커지는 경계를 찾습니다.

마지막으로 노드와 로봇을 순서대로 재시작하고 공구를 교환해 TF가 누락·중복되거나 오래된 값으로 남지 않는지 봅니다. 성공 여부와 함께 최대 변환 나이, 조회 실패율, 프레임 경로와 보정 버전을 로그로 남깁니다.

시험입력합격 신호
정적 방향축별 이동·회전, 기준 표적부호·단위·자세 일치
동적 시간회전·가속·센서 지연고정 물체의 잔차 제한
트리 복구노드 순차 재시작중복·분리·오래된 TF 없음
공구 교환tool ID·보정 변경올바른 TCP만 활성

TF2는 좌표 데이터를 전달하는 계약으로 관리한다

tf2 공식 API 문서의 조회·변환 도구를 사용할 때도 프레임 이름과 시간 의미를 애플리케이션 계약에 적어야 합니다. 로봇 추론 지연 예산과 연결하면 센서 시각, 변환 가용 시각과 제어 사용 시각을 한 타임라인에서 볼 수 있습니다.

좌표 오차가 반복되면 모든 보정을 다시 하기보다 로봇 SLAM의 좌표 추정, TF 트리의 방향, 회전 표현, 시간 동기화와 변환 소유권을 차례로 분리하십시오. 이 순서가 보정값과 소프트웨어 연결 오류를 섞지 않는 가장 빠른 길입니다.

로봇 좌표계와 TF2에서 자주 묻는 질문

map과 odom은 왜 둘 다 필요한가요?

map은 전역 보정으로 점프할 수 있고 odom은 단기 연속성을 유지하는 대신 드리프트할 수 있습니다. 전역 정확도와 로컬 연속성을 분리하기 위해 둘을 함께 씁니다.

extrapolation 오류는 버퍼 시간을 늘리면 해결되나요?

일부 과거 조회에는 도움이 되지만 잘못된 시계, 미래 타임스탬프와 큰 처리 지연은 남습니다. 타임스탬프 의미와 동기화부터 확인해야 합니다.

static_transform_publisher로 모든 변환을 올려도 되나요?

관절·이동 자세처럼 시간에 따라 변하는 관계를 정적으로 올리면 실제 동작과 TF가 달라집니다. 물리적으로 고정된 관계에만 사용해야 합니다.

카메라 영상이 맞는데 포인트클라우드만 돌아가는 이유는 무엇인가요?

카메라 optical frame의 축 규약, 장착 변환 방향과 메시지 frame_id가 서로 맞는지 확인해야 합니다.

TF 트리에 루프를 만들어 보정을 되먹임해도 되나요?

tf2는 트리 구조를 전제로 하므로 한 자식에 하나의 부모를 두고 보정 결과를 정해진 한 변환에 반영해야 합니다.

이 글은 ROS 2 tf2와 로봇 좌표 프레임의 설계·진단 원리를 설명합니다. 실제 프레임 규약과 API 동작은 사용 중인 ROS 2 배포판과 패키지 문서를 확인해야 합니다.