2023년 1학기: 졸업 프로젝트(Capstone Design)
학부 시절, 유종의 미를 거두다
[Github 저장소 바로가기]
[졸업 프로젝트: 캡스톤 디자인(Capstone Design)]
어느덧 졸업 학년이 되었습니다. 저는 어느새 “학석박” 통합과정을 약정했고, 한두 차례 가상현실 실험에 피실험자로서 참여하고 연구자로서도 주도해보는 등 다양한 경험을 쌓았습니다. 그렇게 맞이한 4학년, 졸업 프로젝트였습니다.
본래 캡스톤 디자인이란, 학부 3년간 배웠던 지식을 바탕으로 새로운 프로젝트를 제안하고 한 학기 동안 수행하면서 나의 가장 멋진 포트폴리오를 만드는 시간일 것입니다. 그렇다면 저는 무엇으로 캡스톤 디자인을 해야 할까요.
AI 시대에 VR로 승부를 보다
지난 5년간 SW 분야는 AI의 급속한 발전으로 인한 대격변이 있었습니다. 이는 대학도 피해갈 수 없었죠. 몇 년 전 캡스톤만 하더라도 단순한 애플리케이션 개발에 그쳤는데, 지금은 거의 모든 팀이 AI 기술을 포함하여 캡스톤 주제를 삼고 있습니다. 이는 지난 1~2년 전 선배님들의 코로나 시기의 캡스톤 영상을 돌려보면 쉽게 알 수 있습니다. 이제 AI가 없으면 그 프로젝트의 가치는 크게 절하되는 시대입니다.
그래도 가상현실 연구실이니, 그리고 교수님의 의견 역시 그러하니, VR을 메인 주제로 캡스톤을 진행하게 되었습니다. 3인 1조였는데, 연구실 동료 후배와 그가 아는 한 형(!)과 함께 팀을 꾸렸고, 주제를 결정하기 위해 오랜 기간 회의를 진행했습니다. 그 결과, 지난 학기의 경험을 살리기도 하고, 최근에 한 연구의 경험을 살리기도 해서, 뭔가 범용적인 원격 회의 시스템을 만들면 좋을 것 같다는 결론에 다다릅니다. 하지만, 지도교수님은 좀 마음에 들어하지 않으셨는데요, 통상적인 캡스톤 디자인이 ‘애플리케이션 개발’에 초점이 맞춰져 있다 보니, ‘학술적 의미’가 크지 않다는 점입니다. 교수님의 관심은 “논문을 쓸 수 있느냐”이기 때문입니다. 그런데 어떻게 하나요. 개발 결과물 평가를 제 지도교수님만 하진 않기 때문에, 전반적인 흐름에 맞출 수밖에 없었습니다. 결국 교수님을 설득한 끝에, 애플리케이션 개발로 가되, 이와 관련된 연구 결과를 다른 학술대회에 제출했다는 내용과 더불어 간단한 사용자 실험을 포함하기로 했습니다. 다른 캡스톤 팀들과 비교해보면 완전한 하이브리드 프로젝트가 된 셈이죠.
사실 VR 역시 AI와 접목할 수 있습니다. 그러나 다른 팀은 AI가 기능의 중심이 되고 그걸 구현하는 파트가 Web이나 App이 된다면, 저희는 VR 구현에 제법 시간을 써야 했기 때문에 (그리고 VR 기기 자체가 일부 AI 기능을 포함하기도 하니까) 새로운 AI를 개발한다기보다는 AI를 단순 접목하거나 활용하는 선에서 진행해야 했습니다. 개발 기간이 2달 반 정도에 불과하니까요.
AR + VR = MR & XR
그렇게 결정된 주제인 “사용자 간 협업을 위한 Eye 및 Hand Interaction 기반 XR Co-Working Space”. AR 개인 스페이스와 VR 단체 회의 공간을 결합한 MR(Mixed Reality) 애플리케이션을 표방하며, 책상 주변에 가득한 포스트잇이나 다양한 도구를 비워낸다는 의미의 “Emptied”라는 가상의 제품명을 달았습니다. 그렇게 현실을 다양한 기능으로 확장할 수 있는 XR(Extended Reality)을 구현하는 것입니다.


