휠 오도메트리 미끄럼 보정: 엔코더 속도와 실제 이동이 달라지는 이유

휠 오도메트리는 엔코더 회전량을 바닥 이동으로 적분하지만 급가속·제동·선회·문턱·낮은 마찰에서는 바퀴가 돈 거리와 차체가 간 거리가 달라집니다. 바퀴 반지름과 윤거 보정, IMU·LiDAR 잔차로 슬립을 찾는 법, 고정 공분산 대신 상황별 불확실성을 키우는 법과 실제 주행 검증 절차를 정리합니다.

아래에서는 용어의 차이를 실제 시스템 경계, 실패 조건과 검증 순서로 나눠 살펴봅니다.

휠 오도메트리는 바퀴 회전량을 차체 이동으로 바꾸는 추정값이지 바닥을 직접 잰 값은 아니다

좌우 엔코더의 각도 변화에 바퀴 반지름을 곱하면 각 바퀴가 굴러간 거리를 얻고, 두 거리의 평균과 차이로 전진량과 회전량을 적분할 수 있습니다. 짧은 구간에서 빠르고 매끄러운 속도를 주기 때문에 이동 로봇 제어와 다른 센서의 초기값으로 널리 사용됩니다.

로봇 SLAM 글에서 엔코더가 스캔 정합의 초기값이 된다고 설명했지만, 이 글은 지도를 만드는 법이 아니라 바퀴 회전과 실제 차체 이동이 어긋날 때 오도메트리 신뢰도를 어떻게 낮추고 복구하는지에 집중합니다.

먼저 좌우 바퀴 반지름과 윤거를 실제 주행값으로 맞춘다

명목 반지름이 같아도 타이어 마모·공기압·하중·조립 편차 때문에 한 회전당 이동 거리가 달라질 수 있습니다. 직선 명령에서 한쪽으로 휘면 좌우 반지름 배율을, 제자리 회전각이 계속 크거나 작으면 유효 윤거를 먼저 의심합니다.

ros2_control diff_drive_controller 문서도 wheel separation과 wheel radius 보정 계수를 별도로 둡니다. 긴 직선과 여러 바퀴 수의 제자리 회전을 반복해 한 번의 짧은 시험보다 누적 기울기를 맞춥니다.

Odometry 메시지의 pose와 twist는 서로 다른 좌표계와 공분산 책임을 가진다

ROS nav_msgs/Odometry 정의에서 pose는 header frame, twist는 child_frame_id 좌표계로 표현됩니다. 숫자만 맞아도 frame_id가 뒤바뀌면 회전 중 속도 방향과 센서 융합 잔차가 잘못 계산됩니다.

공분산을 모두 0으로 두면 측정이 완벽하다는 뜻으로 해석될 수 있고, 임의의 큰 수를 고정하면 정상 구간의 유용한 속도까지 버립니다. 위치와 회전, 선속도와 각속도의 오차가 어떤 시험에서 계산됐는지 단위와 축 순서까지 남깁니다.

항목좌표·입력틀렸을 때 보이는 증상
poseodom→base 위치·자세회전 뒤 위치가 옆으로 점프
twistchild frame의 선·각속도전진 중 측면 속도가 발생
pose covariance적분 위치 불확실성장거리에서 과신·과소신
twist covariance현재 속도 불확실성필터가 슬립 속도를 따라감

엔코더 실물은 회전을 세지만 접지력과 횡방향 미끄럼은 보지 못한다

사진의 휠 모듈은 슬롯 디스크와 광센서로 축 회전을 펄스로 바꿉니다. 펄스 수, 기어비와 방향을 알면 바퀴 각도와 속도를 계산할 수 있지만 타이어와 바닥 사이에 전달된 힘은 같은 신호에 들어 있지 않습니다.

로봇 엔코더 가이드의 해상도·절대값·장착 오차와 별개로, 휠 오도메트리에는 접지 가정이라는 추가 조건이 붙습니다. 펄스가 깨끗하다는 이유만으로 차체 속도를 확정하지 않습니다.

분해된 이동 로봇 구동 휠 안쪽의 슬롯 디스크와 광센서 배선이 보이는 실제 휠 엔코더 사진
엔코더는 이 슬롯 디스크의 회전을 읽습니다. 회전량은 정확해도 타이어가 헛돌거나 옆으로 미끄러지면 차체 이동량은 달라질 수 있습니다. 출처: Adam Mayer. 라이선스: CC BY-SA 2.0. EXIF orientation normalized, center-cropped to the article image ratio, and resized; no material content altered.

