659.88 센서 프레임의 명명 규칙

1. 개요

로봇 시스템에는 다양한 종류와 수량의 센서가 장착된다. 각 센서는 고유한 좌표 프레임을 가지며, 센서 데이터의 header.frame_id 필드에 해당 프레임의 이름이 기록된다. 센서 프레임의 명명 규칙은 TF2 변환 트리의 가독성, 유지보수성, 그리고 다중 로봇 환경에서의 호환성에 직접적으로 영향을 미친다. 본 절에서는 ROS2 생태계에서 권장되는 센서 프레임의 명명 규칙과 그 근거를 체계적으로 기술한다.

2. 명명 규칙의 원칙

2.1 기본 원칙

센서 프레임 이름은 다음의 원칙을 따라야 한다.

  1. 소문자와 밑줄 사용: 프레임 이름은 소문자 알파벳과 밑줄(_)만으로 구성한다. 대문자, 공백, 특수 문자는 사용하지 않는다.
  2. 서술적(Descriptive) 이름: 프레임의 역할과 위치를 직관적으로 파악할 수 있는 이름을 사용한다.
  3. 접미사 _link_frame의 사용: 물리적 부착점의 프레임에는 _link 접미사를, 데이터 생성 좌표계에는 _frame 또는 _optical_frame 접미사를 사용한다.
  4. 계층적 구조 반영: 센서가 로봇의 어느 부위에 장착되어 있는지를 이름에 반영한다.

2.2 명명 패턴

센서 프레임의 일반적인 명명 패턴은 다음과 같다.

[위치_수식어/][센서_유형]_[인스턴스_식별자]_[프레임_유형]

각 구성 요소의 의미는 다음과 같다.

구성 요소설명예시
위치 수식어센서의 장착 위치 (선택적)front_, rear_, left_, right_, top_
센서 유형센서의 종류camera, laser, imu, gps, ultrasonic
인스턴스 식별자동일 유형 센서의 구분 식별자 (선택적)번호(1, 2), 위치(left, right)
프레임 유형프레임의 역할_link, _frame, _optical_frame

3. 센서별 명명 예시

3.1 카메라 센서

카메라 센서는 물리적 부착점 프레임(_link)과 광학 좌표계 프레임(_optical_frame)의 두 프레임을 갖는다.

프레임 이름역할좌표축 규약
camera_link카메라 하우징의 물리적 부착점FLU (X=전방, Y=좌측, Z=상방)
camera_optical_frame카메라 영상의 좌표계광학 규약 (X=우측, Y=하방, Z=전방)

다중 카메라 시스템에서의 명명 예시:

front_camera_link           → front_camera_optical_frame
rear_camera_link            → rear_camera_optical_frame
left_stereo_camera_link     → left_stereo_camera_optical_frame
right_stereo_camera_link    → right_stereo_camera_optical_frame
depth_camera_link           → depth_camera_optical_frame

3.2 LiDAR 센서

프레임 이름역할
laser_link 또는 lidar_linkLiDAR 센서의 물리적 부착점
laser_frame 또는 lidar_frame데이터 발생 좌표계 (일반적으로 _link와 동일)

다중 LiDAR 명명 예시:

front_laser_link
rear_laser_link
top_lidar_link
velodyne_link

3.3 IMU 센서

프레임 이름역할
imu_linkIMU 센서의 물리적 부착점
imu_frameIMU 데이터의 좌표계 (일반적으로 _link와 동일)

3.4 GNSS 수신기

프레임 이름역할
gps_linkGPS 안테나의 물리적 위치
gnss_linkGNSS 수신기의 위치 (gps_link의 대안)

3.5 초음파 센서

프레임 이름역할
front_left_ultrasonic_link전방 좌측 초음파 센서
front_right_ultrasonic_link전방 우측 초음파 센서
rear_center_ultrasonic_link후방 중앙 초음파 센서

4. 프레임 유형 접미사의 구분

4.1 _link 접미사

_link 접미사는 센서의 **물리적 부착점(physical attachment point)**에 해당하는 프레임에 사용된다. 이 프레임은 REP 103의 FLU 규약을 따르며, URDF에서 <link> 요소로 정의된다.

<link name="camera_link">
  <visual>
    <geometry>
      <box size="0.04 0.08 0.04"/>
    </geometry>
  </visual>
</link>

4.2 _optical_frame 접미사

_optical_frame 접미사는 카메라 센서의 **광학 좌표계(optical coordinate system)**에 해당하는 프레임에 사용된다. 이 프레임은 컴퓨터 비전의 관례를 따라 Z축이 전방(광축 방향), X축이 우측, Y축이 하방을 가리킨다.

_link 프레임에서 _optical_frame으로의 변환은 고정된 회전 변환이다.

<joint name="camera_optical_joint" type="fixed">
  <parent link="camera_link"/>
  <child link="camera_optical_frame"/>
  <origin xyz="0 0 0" rpy="-1.5708 0 -1.5708"/>
