[IT 심층 분석]
스마트폰 카메라 OIS 모듈의 자이로 센서 데이터 폴링 주기 최적화 및 떨림 상쇄기
김민준 · IT 시스템 엔지니어|
광학식 손떨림 방지 즉 OIS(Optical Image Stabilization) 기술은 저조도 환경에서 셔터 스피드를 최대한 확보해 노이즈를 억제하는 가장 물리적이고 강력한 수단입니다. 하지만 렌즈를 전자기력 구동계 위에서 아주 미세하게 띄워놓고 손의 흔들림을 상쇄하는 이 기술의 이면에는 엄청난 양의 센서 데이터 처리가 얽혀 있습니다. 최근 커스텀 펌웨어를 올린 프로토타입 하드웨어 모델에서 동영상 레코딩을 할 때마다 주기적으로 화면이 파도치듯 치솟는 롤링 바운스 현상이 보고되었습니다. 초기에는 VCM 코일의 하드웨어 불량이나 기구적 마찰을 의심했지만 놀랍게도 문제의 근원은 운영체제가 자이로 센서에서 데이터를 끌어오는 폴링 타이밍의 소프트웨어적 불일치에 있었습니다. 손떨림의 진동 주파수와 시스템의 응답 주기가 공진을 일으켜 오히려 진동을 증폭시켜버린 환장할 사태였죠.
문제를 진단하기 위해 자이로스코프 센서가 내뿜는 X축 Y축 각속도 데이터의 주파수 응답을 분석했습니다. 사람의 손떨림 대역은 대개 1Hz에서 10Hz 사이의 저주파 대역에 집중됩니다. 따라서 Nyquist-Shannon 샘플링 이론에 의거하여 이론적으로는 20Hz 즉 50밀리초 주기로만 데이터를 폴링해도 파형의 복원이 가능해야 합니다. 그러나 OIS 구동계는 단순히 파형을 파악하는 것을 넘어서서 리얼타임으로 모터 전류값을 업데이트해야 하는 정밀한 폐루프 제어계입니다. 커널 드라이버에서 설정된 I2C 버스를 통한 센서 폴링 레이트가 200Hz 였는데 운영체제 내부의 타이머 틱 해상도와 스케줄링 오차로 인해 실제 소프트웨어 데몬으로 데이터가 넘어오는 주기에 지터(Jitter)가 잔뜩 끼어 있었습니다. 무려 5밀리초 간격이어야 할 타임스탬프가 어떤 때는 2밀리초 어떤 때는 8밀리초로 들쭉날쭉하게 들어왔던 것입니다.
이러한 지터는 제어 로직의 적분 및 미분 연산에 치명적인 노이즈로 작용했습니다. 미분항은 데이터 간의 시간 차이에 극도로 민감하기에 미세한 주기 오차에도 제어 출력값을 널뛰게 만들어버렸죠. 이를 타파하기 위해 CPU 스케줄러에 의존하는 소프트웨어 폴링 구조를 버리고 하드웨어 인터럽트 기반의 정시 처리 구조로 전면적인 드라이버 수술을 감행했습니다. 자이로스코프 내부에 있는 FIFO 하드웨어 버퍼를 활성화시키고 지정된 워터마크 레벨에 도달할 때만 AP에 핀 인터럽트를 발생시키도록 SPI 인터페이스로 버스를 교체하고 레지스터를 세팅했습니다. 데이터가 일정량 모였을 때 DMA를 통해 CPU 개입 없이 메모리로 즉각 복사되도록 구성하여 소프트웨어 스케줄링이 일으키는 지터의 근원을 완전히 뿌리뽑았습니다.
또한 이렇게 정제되어 메모리에 도달한 자이로 데이터를 기반으로 구동 모터를 제어하는 펌웨어 계층에 칼만 필터(Kalman Filter) 알고리즘의 예측 모델을 새롭게 접목했습니다. 센서 데이터가 도착하기 전의 아주 짧은 찰나의 순간에도 과거의 경향성을 바탕으로 렌즈의 예측된 위치를 선제적으로 구동시킴으로써 제어 레이턴시를 제로에 수렴하게 만들었습니다. 펌웨어가 렌즈를 밀어내는 타이밍이 손이 떨리는 타이밍을 물리적으로 완벽하게 따라잡자 괴랄하게 일렁이던 파도 현상은 마치 삼각대에 고정한 듯한 매끄러운 뷰파인더 뷰로 탈바꿈했습니다. 초소형 렌즈를 공중에 띄우는 OIS는 기계공학의 승리처럼 보이지만 그 내면에는 수백 헤르츠의 오차를 다투며 인터럽트와 메모리를 넘나드는 치열한 저수준 소프트웨어 엔지니어링의 정수가 담겨 있다는 것을 저는 이 지독한 디버깅을 통해 처절하게 깨달았습니다.