급가속·제동·선회·문턱·낮은 마찰에서 종방향과 횡방향 슬립이 생긴다

모터 토크가 접지 한계를 넘으면 바퀴가 헛돌아 엔코더 이동량이 실제보다 커집니다. 강한 제동에서는 바퀴 회전이 줄어도 차체가 계속 미끄러질 수 있어 실제 이동량이 더 커지는 반대 오차도 생깁니다.

스키드 스티어처럼 네 바퀴가 같은 방향을 보며 선회하는 차체는 옆으로 비벼지며 돌아갑니다. 바닥 재질·하중·무게중심·타이어 온도에 따라 유효 윤거가 달라지므로 직선에서 맞은 파라미터가 선회에서 그대로 맞는다고 보지 않습니다.

슬립은 엔코더 하나가 아니라 IMU 요레이트와 스캔 정합·전류의 잔차로 찾는다

휠 속도로 예측한 요레이트와 IMU 자이로의 요레이트 차이, 휠 적분 이동과 LiDAR·카메라 프레임 정합의 상대 이동 차이를 같은 시간 구간에서 비교합니다. 모터 전류가 급증했는데 차체 가속이 늘지 않는 현상도 접지 손실 후보가 됩니다.

IMU 바이어스·드리프트 글처럼 자이로 자체 영점이 틀리면 정상 선회도 슬립으로 보입니다. 따라서 잔차 임계값은 정지 바이어스, 속도, 가속도와 바닥 조건별 정상 분포에서 정합니다.

슬립이 감지되면 pose를 억지로 고치기보다 해당 측정의 공분산을 먼저 키운다

휠 오도메트리가 갑자기 틀렸다고 현재 pose를 다른 센서 위치로 즉시 덮어쓰면 제어기가 큰 점프를 받습니다. 슬립 구간의 twist와 적분 pose 공분산을 키워 필터가 IMU·LiDAR·비전의 독립 관측을 더 믿게 하는 방식이 연속성을 지키기 쉽습니다.

robot_localization 문서는 Odometry·IMU 등 여러 측정과 공분산을 상태 추정에 사용합니다. 공분산 조정은 슬립을 없애는 기능이 아니라 해당 측정의 신뢰도를 낮추는 신호이며, 독립 센서가 없으면 불확실성만 커질 수 있습니다.

스키드 스티어는 선회 속도와 바닥에 따라 유효 윤거를 바꾸거나 별도 모델을 써야 한다

좌우 바퀴 속도 차이를 고정 윤거로 나누는 이상 모델은 순수 구름을 가정합니다. 실제 스키드 스티어는 선회 중심, 횡력과 하중 이동 때문에 같은 바퀴 속도에서도 회전량이 달라집니다.

저속·중속·고속, 빈 차체·최대 적재, 에폭시·콘크리트·경사 바닥에서 제자리 회전과 원주행을 측정합니다. 파라미터를 하나로 유지해야 한다면 가장 위험한 구간의 오차를 공분산과 경로 여유에 반영하고, 필요하면 상태별 보정표를 둡니다.

같은 엔코더에서 만든 위치와 속도를 독립 측정처럼 두 번 넣지 않는다

휠 위치를 적분한 pose와 같은 펄스에서 계산한 twist는 공통 오차를 가집니다. 둘을 독립 센서처럼 강하게 융합하면 정보가 늘어난 것이 아니라 같은 슬립을 두 번 믿어 필터 공분산만 과도하게 작아질 수 있습니다.

로봇 센서 퓨전 글의 측정 원천 목록처럼 각 필드가 어느 센서와 계산에서 나왔는지 표시합니다. pose만 넣을지 twist만 넣을지, 차동 모드로 쓸지 선택하고 혁신값과 공분산 일관성으로 결정합니다.

슬립이 끝난 뒤에는 잔차가 일정 시간 정상 범위에 머물 때 신뢰도를 천천히 되돌린다

한 샘플의 잔차가 작아졌다고 공분산을 즉시 원복하면 바퀴가 붙었다 미끄러지는 구간에서 신뢰도가 흔들립니다. 진입 임계값과 해제 임계값을 다르게 두고, 최소 지속시간과 정상 샘플 수를 만족할 때 단계적으로 회복합니다.

