1什么是 FreeD 定位系統(tǒng)
FreeD 定位系統(tǒng)(通常稱為 FreeD 協(xié)議)是一種業(yè)界廣泛應(yīng)用的攝像機追蹤數(shù)據(jù)通信協(xié)議,主要用于虛擬演播室(AR/VR)、電影虛擬制作等實時追蹤場景。在很多工業(yè)數(shù)字軟生項目中也有類似接收發(fā)送數(shù)據(jù)協(xié)同的需求,可以參考下面的流程作參考。
FreeD 主要傳遞包括攝像機三維位置(XYZ)、旋轉(zhuǎn)(Pitch、Yaw、Roll)、鏡頭參數(shù)(焦點、變焦)。
我們采取的協(xié)議包含 29 個字節(jié)的數(shù)據(jù),其 FreeD 發(fā)送的定位設(shè)備一般是一個獨立于攝影機的組件,其實現(xiàn)原理大致分為紅外定位點,雙目攝像頭,多攝像頭等。包括著名的 Mosys、Redspy、HTC Vive Mars 等。FreeD 是一個通用的定位協(xié)議,常見的定位系統(tǒng)默認都支持 FreeD 協(xié)議。
2開始開發(fā)
首先創(chuàng)建一個插件,命名為omni.freed.livelink。具體步驟可參考:《NVIDIA Omniverse Extension 開發(fā)秘籍:Python/C++ 實戰(zhàn),附完整代碼》
2.1 背景分析
首先找到 FreeD 的定義文檔,并且分析其協(xié)議 (https://www.manualsdir.com/manuals/641433/vinten-radamec-free-d.html?download),然后根據(jù)協(xié)議在 Omniverse Extension 編寫接收協(xié)議,且實時更新 Omniverse USD 的 Camera,讓 Omniverse 的 Camera 跟隨外部的相機定位系統(tǒng)實時同步更新,實現(xiàn)數(shù)字孿生效果。
*注:文本下面需要用到很多計算機編程開發(fā)的基礎(chǔ)知識。
2.2 開發(fā)解析
2.2.1 端口創(chuàng)建
FreeD 協(xié)議基于 UPD 協(xié)議傳輸,一般默認是廣播方式,接收的端口是 40000 (可以在相機定位設(shè)備里更改端口,或者進行點對點傳輸)。
_startUPDServe函數(shù)里面創(chuàng)建 Socket 端口(或者使用已有框架比如 python-osc)
2.2.2 協(xié)議解析
分析 FreeD 的協(xié)議,通用 FreeD 采用的是 Type D1 的數(shù)據(jù)格式,接收 29 個 Bytes。在文檔的第 30 頁,根據(jù)指引“Appendix”去看第 40 頁。
FreeD字段說明
再通過下圖更直觀地表達 FreeD 的 29 個字節(jié)所,按照文檔計算 Pan, Tilt, Roll 的數(shù)值。
*注:從網(wǎng)絡(luò)端口傳來的數(shù)據(jù)是大端格式, 并且如果是負數(shù)的話則需按照負數(shù)補碼來解析。
2.2.3計算 Yaw Pitch Roll:
旋轉(zhuǎn) Pan,Tilt,Roll(Yaw Pitch Roll)的角度定義
2.2.4計算位置 X, Y, Z:
同理按照文檔計算 Translate 的 X Y Z 數(shù)據(jù)。
位置信息 X,Y,Z 的定義
按照定義給出代碼。
Zoom 和 Focus 和鏡頭文件相關(guān),由于每一個鏡頭文件對應(yīng)的解析都不太一樣,這里就不再詳細判斷。
最后把解析得到的 Yaw Pitch Roll 和 X,Y,Z 的數(shù)據(jù)更新到我們綁定的 Camera 上面實時更新。
3創(chuàng)建 Event 事件
3.1 發(fā)現(xiàn)問題
在子線程運行的時候發(fā)現(xiàn)無法對 USD Stage 場景的 Prim 操作,調(diào)試發(fā)現(xiàn) USD Prim 都是 None。
這時候可以利用AI幫助,描述清楚問題的前因后果。
根據(jù)上面 AI 給出的提示,原因是 Omniverse 子線程中無法對 Stage 的 USD Prim 進行操作。 此時需要一個注冊主線程 Event 事件,在這個 Event 事件中去更新每一個 Prim 的操作。
此后還需考慮以下幾件事情:同步性(幀率統(tǒng)一)、設(shè)置延時、設(shè)置偏移、相機旋轉(zhuǎn)順序。
3.2 鎖定Omniverse渲染幀率
首先鎖定渲染的幀率。例如 FPS 鎖定在每秒 25 幀,F(xiàn)reeD 的發(fā)送幀率也鎖定到 25 幀。目的是保證良好的同步性,同時保證 Genlock 的傳輸接收效果良好。
關(guān)閉 Omniverse, 首先找到你對應(yīng)的 Build 出來的 Composer 對應(yīng)的.Kit文件,在“..kit107.3\_buildwindows-x86_64 eleaseapps” 里面包含所有配置的信息,用文本打開。
在[settings]下面添加以下字段, 注意是單獨的[settings]字段。
app.runLoops.main.rateLimitEnabled = true
app.runLoops.main.rateLimitFrequency = 25
app.runLoops.main.rateLimitUsePrecisionSleep = true
app.runLoops.main.syncToPresent = true
app.runLoops.present.rateLimitEnabled = true
app.runLoops.present.rateLimitFrequency = 25
app.runLoops.present.rateLimitUsePrecisionSleep = true
app.runLoops.rendering_0.rateLimitEnabled = true
app.runLoops.rendering_0.rateLimitFrequency = 25
app.runLoops.rendering_0.rateLimitUsePrecisionSleep = true
app.runLoops.rendering_0.syncToPresent = true
app.runLoops.rendering_1.rateLimitEnabled = true
app.runLoops.rendering_1.rateLimitFrequency = 25
app.runLoops.rendering_1.rateLimitUsePrecisionSleep = true
app.runLoops.rendering_1.syncToPresent = true
app.runLoopsGlobal.syncToPresent = true
app.vsync=true
重新打開 Omniverse 的 Composer ,可以看到此時的幀率是 50。原因是我們開啟了 DLSS 的 Frame Generation功能。 如果去掉 Frame Generation ,則會顯示 25 幀率。
3.3 注冊渲染 on_update 事件
要得到渲染事件的事件,需要在每一次渲染 Render 開始的時候取出一幀進行合并。
https://docs.omniverse.nvidia.com/dev-guide/latest/programmer_ref/events.html
Event streams 是以線程安全的方式傳遞數(shù)據(jù),是由 Omniverse 的核心組件 carb 來提供,下面就是每一幀渲染的時候都會調(diào)用的函數(shù), 后還需要再on_update函數(shù)去處理。
注冊 Event:
sub1= update_stream.create_subscription_to_pop(on_update, name="My Subscription Name")
解除注冊:需要把這個 sub1 設(shè)置為 None (并沒有 unsubscription 這個函數(shù))
sub1= None
這里需要注意的是,在實際工程中要注意這個 sub1 的生命周期,不能用一個局部變量去存儲注冊的 event,否則在出了這個局部函數(shù)sub1以后會自動設(shè)置為 None,解決辦法是用一個成員變量去控制
self._sub= update_stream.create_subscription_to_pop,
然后在不需要的時候設(shè)置為 None:
self._sub= None
4相機延遲和定位偏移
4.1 相機延遲
相機延遲:在虛擬拍攝當(dāng)中,除了相機定位,還有動捕數(shù)據(jù),綠幕視頻流傳輸數(shù)據(jù),這些數(shù)據(jù)需要處理的時間比 FreeD 要耗時,所有可能會造成不同步,這就需要給相機定位在本地緩沖增加一些延時,例如可以在程序中開一個 Buffer 來緩沖一下
4.2 定位偏移
因為定位設(shè)備和實際有偏移,所以利用 Nodal offset 來手動添加偏移量。
5設(shè)置 Camera 旋轉(zhuǎn)順序
歐拉角的旋轉(zhuǎn)是有順序的,其本質(zhì)是因為旋轉(zhuǎn)對應(yīng)的矩陣乘法不具備交換律。在 Omniverse Rotate 有 6 種方式,我們應(yīng)該以哪種旋轉(zhuǎn)指定呢?
在 Omniverse 當(dāng)中,應(yīng) Y 軸向上,按照 FreeD 的解析,即 Y, X, Z 的順序。 我們在 Omniverse 里按照 ZXY 給出旋轉(zhuǎn)順序的具體原理可以查看知乎中的這篇帖子:https://zhuanlan.zhihu.com/p/85108850
6最終
結(jié)合所有的步驟,完成最終所有功能。
iPhone 上面的 JetSet 軟件可以發(fā)送 FreeD 定位協(xié)議,這樣我們即可通過上面的思路完整做出一個符合工業(yè)標準的插件。
文案&技術(shù)支持:
宋毅明 NVIDIA Omniverse & OpenUSD 開發(fā)者關(guān)系經(jīng)理
-
通信協(xié)議
+關(guān)注
關(guān)注
28文章
1064瀏覽量
41660 -
定位系統(tǒng)
+關(guān)注
關(guān)注
10文章
635瀏覽量
37314 -
攝像機
+關(guān)注
關(guān)注
3文章
1737瀏覽量
62432
原文標題:實戰(zhàn)項目拆解!當(dāng) FreeD 定位系統(tǒng)遇上 Omniverse Extension
文章出處:【微信號:Leadtek,微信公眾號:麗臺科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
NVIDIA Omniverse Extension開發(fā)秘籍

NVIDIA將NVIDIA Omniverse帶給全球超過250萬的開發(fā)者
用NVIDIA Omniverse連接游戲開發(fā)工作流
NVIDIA Omniverse Create最新版功能介紹
NVIDIA Omniverse的特性及應(yīng)用
利用NVIDIA RTX和Omniverse取得的工作成果
利用 NVIDIA Omniverse 和 Bentley LumenRT 創(chuàng)建實時模擬

奧比中光將接入 NVIDIA Omniverse開發(fā)平臺
探索NVIDIA AI和Omniverse加速設(shè)計創(chuàng)作
NVIDIA Omniverse中的物理模擬功能

NVIDIA宣布將以API形式提供Omniverse? Cloud
Omniverse教程(12):NVIDIA Omniverse USD Presenter的基礎(chǔ)應(yīng)用

使用OpenUSD和NVIDIA Omniverse開發(fā)虛擬工廠解決方案

評論