659.88 센서 프레임의 명명 규칙
1. 개요
로봇 시스템에는 다양한 종류와 수량의 센서가 장착된다. 각 센서는 고유한 좌표 프레임을 가지며, 센서 데이터의 header.frame_id 필드에 해당 프레임의 이름이 기록된다. 센서 프레임의 명명 규칙은 TF2 변환 트리의 가독성, 유지보수성, 그리고 다중 로봇 환경에서의 호환성에 직접적으로 영향을 미친다. 본 절에서는 ROS2 생태계에서 권장되는 센서 프레임의 명명 규칙과 그 근거를 체계적으로 기술한다.
2. 명명 규칙의 원칙
2.1 기본 원칙
센서 프레임 이름은 다음의 원칙을 따라야 한다.
- 소문자와 밑줄 사용: 프레임 이름은 소문자 알파벳과 밑줄(
_)만으로 구성한다. 대문자, 공백, 특수 문자는 사용하지 않는다. - 서술적(Descriptive) 이름: 프레임의 역할과 위치를 직관적으로 파악할 수 있는 이름을 사용한다.
- 접미사
_link와_frame의 사용: 물리적 부착점의 프레임에는_link접미사를, 데이터 생성 좌표계에는_frame또는_optical_frame접미사를 사용한다. - 계층적 구조 반영: 센서가 로봇의 어느 부위에 장착되어 있는지를 이름에 반영한다.
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_link | LiDAR 센서의 물리적 부착점 |
laser_frame 또는 lidar_frame | 데이터 발생 좌표계 (일반적으로 _link와 동일) |
다중 LiDAR 명명 예시:
front_laser_link
rear_laser_link
top_lidar_link
velodyne_link
3.3 IMU 센서
| 프레임 이름 | 역할 |
|---|---|
imu_link | IMU 센서의 물리적 부착점 |
imu_frame | IMU 데이터의 좌표계 (일반적으로 _link와 동일) |
3.4 GNSS 수신기
| 프레임 이름 | 역할 |
|---|---|
gps_link | GPS 안테나의 물리적 위치 |
gnss_link | GNSS 수신기의 위치 (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_link와 lidar_frame을 혼용하지 않고, camera_link와 lidar_link로 통일하거나, camera_frame과 lidar_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)