MPU6050을 처음 연결했을 때는 정지한 센서에서 자이로 평균을 구한 뒤 측정값에서 빼면 된다고 생각했어요. 이 절차는 전원을 켠 시점의 오프셋을 줄여 주지만, 온도와 시간에 따라 변하는 바이어스, 축 비직교성, scale factor, 가속도계와 자이로스코프 사이의 misalignment까지 설명하지는 못해요.
센서값이 그럴듯해 보이는지 확인하는 일과, 그 값으로 만든 추정기가 언제 실패하는지 검증하는 일도 달랐어요. 이번에는 질문을 바꿨어요. “보정을 넣으면 오차가 줄어드는가”보다 “어떤 운동과 결측 조건에서 그 주장이 깨지는가”를 먼저 확인했습니다.
이 글의 수치는 실제 IMU 성능시험 결과가 아니에요. 6-DoF 궤적에 오차와 결측을 주입해 실행한 합성 software validation과, 기존 프로젝트 로그의 시간 정보만 감사한 결과예요. 실물 센서의 정확도나 특정 제품의 성능으로 읽으면 안 됩니다.
정지 평균과 센서 모델은 답하는 질문이 달라요
정지 평균은 시작 시점의 자이로 바이어스를 추정하는 초기화 방법이에요. 센서가 움직이는 동안 평균을 내면 실제 각속도까지 오프셋으로 흡수하고, 온도가 달라지거나 바이어스가 움직이면 처음 구한 값과 다시 어긋납니다.
Tedaldi 등은 여러 정적 자세와 자세 사이의 회전 구간을 이용해 가속도계와 자이로스코프의 intrinsic parameter를 추정했어요. 한 자세의 평균은 런타임 오프셋을 다루고, 다자세 캘리브레이션은 축과 배율을 포함한 모델을 식별합니다. 둘은 서로 대체할 수 없어요.
가속도 바이어스가 일정하고 자세가 정확하다고 두면 위치 오차는 시간의 제곱에 비례해 커집니다.
자이로 바이어스는 자세를 기울이고, 잘못 기울어진 좌표계에서 중력을 제거하면 중력 일부가 수평 가속도로 남아요. 작은 각도와 일정한 바이어스를 가정하면 위치 오차의 주도항이 시간의 세제곱에 비례할 수 있습니다.
Farrell 등의 튜토리얼은 이런 측정 오차를 연속시간 모델과 이산 상태공간 모델로 연결합니다. 실제 추정기에서는 바이어스와 잡음을 상태, 공분산, 측정 갱신과 함께 다뤄야 해요.
출처: Farrell 외, IMU error-modeling tutorial
문헌 61건을 같은 수준의 근거로 취급하지 않았어요
검색 결과를 많이 모으는 것보다 원문을 실제로 확보했는지 구분하는 데 시간이 더 들었어요. 중복을 제거한 후보는 61건이었습니다. 분류 결과는 CORE_FULLTEXT 25건, 국내 WEB_FULLTEXT 1건, METADATA_ONLY 33건, EXCLUDED 2건이에요. 따라서 “61편의 원문을 모두 검토했다”고 쓰지 않습니다.
파일을 받았다는 사실도 원문 확보의 증거로 삼지 않았어요. 후보별로 기대한 제목, 저자, DOI 또는 arXiv 식별자를 PDF 첫 페이지와 본문 메타데이터에 대조했습니다. 그 과정에서 파일명과 실제 논문이 다른 오다운로드 2건을 찾았고, 공식 원문으로 다시 확인했어요. 논문 대신 저장된 접근 차단 HTML과 같은 논문의 중복 버전도 원문 수에서 분리했습니다.
문헌이 말한 사실과 이번 실험의 선택도 갈라 적었어요. 예를 들어 Tedaldi의 절차가 다자세 보정의 근거는 되지만, 이번 합성 벤치마크의 궤적 구성이나 평가 지표를 정당화하는 근거는 아닙니다. Forster 등의 preintegration도 키프레임 사이 IMU 제약과 바이어스 보정의 이론적 근거이지, 아래 수치의 실센서 재현성을 보장하지 않아요.
출처: Forster 외, on-manifold IMU preintegration
국내 원문에서는 외부 가속도와 자이로 바이어스를 상태에 포함하는 자세 추정 방법을 비교한 연구를 확인했습니다. 이 문헌 역시 동적 가속도를 중력으로 오인하는 모델링 문제의 배경으로만 사용했어요.
출처: 장태호 외, 외부가속도와 바이어스를 고려한 자세추정 비교
6-DoF 합성 검증은 실패 조건을 찾도록 만들었어요
검증에는 nominal, low planar, high dynamic 세 운동 프로필을 사용했습니다. 각 프로필에서 30개 seed를 실행하고, 원시 적분, 정적 바이어스 보정을 적용한 fixed-step 적분, gap-aware 적분을 비교했어요. Fixed-step은 현재 수신 샘플을 nominal dt로 적분하고, gap-aware는 이전 수신 샘플을 다음 timestamp까지 causal ZOH로 유지합니다. 두 구현은 정보량은 같지만 dt와 sample alignment가 함께 달라요. 세 프로필은 같은 seed 집합에 적용한 조건이며 독립 표본이 아닙니다. seed도 Monte Carlo 반복을 뜻할 뿐 물리 센서 30대나 실험 30회의 대체물이 아니에요. 위치와 속도 관측을 받는 aided observer도 함께 실행했지만, 이 방법은 IMU만 쓰는 적분기보다 정보가 많으므로 같은 순위표에 놓지 않았습니다.
두 가설의 차이는 seed-paired ATE로 계산하고 bootstrap 95% 신뢰구간을 구했어요.
- H1: 정적 바이어스 보정을 적용하면 원시 적분보다 ATE가 줄어드는가
- H2: 현재 샘플·nominal
dt정책에서 이전 샘플 ZOH·수신 간격 정책으로 함께 바꾸면 ATE가 어떻게 달라지는가
아래 결과는 모두 profile-conditioned exploratory 분석입니다. 실험 전에 어느 프로필을 일차 분석으로 삼을지 사전등록하지 않았으므로 primary 결과가 아니며, 가설을 확증했다고 쓰지 않습니다. d_z는 seed별 차이의 paired standardized effect size예요.
| 프로필 | 비교 | 평균 ATE 차이 | 95% CI | 읽을 수 있는 범위 | |
|---|---|---|---|---|---|
| nominal | H1, raw - calibrated | 1.990 m | [1.092, 2.906] | 0.741 | 이 합성 조건에서는 정적 보정 뒤 ATE가 작았음 |
| nominal | H2, fixed - gap-aware | 2.336 m | [1.973, 2.721] | 2.186 | 이 합성 조건에서는 결측 간격 반영 뒤 ATE가 작았음 |
| low planar | H2, fixed - gap-aware | -0.217 m | [-0.270, -0.167] | -1.468 | gap-aware가 오히려 나빴던 반례 |
| high dynamic | H1, raw - calibrated | 0.294 m | [-0.863, 1.388] | 0.091 | 구간이 0을 포함해 개선 방향이 불확실함 |
nominal만 보면 두 보정이 모두 좋아 보입니다. low planar에서는 H2의 방향이 뒤집혔고, high dynamic에서는 H1의 신뢰구간이 0을 포함했어요. 평균 하나로 “보정이 항상 낫다”고 결론 내리면 이 두 실패 조건이 사라집니다.
작은 오차가 곧 공정한 비교는 아니에요
nominal 프로필에서 gap-aware 적분기의 ATE는 1.412 m, 마지막 위치 오차는 3.605 m였어요. 최종 위치 오차가 2.0 m를 넘거나 최종 자세 오차가 10.0도를 넘으면 실패로 세었고, 이 기준의 실패율은 86.7%였습니다. 결측을 반영해 fixed-step보다 나아졌어도 독립 항법기로 충분하다는 뜻은 아니에요.
aided observer의 nominal ATE는 0.035 m였습니다. 외부 위치와 속도 관측을 받았기 때문에 IMU 적분기와 정보량이 다릅니다. 0.035 m와 1.412 m를 나란히 놓고 알고리즘 순위를 매기면 외부 관측의 효과와 적분 방법의 효과가 섞여요. aided 결과는 “관측 갱신이 누적 오차를 끊을 수 있다”는 sanity check로만 남겼습니다.
Forster의 preintegration이 다루듯 카메라나 LiDAR 관측 사이에서는 IMU가 상대 운동을 전달합니다. 외부 관측이 있다는 이유로 IMU 오차 모델이 없어지는 것은 아니에요. 관측 공백이 길어지면 바이어스와 중력 투영 오차를 견뎌야 하는 구간도 길어집니다.
이번 gap-aware의 뜻과 한계를 좁혀 썼어요
합성한 timestamp 변화는 물리적인 sampling jitter가 아닙니다. 기준 샘플 시간에 더한 metadata timestamp error의 proxy예요. 센서 내부 클록, 버스 지연, 운영체제 스케줄링을 각각 재현한 모델도 아닙니다.
gap-aware 적분기는 미래 샘플을 보지 않고 마지막으로 받은 측정값을 유지하는 causal last-sample zero-order hold(ZOH)를 사용했어요. 고차 보간이나 실제 센서의 missing-sample recovery를 검증한 결과가 아닙니다.
따라서 H2 수치는 timestamp 처리 하나의 효과가 아닙니다. dt와 sample alignment가 함께 달라진 두 구현 정책의 대조예요. 이 차이를 분리하려면 fixed-dt와 gap-aware 양쪽의 quadrature를 같게 둔 추가 ablation이 필요합니다.
마지막 nominal packet 자체가 없었던 경우는 10개 trial, 네 추정기를 합쳐 40행이었어요. 그런데 terminal ZOH는 이 경우에만 생기지 않았습니다. Timestamp를 쓰는 두 경로를 별도로 세면 181개 trial·362행은 마지막 metadata timestamp가 20.0초보다 일러 최대 0.02초를 더 전파했어요. 반대로 120개 trial·240행은 timestamp가 종료 시각을 넘었고, 상태를 되감지 않아 최대 0.003324초 앞선 estimator state를 20.0초 truth와 비교했습니다. 이 비대칭 clamp도 현재 결과의 한계예요. 같은 프로필·오차 조건·seed에서는 모든 적분기가 같은 retained samples를 공유하므로 평가점 수 K도 같습니다. 다만 ATE를 실제로 받은 샘플 그리드에서 계산했기 때문에 dropout을 켠 조건과 끈 조건 사이에는 K가 달라져요. 다음 검증에서는 공통 시간 격자로 재표본화한 ATE와 수신 샘플 기준 ATE를 함께 보고해야 합니다.
프로젝트 로그는 시간 품질만 말할 수 있었어요
기존 프로젝트 로그 1,654행도 따로 감사했습니다. timestamp 역전은 없었지만 중복 timestamp가 75건 있었고, 100 ms를 초과한 인접 간격은 803건이었어요. 정확히 100 ms인 간격은 >100 ms 집계에서 제외했습니다. 다만 이 시간 열의 clock source를 확인할 수 없으므로, 이 수치는 logger의 인접 timestamp 품질만 말합니다. 물리 IMU의 sampling jitter나 sensor packet dropout을 측정한 결과로 읽으면 안 돼요.
이 로그에는 raw 가속도계·자이로스코프 6축, sensor timestamp, 설정된 output data rate, 온도, 독립 ground truth가 없었어요. 따라서 Allan deviation, intrinsic calibration, 자세 정확도, VIO drift를 이 데이터로 계산할 수 없습니다. 이 로그에 붙일 수 있는 주장 상한은 timing_telemetry_case_study_only입니다. 시간 텔레메트리 사례로는 쓸 수 있지만 IMU 정확도 실험으로 승격할 수 없다는 뜻이에요.
빠진 열을 추정하거나 메시지 개수를 IMU 샘플 수로 바꾸지 않았어요. 데이터가 답하지 못하는 질문은 결과표를 더 만드는 것으로 해결되지 않습니다.
PID와 depth camera에도 같은 증거 계약을 적용할 수 있어요
센서와 제어 실험을 정리할 때는 주장, 필요한 관측값, 분석 단위, 반례, 주장 상한을 먼저 적습니다. 이 다섯 항목을 evidence contract로 두면 로그가 생긴 뒤에 질문을 바꾸는 일을 줄일 수 있어요.
| 분야 | 주장 예시 | 최소한 남길 증거 | 이 증거가 없을 때의 상한 |
|---|---|---|---|
| IMU | 보정이 자세·위치 오차를 줄인다 | raw 6축, sensor·host timestamp, 온도, 설정값, 동기화된 ground truth | 통신·시간 텔레메트리 사례 |
| PID | 제어기가 추종오차와 정착시간을 줄인다 | setpoint, 측정 상태, 제어 입력, 포화 상태, 공통 clock, 반복 trial | 한 실행의 응답 예시 |
| depth camera | 조건별 깊이 오차와 결측률을 줄인다 | raw depth·confidence, intrinsics, 거리·재질·조명 조건, ground truth surface | 장면별 정성 비교 |
PID에서는 평균 오차가 줄어도 actuator saturation이나 지연 구간에서 불안정해질 수 있어요. depth camera는 전체 RMSE가 좋아도 반사체, 먼 거리, 낮은 텍스처에서 결측이 몰릴 수 있습니다. IMU의 low planar와 high dynamic 반례처럼, 평균에 묻히는 조건을 별도 프로필로 남겨야 해요.
다음 단계는 실제 데이터의 주장 범위를 먼저 고정하는 일이에요
실물 IMU 검증에서는 다음 항목을 한 로그에 묶을 계획입니다.
- 가속도계와 자이로스코프의 raw 6축, sensor timestamp와 host 수신 시각을 함께 기록합니다.
- output data rate, 측정 범위, 필터 설정, 온도, packet sequence와 읽기 실패를 남깁니다.
- 정지 구간, 반복 회전, 저동적 평면 운동, 고동적 6-DoF 운동을 분리하고 각 조건을 반복합니다.
- motion capture, 정밀 회전대, 검증된 외부 pose 중 하나를 동기화해 ground truth를 확보합니다.
- 데이터를 보기 전에 primary 프로필, 일차 지표, 실패 기준, 제외 규칙을 고정합니다.
- 캘리브레이션에 쓴 trial과 평가 trial을 나누고, 공통 시간 격자와 수신 샘플 격자의 결과를 함께 공개합니다.
그 전까지 이번 결과의 지위는 실패지향 6-DoF 합성 검증과 시간 텔레메트리 사례예요. nominal에서 보정 효과가 관찰됐고, 다른 운동 프로필에서는 방향이 뒤집히거나 불확실해졌습니다. 다음 실험은 더 작은 숫자를 만드는 일이 아니라, 같은 주장이 실물 센서와 사전등록한 조건에서도 남는지 확인하는 작업입니다.