ROS REP-105 좌표계 규약처럼 odom은 짧은 구간의 연속성을, map은 전역 보정을 맡기는 구조가 일반적입니다. 슬립 복구 중에도 odom→base_link가 점프하지 않도록 map→odom 보정과 역할을 분리합니다.

검증은 직선 평균 오차 하나가 아니라 동작·바닥·적재별 궤적과 불확실성 일관성을 본다

측량 기준점, 모션캡처, 레이저 트래커 또는 신뢰할 수 있는 SLAM 궤적으로 동일 시간의 실제 이동을 비교합니다. 직선만 맞추지 말고 제자리 회전, S자, 급정지, 경사와 문턱을 포함합니다.

위치 오차가 공분산이 예측한 범위에 얼마나 자주 들어오는지 보고, 슬립 검출률·오탐률·복구 시간도 함께 기록합니다. 성공 주행만 평균 내면 가장 위험한 바닥 전환과 적재 변화를 놓칩니다.

시험독립 기준확인할 값
긴 직선측량 거리·기준선좌우 반지름·횡편차
제자리·원주행기준 각도·궤적유효 윤거·요 오차
급가감속·저마찰IMU·외부 위치슬립 검출·공분산 팽창
바닥·적재 전환동일 경로 반복오차 분포·복구 시간

운영 로그에는 pose보다 바퀴 원시값·잔차·공분산 상태와 슬립 이유를 함께 남긴다

최종 odom pose만 저장하면 어느 바퀴가 헛돌았는지, IMU와 스캔 중 무엇이 불일치를 만들었는지 재현하기 어렵습니다. 좌우 펄스·속도, 모터 전류, IMU 요레이트, 스캔 상대 이동, 공분산 배율과 상태 전환 이유를 같은 시간축에 둡니다.

로봇 시간 동기화 글처럼 측정 시각과 수신 시각을 구분합니다. 슬립 검출이 실제보다 늦게 보이는 원인이 필터가 아니라 센서 지연일 수 있으므로 원시 타임스탬프와 보정 버전을 보존합니다.

휠 반지름 윤거 시간 동기 IMU 요레이트 스캔 잔차 공분산과 복구 조건을 확인하는 오도메트리 점검표
고정 covariance 하나로 모든 바닥과 동작을 덮지 않습니다. 주행 상태와 독립 센서 잔차로 신뢰도를 바꾸고 복구 조건까지 시험합니다. 출처: 피지컬 AI Lab.

휠 오도메트리 미끄럼 보정에서 자주 묻는 질문

휠 오도메트리 covariance를 0으로 둬도 되나요?

0은 완벽한 측정으로 해석될 수 있어 피해야 합니다. 실제 주행 오차에서 pose·twist 공분산을 추정하고 슬립이 감지되면 관련 축의 값을 키웁니다.

IMU만 있으면 바퀴 미끄럼을 정확히 알 수 있나요?

요레이트 차이는 선회 슬립에 유용하지만 IMU 바이어스와 진동 영향이 있습니다. LiDAR·비전 상대 이동, 모터 전류와 함께 확인하면 원인을 더 잘 분리할 수 있습니다.

스키드 스티어의 wheel separation은 실제 바퀴 간격과 같나요?

순수 구름 모델에서는 그렇지만 실제 선회에서는 횡미끄럼 때문에 유효 윤거가 달라질 수 있습니다. 바닥·속도·하중별 회전 시험으로 보정합니다.

슬립 순간에 GPS나 SLAM pose로 odom을 바로 바꾸면 안 되나요?

제어용 odom에 점프가 생길 수 있습니다. 휠 측정 공분산을 키우고 전역 보정은 map→odom 같은 별도 변환에서 처리하는 편이 연속성을 지키기 쉽습니다.

바퀴 반지름은 줄자로 재면 충분한가요?

초기값으로는 쓸 수 있지만 타이어 압축과 하중을 반영하지 못합니다. 실제 적재 상태에서 긴 직선 누적 거리로 유효 반지름을 맞춥니다.

휠 오도메트리 보정은 기능 안전 위치 검증이나 독립 위치 센서를 대신하지 않습니다. 슬립 검출과 공분산 조정은 실제 차체·바닥·적재·속도에서 검증하고, 제어가 허용할 점프와 불확실성 동작을 별도로 정의해야 합니다.