다양한 온라인 컴퓨터 게임을 하며 자란 한국인에게, 컴퓨터 그래픽스는 누구나 한 번쯤 공부해 보고 싶은 분야일 것이다. 하지만, 아주 단순한 그래픽을 구현하는 것조차도 필요한 수식을 유도하면서 진행하고자 한다면, 생각보다 많은 선행 지식(선형대수학, 사영기하, 기하광학, 다변수 미적분 등등)과 까다로운 디버깅을 요구함을 빠르게 깨달을 수 있다. 그런데, 왜 필자는 레이 트레이싱을 구현하는 과제를 수행하기로 했을까? 이번 글을 통해, 레이 트레이싱을 구현하면 어떤 경험을 할 수 있고 이것이 어떻게 로봇 개발 공부에 도움이 될지 살펴보자.
수학도가 아닌 공학도의 관점에서, 직면한 문제를 푸는 데 필요한 지식을 습득하고 적용하는 경험을 해보고 싶었다. 특히나, 필자가 공부했던 대학의 수학과는 formal하게 공리계를 구성하고 논리를 전개하여 증명하는 것에 중점을 두기에 직관을 경시하는 분위기와 수학을 흥미로운 실제 문제에 적용하는 경험이 부족했던 것이 아쉬웠다. 구체적으로는 대학 재학시절 선형대수학과 다변수 미적분을 공부할 때 해보지 못했던 아래의 경험을 minirt 과제 수행을 통해 경험해 보고 싶었다.
위의 내용을 공부하고 적용해보며, 공학도의 센스를 키워나가는 것뿐만이 아니라, 위의 내용들이 전부 다 로봇을 이해하는 데 도움이 되기 때문에 이 과제를 수행하기로 했다. 예시로, ROS와 같은 로봇 개발 프레임워크의 경우 "frame"이라는 개념을 사용하는데, 이를 잘 사용하려면 행렬로 좌표계를 표현하고 변환하는 것을 잘 이해해야한다. 또한, 필자가 개발하고 싶은 호텔 청소 로봇의 경우 단순히 이미지를 가져다 객체를 인식하는 것에서 끝나는 게 아니라, object permanence, 6d pose estimation, 3d part/semantic segmentation 등의 기능을 수행할 수 있어야 청소를 해낼 수 있으리라 생각했다. 위와 같은 3d 컴퓨터 비전을 공부할 때 다루는 내용과 컴퓨터 그래픽스를 공부할 때 다루는 내용에 겹치는 부분이 많다고 판단했다.
엄밀한 논리 전개를 통한 증명만큼이나, 직관에 기대어 문제를 풀어나가는 경험은 무척 즐거웠고 필자가 기대했던 경험을 할 수 있어서 보람찼다. 3d 컴퓨터 비전 혹은 로봇 개발에 관심이 있는 학생이라면 누구에게나 해보길 권하고싶을 정도로 도움이 많이 됐다. 특히 아래와 같이, 기존에 예상하지 못했던 지식을 습득하고 적용할 수 있었기에 생각했던 것보다 훨씬 더 좋았다.
이 시리즈의 나머지 글에서는, 어떤 문제를 풀기 위해 어떤 내용을 어떻게 공부했으며 구현하는 과정에서 어떤 버그와 디버깅을 겪었는지 살펴보도록 하자.