[소공 역사에 남을 캡스톤 디자인]
그렇게 곧 사라질 소프트웨어공학과 역사에 남을 만한 캡스톤 디자인이 시작되었습니다. 개발 도구로는 Unity와 Quest Pro를 사용하였습니다.
지난 학기 경험의 중요성
4월 초부터 시작된 본 시스템의 개발은 3인 팀인 만큼 역할을 나눠 진행되었습니다.
- 저는 지난 학기의 경험을 살려 오브젝트 생성 파트를 포함한 Unity 앱의 전반 베이스를 맡았고, 추가 위젯을 개발하였습니다. 특히 앱을 끄고 다시 켜도 오브젝트가 그대로 살아있도록 하기 위해 JSON을 이용해 클래스를 텍스트화하여 저장소에 저장하고 실행할 때 불러오는 기능을 추가하였습니다.
- 다른 학생은 Quest Pro의 기능인 Spatial Anchor를 앱에 추가하여 공간상에 오브젝트 위치 정보를 저장하였고, 유저 데이터베이스를 구성하였습니다.
- 또 다른 학생은 PC 화면을 Quest Pro 내에 저장할 수 있도록 WebRTC 기반 화면 공유 기능 및 해당 웹사이트를 구현하였습니다. 또한 전반적인 UI 디자인을 맡았습니다.
그래도 오브젝트 생성 기능은 지난 학기 산학협력프로젝트의 경험을 살려서 빠르게 구현할 수 있었고, 따라서 기능을 고도화하고 더 자연스럽게 구현하는 데 초점을 맞췄습니다. 예를 들어 스케치 기능은 기존에는 한 획 단위로만 그릴 수 있어 활용성이 떨어졌으나, 이번에 구현할 때는 업그레이드하여 그룹화 기능을 도입해 보다 완성된 스케치를 그릴 수 있도록 수정하였습니다. 그 외에도 업무를 위한 타이머, 음성 메모장, 세계시간 등을 추가로 구현했습니다. 다행인 점은 지난 학기와 달리 무거운(!) 의료 영상을 사용하지 않기 때문에, 실제 장비에 설치하고 운용해도 무리가 없다는 점입니다.
이렇게 로컬 기능 구현은 5월 초까지 해서 어느 정도 마무리되었습니다. 그래도 여기까지는 개인 할 일을 해가면서 천천히 할 수 있었습니다.
희로애락
하지만, 지난 학기와 마찬가지로 관건은 네트워킹이었습니다. 앱의 구조도 다르고, SDK 버전도 달라지면서 네트워킹 파트만큼은 지난번의 것을 거의 활용하지 못하고 사실상 다시 구현해야 했습니다. 의도한 대로 구현하고 싶어 계속 시도했지만 일부는 끝끝내 구현을 허락하지 않았습니다. 그렇게 몇 개는 양보하고, 몇 개는 대체해 나갔습니다. 예를 들어 여러 개의 회의실을 생성할 수 있음을 보이기 위해 Photon Fusion 라이브러리의 매뉴얼을 열심히 읽어가며 구현했습니다. 한편 로컬에서 그룹화 기능을 추가한 스케치는 그룹화가 어려워 결국 파편화되었지만, 그래도 부드럽게 스케치가 그려질 수 있도록 하였습니다. 또한 모든 회의 참가자가 스케치를 그릴 수 있게 하기 위해 RPC를 두세 번씩 호출해가면서 구현하는 데에는 성공했지만, 코드는 점점 스파게티가 되어 갔습니다.
다른 팀원도 각자의 위치에서 최선을 다했습니다. 특히 형이었던 팀원 분은 WebRTC 기반 화면 공유 기능 구현에 온 시간을 쏟았고 (심지어 기말고사도 포기해 가면서) 로고 및 UI 디자인도 진심으로 하는 등 자신만의 포트폴리오로 남기고 싶어했음을 느낄 수 있었습니다. 그래서 저 역시도 최선을 다하고자 했습니다.
시간은 어느덧 빠르게 지나 6월에 다다랐고, 어느덧 최종 발표 시간이 다가오고 있었습니다. 그래도 개발은 얼추 막바지에 이르렀지만, 아직 테스트도 많이 해야 했고 기말고사도 다가오고 있어 시간이 넉넉하지 않았습니다.
당시 캡스톤 평가 비중은 중간 발표 30점, 최종 발표가 무려 70점이었습니다. 즉, 모든 팀은 최종 발표에 자신의 팀의 결과물을 최대한 효율적으로 담아내야 했죠. 그러나 주어진 시간은 단 5분, 형식은 동영상 발표 후 추가 라이브 질의응답 방식이었습니다. 아무리 많은 고생을 들여 캡스톤 프로젝트를 진행했더라도, 최종 발표에 잘 담기지 않는다면 말짱 꽝이었습니다. 그래서 저희는 어떻게 최종 발표를 진행할지 깊은 고민을 진행했습니다. 저희에게는 새로운 발상이 필요했습니다. 바로, 기업인처럼, 유튜버처럼 최종 발표를 구성하자는 아이디어였습니다. 우리 모두는 토스 같은 IT 기업의 유튜브 발표 영상을 떠올렸고, 그들의 감각을 배워보기로 했습니다.
원래는 최종 발표 ppt를 만들어서 Zoom 등으로 녹화해서 발표하라고 의도한 것이었지만, 저희들은 5분짜리 실제 앱 소개 영상을 만든다고 생각하고, 시나리오를 짰습니다. 그리고 우리 팀의 형님은 정말 놀랍게도 어디서 DSLR 카메라(!)를 들고 오심으로써 자신의 열정이 결코 약하지 않음을 보였습니다.
그렇게 시작된 최종 발표 녹화. 각자 역할을 나눠서 저와 연구실 동료 후배는 시연 영상을 녹화하고, 그 형은 밤을 새가며 영상을 편집해 주셨습니다. 또한 얼굴이 잘 나오도록 함께 인삿말을 녹화했고, 개인 컷을 찍고, (그리고 저의 프로필 사진을 촬영해 주시고), 소리가 뭉개진다고 대본은 따로 스마트폰으로 녹음해서 합쳤습니다. 완성도 있는 최종 발표를 만들기 위해 발표 1주일 전부터는 모두가 캡스톤에만 매달렸습니다.
그렇게 최종 발표 하루 전, 4분 59초짜리 영상이 완성됩니다.
최종 발표
최종 발표 평가는 교수님들 평가와 다른 팀 평가를 합쳐 진행됩니다. 발표는 팀 번호순으로 진행되었으며, 저희는 28팀 중 7번째였습니다. 28팀 중 Unity를 사용하는 팀은 저희를 포함하여 6팀 정도, 그 중 대부분은 게임이고 순수 VR은 2팀? 정도에 불과했습니다. 그래도 Unity 팀들이 어느 정도 퀄리티 있는 결과물을 내주긴 했지만, 아무래도 교수님들이 AI 전공이 대부분이시다 보니 반응이 완전 시원하진 않더군요. 한편, 저희 바로 앞 팀인 6번째 팀이 많은 동기를 놀라게 할 만한 고퀄리티 프로젝트를 진행해 발표했고 국제 학술대회에도 연구 결과물을 제출했더라고요. (그리고 사실 이런 내용이 원래는 저희 지도교수님이 원하셨던 방향이었겠지만…) 저희 팀원은 해당 발표를 보면서 약간 긴장했습니다. 무엇보다도, 교수님들이 질문을 어떻게 하실까 그렇게 긴장되었습니다.
그리고 저희 순서가 되어, 앞으로 나가 동영상을 재생했습니다.
저희 스스로도 파격이라고 생각했지만 사실 교수님들의 반응이 가장 걱정스러웠습니다. 앞 조에서 허를 찌르는 질문을 많이 하셨기 때문이었습니다. 예상 질문을 많이 준비해갔는데, 놀랍게도(?) 그 질문을 다 피해가시고, 대체로 긍정적인 반응을 보여주셨습니다. 아무래도 모두가 빨려드는 영상미가 한몫 한 것 같습니다. (형님 감사합니다 ㅠㅠ)
그렇게 큰 문제 없이 발표를 마치고 자리에 돌아갔을 때, 우리 모두는 긴장이 풀렸고 서로를 계속해서 격려해주었습니다. 그리고 그 이후의 캡스톤 발표를 편안한 마음으로 지켜볼 수 있었습니다.
한 가지 느낀 점은, 결과물을 잘 낸 팀이 많이 있었음에도 불구하고 주제와 내용이 일치하지 않아 낮은 평가를 받은 팀이 있었다는 점입니다. 저희는 그래도 약간 어설프긴 하지만 처음 제안한 주제와 최종 결과물이 대체로 일치하기 때문에 그런 부분에서 문제가 생기진 않았습니다. 주제를 잘 잡고, 그렇게 잡은 주제를 끝까지 잘 따라가야 한다는 점은 앞으로의 프로젝트를 진행하면서도 꼭 기억해야 할 중요한 부분이었습니다.
결론
그렇게 최종 발표가 끝났고, 며칠 뒤에 나온 평가 결과에서 28개 팀 중 당당히 1등을 차지했습니다. 저희 팀원 모두들 기뻐했고, 뒤풀이 식사(?)를 두 차례 했습니다. 특히 100점 만점에 유일한 90점대(80점대 5팀)였다는 점이 더더욱 기분이 좋았는데, 이는 어떻게 보면 VR을 잘 모르는 교수님들 역시 이번 저희 발표 주제를 마음에 들어하셨다는 것을 의미해서, 앞으로 VR을 잘 연구해봐야겠다는 생각이 들었습니다. (설령 이번 프로젝트는 VR이 아니더라도요.)
여담으로, 이 애플리케이션에 구현된 기본 인터페이스는 이 해 2학기에 논문으로 출판된 GazeHand 인터페이스입니다. (추후 Project 탭에서 소개해드리겠지만, 발표 영상에도 간략히 설명이 들어 있습니다.) 사실상 해당 연구와 캡스톤을 동시에 진행한 느낌도 있었기 때문에, 그나마 효율적으로 진행할 수 있었다고 봐야 할까요.
이렇게 저의 학부 시절 모든 프로젝트를 마치고, 얼마 뒤 기말고사를 끝으로 학부 교과목 수강을 다 마쳤습니다. 마지막 시험을 치른 이후, 저는, 이제 정말 졸업이구나, 그리고 이제 정말 새로운 시작이구나 하는 생각을 해보며, 형식적으로는 학부생이자 사실상 첫 대학원생으로서의 학기를 준비하였습니다.