通过 WebRTC 方式可视化连接 Isaac Sim
案例介绍
NVIDIA Isaac Sim 是基于 NVIDIA Omniverse 构建的机器人仿真平台,本文是在开发机上基于 Isaac Sim 实现可视化能力的实践教程。
NVIDIA Isaac Sim 支持从 URDF、MJCF 和 CAD 等常见格式导入机器人系统。通过 GPU 加速物理引擎来实现精确仿真,并支持大规模、多传感器 RTX 渲染。集成数据生成、强化学习、ROS 集成和数字孪生模拟等端到端工作流程。其优势包括:
- 资产导入 & 导出:支持从非 USD 格式导入机器人和环境,或将其导出为非 USD 格式;
- 机器人微调:优化机器人的物理精度、计算效率或真实感;
- 机器人仿真:提供全流程运动控制工具链,如控制器、运动生成和运动学求解器以及策略集成接口;
- 传感器系统:支持 RTX 和物理学传感器。
- 官方地址:https://docs.isaacsim.omniverse.nvidia.com/latest/index.html
部署方案
本文采用 WebRTC 串流方式实现 Isaac Sim 的可视化:由开发机上的 Isaac Sim 直接对外推流,本地安装 NVIDIA 官方的 Isaac Sim WebRTC Streaming Client 进行连接,画面由 GPU 的 NVENC 硬件编码器实时压缩,交互性能较好。
该方式不支持身份鉴权,推荐配合云的安全组使用(详见 2.7 访问控制)。
部署环境要求
| 组件 | 部署要求 | 最佳实践 |
|---|---|---|
| CPU | 建议 8 核及以上 | 按需 |
| 内存 | 建议 64G 及以上 | 按需 |
| GPU | Isaac Sim:支持 RT Core 的 NVIDIA GPU 卡,1 卡及以上 | 按需 |
| CDS | 按需 | 按需 |
| 其它 | 无 | 无 |
使用需知:
- Isaac Sim 的仿真渲染依赖 DLSS(超采样技术,Deep Learning Super Sampling),因此推荐使用 GeForce RTX 系列显卡。
- 本案例使用 RT Core 的显卡,且使用的 BLB 网络带宽为 50Mbps 时,无噪点、无卡顿,表现更为符合期望。
- 最新版本的 Isaac Sim 需要较高的驱动版本,但 NVIDIA 官方在较高版本驱动显卡兼容性存在一些未解决的问题,如果出现不能运行的情况,请联系售后支持同学调整。
- 官方未对 CUDA 和 cuDNN 有限制,不同的 CUDA 版本和 cuDNN 版本是否对可视化界面的表现有影响未验证。
- 由于该工具的较多场景需要访问外网,可以通过设置服务网卡,并设置 HTTPS 网络代理支持访问,参考服务网卡的配置。
- 建议在距离您最近的地域创建开发机实例使用当前方案。如果画面不流畅,建议在客户端降低 Resolution。
使用说明
本文会先介绍如何【创建与登录开发机】、如何【通过 WebRTC 方式可视化连接 Isaac Sim】,然后以【执行官方四足和人形可操作演示】、【宇树 GR1 机器人简易操作演示】和【Replicator 数据生成】几个例子,简单介绍 Isaac Sim 的使用。
在试用案例之前,请确保已挂载了案例所需的数据集,否则脚本无法正常运行,可在脚本内更改数据集地址配置。
1. 创建与登录开发机
1.1 从快速开始创建一个【Isaac Sim 可视化】开发机实例
点击【在开发机中打开】创建开发机,主要配置如下:
-
基本信息
- 版本选择:Isaac Sim 6.0
-
资源配置
- GPU 选择:支持 RT Core 的 NVIDIA GPU 卡
- CPU/内存:推荐 8 核 64G 及以上,保证运行所需的基础资源配置
-
访问配置
- 启动自定义端口,选择支持公网访问的 BLB(建议选择网络带宽 ≥ 50Mbps 的 BLB,带宽越大越好,越少共享复用越好)
- 新增访问端口:WebRTC 串流所需的两条端口映射见 2.1 端口配置要求
1.2 登录开发机
填写完表单,提交后,在开发机列表可见创建的开发机,等待资源调度并部署成功后,点击【登录】,即可进入开发机 webIDE。
主要路径介绍:
- Isaac Sim USD 资产挂载路径:
/mnt/bos/isaac-sim,该目录下存有 Isaac Sim 预置的部分 USD 资产。
1.3 验证 GPU 硬件和显卡驱动版本
根据部署环境要求成功创建开发机后,点击登录开发机,进入开发机 webIDE,打开 Terminal 界面,输入以下命令确认 NVIDIA 的 GPU 硬件和显卡驱动版本:
1nvidia-smi
执行结果中可查看显卡驱动版本和 GPU 硬件型号,如显卡获取不到出现报错,建议联系售后支持同学重装节点驱动。
2. 通过 WebRTC 方式可视化连接 Isaac Sim
2.1 端口配置要求
创建开发机时需开启自定义端口,并配置以下两条映射:
| 服务名称 | 开发机监听端口 | BLB 监听端口 | 传输协议 | 用途 |
|---|---|---|---|---|
webrtc-signal |
49100 | 49100 | TCP | 信令握手 |
webrtc-media |
47988 | 47988 | UDP | 音视频数据 |
注意
- 两个端口的「开发机监听端口」与「BLB 监听端口」必须填相同的数字。 Isaac Sim 会把自己监听的端口号写进 SDP 告知客户端,BLB 的端口转换不会被改写。
- 媒体端口必须是 UDP。
49100/47988 只是本文示例值,可改为其它未占用端口,但必须两侧一致,后文命令中的端口请一律替换为您实际配置的值。
2.2 预检 GPU 编码器(几秒钟,请勿跳过)
本方式由 GPU 的 NVENC 硬件编码器实时压缩画面,但当前 NVIDIA 官方针对部分显卡支持存在问题,请先运行以下检查脚本并确认输出结果。
1/root/workspace/quick_start/check_gpu.sh
通过时输出:
1== GPU ==
2 NVIDIA GeForce RTX 4090, 580.159.04
3== CUDA ==
4 [ OK ] CUDA 可用, 显存 21269/24080 MiB 空闲
5== NVENC 编码器(决定 WebRTC 能否出画面)==
6 [ OK ] 成功打开编码会话 (NVENC API 13.0)
7== NVDEC 解码器(参考项)==
8 [ OK ] h264 解码支持, 1 个 NVDEC, 最大 4096x4096
9
10结论: 通过 -- 本机可用于 WebRTC 串流
不通过时输出(示例为编码器不可用的典型错误码):
1== NVENC 编码器(决定 WebRTC 能否出画面)==
2 [失败] 无法打开编码会话: 2 (UNSUPPORTED_DEVICE)
3
4结论: 失败(1 项) -- 本机的 GPU 编码器在容器内不可用
5 WebRTC 方式必定黑屏。请换一台开发机,或提工单请平台在宿主机侧修复。
结论为失败时,请提交工单联系官方为您在宿主机侧解决问题。
2.3 启动串流服务
把 <EIP> 替换为开发机详情页的公网访问地址(EIP),同时将端口号依次改为您配置的 TCP 与 UDP 端口:
1/root/workspace/quick_start/launch_stream.sh -b <EIP> 49100 47988
输出示例:
1客户端请填 -> Server 114.111.22.233 Signal 49100/tcp Stream 47988/udp
2pid 614 日志 /root/webrtc-test/stream.log
3首次启动约需 310 秒(编译 shader),之后约 20 秒。就绪后执行 check_stream.sh 自检。
-b 表示后台运行。若希望前台运行(Ctrl-C 即停),去掉 -b。端口使用默认值 49100/47988 时可省略,即 /root/workspace/quick_start/launch_stream.sh -b <EIP>。
不确定参数是否填对时,可用 -n 干跑,只打印将要执行的命令而不启动:
1/root/workspace/quick_start/launch_stream.sh -n <EIP> 49100 47988
2.4 等待就绪并自检
百舸官方最新版镜像中已预置了 shader 缓存,大约可节省 2~5 分钟的编译时间:
| 情形 | 耗时(实测) |
|---|---|
| 镜像已预热缓存、同型号 GPU(常见情形) | 约 17 秒 |
| 缓存未命中,需完整编译 shader | 约 5 分钟(306~308 秒) |
| 换了不同型号 GPU,缓存部分命中 | 约 3 分钟(178 秒) |
1/root/workspace/quick_start/check_stream.sh
全部通过时输出:
1== 1. 进程 ==
2 [ OK ] isaacsim 正在运行, pid 614
3 预期 publicIp=114.111.22.233 信令=49100/tcp 媒体=47988/udp
4== 2. app ready ==
5 [ OK ] [16.750s] app ready
6 [ -- ] 日志中的 ROS2 Bridge 报错 -- 无害,可忽略
7 [ -- ] glfw 插件警告 -- 无显示器时的正常现象,可忽略
8== 3. 信令端口监听 ==
9 [ OK ] TCP 49100 处于 LISTEN
10== 4. SDP ICE candidate(决定性)==
11 candidate:1 1 udp 2122260223 114.111.22.233 47988 typ host
12 [ OK ] SDP 通告 114.111.22.233:47988/udp -- 与启动参数一致
13 [ -- ] 仍需确认 BLB 已将 47988 映射为 47988/UDP;此处不一致时表现为纯黑屏且无任何报错
14
15结论: 通过
16客户端请填 -> Server 114.111.22.233 Signal 49100 Stream 47988
若第 2 项显示「尚未就绪」,说明还在启动中,等待后重试,或用 tail -f /root/webrtc-test/stream.log 观察进度。
停止服务
1pkill -f "livestream.app/primaryStream"
2.5 在本地安装并连接客户端
第 1 步:下载客户端
从 NVIDIA 官方下载 Isaac Sim WebRTC Streaming Client,选择与开发机 Isaac Sim 版本匹配的客户端版本:https://docs.isaacsim.omniverse.nvidia.com/latest/installation/download.html
注意:官方仅提供 Windows x86_64、Linux x86_64 和 macOS x86_64 版本。Apple Silicon(M 系列)Mac 需通过 Rosetta 运行 x86_64 版本。 第 2 步:填写连接参数
打开客户端,按 2.4 节最后输出的三个值填写:
| 字段 | 填写内容 | 示例 |
|---|---|---|
| Server | 开发机 EIP | EIP |
| Signal Port | 信令端口 | 49100 |
| Stream Port | 媒体端口 | 47988 |
| Resolution | 分辨率 | 1280x720 HD |
点击 Connect。正常情况下几秒内即出现 Isaac Sim 界面,右上角性能面板可见帧率(实测 1280x720 下 60.02 FPS,帧时间 16.66 ms)。
第一次 Connect 黑屏时,先原地重连一次再排查。 一个串流服务同时只服务一个客户端,
check_stream.sh的第 4 项检查本身会短暂占用这个名额,服务端回收有数秒延迟。若刚跑完自检就立刻 Connect,可能撞上名额未释放,等几秒重连即可。 注意:第二个客户端连接会得到黑屏;重启串流服务会强制接管会话并丢失未保存的工作。
2.6 常见问题
Q1:客户端连上了,但画面一直全黑
这是本方式最典型的故障。先做两件不花钱的事:等几秒重连一次(排除会话名额未释放),然后看日志区分原因:
1grep -aE "Got stop event|Failed to create video stream" /root/webrtc-test/stream.log
| 日志中出现 | 原因 | 去看 |
|---|---|---|
Got stop event while waiting for client connection |
媒体通路不通(端口/IP 配置) | 下面的 A |
Failed to create video stream 0 + NVST_R_INVALID_STATE |
开发机 GPU 编码器不可用 | Q9 |
| 两条都没有 | 客户端还没真正连上,或仍在启动中 | 先跑 /root/workspace/quick_start/check_stream.sh |
注意:在客户端连接之前,日志里不会有任何相关报错——端口填错不会在启动阶段暴露,
launch_stream.sh与check_stream.sh都会显示正常。只有在客户端点了 Connect 之后,日志里才会留下上表的痕迹。 A. 媒体通路不通的排查顺序
- 在开发机执行
/root/check_stream.sh。它的第 4 项会打印 Isaac Sim 实际告知客户端的地址:
1candidate:1 1 udp 2122260223 114.111.22.233 47988 typ host
2 ^^^^^^^^^^^^^^ ^^^^^
3 必须是 EIP 必须等于 BLB 的 UDP 端口
- 若这里的 IP 是内网地址 → 2.3 节的
<EIP>填错了。 - 若这里的端口与开发机详情页 BLB 配置的 UDP 端口不一致 → 修正 2.1 节的端口映射,或用一致的端口重启服务。端口数字写错一位(如 47988/47998)是最常见的原因。
- 若 IP 和端口都对,则检查 BLB 的
webrtc-media一条是否配成了 UDP 而非 TCP。 - 以上全部核对无误仍然黑屏时,不要相信控制台的端口表,去实测一次——我们遇到过控制台已显示
47988 → 47988但转发规则实际没有生效的情况(改配置后 BLB 内侧监听已刷新、EIP 外侧的端口转换仍是旧值)。实测方法见 Q9。
Q2:日志里有 [Error] ... ROS2 Bridge startup failed
无害,可忽略。串流不依赖 ROS2 Bridge。
Q3:界面底部状态栏有黄色警告 Failed to startup plugin carb.windowing-glfw.plugin
无害,可忽略。串流模式下开发机没有本地显示器,该插件本就无法启动;Isaac Sim 状态栏会一直显示最后一条警告。
Q4:日志里找不到 Started primary stream server on signal port ... 这一行
不代表失败。该日志行在部分环境不输出。请以 /root/check_stream.sh 的结果为准,不要以这行日志判断是否启动成功。
Q5:netstat / ss 看不到媒体端口(47988/UDP)在监听
正常现象。该 UDP 端口在客户端接入前不会出现在监听列表中,不是故障。
Q6:连接成功后想确认是否真的在用 GPU 硬件编码
客户端连上后,在开发机执行:
1nvidia-smi --query-gpu=encoder.stats.sessionCount,encoder.stats.averageFps --format=csv
正常输出 1, 59 左右。注意此命令仅在客户端已连接时有效,连接前 sessionCount 恒为 0,不能用于连接前的健康检查。
Q7:check_stream.sh 第 4 项偶尔报「没有 ICE candidate」或「peerRemoved」
因为串流会话名额同时只有一个,而这项检查本身要占用它,服务端回收有延迟,实测约每 3 次尝试才有 1 次能拿到 SDP。脚本内部已做 6 次重试,正常情况下不会暴露该现象。若您手工写检查逻辑,务必重试,否则会得到随机的假失败。
Q8:画面卡顿
参考前文「使用需知」:确认 BLB 带宽不低于 50 Mbps,开发机创建在离使用者最近的地域,并在客户端降低 Resolution。
Q9:控制台端口表看起来是对的,如何实测转发真的生效?
在开发机起一个临时 UDP 接收端(把 47988 换成您的媒体端口):
1python3 - <<'EOF'
2import socket
3s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
4s.bind(("0.0.0.0", 47988)); s.settimeout(60)
5print("listening 47988/udp")
6for _ in range(5):
7 d, a = s.recvfrom(2048); print("收到", d, "来自", a, flush=True)
8EOF
在本地电脑(客户端所在机器)另开一个终端,把 <EIP> 换成实际地址:
1python3 -c "import socket;s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM);[s.sendto(b'ping%d'%i,('<EIP>',47988)) for i in range(5)]"
开发机侧打印出 5 行「收到」即转发生效。若收不到但控制台显示映射正确,说明 BLB 转发规则未真正生效,需重建端口映射或提工单。
此测试需在串流服务未运行时做,否则端口已被 Isaac Sim 占用,
bind会失败。
2.7 访问控制(必读)
WebRTC 串流服务没有任何身份认证。BLB 上开放的 49100/TCP 与 47988/UDP 对全网可达,任何人都可以连入并完整操作您的 Isaac Sim。
请在 BLB 上配置安全组,仅放通您自己的出口 IP:
- 参见 BLB 安全组配置文档
- 需同时限制 TCP 49100 和 UDP 47988 两条规则,只限制其中一条无效
- 不再使用时请及时停止串流服务并关闭端口映射
3. 案例演示
以通过 WebRTC 客户端连入 Isaac Sim 为例:
3.1 执行官方四足和人形可操作演示
3.1.1 步骤一:开启机器人案例选项卡

