---
# System prepended metadata

title: 如何利用3d pose estimation 模型和視訊鏡頭實現無追蹤器的VR全身追蹤？

---

# 如何利用3D Pose Estimation 模型和視訊鏡頭實現無追蹤器的VR全身追蹤？
智慧物聯網創意應用競賽

## 發想源起

  一切要從我去年買了Meta Quest 2在VRChat這款社交遊戲的體驗開始，Quest 2使大眾使用VR門檻低了很多，但還是能看到某些功能實現相當的昂貴。
  比如說全身追蹤，最一開始，也是最知名的的VR全身追蹤系統，是HTC與知名遊戲平台Steam的母公司VALVe所合作研發的HTC vive燈塔定位系統(Lighthouse)，它使用紅外線陣列或雷射基站來定位空間中的vive追蹤器，獲得如今全身追蹤仍是準確度最高、延遲最低的解決方案，但如此高性能的追蹤方式也帶來了非常直觀的缺點：那就是價格極其昂貴，一顆二代基站台灣HTC官方要價6500元，即便是1代基站也要新台幣4750元，買了基站還需購入追蹤器才能定位，目前官方在售的vive 追蹤器3代一顆需要4200元新台幣，定位點越多，錢包失血越多。
  反觀目前已經漲價的最新款Meta Quest 3 VR頭顯，台灣區售價529.99美金，以匯率32元計算約17000元新台幣，也就是大約兩個基站加上一個追蹤器的錢，就能買到頭顯本體，可見從VR入門到較為高階的全身追蹤，所付出的財力代價是相當高的。
  這套方案還有個非常明顯的問題，那就是部署極度不方便，首先要先找出一塊空間架設基站，處理有線連接的線材，若為無線連接還需要考慮干擾、延遲及電池續航問題；再者，還要在身上綁追蹤器用於定位，只為了追求極致的定位效果。
  VR使用者目前在台灣不算普及，有足夠能力和財力能部屬這套系統的人少之又少，顯然這套系統並不適合推廣VR設備的普及，更像是給專業用戶的生產力工具及VR發燒友的高階配備。
  有沒有更加經濟實惠的解決方案?答案是有的。
  由於當時處於VR普及早期，為了加速軟硬體生態環境發展，VALVe開發了一套面向開發者，包含一系列SDK和API的開源工具集"OpenVR"，為後續的VR軟硬體發展奠定了很大的基礎，藉由OpenVR，許多第三方VR軟體、硬體都能執行在基於OpenVR的SteamVR上。
  目前最知名的全身追蹤替代方案，SlimeVR也由此而生。
  SlimeVR這套開源方案很有效的解決了Lighthouse系統價格昂貴的問題，而且定位效果也不差，是大多數想上全身追蹤的VR玩家之首選，但它還是面臨一些小問題：因為SlimeVR的原理是透過多個慣性測量傳感器，如加速度計、陀螺儀和磁力計來進行追蹤，因此綁在身上的傳感器越多越準確，過少的追蹤器會導致追蹤偏移明顯，過多則會導致舒適度降低。
  Xbox kinect，是個用於xbox 360和xbox one的追蹤裝置，它具備多鏡頭組成的3D結構光深度傳感器，若能將它用於全身追蹤，豈不是深度資訊等傳統鏡頭需要繞道解決的方案都能迎刃而解?
  答案是肯定的，它甚至不需要在身上綁tracker就能追蹤，本體也跟網路攝影機相似，達到方便部屬和啟動的超便利效果，因為是遊戲機外部配件，因此二手價格極其便宜，但同樣有缺點：因為機體性能因素，計算人體部位的速度稍嫌緩慢，約70ms(14fps)這會導致進入VR後會很明顯感覺到追蹤慢一拍，行業標竿Lighthouse 延遲最大值約為2.7ms。
  其實kinect還有出一版面像企業的版本[^貴]，但跟Lighthouse系統價差不大了，無法納入選擇。
  我就在想，有沒有像是kinect，又有比kinect更高算力的裝置?於是就有了這項創意提案。
[^貴]:Azure Kinect DK $399USD(台幣約12768元) https://azure.microsoft.com/zh-tw/products/kinect-dk/
## 提案內容

### 目標

以軟體層面和大眾較有可能擁有的硬體設備實現全身追蹤

### 原因

解決當前實現VR全身追蹤昂貴和需要穿戴追蹤器的不便

### 實現方式

