0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用NVIDIA Omniverse Extension开发FreeD定位系统

丽台科技 来源:丽台科技 2025-09-23 17:17 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1什么是 FreeD 定位系统

FreeD 定位系统(通常称为 FreeD 协议)是一种业界广泛应用的摄像机追踪数据通信协议,主要用于虚拟演播室(AR/VR)、电影虚拟制作等实时追踪场景。在很多工业数字软生项目中也有类似接收发送数据协同的需求,可以参考下面的流程作参考。

FreeD 主要传递包括摄像机三维位置(XYZ)、旋转(Pitch、Yaw、Roll)、镜头参数(焦点、变焦)。

44d446d4-9215-11f0-8c8f-92fbcf53809c.png

我们采取的协议包含 29 个字节的数据,其 FreeD 发送的定位设备一般是一个独立于摄影机的组件,其实现原理大致分为红外定位点,双目摄像头,多摄像头等。包括著名的 Mosys、Redspy、HTC Vive Mars 等。FreeD 是一个通用的定位协议,常见的定位系统默认都支持 FreeD 协议。

2开始开发

首先创建一个插件,命名为omni.freed.livelink。具体步骤可参考:《NVIDIA Omniverse Extension 开发秘籍:Python/C++ 实战,附完整代码》

2.1 背景分析