3.1.2 步骤二:加载 Humanoid 人形机器人案例
点击 Load 按钮加载,Reset 按钮重置案例(或选择右侧的 Quadruped 四足机器人案例,同样点击 Load 按钮加载、Reset 按钮重置)。
一般来说,对一个模型或者脚本点击 Load 按钮,客户端窗口会停止响应一些时间进行网络加载。但在开发机刚新建时,这里的加载时间过长,也有几率是客户端卡死。
如果客户端卡死,可以关闭客户端后重新 Connect;必要时按 2.4 节的方式停止串流服务,再按 2.3 节重新启动。一般一到两次之后,一旦有一次 Load 成功,之后客户端就不会再卡死。

3.1.3 步骤三:操作机器人
窗口缩放操作:
- 在窗口内使用鼠标滚轮
Humanoid 人形机器人操作:
- 前进:向上箭头 / 数字键 8
- 左转:左箭头 / 数字 4
- 右转:右箭头 / 数字 6
Quadruped 四足机器人操作:
- 前进:向上箭头 / 数字键 8
- 后退:向下箭头 / 数字 2
- 向左移动:左箭头 / 数字 4
- 向右移动:右箭头 / 数字键 6
- 左转:N / NUM 7
- 右转:M / NUM 9
3.1.4 运行效果

3.2 宇树 GR1 机器人简易操作演示
3.2.1 步骤一:在 Assets 中找到 GR1 机器人,并加载到工作空间中
操作结果:

3.2.2 步骤二:使用 Physics Inspector 工具,对关节进行简易操作
操作步骤:
额外步骤:如果按照上面操作后,Physics Inspector 显示异常,则需要点击一下【Re-Enable authoring】按钮,就会显示关节角度界面。




评价此篇文章
