[자율주행] 센서 캘리브레이션 — 좌표계를 맞추지 못하면 아무것도 맞지 않는다
자율주행/캘리브레이션
· 2026-07-16
본문의 점선 밑줄 친 전문용어를 누르면 설명이 열립니다.
앞 글에서 은 여러 센서가 같은 순간을 각자의 좌표계로 기록한 묶음이라고 했다. 그렇다면 당연한 질문이 남는다. 그 좌표계들을 어떻게 하나로 맞추는가. 이 정합의 정확도를 책임지는 작업이 (calibration) 이다.
캘리브레이션은 눈에 잘 안 띄지만, 자율주행에서 가장 조용하고 치명적인 부분이다. 모델이 아무리 좋아도, 센서 사이가 몇 cm·몇 ms 어긋나 있으면 그 위의 모든 판단이 미세하게, 그러나 일관되게 틀어진다.
세 가지 정렬: 내부·외부·시간
은 크게 세 축으로 나뉜다.
- (intrinsic) — 센서 하나가 세상을 자기 안에 어떻게 담는지.
- (extrinsic) — 센서가 차의 어디에, 어떤 자세로 붙어 있는지.
- 시간 정렬(temporal) — 서로 다른 센서의 타임스탬프가 정말 같은 순간을 가리키는지.
셋 중 하나만 틀어져도 씬은 거짓말을 하기 시작한다.
내부 파라미터(intrinsic)
카메라의 는 3D 점이 2D 픽셀로 찍히는 규칙이다. 초점거리 fx, fy, 주점 cx, cy로 이루어진 카메라 행렬 K, 그리고 렌즈가 직선을 휘게 만드는 왜곡 계수(distortion) 가 여기 속한다.
[u] [fx 0 cx] [X/Z]
[v] = [ 0 fy cy] [Y/Z]
[1] [ 0 0 1] [ 1 ]
이 K가 틀리면 픽셀 좌표가 실제 광선 방향과 어긋난다. 특히 을 안 하면 화면 가장자리의 직선이 휘어, 차선이나 먼 물체의 위치가 밀린다. (왜곡 모델의 종류, 보정이 무엇을 잃는지, 라벨을 어느 이미지 공간에 그릴지는 카메라 이미지의 실제에서 판다.) 라이다에도 자체 내부 보정(빔별 각도·거리 오프셋)이 있다.
외부 파라미터(extrinsic)
는 한 센서 좌표계를 다른 좌표계(보통 차량 기준)로 옮기는 강체 변환 이다. 회전 R(3×3)과 이동 t(3×1)를 4×4 동차 변환으로 묶는다. (회전을 적는 방법과 동차 변환의 근간은 3D 기하 기초 — 좌표계·회전·yaw에서 판다.)
[ R t ]
T = [ 0 1 ]
여기서 자주 무너지는 건 행렬 곱이 아니라 양쪽 좌표계의 축 정의다. KITTI의 velodyne은 x가 전방인데 같은 데이터셋의 camera(rect)는 z가 전방이고, nuScenes의 LIDAR_TOP은 또 y가 전방이다. 규약을 헷갈린 채로 곱하면 오차가 아니라 90° 단위로 돌아간 결과가 나오는데, 값은 멀쩡해 보인다. 그래서 로그마다 어느 규약을 쓰는지를 메타데이터로 남겨야 한다.
라이다 점 p_lidar를 차량 좌표로 옮기려면 p_ego = T_lidar→ego · p_lidar, 카메라에 투영하려면 다시 p_cam = T_ego→cam · p_ego를 거쳐 K로 픽셀에 찍는다. 라이다→카메라 은 이 사슬 전체를 맞추는 일이고, 자율주행에서 가장 많이 쓰이는 조합이다. 이것이 맞아야 "라이다가 잰 3D 박스를 카메라 이미지 위에 정확히 겹쳐 그리기"가 가능하다.
extrinsic이 몇 도만 틀어져도, 먼 거리에서는 그 오차가 미터 단위로 벌어진다. 각도 오차는 거리에 비례해 커지기 때문이다.
시간 정렬(temporal)
세 번째 함정은 시간이다. 라이다는 20Hz, 카메라는 30Hz, 레이더는 또 다른 주기로 돈다. 같은 '샘플'이라 묶어도, 실제로는 서로 몇 ms 차이 나는 순간일 수 있다.
문제는 차와 주변이 움직이고 있다는 점이다. 시속 72km면 1ms에 2cm를 간다. 라이다와 카메라가 20ms 어긋나 있으면, 빠른 차는 이미 40cm 앞에 가 있는데 이미지엔 뒤에 있는 것으로 겹쳐진다. 게다가 라이다는 한 바퀴 도는 동안에도 차가 움직여 안의 점들이 저마다 다른 순간에 찍히므로, 에고 모션으로 되감아(모션 디스큐/deskew) 하나의 순간으로 정렬해야 한다.
왜 '한 번 하고 끝'이 아닌가
캘리브레이션은 공장에서 한 번 맞추면 끝이 아니다.
- 방지턱·온도 변화·진동으로 센서 마운트가 미세하게 틀어진다.
- 정비·교체 후 값이 바뀐다.
- 그래서 주행 중 데이터로 스스로 보정하는 온라인 캘리브레이션과, 값이 벗어났음을 감지하는 모니터링이 필요하다.
데이터 파이프라인 관점에서 캘리브레이션은 씬마다 따라다니는 메타데이터다. 어떤 로그가 어떤 캘리브레이션 버전으로 찍혔는지 추적하지 못하면, 나중에 그 데이터로 학습한 모델의 오차 원인을 영영 못 찾는다.
어긋남이 만드는 실패
캘리브레이션 오차는 요란하게 터지지 않는다. 대신 조용히 일관되게 성능을 갉는다.
- 라이다-카메라 융합이 물체를 살짝 겹쳐 보며 검출을 놓친다.
- 3D 박스가 실제보다 앞/뒤로 밀려 거리 추정이 틀린다.
- 이미지에 라이다 깊이를 얹는 라벨링 도구가 어긋나, 틀린 정답이 데이터에 스며든다.
마지막이 가장 무섭다. 캘리브레이션 오차는 데이터 자체를 오염시키기 때문에, 그 위에 무엇을 쌓아도 흔들린다.
정리
- 캘리브레이션은 센서의 내부()·외부()·시간(temporal) 을 정렬하는 작업이다.
- 외부 파라미터는 좌표계 사이의 회전·이동(동차 변환)이며, 각도 오차는 거리에 비례해 커진다.
- 센서가 움직이는 순간을 다루므로 와 이 필수다.
- 진동·정비로 값이 변하므로 온라인 보정·모니터링이 필요하고, 캘리브레이션은 씬을 따라다니는 메타데이터로 관리해야 한다.
좌표계를 맞췄다면, 이제 그 위의 3D 데이터를 어떻게 '표현'하느냐가 남는다. 다음 글은 3D 데이터 표현 — 포인트 클라우드부터 복셀·BEV까지다.