659.108 다중 로봇 프레임 네임스페이싱
1. 개요
다중 로봇 시스템에서 프레임 네임스페이싱(namespacing)은 각 로봇의 좌표 프레임에 고유한 접두사를 부여하여 프레임 이름의 충돌을 방지하는 기법이다. 네임스페이싱이 없으면 복수의 로봇이 동일한 base_link 프레임을 발행하여 TF2 트리에서 충돌이 발생한다.
2. 네임스페이싱 방법
2.1 런치 파일의 namespace 매개변수
Node(
package='robot_state_publisher',
executable='robot_state_publisher',
namespace='robot1',
parameters=[{
'robot_description': robot_description,
'frame_prefix': 'robot1/',
}],
)
frame_prefix 매개변수는 robot_state_publisher가 발행하는 모든 프레임 이름에 접두사를 추가한다.
2.2 결과 프레임 구조
robot1/base_link
robot1/laser_link
robot1/camera_link
robot1/camera_optical_frame
robot1/imu_link
robot2/base_link
robot2/laser_link
robot2/camera_link
3. 센서 드라이버의 네임스페이싱
센서 드라이버의 frame_id 매개변수도 네임스페이스에 맞게 설정하여야 한다.
# robot1의 LiDAR 드라이버
robot1:
laser_driver:
ros__parameters:
frame_id: "robot1/laser_link" # 네임스페이스 포함
또는 런치 파일에서 네임스페이스를 적용하면 frame_id를 상대적으로 설정할 수 있는 드라이버도 있다.
4. 주행 측정과 위치 추정의 네임스페이싱
# robot1의 EKF 노드
robot1:
ekf_node:
ros__parameters:
odom_frame: "robot1/odom"
base_link_frame: "robot1/base_link"
world_frame: "robot1/odom"
# robot1의 AMCL 노드
robot1:
amcl:
ros__parameters:
global_frame_id: "map" # map은 공유
odom_frame_id: "robot1/odom"
base_frame_id: "robot1/base_link"
map 프레임은 모든 로봇이 공유하므로 네임스페이스를 적용하지 않는다. 각 로봇의 odom과 base_link만 네임스페이싱된다.
5. 주의 사항
- 일관성: 모든 노드(드라이버, 위치 추정, 내비게이션 등)에서 동일한 네임스페이스를 사용하여야 한다.
- 공유 프레임:
map,earth등의 글로벌 프레임에는 네임스페이스를 적용하지 않는다. - 토픽 네임스페이싱: TF 프레임 네임스페이싱과 함께 토픽(
/tf,/tf_static)도 네임스페이스로 분리하거나, 공유 토픽에 모든 로봇의 변환을 발행할지 결정하여야 한다.
6. 요약
프레임 네임스페이싱은 다중 로봇 시스템에서 프레임 이름 충돌을 방지하는 핵심 기법으로, frame_prefix와 런치 파일의 namespace를 통하여 구현된다. 글로벌 공유 프레임(map, earth)은 네임스페이싱에서 제외하고, 로봇별 프레임(odom, base_link, 센서 프레임)에만 접두사를 적용한다.
참고 문헌 및 출처
- T. Foote, “REP 105 – Coordinate Frames for Mobile Platforms,” ROS Enhancement Proposals, https://www.ros.org/reps/rep-0105.html (2010, 최종 갱신 2022)
robot_state_publisher패키지, https://github.com/ros/robot_state_publisher (ROS2 Humble 브랜치)