4 Get Raw IMU data from Vi ve VR System ) ( OpenVR ) 언리얼 엔진에서 Vive VR IMU 센서 정보 뽑기 ( Unreal Engine

 어디를 찾아도 모두 안 된다는 말만 무성했지 방법이 나오지 않았다.결국 방법을 찾았지만 누군가는 나처럼 삽을 쓰지 말라고 기록해 둔다.

가속도 센서(Accelerometer), 각속도 센서(Gyroscopesensor) 등 IMU(Inertia Measurement Unit)raw data가 필요할 수 있다. 이와 같은 시간축에 따른 데이터를 time-series data라고 하며 센서로부터 얻은 것에 대해서는 modality라고도 한다.통상, 이 IMU 데이터가 필요한 곳은 HAR(Human Activity Recognition)이다. 사람의 행동 패턴을 인식해 어떤 행동인지를 알아내는 HCI(Human Computer Interaction) 개념으로 사용한다. 엔진이나 모터에 가속도 센서를 달아 고장을 검출하려는 분야도 있고, 아무튼 더 있지만 내가 관심을 갖고 볼 분야는 아니다.내가 추구하는 게임 분야에서는 VR이 대표적인 사용 예다. VR은 양손에 컨트롤러를 잡고 콘텐츠를 즐기는데 거기에는 각각 IMU 센서가 들어있어 해당 데이터로 컨트롤러의 위치를 보정해준다. 머리에 쓰는 HMD에도 달려있고 트래커에도 달려있고 각각 달려있다.VIve 컨트롤러 – https:/w ww.vrheads.com으로 VR에서 HAR 같은 일을 하려면 IMU데이터가 필요한 것이다. 그리고 정확한 센서 데이터 분석을 위해서는 전 처리가 섞이지 않고 있다(최종 position값을 다시 변환해서 얻어진 값은 아니다)Raw IMU Data이 필요하다. 최종 애플리케이션의 단에서 입수할 수 있는 포지션 데이터(Unreal Engine에서 GetLeftHand Pose Data 같은)을 활용하고 더 좋은 분석 결과가 나올지도 모른다. 하지만 우선 순위는 rawimudata가 되고, 이후에 optimization의 일환으로 어떤 의도를 갖고 데이터를 가공하고 쓰는 것이 옳다. 어떻게 전 처리됐는지도 모르고, 전처리의 의도도 파악하지 않은 데이터 형식을 사용하고 뭔가 유의의로운 결과를 내는 것은, 치밀함이 결여되어 성공 확률이 낮아지고, 만일 성공했다고 해도 얻어걸렸을 뿐이기 때문이다. 심지어 데이터 사전 처리를 자신이 한 것도 아니게 된다. 연구는 그러한 방식으로 행해지는 것이 아니다. 좀 더 치밀하지 않으면 안 된다. 만약 IMU 센서 정보를 이용해 나온 최종 Position 데이터를 사용해 분석을 하려면, 그 전 처리 과정을 그대로 해야 한다.

아무튼 나름의 이유로 사람들이 해당 데이터를 필요로 하는 질문도 많았지만 잘 알려주는 대답은 별로 없었다. 그래서 방법이 없다고 생각했다. 결론만 말하면, openvr의 1.0.15 버전부터 IMU 데이터를 공식적인 API로 제공한다. 이 간단하게 흩어진 정보를 찾는 데 시간이 걸렸다. 이 때문에 검색 능력이 중요하다.

https://github.com oftware openvrwiki IVRIO Buffer 저기 적혀 있는 IVRIO Buffer 문서에 들어가 보면 친절하게 IMU 데이터를 골라오는 방법과 그 코드도 적혀 있다. 기기마다 512이하 크기의 링 버퍼 형식으로 imudata가 계속 기록되는데 거기에 접속해서 imudata를 넣으면 된다. Lighthouse라고 처음에는 basestation 일련번호를 넣었는데 당연히 안됐지. 기기의 일련번호를 넣는다. HMD, 컨트롤러, 트래커가 된다. 그리고 링 버퍼이므로 위 코드의 예제에 써있는 대로 unRead를 활용하여 읽히지 않는 부분만을 선별하여 읽어들이면 된다. 예제에서는 ImuSample_tstruct를 기반으로 한 번에 10개의 imudata를 읽는다.

저 path가 도대체 무엇을 의미하고 실제로 어디에 있는지 가상의 공간인가 싶었다. Steam 폴더에서 검색을 해보면 이렇게 나온다. 저기 안의 config.json 파일에 각 device에 대한 모든 설정이 기록되어 있다. 어떤 기기가 어떤 일련번호를 갖고 있는지도 확인할 수 있다.

그 config.json 파일을 열어 보면, json 형식으로 이렇게 정리되어 있다. 센서마다의 베이스와 스케일외, 예상 이상으로 상당한 정보를 거둘 수 있고 있다. imu 이외의 정보도 확인할 수 있을 것 같다.

그래서 언리얼 엔진(내 버전은 4.25.3) 위에서 직접 가속도와 각속도의 데이터를 선택했다. 280hz 언저리로 들어오는 것 같다. Raw Data와 가속도 센서에 중력가속도 포함되어 감지되는 것을 볼 수 있다. 참고로 SteamVR에서 제공하는 GetLeft/RightPoseData를 사용하면 중력가속도가 없이 나온다. 프레임 단위로만 받을 수 있는데 openvr_driver.h의 VR Properties를 사용해 Property를 가져와 Factory Calibration을 적용하는 것도 Github wiki 문서에 나와 있다. openvr.h를 사용해 가져오는 방법도 있다.

https://github.com/ValveS oftware / openvr / wiki / ImuSample _ t 그롬 이만 ..