</joint>

4.3 _frame 접미사

_frame 접미사는 센서의 **데이터 발생 좌표계(data generation coordinate system)**에 사용되며, _link 프레임과 동일하거나 약간의 오프셋을 갖는 경우에 사용된다. 많은 경우 _link_frame은 호환적으로 사용되나, 관례상 다음과 같이 구분한다.

  • _link: URDF의 <link> 요소에 대응하는 프레임
  • _frame: 센서 드라이버가 발행하는 데이터의 frame_id로 사용되는 프레임

5. 네임스페이싱

5.1 다중 로봇 네임스페이싱

다중 로봇 시스템에서는 로봇 이름을 네임스페이스로 사용하여 프레임 이름의 충돌을 방지한다.

robot1/camera_link
robot1/camera_optical_frame
robot1/laser_link
robot2/camera_link
robot2/camera_optical_frame
robot2/laser_link

네임스페이싱은 런치 파일의 namespace 매개변수를 통하여 자동으로 적용할 수 있다.

Node(
    package='usb_cam',
    executable='usb_cam_node_exe',
    namespace='robot1',
    parameters=[{'frame_id': 'camera_link'}],
    remappings=[('/image_raw', '/robot1/camera/image_raw')],
)

5.2 센서 그룹 네임스페이싱

동일 로봇 내에서 센서를 논리적 그룹으로 분류하는 경우에도 네임스페이싱을 활용할 수 있다.

perception/front_camera_link
perception/rear_camera_link
navigation/laser_link
navigation/imu_link

6. 전형적인 로봇의 센서 프레임 트리

base_link
  ├── front_laser_link
  ├── rear_laser_link
  ├── front_camera_link
  │     └── front_camera_optical_frame
  ├── rear_camera_link
  │     └── rear_camera_optical_frame
  ├── depth_camera_link
  │     ├── depth_camera_optical_frame
  │     └── depth_camera_color_optical_frame
  ├── imu_link
  ├── gps_link
  ├── front_left_ultrasonic_link
  ├── front_right_ultrasonic_link
  ├── rear_left_ultrasonic_link
  └── rear_right_ultrasonic_link

7. 센서 드라이버와의 일관성

센서 드라이버가 발행하는 메시지의 header.frame_id와 TF2에 등록된 프레임 이름이 정확히 일치하여야 한다. 불일치가 발생하면 lookupTransform()에서 LookupException이 발생한다.

# 카메라 드라이버의 frame_id 설정
usb_cam_node:
  ros__parameters:
    camera_name: "front_camera"
    frame_id: "front_camera_optical_frame"  # TF2 프레임과 일치
# LiDAR 드라이버의 frame_id 설정
velodyne_driver:
  ros__parameters:
    frame_id: "velodyne_link"  # TF2 프레임과 일치

8. 명명 시 주의 사항

8.1 피해야 할 이름

피해야 할 이름사유대안
sensor지나치게 일반적이어서 식별이 불가능front_laser_link
cam1, cam2의미를 파악하기 어려움front_camera_link, rear_camera_link
Laser_Link대문자 사용은 ROS2 관례에 부합하지 않음laser_link
laser-link하이픈 사용은 권장되지 않음laser_link
my_robot/laser슬래시는 네임스페이스 구분자로 예약됨my_robot_laser_link 또는 네임스페이싱 사용

8.2 일관성 유지

동일 프로젝트 내에서는 일관된 명명 패턴을 유지하여야 한다. 예를 들어, camera_linklidar_frame을 혼용하지 않고, camera_linklidar_link로 통일하거나, camera_framelidar_frame으로 통일한다.

9. 요약

센서 프레임의 명명 규칙은 소문자와 밑줄을 사용하는 서술적 이름을 기본으로 하며, 센서 유형, 장착 위치, 인스턴스 식별자, 프레임 유형 접미사의 조합으로 구성된다. _link 접미사는 물리적 부착점, _optical_frame 접미사는 카메라의 광학 좌표계, _frame 접미사는 데이터 발생 좌표계에 사용된다. 일관되고 서술적인 명명 규칙을 준수함으로써 TF2 변환 트리의 가독성과 유지보수성을 확보할 수 있다.


참고 문헌 및 출처

  • T. Foote, “REP 103 – Standard Units of Measure and Coordinate Conventions,” ROS Enhancement Proposals, https://www.ros.org/reps/rep-0103.html (2010, 최종 갱신 2023)
  • T. Foote, “REP 105 – Coordinate Frames for Mobile Platforms,” ROS Enhancement Proposals, https://www.ros.org/reps/rep-0105.html (2010, 최종 갱신 2022)
  • ROS Wiki, “Sensors/Conventions”, https://wiki.ros.org/Sensors
  • ROS2 공식 문서, “URDF Tutorials”, https://docs.ros.org/en/humble/Tutorials/Intermediate/URDF/ (ROS2 Humble Hawksbill)