개발/Project

360도 카메라 만들기(VR) - HW부터 SW까지

재근이 2021. 10. 19. 23:24
반응형

목적

2015년도 학생 때 진행했던 프로젝트에서 직접 제작한 "360도 VR 카메라"를 기록하기 위해 작성한다.

아래 영상은 그때 당시 프로젝트 끝나고 만들었던 영상 중 담당했던 360도 VR카메라 부분이다.

(배경음악이 있으니 소리를 원치 않으시면 음소거가 필요합니다.)

360도 VR 카메라 제작 영상

VR 화면


프로젝트 소개

"쿼드콥터와 카드보드를 이용한 360도 VR 체험"이라는 프로젝트 명이고, 필자 포함 3명이서 진행했었다.

프로젝트의 전체 콘셉트는 아래 그림처럼 쿼드콥터(드론) 밑에 360도 카메라를 달고, 사용자가 VRMYO라는 근전도 컨트롤러로 조종 체험을 하게 하는 것이다.


담당 부분

여기서 나는 360도 VR 카메라를 만드는 것을 담당했었고, 나머지 2명이 쿼드 콥터와 VR, MYO 컨트롤을 담당했다.

2015년 그때 당시에도 360도 카메라는 제품화가 되어있었지만, 학생이 360도 카메라를 직접 제작한 이미지나 영상은 찾질 못해서 진행했었다.

없었는지 못 찾았는지는...

이 글에서는 담당했던 360도 VR 카메라 만들기에 대한 내용만 작성했다.


전체 시스템 구조

그때 당시 그려놨던 그림인데, 여기서 내가 담당했던 부분은 가운데 Raspberry pi부터 Android에서 영상 합성까지이다.


360도 카메라 하드웨어 제작

라즈베리파이나 필요한 모듈들은 구매를 했지만, 전체적으로 기본 회로 납땜부터 프레임 제작(3D 프린팅)까지 하드웨어 제작을 직접 했다.

하드웨어 완성도

초기 실패한 구성

처음에 잘 모르는 부분도 많았고 돈을 아낀다고 아래와 같이 설계했다가 실패했었다.

실패한 이유는 실제 6개의 카메라에서 어떤 화질이 얼마만큼의 속도로 받을 수 있는지 계산을 제대로 하질 못해서이다.(단순이 되겠지 라고 안일하게 생각했었다.)

잘못된 설계로 인해 시간을 낭비하게 돼서 프로젝트 일정이 촉박했었다.

실패한 구조

초기 문제점

  • UART 시리얼 통신의 속도 한계
  • 구매했던 카메라의 화질
  • 불가능한 1개의 라즈베리파이에서의 6개의 시리얼 인터페이스

 

수정한 하드웨어 구성

수정한 하드웨어 구성은 <라즈베리파이+광각 카메라+기타 부품>이 1개의 세트이며 총 6개의 세트이다.

초기 문제점을 해결하기 위해, 라즈베리파이 전용 카메라 1개당 라즈베리파이 보드 1개를 사용했다.

수정한 구조

6면의 카메라 이미지를 받으려고 6개의 라즈베리파이를 사용한 건 오버헤드를 알고 있었고, 컸다.

하지만 이미 프로젝트를 계획하고 시작하고 있는 단계이기에 효율성을 따지는 건 늦었고 제 시간이 안에 완성하는 것이 중요했었다.

 

프레임 제작

3D 프린터로 외형 제작을 위해 솔리드웍스라는 툴로 3D 모델을 그렸다.

부품 하나씩 어떻게 조립해야 할지와 어떻게 하면 이때 당시의 3D 프린팅의 문제점이었던 프린팅의 결 방향으로는 약했던 부분을 어떻게 피할 수 있을지 고민하면서 만들었다.

가운데 알루미늄 프레임은 쿼드콥터와 연결을 위해 따로 특수 제작 요청한 프레임이다.

