659.85 odom 프레임의 정의와 역할
1. 개요
odom 프레임은 REP 105에 의하여 정의된 **주행 측정 기준 좌표 프레임(odometry reference frame)**이다. 이 프레임은 로봇이 시동된 시점의 위치를 원점으로 하며, 바퀴 인코더, 관성 측정 장치(IMU), 시각 주행 측정(Visual Odometry) 등의 누적적 센서 데이터에 기반하여 로봇의 상대적 위치 변화를 추적한다. odom 프레임의 가장 중요한 특성은 odom → base_link 변환이 반드시 **시간적으로 연속적(temporally continuous)**이어야 한다는 것이다.
2. 정의
2.1 REP 105에 의한 정의
REP 105는 odom 프레임을 다음과 같이 정의한다.
odom프레임은 세계 고정(world-fixed) 프레임이다.odom프레임에서의 로봇의 포즈는 시간에 따라 드리프트할 수 있으며, 이로 인하여 장기적으로는 유의미한 글로벌 기준으로 사용할 수 없다. 그러나odom프레임에서의 로봇의 포즈는 연속적이어야 하므로, 단기적인 로컬 참조로서 유용하다.
2.2 핵심 특성
| 특성 | 설명 |
|---|---|
| 연속성 | odom → base_link 변환은 불연속적 점프 없이 시간에 따라 매끄럽게 변화한다 |
| 단기 정확성 | 짧은 시간 구간에서의 상대적 위치 변화는 정확하다 |
| 장기 드리프트 | 시간이 경과함에 따라 실제 위치와의 오차가 누적된다 |
| 고빈도 갱신 | 일반적으로 50~200 Hz의 주기로 갱신된다 |
| 초기 원점 | 로봇 시동 시점의 위치가 원점이 된다 |
3. odom 프레임의 의미론
3.1 좌표계 방향
odom 프레임은 REP 103의 글로벌 좌표계 규약을 따르되, 글로벌 지리 정보가 아닌 로봇의 시동 위치를 기준으로 한다.
- X축: 로봇 시동 시 전방(또는 동쪽 방향)을 가리킨다.
- Y축: 로봇 시동 시 좌측(또는 북쪽 방향)을 가리킨다.
- Z축: 중력 반대 방향(상방)을 가리킨다.
일반적으로 시동 시점에서 odom 프레임과 base_link 프레임은 동일한 위치와 방향을 갖는다. 즉, 초기 변환은 항등 변환(identity transform)이다.
3.2 연속성의 의미
odom → base_link 변환의 연속성은 다음을 의미한다.
-
위치의 연속성: 로봇의 위치 (x, y, z)가 시간에 따라 연속 함수로 변화한다. 한 시점에서 다른 시점으로 순간 이동(teleportation)이 발생하지 않는다.
-
자세의 연속성: 로봇의 회전(쿼터니언)이 시간에 따라 연속적으로 변화한다. 회전의 불연속적 점프가 발생하지 않는다.
-
속도의 유한성: 변환의 시간 미분(로봇의 속도)이 유한한 값을 갖는다. 무한대의 가속도가 발생하지 않는다.
이러한 연속성은 로봇의 운동 제어기가 안정적으로 작동하기 위한 필수 조건이다, 제어기가 참조하는 좌표 변환에 불연속적 점프가 발생하면 제어 명령이 급변하여 로봇의 물리적 안전에 영향을 미칠 수 있다.
3.3 드리프트의 원인
odom 프레임의 장기적 드리프트는 다음과 같은 원인에 의하여 발생한다.
| 드리프트 원인 | 설명 | 영향 |
|---|---|---|
| 바퀴 미끄러짐(Wheel Slippage) | 바퀴가 지면에서 미끄러지면 인코더 측정값과 실제 이동 거리가 불일치한다 | 위치 오차 누적 |
| IMU 바이어스 드리프트 | 자이로스코프의 바이어스가 시간에 따라 변동하여 각도 추정 오차가 누적된다 | 방향 오차 누적 |
| 지면 불균일 | 바퀴 직경 가정과 실제 이동 경로의 차이가 발생한다 | 위치 및 방향 오차 |
| 수치 적분 오차 | 이산적 센서 데이터를 적분할 때 발생하는 수치적 오차가 누적된다 | 미소 오차 누적 |
| 기구학 모델 부정확성 | 로봇의 이론적 기구학 모델과 실제 기구학의 차이가 존재한다 | 체계적 오차 |
4. odom → base_link 변환의 발행
4.1 발행 주체
odom → base_link 변환은 주행 측정 노드(odometry node)에 의하여 발행된다. 일반적인 발행 주체의 예시는 다음과 같다.
| 발행 주체 | 입력 데이터 | 특성 |
|---|---|---|
ros2_control 차분 구동 플러그인 | 바퀴 인코더 | 기구학 모델 기반, 고빈도 |
robot_localization EKF/UKF | 인코더, IMU, GPS 등 | 다중 센서 융합, 최적 추정 |
| 시각 주행 측정 노드 | 카메라 영상 | 특징점 기반 움직임 추정 |
| LiDAR 주행 측정 노드 | LiDAR 스캔 | 스캔 매칭 기반 움직임 추정 |
4.2 TF2 변환 발행 예시
void publish_odometry_transform(
double x, double y, double theta,
const rclcpp::Time& stamp)
{
geometry_msgs::msg::TransformStamped t;
t.header.stamp = stamp;
t.header.frame_id = "odom";
t.child_frame_id = "base_link"; // 또는 "base_footprint"
t.transform.translation.x = x;
t.transform.translation.y = y;
t.transform.translation.z = 0.0;
tf2::Quaternion q;
q.setRPY(0.0, 0.0, theta);
t.transform.rotation.x = q.x();
t.transform.rotation.y = q.y();
t.transform.rotation.z = q.z();
t.transform.rotation.w = q.w();
tf_broadcaster_->sendTransform(t);
}
4.3 Odometry 메시지와의 관계
odom → base_link 변환은 /odom 토픽으로 발행되는 nav_msgs/msg/Odometry 메시지와 동일한 정보를 포함한다. 그러나 두 데이터 스트림은 서로 다른 목적으로 사용된다.
| 데이터 | 형식 | 목적 |
|---|---|---|
| TF2 변환 | geometry_msgs/msg/TransformStamped | 좌표 변환 조회 |
| Odometry 토픽 | nav_msgs/msg/Odometry | 속도 정보, 공분산 정보 포함 |
# Odometry 메시지 발행 (TF 변환과 함께)
odom_msg = Odometry()
odom_msg.header.stamp = self.get_clock().now().to_msg()
odom_msg.header.frame_id = 'odom'
odom_msg.child_frame_id = 'base_link'
# 포즈 (위치 + 자세)
odom_msg.pose.pose.position.x = x
odom_msg.pose.pose.position.y = y
odom_msg.pose.pose.orientation = quaternion_from_yaw(theta)
# 포즈 공분산 (6x6 행렬의 상삼각)
odom_msg.pose.covariance[0] = 0.01 # x 분산
odom_msg.pose.covariance[7] = 0.01 # y 분산
odom_msg.pose.covariance[35] = 0.03 # yaw 분산
# 속도 (base_link 프레임에서)
odom_msg.twist.twist.linear.x = v
odom_msg.twist.twist.angular.z = omega
odom_publisher.publish(odom_msg)
5. odom 프레임의 활용
5.1 로컬 내비게이션
로컬 경로 계획기(local planner)는 odom 프레임을 기준으로 로봇의 단기 경로를 계획한다. odom 프레임은 연속적이므로 로컬 장애물 회피와 속도 제어에 안정적인 기준을 제공한다.
5.2 운동 제어
로봇의 운동 제어기는 odom → base_link 변환을 참조하여 현재 위치를 파악하고, 목표 속도를 추종한다. 이 변환이 연속적이므로, 제어 명령이 급격하게 변동하지 않는다.
5.3 로컬 비용 지도
Nav2의 로컬 비용 지도(local costmap)는 odom 프레임에서 유지된다. 이는 로봇 주변의 단기적 장애물 정보를 연속적인 좌표계에서 관리하기 위함이다.
# Nav2 로컬 비용 지도 설정
local_costmap:
ros__parameters:
global_frame: "odom"
robot_base_frame: "base_link"
rolling_window: true
width: 5.0
height: 5.0
6. odom 프레임 운용 시 주의 사항
6.1 초기화 문제
odom 프레임의 원점은 로봇 시동 시점에서 결정되므로, 재시동 시마다 원점이 달라진다. 이는 map → odom 변환에 의하여 보정되므로 시스템 전체 동작에는 영향을 미치지 않으나, 오프라인 데이터 분석 시에는 주의가 필요하다.
6.2 드리프트 보정
odom 프레임 자체의 드리프트는 보정하지 않는다. 대신, 위치 추정 알고리즘이 map → odom 변환을 주기적으로 갱신하여 드리프트를 간접적으로 보상한다.
T_{\text{map} \leftarrow \text{base\_link}} = T_{\text{map} \leftarrow \text{odom}} \times T_{\text{odom} \leftarrow \text{base\_link}}
이 구조에서 T_{\text{odom} \leftarrow \text{base\_link}}의 드리프트는 T_{\text{map} \leftarrow \text{odom}}의 갱신에 의하여 상쇄된다.
6.3 발행 주파수
odom → base_link 변환의 발행 주파수는 제어 루프의 주파수 이상이어야 한다. 발행 주파수가 너무 낮으면 제어기가 오래된 위치 정보를 참조하여 제어 성능이 저하된다.
| 시스템 유형 | 권장 발행 주파수 |
|---|---|
| 저속 실내 로봇 | 20~50 Hz |
| 고속 실외 로봇 | 50~100 Hz |
| 산업용 정밀 로봇 | 100~200 Hz |
| 드론 비행 제어 | 200~400 Hz |
6.4 단일 발행자 원칙
odom → base_link 변환은 반드시 단일 노드에 의하여 독점적으로 발행되어야 한다. 복수의 노드가 동일한 변환을 동시에 발행하면 데이터 충돌이 발생하며, TF2에서 경고가 출력된다.
7. 다중 센서 융합에서의 odom 프레임
바퀴 인코더와 IMU 등 복수의 센서 데이터를 확장 칼만 필터(EKF)나 무향 칼만 필터(UKF)로 융합하여 최적의 주행 측정 추정치를 산출하는 경우, 융합 결과가 odom → base_link 변환으로 발행된다.
# robot_localization EKF 노드 설정
ekf_odom:
ros__parameters:
frequency: 50.0
odom_frame: "odom"
base_link_frame: "base_link"
world_frame: "odom"
# 바퀴 인코더 주행 측정 입력
odom0: "/wheel_odom"
odom0_config: [true, true, false,
false, false, false,
false, false, false,
false, false, true,
false, false, false]
# IMU 입력
imu0: "/imu/data"
imu0_config: [false, false, false,
true, true, true,
false, false, false,
true, true, true,
true, false, false]
8. 요약
odom 프레임은 주행 측정 기반의 로컬 기준 좌표계로서, odom → base_link 변환의 시간적 연속성을 보장하는 것이 가장 중요한 특성이다. 단기적으로 정확한 상대 위치 정보를 제공하여 운동 제어와 로컬 내비게이션의 안정적인 기준을 마련하나, 장기적으로는 불가피한 드리프트가 발생한다. 이 드리프트는 map → odom 변환을 통하여 간접적으로 보정되며, 이러한 이중 구조가 REP 105 프레임 체계의 핵심 설계 철학이다.
참고 문헌 및 출처
- T. Foote, “REP 105 – Coordinate Frames for Mobile Platforms,” ROS Enhancement Proposals, https://www.ros.org/reps/rep-0105.html (2010, 최종 갱신 2022)
- T. Moore, D. Stouch, “A Generalized Extended Kalman Filter Implementation for the Robot Operating System,” Advances in Intelligent Systems and Computing, vol. 302, pp. 335–348, 2016.
- Nav2 공식 문서, “Setting Up Odometry”, https://docs.nav2.org/setup_guides/odom/setup_odom.html (Nav2 1.1, 2023)
- S. Macenski et al., “Robot Operating System 2: Design, Architecture, and Uses in the Wild,” Science Robotics, vol. 7, no. 66, 2022.