LiDAR 노이즈 필터링
저가형 RPLidar C1의 노이즈 많은 데이터에서 안정적인 가이드 레일 추적을 위한 다단계 필터링 파이프라인
배경
Wally (벽면 리프트)는 가이드 레일 추적을 위해 RPLidar C1을 사용합니다.
문제: 저가형 LiDAR는 거리/각도 측정에 노이즈가 많아서 raw 데이터로는 정밀 제어가 불가능합니다.
목표: 노이즈 많은 LiDAR 스캔에서 안정적인 가이드 레일 위치와 각도 추출.
핵심 문제
노이즈 특성이 다양해서 단일 필터로는 처리가 불가능합니다:
- 공간 이상치: 반사, 먼지, 가림으로 인한 튀는 값
- 시간 떨림: 프레임마다 각도/거리가 흔들림
- 움직임 민감도: 이동 중엔 빠른 반응, 정지 시엔 부드러운 출력 필요
핵심 아이디어
노이즈 유형마다 다른 필터가 필요합니다. 각 단계가 하나의 노이즈 유형을 처리하는 파이프라인을 구성했습니다.
접근 방식
1) 엣지 감지 + 영역 분할
거리 불연속으로 가이드 레일과 벽을 분리합니다:
- X 좌표(측면 위치)로 점들을 정렬
- 거리 차이가 0.12m 이상인 지점에서 엣지 감지
- 연속된 점들을 세그먼트로 그룹화
- 가장 가까운 세그먼트를 가이드 레일로 선택 (가이드는 항상 벽보다 가까움)
2) Trimmed PCA로 직선 피팅
RANSAC은 무작위 샘플링을 사용하므로 결과가 매번 다릅니다. Trimmed PCA는 일관된 결과를 제공합니다:
- 1차 PCA: 모든 점에 직선 피팅
- 잔차 계산: 직선까지 수직 거리
- 이상치 제거: 잔차가 큰 상위 **20%**를 버림
- 2차 PCA: 남은 점들로 최종 직선 피팅
등방성 검사: 고유값 비율이 > 0.15면 거부 (점들이 직선을 이루지 않음)
3) 법선 벡터에 EWMA 적용
각도 계산 전에 직선 방향을 스무딩합니다:
- 2D 법선 벡터에 EWMA (α = 0.15) 적용
- 부호 연속성: 이전 벡터와 내적이 음수면 방향 뒤집기
각도가 아닌 법선 벡터를 쓰는 이유: 각도에 EWMA를 걸면 ±180° 근처에서 튑니다.
4) 1-Euro 필터로 적응형 스무딩
마지막 단계로 각도와 거리에 적응형 로우패스를 적용합니다.
공식: cutoff = min_cutoff + beta × |변화율|
| 상태 | 변화율 | 컷오프 | 동작 |
|---|---|---|---|
| 정지 | 낮음 | 0.3 Hz | 강하게 스무딩 |
| 이동 | 높음 | 높아짐 | 빠르게 반응 |
파라미터 설정: min_cutoff = 0.3 Hz, beta = 0.001
5) 디바운스로 유효성 판정
시작 시 성급한 유효 판정을 방지합니다:
- 최초 감지: 디바운스 카운트의 2배 필요
- 이후: 디바운스 카운트의 1배 필요
디바운스 카운트는 EWMA 정착 시간에서 계산합니다: N = ceil(log(0.1) / log(1 - α))
트레이드오프
- 지연 추가: 다단계 필터링으로 지연이 발생합니다 (EWMA 정착 + 디바운스).
- 고정 트림 비율: 20%가 실제 이상치 비율과 안 맞을 수 있습니다.
- 파라미터 튜닝: 각 단계마다 환경에 맞게 조정이 필요합니다.
결과
- 안정적인 출력: 노이즈 많은 raw 스캔에서 일관된 각도/거리
- 결정적: 같은 입력이면 같은 출력 (무작위 샘플링 없음)
- 적응형: 정지 시 부드럽고 이동 시 반응 빠름
- 강건: Trimmed PCA로 공간 이상치, 1-Euro로 시간 떨림 처리
핵심 교훈
다단계 필터링으로 다양한 노이즈 특성을 처리했습니다:
- 공간 이상치 → 엣지 감지 + Trimmed PCA (20% 트림)
- 방향 떨림 → 법선 벡터에 EWMA (α = 0.15)
- 움직임 적응 → 1-Euro 필터 (적응형 컷오프)
- 시작 안정성 → EWMA 기반 디바운스