360도 카메라 3D 모델링 및 3D 프린팅


이미지 전처리

지금 하고 있는 업무가 영상 스트리밍 쪽이어서 ffmpeg를 이용하고 있고, 따로 공부 차원으로 ffmpeg을 이용한 사이드 프로젝트를 진행했어서 더 이 프로젝트가 아쉽게 생각이 난다.

이때 ffmpeg을 사용했으면 어땠을까라는 생각은 들지만, 이미 지나간 일 어쩔 수 없으니...

 

스마트폰에서 6면의 이미지들을 각각 수신해서 합성하기 전에 라즈베리파이에서 간단한 전처리를 해줬다.

전처리를 하는 이유는 화질은 안 좋아지지만 ffmpeg을 사용하지 않았기에 전송 속도가 많이 부족했고, 광각렌즈로 인해 이미지가 뒤틀리는 왜곡현상을 잡기 위해서이다.

각 6면의 카메라가 영상을 캡처하고, 영상 전송 속도를 위해 스마트폰으로 전달하기 전에 영상의 크기를 줄였다.

그러고 나서 광각 렌즈로 인해 발생한 왜곡 현상까지 보정하고 스마트폰으로 전달 했다.


Equirectangular Panorama

"Equirectangular Panorama"란 360도 구의 면을 한 장의 평면 이미지를 펼친 것을 말한다.

쉽게 생각하면 우리가 자주 봐왔던 지구의 세계 지도의 형식을 보면 된다

Equirectangular Panorama

 

"Equirectangular Panorama"360도 VR을 공간의 배경을 만들기 위해 필요했다.

OpenGL의 구 텍스처 매핑 API를 이용해서 360도 VR 공간을 만들 수 있기 때문이다.

360도 구의 안에서 바깥을 바라보면 360도의 공간의 배경으로 볼 수 있다

구 텍스처 매핑

 

그래서 카메라로 찍고 있는 앞, 뒤, 좌, 우, 위, 아래 6면을 "Equirectangular Panorama" 이미지로 만들어줘야 했다.

카메라로 찍은 6장을 1장 이미지로 변환

 

그래서 어떻게 만드는 건데!? 하고 찾아보는데 아무리 찾아봐도 그 당시에는 못 찾았었다.

수식도 못 찾겠고, 라이브러리도 못 찾겠고 프로젝트를 못 끝낼까 봐 고통스러웠지만 우연히 생각난 아이디어가 있었다.

전자기학 시간에 구좌표계, 직교 좌표계2/3차원 좌표계 변환을 배웠었는데, 이걸 활용하면 나오지 않을까라는 생각이 들어서 그 아이디어로 이런저런 방법을 구상했었다.

전체적인 콘셉트의 그림은 아래와 같다.

Equirectangular Panorama 만들기 위한 아이디어

 

이걸 좀 더 디테일하게 풀면 아래와 같다.

이걸 다 말로 풀어서 설명하기에는 머리만 아프기만 하기에...

혹시 필요한 사람이 있다면 참고할 수 있도록 아래에 자료를 남긴다.


Little planet

Equirectangular Panorama의 구상을 확실히 잡으니 자신감이 생겼었다. 그래서 Equirectangular Panorama 뿐만 아니라 다른 360도 평면 이미지인 Little planet도 진행했다.

실제 작은 행성과 같이 보이도록 이미지를 만드는 건데 아래 그림을 보면 어디선가 봤을 법한 이미지이다.

Little planet

왼쪽의 사진을 만들기 위해 오른쪽처럼 6면의 이미지를 합성해줘야 한다.

Little planet을 만들기 위한 콘셉트 그림은 인터넷에서 그림으로 많이 찾을 수 있었다.

"Stereographic Projection"이라는 방법으로 만드는 건데 쉽게 말하면 3차원의 구의 기준점을 잡고, 아래에 있는 2차원 평면에 투과해서 만드는 거다.

