연초에 말했던 2주~1달 텀으로 뭔가 자체적인 유용한 글을 쓰겠다는 계획의 첫번째 글


뭐부터 해볼까 생각했는데 일단 기존의 정보글들에서 좀 더 깊이 파고들어보는건 어떨까 싶어서 이걸로 정함


이미 8년~9년 된 기술을 이제와서 다루는것도 웃긴일이긴 하지만 ㅋㅋㅋ


이것저것하다보면 더이상 못 찾아서 고갈될듯




초기에 발매된 베이스 스테이션의 사진 (출처: https://www.windowscentral.com/can-you-use-htc-vive-base-stations-valve-index)


우리가 추적 방식을 이야기할때 지금와서는 라이트 하우스 (베이스 스테이션) 혹은 헤드셋에서 추적하는 인사이드 아웃 두가지로 구분하지만 

실제로는 둘다 인사이드 아웃이며 걍 외부 센서가 필요한가? 필요하지 않은가로 구분하는게 맞다는건 예전부터 몇번 썼던 이야기임


이제 15년~16년으로 돌아가서 이 방식에 대해서 이야기 해보자.



약간 복잡하게 굳이 먼길을 돌아가는것 같지만 오큘러스 리프트와 HTC VIVE의 추적 방식을 보자.


이미지 출처: PC Perspective - Allyn Malventano


오큘러스 리프트의 기술은 이렇다.


헤드셋의 전면과 후면에 IR LED를 심어주고 외부 IR 카메라에 의해서 이를 추적하는 방식이다.



이러한 IR LED의 패턴을 읽고 위치 및 방향을 파악하고, 패턴의 크기로 거리를 파악한다.


물론 IMU도 쓰이겠지만.


예를 들어 전면의 패턴이 보이면 유저는 카메라 쪽을 보고 있는 것이고, 후면의 삼각형 패턴이 보인다면 유저는 카메라 반대편을 바라보고 있는 것이다.


이와 달리 HTC와 밸브는 외부에서 빛을 뿌려주고 기기에서 이를 받아 위치를 기기가 자체적으로 파악한다. (결국 정보가 기기 안에서 돌기때문에 인사이드 아웃 방식이다.)




한편으로는 이러한 방식이 쓰인다면 하나의 방 안에 존재하는 여러개의 기기를 동시에 추적하는 것은 굉장히 어려운 일이 될 것이다.


하나의 화면에 5개의 기기가 있다면 각각의 랜덤한 패턴을 통해서 5개의 기기를 서로 구분 할 수 있어야하고, 가려지거나 일부만 보이는 경우에 서로 헷갈려서 트래킹이 뒤죽박죽이 될 것이다.


위에 있는 영상과 동일하지만 5개가 화면 안을 휘젓고 다닌다고 생각해보자. 생각만 해도 아찔해진다. 물론 사람의 경우에는 각각의 위치가 어디로 이동했는지 추론이 가능하지만 기계의 경우에는 각각의 패턴을 분석해서 끼워 맞춰야한다.


그렇기때문에 트래커가 통합된 추적 시스템은 라이트 하우스 시스템밖에 없는게 아닌가라는 킹리적 갓심이 있다.



이미지 출처: PC Perspective - Allyn Malventano


VIVE 컨트롤러의 링 부분에는 총 24개의 센서가 들어가며 위치는 이렇게 되어있다.



물론 라이트 하우스의 경우에는 각각의 기기가 그냥 베이스 스테이션에서 빛을 뿌려주면 그걸 받아서 자기 위치를 알면 되는것이기 때문에 비교적 할만하다.



베이스 스테이션 1.0


이미지 출처: PC Perspective - Allyn Malventano


분해하면 이렇게 생겼다.


우측 하단의 무언가가 베이스 스테이션의 본체이다.


좌 상단에는 IR LED 어레이가 존재하고, 그 오른쪽에는 세로로 훑는 모터와 그 아래에는 가로로 훑는 모터가 있다.


그리고 오른쪽 아래에는 베이스 스테이션끼리 신호를 주고 받는 용도의 센서가 있다. (위에 컨트롤러/HMD 이미지에서도 보이듯이 빛을 감지하는 센서다.)


각각의 모터에는 여러개의 선으로 나뉘어져 있는 '라인 렌즈'가 존재하는 광학 플라이휠을 회전시킨다.

그 결과로 각 모터는 IR 레이저 라인을 훑을 수 있게 된다.






https://youtu.be/J54dotTt7k0


이렇게 공간에 빛을 뿌리면 각각의 기기에서 빛이 들어오는 순서나 시간을 통해 자기 자신의 위치를 알 수 있게 된다.


영상에도 보이듯이 


IR LED 여러개가 깜빡 - Y축 훑기 - IR LED 패널 깜빡 - X축 훑기


이런 순서이다.


IR LED 여러개가 깜빡거리는 것은 싱크 펄스 또는 싱크 블라스터라고 부른다.


용도는 베이스 스테이션끼리의 신호를 주고 받는 용도이기도 하며 각각의 기기에게 한번 리셋을 시켜주는 역할이다.


수평으로 훑고, 싱크 펄스가 한번 뿌려지면 '이번 수평은 끝났고 이제부터 시간을 재서 다음 스캔을 받아들일 준비를 해라.' 라는거다.


참고로 2.0에서는 싱크 펄스를 레이저 펄스에 포함시켰기 때문에 사라진 요소이다.

이에 대해서는 조금있다가 설명해보겠다.



이제 대강의 구조에 대해서 설명했으니 작동에 관해서도 이야기 해보자.


베이스 스테이션 1.0은 위에 있는대로 2개를 사용할 경우 서로 마주보거나 동기화 케이블을 연결해야만 한다.

이는 A와 B가 서로 다른 타이밍에 동작해야하기때문에 필요한 필수 사항이다. (위에 적은대로 베이스 스테이션 2.0에서는 싱크 펄스를 레이저 펄스에 포함시켰기 때문에 사라졌다.)



베이스 스테이션 하나에 내장된 각각의 모터는 3600rpm으로 회전하며 이는 초당 60회 방을 훑는다.


베이스 스테이션을 하나만 사용할때에는

1회에 2번의 동작이 이루어진다.


  • 프레임 1: 싱크 펄스 - 수평 스윕
  • 프레임 2: 싱크 펄스 - 수직 스윕

1 프레임당 1/120초이다.

이때 2 프레임을 사용했으므로 초당 60회로 이 동작이 이루어져 60Hz가 된다.


베이스 스테이션을 두개 사용할 때에는

1회에 4번의 동작이 이루어진다.


  • 프레임 1: 베이스 스테이션 A+B에서 싱크 펄스 - A에서 수평 스윕
  • 프레임 2: 베이스 스테이션 A+B에서 싱크 펄스 - A에서 수직 스윕
  • 프레임 3: 베이스 스테이션 A+B에서 싱크 펄스 - B에서 수평 스윕
  • 프레임 4: 베이스 스테이션 A+B에서 싱크 펄스 - B에서 수직 스윕

4번동안 A와 B 모두 싱크 펄스를 뿌리지만 스윕을 하는 것은 하나씩 번갈아가면서 실시된다.


이제 이것은 프레임이 4프레임으로 늘어났으므로 리프레쉬 레이트는 120/4로 30Hz가 된다.

(https://www.reddit.com/r/Vive/comments/54t8hc/comment/d870ecw/?utm_source=share&utm_medium=web2x&context=3)



한편으로는 이것을 컨트롤러 기준으로 이야기하게 된다면 헤드셋 또는 컨트롤러는 120Hz마다 빛을 받게 되며 컨트롤러의 추적 업데이트 속도는 120Hz가 된다.

그리고 SteamVR 내부의 설정 또는 개발자의 설정에 따라서 다르지만 각각의 컨트롤러에 대한 포즈는 250Hz로 업데이트되며 헤드셋은 225Hz가 된다.

또한 IMU를 함께 사용하는 등의 센서 퓨전을 사용하게 되면 헤드셋은 1006Hz마다 포즈가 업데이트 되며 각각의 컨트롤러는 366Hz마다 업데이트 된다.

(http://doc-ok.org/?p=1478)


여기까지가 베이스 스테이션 1.0의 설명이다.


이제 베이스 스테이션 2.0에 대해서 알아보자.


베이스 스테이션 2.0의 분해 사진. IR LED가 배열된 판이 사라지고 모터도 하나로 줄었다. (출처: https://www.thevrist.com/fixingbasestations)


베이스 스테이션 2.0은 싱크 블라스터가 사라졌고, X축과 Y축으로 구분되던 모터도 하나로 통합되었다.



베이스 스테이션 1.0과 2.0의 차이 (출처: Ben Jackson / Valve, https://www.roadtovr.com/next-gen-lighthouse-base-station-bring-rapid-cost-reductions/)


https://youtu.be/6iA-12lrTcw






이로 인하여 기존 베이스 스테이션 1.0은 이후에 나온 모든 기기들(트래커, HMD, 컨트롤러 등등)을 지원하지만

베이스 스테이션 1.0에서 작동하도록 나온 기기들은 베이스 스테이션 2.0을 지원하지 않는다.


싱크 펄스가 없기때문에 1.0의 기기들은 영원히 싱크 펄스를 기다리는 상태가 되고, 제대로 작동하지 않게 되는 것이다.


그렇다면 베이스 스테이션끼리의 싱크는 어떻게 되는걸까?


베이스 스테이션 2.0은 광학 동기화 기능이 없고 레이저 스윕에 동기화 기능이 통합되어 있다.

즉, 베이스 스테이션 1.0처럼 두 베이스스테이션이 서로 직접적으로 마주볼 필요가 없으며, 동기화 케이블도 필요하지 않다.


서로간의 동기화가 필요없기때문에 좀 더 자유롭게 베이스 스테이션을 배치할 수 있게 된다.



또한 2.0으로 올라오면서 수평 시야각은 110도에서 150(~160)도로 증가하였다.

1.0에서는 2개의 베이스 스테이션만 사용할 수 있었지만 2.0에서는 최대 16개까지 사용이 가능해졌다. (16개까지 된다고는 하지만 하나의 플레이 구역에서 4개까지라서 사실상 4개다.)

또한 10m의 거리까지 닿는 싱크 블라스터의 존재때문에 1.0에서는 서로 간섭이 일어나 여러개의 플레이 구역을 한 방에서 구성할 수 없다.

1.0에서는 최대 대각선 5m, 4x4m의 플레이 구역을 가지고, 2.0에서는 4개를 사용하여 10x10m까지 넓힐 수 있다.


1.0과 2.0은 같이 사용할 수 없다.


전반적으로 트래킹 성능에는 큰 차이가 없으며 대부분 넓은 장소에서 플레이 할때에 가장 큰 장점을 가지게 된다.



이제 베이스 스테이션 트래킹에 대해서 본격적으로 들어가보자.

(http://doc-ok.org/?p=1478)



https://youtu.be/Uzv2H3PDPDg


트래킹의 잔여 노이즈 및 트래킹 지터를 보여주는 영상.


두 개의 기지국이 있는 경우 잔류 노이즈는 등방성이며, 그 범위는 약 0.3mm입니다. 기지국이 하나만 있는 경우 노이즈 분포는 매우 이방성으로 변하여 기지국 방향으로 0.3mm, 거리 방향으로 2.1mm가 됩니다. 컨트롤러의 노이즈 크기와 분포는 매우 유사합니다. 라이트하우스 기반 포즈 추정은 카메라 기반 트래킹에서 발생하는 것과 동일한 원근 N점 재구성 문제로 귀결되며, 거리에 따라 선형적으로 증가하는 카메라 방향 오차와 거리에 따라 이차적으로 증가하는 카메라 간 오차가 있기 때문에 이러한 이방성은 예상할 수 있는 현상입니다.



관성 데드 레코닝 및 드리프트 보정


위에서 설명한 높은 추적 업데이트 속도에서 이미 유추할 수 있듯이, Lighthouse는 레이저 스윕을 받았을 때 추적 대상의 위치와 방향을 단순히 업데이트하지 않습니다.

대신, 현재 추적 추정치는 주로 추측 항법을 통해 각 디바이스에 내장된 관성 측정 장치(IMU)의 선형 가속도 및 각속도 측정값을 통합하여 개선되며, 해당 IMU에서 샘플이 도착하는 속도에 따라 업데이트됩니다. 라이트하우스 기지국은 이 동영상에서 설명한 대로 잡음이 많고 편향된 측정값을 통합하는 데 내재된 위치 및 방향 드리프트의 축적을 제어할 뿐입니다. 그림 4는 헤드셋 추적 데이터에 대한 드리프트 축적 및 드리프트 보정의 정확한 효과를 보여주며, 그림 5는 컨트롤러 추적 데이터에 대한 동일한 효과를 보여줍니다.



https://youtu.be/XwxwMruEE7Y




그림 4: 헤드셋 트래킹의 관성 추측 항법, 드리프트 누적 및 드리프트 보정.



https://youtu.be/A75uKqA67FI

그림 5: 컨트롤러 추적의 관성 추측 항법, 드리프트 누적 및 드리프트 보정.




기지국당 두 개의 레이저를 사용하여 왼쪽에서 오른쪽으로, 아래에서 위로 번갈아 가며 트래킹 볼륨을 스윕하는 설계로 인해 라이트하우스는 드리프트 보정에 추가적인 주름을 추가합니다(그림 5 참조). 같은 시점에 추적된 모든 마커의 카메라 상대 X 및 Y 위치를 측정하는 Oculus의 Constellation과 같은 카메라 기반 추적 시스템과 달리 Lighthouse는 왼쪽에서 오른쪽으로 스윕하는 동안 추적 대상의 포토다이오드의 X 위치만 측정하고, 아래에서 위로 스윕하는 동안에는 서로 8.333ms 오프셋이 있는 Y 위치만 측정합니다.


이는 두 가지 주요 효과를 가져옵니다: 첫째, 센서 융합 알고리즘에 복잡성을 더합니다. 추적 대상의 포즈 추정치를 단일 시점(또는 매우 짧은 간격)에 촬영된 단일 카메라 이미지로 계산된 전체 포즈로 제한하는 대신 센서 퓨전 코드는 추적 솔루션을 독립적인 단계로 제한해야 합니다. 더 자세히 살펴보면, 레이저가 공간을 스윕할 때 디바이스의 포토다이오드가 서로 다른 시간에 부딪히기 때문에 라이트하우스에서 파생된 부분적인(X 또는 Y) 포즈조차 존재하지 않는 것으로 밝혀졌습니다. 적어도 한 번의 레이저 스윕 기간 동안 전체 포즈 추정치를 계산하려면 디바이스의 현재(추정) 동작을 고려해야 합니다. 다행히도 칼만 필터와 같이 널리 사용되는 센서 융합 알고리즘은 원칙적으로 이러한 부분 상태 업데이트를 지원할 수 있을 만큼 유연합니다.


두 번째 효과는 라이트하우스 시스템이 센서 퓨전 코드에 제공하는 정보의 총량이 카메라 기반 시스템이 동일한 프레임 속도로 제공하는 정보의 절반에 불과하다는 것입니다. 즉, 라이트하우스가 8.333ms 간격 또는 120Hz의 속도로 추적 볼륨을 스윕하더라도 카메라가 각 프레임마다 추적된 모든 마커의 X 및 Y 위치를 전달하기 때문에 캡처 프레임 속도가 60Hz인 카메라 기반 시스템과 동일한 총 정보량만 제공한다는 의미입니다. 즉, 라이트하우스 드리프트 보정 기능이 120Hz로 작동하는 추측 항법 추적 시스템이 60Hz로 작동하는 카메라 기반 드리프트 보정 기능이 있는 추측 항법 추적 시스템보다 자동으로 두 배 더 "좋은" 것은 아닙니다. 이러한 두 시스템을 비교하려면 실제 추적 성능 데이터를 자세히 살펴봐야 합니다.


결국 IMU와 IR LED를 이용한 센서 퓨전은 VR의 초창기부터 계속해서 사용된 방식이다. 물론 이제와서는 거추장스러움이나 불편함을 쳐내고 간략함과 간편함을 가진 헤드셋 카메라를 이용한 인사이드 아웃 트래킹이 주류가 되어있다. 또한 이 시기와 비교했을때 센서들도 발전했고, 프로세싱 능력이나 알고리즘 또한 발전하여 이제는 CV와 AI를 결합한 핸드 트래킹, 그리고 그 핸드 트래킹을 컨트롤러 트래킹과 결합하여 추적 링을 빼버리는 등 계속해서 발전을 해나가고는 있다.


아무래도 무슨 생각이었는지는 정확하게는 알 수 없으나 모듈성, 확장성을 좋아하는 밸브의 입장에서는 트래커와 같은 기기들을 포함한 생태계의 확장을 고려해서 이러한 시스템을 만들었을 것이라 볼 수 있겠다.




이번달의 Buy Me a Coffee 멤버:


Amethyst

프렛*5

미키버그

춘춘춘

하페리온

익명의 Someone


그리고 익명의 도네이션들이 있었습니다.


정말 감사드립니다!