有個適用於兩種裝置但相似的做法：手機或電腦外接網路攝影機，使用AI模型對連續影像進行人體關鍵點判斷後輸出座標矩陣，將關鍵點座標轉換成四元數後通過OSC協議輸出至VirtualMotionTracker(VMT)，再由VMT轉換tracker數據輸出至SteamVR客戶端。
詳細實現在[具體實作方法](#具體實作方法)

### 優點

無須在身上綁追蹤器，幾乎為軟體實現，所以只要有手機和電腦，或電腦有鏡頭就能使用，成本趨近為零


### 模型選擇

3D人體姿態估計(3D Human pose estimation)模型分為2D估計轉3D估計和直接3D估計，本提案撰寫時測試了yolov8n-pose和human-pose-estimation-3d-0001兩種模型，分別是純2D估計和2D轉3D估計，提交提案時發現human-pose-estimation-3d-0001模型於短期內實作成功的可能性較高，而yolov8n-pose雖有著更高的偵測精確度，但是在開發上出現了較大的困難，將會在[附錄](#附錄)說明。

### 系統硬體配置

桌機
CPU：Genuine Intel(R) 0000 (i9-13900K ES2 Q0NT)
Memory: 65536MB RAM(64GB)
GPU.0:Intel(R) UHD Graphics 770
GPU.1:Intel(R) Arc(TM) A750 Graphics
Operating System: Windows 11 專業工作站版 Insider Preview 64-bit (10.0, Build 25967) (25967.rs_prerelease.230929-1123)
WebCam0：Logi C270 HD WebCam
WebCam1：Asus Zenfone 9 with DroidCam App

### 系統軟體環境

1. 參考第21點[參考資料](#參考資料)中的教程安裝Openvino Runtime。
    其中可能需要的依賴有：[^備註]
    Microsoft Visual Studio 2019
    CMake 3.14 or higher (64 bit)
    Python 3.7-3.11
    OpenCV 4.5
    Intel® HD Graphics Driver (Required only for GPUs.)
2. 參考第22點[參考資料](#參考資料)中的教程安裝Openvino_notebooks Winodws版
3. 視情況可能需要在openvino_env環境內之python重新安裝套件[^1]
4. 若無WebCam可使用手機用有線或無線連接至電腦使用DroidCam調用手機的鏡頭，手機須開啟偵錯模式，電腦需安裝DroidCam Client
5. 在Steam下載並安裝SteamVR，若從未使用Steam請先至第25點[參考資料](#參考資料)下載並安裝Steam電腦客戶端，並註冊一個帳戶
6. 參考第25點[參考資料](#參考資料)安裝Virtual Motion Tracker

[^備註]:實作時電腦僅安裝了Intel® HD Graphics Driver、Python 3.11和Visual Studio Build Tools 2022並勾選"使用C++的桌面開發"，仍然安裝成功。並無安裝Cmake，OpenCV僅安裝python內之模組包。
[^1]:如`torch`,`onnx`
### 具體實作方法
`假設已在openvino_env環境內啟動Jupyter lab後端且啟動路徑為\..\\openvino_notebooks`
瀏覽器開啟`http://localhost:8888/lab`[^port]進入Jupyter lab前端
左側文件區依序選取`notebooks` `406-3D-pose-estimation-webcam` `406-3D-pose-estimation.ipynb`[^位置]
左上角選單點擊`Kernel Restart Kernel and Run All Cells...`
然後Demo就會給使用模型運算的結果，而主要程式碼中的`poses_3d`就是模型做完後處理準備放入3D渲染的座標值，它是個NumPy數組，形狀為(1,19,3)
具體一點會像這樣，直接改程式碼印出的話不會包含逗號分隔
```=python
a = np.array([[[-350.90454,91.27199,-146.26155],
  [-353.64313, 106.48863, -146.67688],
  [-346.49103, 43.317245, -138.8419],
  [-348.81873, 91.42526, -147.17023],
  [-344.75793, 65.35582, -145.61086],
  [-349.52734, 42.52623, -143.01671],
  [-351.48395, 39.274277, -146.33368],
  [-352.26984, 3.1951752, -145.40761],
  [-354.8626, -31.961075, -146.13872],
  [-353.753, 92.112335, -148.3025],
  [-352.36456, 68.629745, -146.22815],
  [-352.734, 47.22838, -142.20372],
  [-349.59467, 44.723495, -140.12181],
  [-346.32623, 9.699081, -135.05162],
  [-343.21436, -23.875137, -135.13402],
  [-368.05444, 97.3535, -146.76236],
  [-373.4817, 86.85057, -145.6936],
  [-364.13232, 98.67735, -147.7834],
  [-366.9558, 94.13725, -148.98228]]]
)
```
[^port]:預設埠口就是8888
[^位置]:此時網址應為`http://localhost:8888/lab/tree/notebooks/406-3D-pose-estimation-webcam`

#### 待辦事項

1. 搞懂怎麼把連續的座標矩陣轉成含四元數的數據


有了數據後用OSC傳出去

模型輸出方面到此為止，接下來是VMT和SteamVR的部分

### 執行過程中的疑難雜症

### 缺點

1. 尚沒有人開源展示類似實現
2. 部分閉源實現因後續無人維護而無法使用
3. 部分實現使用的模型或算法導致成效不佳及效率低下

## 提案後續之討論

1. 當前項目尚未串接完成，無法直接使用
2. 尚未搞懂VMT要怎麼校正這些座標數據


## 組員分工
隊長：全部事項
指導老師：模型輸入輸出分析、搜尋關鍵字討論、參考資料提供

## 附錄


## 參考資料

1. [SlimeVR說明文檔 - docs.slimevr.dev](https://docs.slimevr.dev/)
2. [Lighthouse系统基站原理与追踪器定位原理解析 - 幕幕Hare - bilibili.com](https://www.bilibili.com/read/cv25362203/)
3. [slimevr上手流程，以及使用过程中遇到的一些问题以及解决方法 - 是猫ちゃん丶 - bilibili.com](https://www.bilibili.com/read/cv14950469/)
4. [不到400！超低价玩转VR全身追踪（全平台）- Mega会玩 - bilibili.com](https://www.bilibili.com/video/BV1be4y1X7DL/?share_source=copy_web&vd_source=dd3a6c30a880eebd5968b80ad22d5110)
5. [HTC Vive - zh.wikipedia.org](https://zh.wikipedia.org/wiki/HTC_Vive)
6. [Kinect - zh.wikipedia.org](https://zh.wikipedia.org/zh-tw/Kinect)
7. [OpenVR - en.wikipedia.org](https://en.wikipedia.org/wiki/OpenVR)
8. [VIVE 基地台 - vive.com](https://www.vive.com/tw/accessory/base-station/)
9. [SteamVR基地台2.0 - vive.com](https://www.vive.com/tw/accessory/base-station2/)
10. [VIVE 移動定位器 (3.0) - vive.com](https://www.vive.com/tw/accessory/tracker3/)
11. [Meta Quest 3 - meta.com](https://www.meta.com/tw/quest/quest-3/)
12. [SteamVR - store.steampowered.com](https://store.steampowered.com/steamvr?l=tchinese)
13. [Analysis of Valve’s ‘Lighthouse’ Tracking System Reveals Accuracy - Ben Lang - roadtovr.com](https://www.roadtovr.com/analysis-of-valves-lighthouse-tracking-system-reveals-accuracy)
14. [【草稿】Kinect低成本全身追蹤方案 教學與心得 - 提拉米酥(mtis1233) - home.gamer.com.tw](https://home.gamer.com.tw/artwork.php?sn=5028174#:~:text=%E9%BB%9E%E6%93%8AKinectAdjustTiltAngle_Demo.exe%E9%96%8B%E5%95%9F%20%2A%E6%94%9D%E5%BD%B1%E6%A9%9F%E5%BD%B1%E5%83%8F%20MEGA%E4%B8%8B%E8%BC%89%20%E9%BB%9E%E6%93%8AKinectVideoAndDepth_Demo.exe%E9%96%8B%E5%95%9F%203.%E5%B7%A6%E9%8D%B5%E9%BB%9E%E6%93%8ASpawn,Trackers%3A%20%E5%B0%87%E8%BF%BD%E8%B9%A4%E5%99%A8%E6%94%BE%E5%85%A5steamvr%E5%85%A7%20%E6%89%93%E5%8B%BEShow%2FHide%20Skeleton%20Tracking%3A%20%E6%9F%A5%E7%9C%8B%E7%9B%AE%E5%89%8D%E9%AA%A8%E6%9E%B6%E7%9A%84%E7%8B%80%E6%85%8B)
15. [7个VR开发中容易混淆的概念：SteamVR、OpenVR、OpenXR…… - 邵伟 - zhuanlan.zhihu.com](https://zhuanlan.zhihu.com/p/363404734)
16. [3D 人体姿态估计简述 - OpenMMLab - zhuanlan.zhihu.com](https://zhuanlan.zhihu.com/p/400922771)
17. [Ultralytics YOLOv8 - github.com](https://github.com/ultralytics/ultralytics)
18. [3D Human Pose Estimation Python* Demo - docs.openvino.ai](https://docs.openvino.ai/2023.1/omz_demos_human_pose_estimation_3d_demo_python.html)
19. [Live 3D Human Pose Estimation with OpenVINO - docs.openvino.ai](https://docs.openvino.ai/2023.1/notebooks/406-3D-pose-estimation-with-output.html#run-pose-estimation-on-a-video-file)
20. [Install Openvino - intel.com](https://www.intel.com/content/www/us/en/developer/tools/openvino-toolkit/download.html?VERSION=v_2023_1_0&OP_SYSTEM=WINDOWS&DISTRIBUTION=ARCHIVE)
21. [Install OpenVINO™ Runtime on Windows from an Archive File - docs.openvino.ai](https://docs.openvino.ai/2023.1/openvino_docs_install_guides_installing_openvino_from_archive_windows.html) 
22. [openvinotoolkit/openvino_notebooks-windows - github.com](https://github.com/openvinotoolkit/openvino_notebooks/wiki/Windows)
23. [gpsnmeajp/VirtualMotionTracker - github.com](https://github.com/gpsnmeajp/VirtualMotionTracker/blob/master/docs/note_en.md#virtual-tracker-control)
24. [Steam官方下載頁面 - store.steampowered.com](https://store.steampowered.com/about/)
25. [VirtualMotionTracker-Setup - gpsnmeajp.github.io](https://gpsnmeajp.github.io/VirtualMotionTrackerDocument/setup/)
26. [VirtualMotionTracker-API - gpsnmeajp.github.io](https://gpsnmeajp.github.io/VirtualMotionTrackerDocument/api/)