Stereographic Projection

 

"Stereographic Projection"의 콘셉트에 대한 수식 하나만 이렇게 만들어 놓고,

앞에서 고생하면서 만들어 놓은  "Equirectangular Panorama"방법중간중간일부 수식만 조금 쏙쏙 틀어주면 된다.

쏙쏙 바뀌는 부분
Little planet 만들기 위한 아이디어


완벽한 이미지로 사전 테스트

열심히 만들어 놓은 수식이 문제가 없는지 확인 및 수정하기 위해서 완벽한 이미지를 이용했다.

직접 만든 360도 카메라오차가 있을 거라고 예상을 하고 있었기에 완벽한 이미지로 테스트가 필요했다.

테스트용 안드로이드 앱을 제작했고, 인터넷에서 구한 6장의 완벽한 이미지로 이미지 합성 기능을 마무리했다.

이미지 합성 결과

실제 이미지 테스트

완벽한 이미지로 이미지 합성에 성공했기에 수식은 문제가 없다고 판단이 했고,

실제 360도 카메라 제작 후 찍은 이미지로 영상으로 조합했다.


최종 결과

프로젝트는 3개월 동안 진행을 했었다.

360도 카메라 하드웨어 제작부터, 이미지 캡처, 전송, 합성 그리고 최종 카드보드 SDK까지 적용해서,

VR로 360도 화면을 보는 것 까지 어찌어찌 마무리를 했다.

프로젝트 제목 소개를 "쿼드콥터와 카드보드를 이용한 360도 VR 체험"이라고 했지만, 담당하지 않았던 부분은 쓰진 않았다.


부족한 점

  • 왜곡 보정으로 인한 화각 변경으로 이미지 잘림 문제
  • 같은 물체를 찍더라도 카메라의 각도에 따른 빛의 양에 대한 보정이 필요했음

 

뭐 많은 부족한 점들이 있겠지만, 대표적으로2가지가 문제로 부자스러운 결과가 나왔다.

빛 보정은 어느 정도 예상은 했지만 시간이 부족해서 전혀 신경도 쓰지를 못했다.

왜곡 보정으로 이미지 화각이 줄어든 현상은 실제 겪기 전까진 예상하지 못했고,

예상했더라도 판매되는 더 큰 화각의 렌즈를 구할 순 없었다.

또는 카메라를 6개 보다 더 많이 쓰는 구조로 생각해서 설계부터 다시 해야 했다.

예상한 이미지 겹치는 부분 <=> 실제 이미지 겹치는 부분


프로젝트를 통해...

여러 가지를 경험하면서 공부가 많이 됐었다.

이 글에서 많이 생략되었지만 리눅스 환경, 안드로이드, 하드웨어, 네트워크, 영상처리, 수학(?) 등등등 정말 많은 것을 경험도 했었고 재미있었다.

가끔 은근히 어필하는 건데, 학생 혼자서 360도 VR카메라를 하드웨어부터 360도 이미지까지 직접 합성해서 이만큼 다 만든 건 없다. (없어야 한다)

다 실제 회사에서 만든 제품들일뿐 학생 프로젝트로 진행한 건 찾을 수 없었다. 지금 글을 쓰면서 살짝 검색을 더 검색을 해봤지만, 6년이 지난 지금도 보이지는 않는다.

아니면 만들고 싶지 않아서 안만드는건가... 나도 지금은 다시 만들고 싶지는 않다.

이 글을 통해...

이 글에서 실제 360도 카메라를 구현하기 위한 자세한 내용들을 적기에는 양이 많기도 하고,

지금 다시 생각해서 쓰기에는 오래전이기에 힘들어서 적을 순 없지만,

누군가가 혹시 360도 카메라를 만든다면 아이디어를 얻어갈 수 있었으면 한다.

과거에 내가 겪었던 문제를 누군가는 다시 격지 않기를 바라며 마무리하겠다.

반응형