首先找到 FreeD 的定义文档,并且分析其协议 (https://www.manualsdir.com/manuals/641433/vinten-radamec-free-d.html?download),然后根据协议在 Omniverse Extension 编写接收协议,且实时更新 Omniverse USD 的 Camera,让 Omniverse 的 Camera 跟随外部的相机定位系统实时同步更新,实现数字孪生效果。

*注:文本下面需要用到很多计算机编程开发的基础知识。

2.2 开发解析

2.2.1 端口创建

FreeD 协议基于 UPD 协议传输,一般默认是广播方式,接收的端口是 40000 (可以在相机定位设备里更改端口,或者进行点对点传输)。

45319bae-9215-11f0-8c8f-92fbcf53809c.png

_startUPDServe函数里面创建 Socket 端口(或者使用已有框架比如 python-osc)

458d9a4e-9215-11f0-8c8f-92fbcf53809c.png

2.2.2 协议解析

分析 FreeD 的协议,通用 FreeD 采用的是 Type D1 的数据格式,接收 29 个 Bytes。在文档的第 30 页,根据指引“Appendix”去看第 40 页。

45e7d7e8-9215-11f0-8c8f-92fbcf53809c.png

FreeD字段说明

再通过下图更直观地表达 FreeD 的 29 个字节所,按照文档计算 Pan, Tilt, Roll 的数值。

*注:从网络端口传来的数据是大端格式, 并且如果是负数的话则需按照负数补码来解析。

44d446d4-9215-11f0-8c8f-92fbcf53809c.png

2.2.3计算 Yaw Pitch Roll:

46a862f6-9215-11f0-8c8f-92fbcf53809c.png

旋转 Pan,Tilt,Roll(Yaw Pitch Roll)的角度定义

47071e54-9215-11f0-8c8f-92fbcf53809c.png

2.2.4计算位置 X, Y, Z:

同理按照文档计算 Translate 的 X Y Z 数据。

47659434-9215-11f0-8c8f-92fbcf53809c.png

位置信息 X,Y,Z 的定义

按照定义给出代码。

47c3a90c-9215-11f0-8c8f-92fbcf53809c.png

Zoom 和 Focus 和镜头文件相关,由于每一个镜头文件对应的解析都不太一样,这里就不再详细判断。

最后把解析得到的 Yaw Pitch Roll 和 X,Y,Z 的数据更新到我们绑定的 Camera 上面实时更新。

3创建 Event 事件

3.1 发现问题

在子线程运行的时候发现无法对 USD Stage 场景的 Prim 操作,调试发现 USD Prim 都是 None。

这时候可以利用AI帮助,描述清楚问题的前因后果。

482318ec-9215-11f0-8c8f-92fbcf53809c.png

488e420c-9215-11f0-8c8f-92fbcf53809c.png

根据上面 AI 给出的提示,原因是 Omniverse 子线程中无法对 Stage 的 USD Prim 进行操作。 此时需要一个注册主线程 Event 事件,在这个 Event 事件中去更新每一个 Prim 的操作。

此后还需考虑以下几件事情:同步性(帧率统一)、设置延时、设置偏移、相机旋转顺序。

3.2 锁定Omniverse渲染帧率

首先锁定渲染的帧率。例如 FPS 锁定在每秒 25 帧,FreeD 的发送帧率也锁定到 25 帧。目的是保证良好的同步性,同时保证 Genlock 的传输接收效果良好。

关闭 Omniverse, 首先找到你对应的 Build 出来的 Composer 对应的.Kit文件,在“..kit107.3\_buildwindows-x86_64 eleaseapps” 里面包含所有配置的信息,用文本打开。

48fbf9aa-9215-11f0-8c8f-92fbcf53809c.png

[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 帧率。

49549308-9215-11f0-8c8f-92fbcf53809c.png

3.3 注册渲染 on_update 事件

要得到渲染事件的事件,需要在每一次渲染 Render 开始的时候取出一帧进行合并。

https://docs.omniverse.nvidia.com/dev-guide/latest/programmer_ref/events.html

Event streams 是以线程安全的方式传递数据,是由 Omniverse 的核心组件 carb 来提供,下面就是每一帧渲染的时候都会调用的函数, 后还需要再on_update函数去处理。

49afa3ec-9215-11f0-8c8f-92fbcf53809c.png

注册 Event:

sub1= update_stream.create_subscription_to_pop(on_update, name="My Subscription Name")

解除注册:需要把这个 sub1 设置为 None (并没有 unsubscription 这个函数)

sub1= None

这里需要注意的是,在实际工程中要注意这个 sub1 的生命周期,不能用一个局部变量去存储注册的 event,否则在出了这个局部函数sub1以后会自动设置为 None,解决办法是用一个成员变量去控制

self._sub= update_stream.create_subscription_to_pop,

然后在不需要的时候设置为 None:

self._sub= None

4相机延迟和定位偏移

4.1 相机延迟

相机延迟:在虚拟拍摄当中,除了相机定位,还有动捕数据,绿幕视频流传输数据,这些数据需要处理的时间比 FreeD 要耗时,所有可能会造成不同步,这就需要给相机定位在本地缓冲增加一些延时,例如可以在程序中开一个 Buffer 来缓冲一下

4.2 定位偏移

因为定位设备和实际有偏移,所以利用 Nodal offset 来手动添加偏移量。

4a0b88ec-9215-11f0-8c8f-92fbcf53809c.png

4a68172e-9215-11f0-8c8f-92fbcf53809c.png

5设置 Camera 旋转顺序

欧拉角的旋转是有顺序的,其本质是因为旋转对应的矩阵乘法不具备交换律。在 Omniverse Rotate 有 6 种方式,我们应该以哪种旋转指定呢?

在 Omniverse 当中,应 Y 轴向上,按照 FreeD 的解析,即 Y, X, Z 的顺序。 我们在 Omniverse 里按照 ZXY 给出旋转顺序的具体原理可以查看知乎中的这篇帖子:https://zhuanlan.zhihu.com/p/85108850

4ac59de0-9215-11f0-8c8f-92fbcf53809c.png

4b27963a-9215-11f0-8c8f-92fbcf53809c.png

6最终

结合所有的步骤,完成最终所有功能。

iPhone 上面的 JetSet 软件可以发送 FreeD 定位协议,这样我们即可通过上面的思路完整做出一个符合工业标准的插件。

文案&技术支持:

宋毅明 NVIDIA Omniverse & OpenUSD 开发者关系经理

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 通信协议
    +关注

    关注

    28

    文章

    1073

    浏览量

    41869
  • 定位系统
    +关注

    关注

    10

    文章

    642

    浏览量

    37477
  • 摄像机
    +关注

    关注

    3

    文章

    1751

    浏览量

    62873

原文标题:实战项目拆解!当 FreeD 定位系统遇上 Omniverse Extension

文章出处:【微信号:Leadtek,微信公众号:丽台科技】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    NVIDIA Omniverse Extension开发秘籍

    NVIDIA Omniverse 是一个模块化平台,使用高级 API 和微服务来构建由 OpenUSD 和 NVIDIA RTX 提供支持的 3D 应用。OpenUSD 功能强大的 3D 框架与
    的头像 发表于 08-22 15:52 3394次阅读
    <b class='flag-5'>NVIDIA</b> <b class='flag-5'>Omniverse</b> <b class='flag-5'>Extension</b><b class='flag-5'>开发</b>秘籍

    NVIDIANVIDIA Omniverse带给全球超过250万的开发

    的面纱。 NVIDIA正在提供一套Omniverse应用程序和工具,以增强开发者工作流水线。开发人员可以插入平台堆栈的任何一层——无论是在顶层,还是
    的头像 发表于 08-16 16:08 1985次阅读

    NVIDIA Omniverse连接游戏开发工作流

    NVIDIA Omniverse 为游戏中的艺术和虚拟世界提供实时、协作的设计平台,从而加快开发速度
    的头像 发表于 04-01 09:30 1632次阅读

    NVIDIA Omniverse Create最新版功能介绍

      NVIDIA Omniverse Create 2021.3 现已在中提供公开测试版,为 Omniverse 艺术家、设计师、开发人员和工程师提供一组新功能,以增强图形和内容创建工
    的头像 发表于 04-07 15:34 2236次阅读

    NVIDIA Omniverse的特性及应用

    NVIDIA Omniverse 基于 Pixar 的 Universal Scene Description 和 NVIDIA RTX技术打造,是一款可扩展的多 GPU 实时推理开发
    的头像 发表于 06-15 09:53 2083次阅读

    利用NVIDIA RTX和Omniverse取得的工作成果

    NVIDIA RTX 和 NVIDIA Omniverse 可带来卓越性能,帮助全球各地的专业人员、创作者、开发者和学生改进 3D 设计工作流。借助
    的头像 发表于 10-13 09:47 1603次阅读

    利用 NVIDIA Omniverse 和 Bentley LumenRT 创建实时模拟

    Omniverse ,快速创建引人注目且高质量的可视化效果与项目交付成果。 LumenRT for NVIDIA Omniverse 是市面上首个基于 NVIDIA
    的头像 发表于 05-18 00:35 1225次阅读
    <b class='flag-5'>利用</b> <b class='flag-5'>NVIDIA</b> <b class='flag-5'>Omniverse</b> 和 Bentley LumenRT 创建实时模拟

    奥比中光将接入 NVIDIA Omniverse开发平台

    ,作为其合作伙伴,奥比中光正式宣布将Femto Mega和其它3D相机集成到NVIDIA Omniverse生态开发平台中。 NVIDIA 全球产业数字化生态布局伙伴, 奥比中光也在其
    的头像 发表于 05-31 09:03 1380次阅读

    探索NVIDIA AI和Omniverse加速设计创作

    协作,是专为虚拟协作和实时逼真模拟而打造的易于扩展的开放式平台。NVIDIA Omniverse 是连接世界上最大的工具生态系统,目前连接 220 个工具软件,下载量超过 30 万。
    的头像 发表于 06-13 15:40 1090次阅读

    NVIDIA Omniverse中的物理模拟功能

    NVIDIA Omniverse™ Simulation 作为 NVIDIA Omniverse™ 平台的关键组件之一,由 NVIDIA
    的头像 发表于 03-08 11:30 2525次阅读
    <b class='flag-5'>NVIDIA</b> <b class='flag-5'>Omniverse</b>中的物理模拟功能

    NVIDIA宣布将以API形式提供Omniverse™ Cloud

    NVIDIA Omniverse Cloud API 使开发者能够将 Omniverse 技术集成到其设计与仿真工具和工作流中。
    的头像 发表于 03-20 09:45 1107次阅读

    Omniverse教程(12):NVIDIA Omniverse USD Presenter的基础应用

    如前所述,NVIDIA Omniverse™ 是一个参考开发平台,通过模块化的开发框架能够轻松扩展和自定义。
    的头像 发表于 05-20 10:09 1661次阅读
    <b class='flag-5'>Omniverse</b>教程(12):<b class='flag-5'>NVIDIA</b> <b class='flag-5'>Omniverse</b> USD Presenter的基础应用

    使用OpenUSD和NVIDIA Omniverse开发虚拟工厂解决方案

    工业开发者正在借助 NVIDIA AI、NVIDIA Omniverse 和通用场景描述 (OpenUSD)生态系统的力量构建虚拟工厂解决方
    的头像 发表于 05-28 18:12 2037次阅读
    使用OpenUSD和<b class='flag-5'>NVIDIA</b> <b class='flag-5'>Omniverse</b><b class='flag-5'>开发</b>虚拟工厂解决方案

    借助OpenUSD和NVIDIA Omniverse开发数字孪生应用

    接口、软件开发套件和服务组成的,使开发者能够开发基于 OpenUSD 的应用 NVIDIA Omniverse
    的头像 发表于 09-06 14:18 1063次阅读

    Foxconn利用NVIDIA AI和Omniverse训练机器人

    全球最大电子制造商 Foxconn 正准备制造 NVIDIA 最复杂的产品之一,并开始使用 NVIDIA Omniverse 和 Isaac 平台驱动的数字孪生。
    的头像 发表于 10-10 09:40 1178次阅读