Post

TF Configuration: 센서 좌표계와 Cartographer용 TF 설정

TF Configuration: 센서 좌표계와 Cartographer용 TF 설정

로봇을 개발할 때 가장 먼저 마주치는 문제 중 하나가 센서 좌표계 설정입니다. LiDAR, IMU, 카메라의 데이터를 융합하려면 각 센서가 로봇의 어디에, 어떤 방향으로 장착되어 있는지를 시스템에 정확히 알려줘야 합니다. 이 글에서는 RoboRacer 플랫폼에서 ROS의 TF(Transform) 시스템으로 센서 좌표계를 설정하는 방법을 다룹니다.

TF란?

TF는 서로 다른 좌표계(frame) 간의 변환 관계를 관리하는 ROS 시스템입니다. “LiDAR는 로봇 중심에서 앞으로 30cm”, “IMU는 왼쪽으로 6cm” 같은 공간 관계를 트리 구조로 정의하며, 모든 프레임은 정확히 하나의 parent 를 가져야 합니다.

전체 TF 트리

이 글에서 만들 트리는 다음과 같습니다.

센서 좌표계 TF 트리 (map → base_link → 각 센서)

  • map → base_link: localization이 실시간으로 계산 (이 글의 범위 밖)
  • base_link → 센서: 장착 위치가 고정이므로 static transform 으로 정의 (이 글의 주제)

base_link — 뒷바퀴 축 중심의 바닥 지점

base_link뒷바퀴 축 중심의 바닥 지점 으로 정의합니다. Ackermann 조향 차량의 회전 중심이 뒷축에 있어 kinematics 계산이 단순해지고, $z=0$(바닥)으로 두면 2D 매핑과의 정합도 깔끔해집니다.

base_link → laser 변환 (translation만, rotation은 0)

translation만 측정해서 넣고, rotation은 0으로 둡니다. 대신 LiDAR가 최대한 수평이 되도록 roll·pitch를 하드웨어 세팅 으로 잡아줍니다.

IMU는 한 단계가 아니라 두 단계로 연결합니다.

1
2
base_link → vesc_imu_rot   (translation만)
vesc_imu_rot → vesc_imu    (rotation만)

이렇게 나누는 이유는 Cartographer 의 두 가지 제약 때문입니다.

1. tracking_frame 제약. Cartographer에서 IMU를 사용하려면 tracking_frame 이 IMU 프레임과 같거나, IMU 프레임과 rotation만 차이 나는 프레임이어야 합니다.

2. 중력 초기화 문제. IMU가 뒤집혀 장착된 경우 IMU 프레임을 그대로 tracking_frame 으로 쓰면, 초기 중력 방향 정렬 과정에서 맵 전체가 뒤집혀 버립니다.

그래서 IMU와 translation 차이는 없으면서 축 방향은 base_link와 정렬된 중간 프레임 vesc_imu_rot 을 만들고, 이를 Cartographer에 넘겨줍니다. 장착 방향의 rotation은 전부 vesc_imu_rot → vesc_imu 에 몰아넣습니다.

1
2
-- mapping_2d.lua
tracking_frame = "vesc_imu_rot",  -- IMU와 translation 없이 정렬된 프레임

설정 예시

VESC에 장착된 IMU의 프레임

VESC에 장착된 IMU는 위 그림과 같은 프레임을 가집니다.

static_transforms 설정 예시

설정 파일: stack_master/config/CAR/static_transforms.yaml

1
2
3
4
5
vesc_imu_rot_to_vesc_imu:
  parent: vesc_imu_rot
  child: vesc_imu
  xyz: [0.0, 0.0, 0.0]
  rpy: [0.0, 0.0, 1.5707963]   # 장착 방향에 맞게 선택 (아래 표 참고)

VESC 장착 방향에 따라 rpy 값만 바꿔주면 됩니다.

장착 방향rpy
a[0.0, 0.0, 1.5707963] (+90°)
b[0.0, 0.0, 0.0]
c[0.0, 0.0, 3.1415927] (180°)
d[0.0, 0.0, -1.5707963] (-90°)

마무리

핵심은 세 가지입니다.

  1. 기준 프레임(base_link)을 물리적으로 명확한 지점으로 정의한다.
  2. Cartographer용 IMU는 translation·rotation을 분리한 중간 프레임(vesc_imu_rot)을 tracking_frame 으로 쓴다.
  3. Cartographer에서 IMU를 활용하지 않을 때는 base_link 에서 IMU로 바로 연결해도 무방하다.

기초 개념과 측정 방법은 base_link 기준 센서 TF 설정 가이드 도 함께 참고하세요.

참고자료

This post is licensed under CC BY 4.0 by the author.