设置 CloudXR 远程操作#
NVIDIA CloudXR 可以实现在任何网络上向扩展现实(XR)设备流畅、高保真地进行沉浸式流媒体传输。
Isaac Lab 开发人员可以使用 CloudXR 与 Isaac Lab 一起构建需要沉浸式 XR 渲染以提高空间准确性和/或需要手部追踪以进行灵巧机器人远程操作的远程操作工作流程。
在这些工作流程中,Isaac Lab 渲染并提交机器人模拟的立体视图给 CloudXR,然后 CloudXR 对渲染视图进行编码并通过低延迟、GPU 加速的管道实时将渲染视图传送到兼容的 XR 设备上。来自 XR 设备的手部追踪等控制输入通过 CloudXR 从 XR 设备返回到 Isaac Lab,可以用来控制机器人。
本指南解释了如何在 Isaac Lab 中使用 CloudXR 和 Apple Vision Pro 进行沉浸式流媒体和远程操作。
备注
未来版本计划支持更多设备。
概述#
使用 CloudXR 与 Isaac Lab 包括以下组件:
Isaac Lab 用于模拟机器人环境并应用从远程操作员接收的控制数据。
NVIDIA CloudXR Runtime 在 Isaac Lab 工作站上以 Docker 容器运行,并将虚拟模拟从 Isaac Lab 流式传输到兼容的 XR 设备。
Isaac XR 远程操控示例客户端 是一个用于 Apple Vision Pro 的示例应用程序,可以使用 CloudXR 沉浸式流媒体和远程操作 Isaac Lab 模拟。
本指南将为您介绍如何:
使用Apple Vision Pro进行远程操作 ,包括如何 为Apple Vision Pro构建和安装Isaac XR远程操作示例客户端应用程序 和 使用Apple Vision Pro远程操作Isaac Lab机器人 。
在Isaac Lab中为XR进行开发 ,包括如何 使用启用了 XR 扩展的 Isaac Lab , 配置 XR 场景放置 和 优化 XR 性能 。
使用 XR 设备输入控制机器人 ,包括 OpenXR 设备 , 重映射架构 以及如何实现 为 XR UI 事件添加回调 。
以及 已知问题 。
系统要求#
在使用 CloudXR 与 Isaac Lab 之前,请查看以下系统要求:
Isaac Lab 工作站(Linux)
Ubuntu 22.04
Docker 26.0.0+, Docker Compose 2.25.0+ 和 NVIDIA Container Toolkit 。有关如何安装,请参阅 Isaac Lab Docker 指南 。
NVIDIA 驱动程序版本 550 或更高
最佳性能要求:16 核 Intel Core i9,X 系列或更高 AMD Ryzen 9,Threadripper 或更高
最佳性能要求:64GB RAM
最佳性能要求:2x RTX 6000 Ada GPU(或等效)
Apple Vision Pro
visionOS 2.0+
Apple M3 Pro 芯片,配备 11 核 CPU,至少 5 个性能核心和 6 个效率核心
16GB 统一内存
256 GB 固态硬盘
基于 Apple Silicon 的 Mac(用于使用 Xcode 为 Apple Vision Pro 构建 Isaac XR 远程操控示例客户端应用程序)
macOS Sonoma 14.5 或更高
Wifi 6 能力路由器
强大的无线连接对于高质量的流媒体体验至关重要
我们建议使用专用路由器,因为并发使用会降低质量
Apple Vision Pro 和 Isaac Lab 工作站必须能够相互实现 IP 可达性(注意:很多机构网络将会阻止设备互相访问,导致 Apple Vision Pro 找不到 Isaac Lab 工作站于网络中)
使用 CloudXR 运行 Isaac Lab#
CloudXR Runtime 在您的 Isaac Lab 工作站上的 Docker 容器中运行,并负责将 Isaac Lab 模拟流式传输到兼容的 XR 设备。
确保已在您的 Isaac Lab 工作站上安装 Docker , Docker Compose 和 NVIDIA Container Toolkit ,如 Isaac Lab Docker 指南 中所描述。
还要确保您的防火墙允许通过运行的 CloudXR 使用的端口进行连接:
sudo ufw allow 47998:48000,48005,48008,48012/udp
sudo ufw allow 48010/tcp
有两种选项可运行 CloudXR Runtime Docker 容器:
选项1(推荐):使用 Docker Compose 同时运行 Isaac Lab 和 CloudXR Runtime容器
在您的 Isaac Lab 工作站上:
从 Isaac Lab 仓库的根目录开始,使用 Isaac Lab 的
container.py
脚本启动 Isaac Lab 和 CloudXR Runtime容器./docker/container.py start \ --files docker-compose.cloudxr-runtime.patch.yaml \ --env-file .env.cloudxr-runtime
如果提示,选择激活 X11 转发,这对于查看 Isaac Lab UI 是必要的。
备注
container.py
脚本是 Docker Compose 的一个薄包装器。额外的--files
和--env-file
参数会增强基础 Docker Compose 配置,以额外运行 CloudXR Runtime有关
container.py
和使用 Docker Compose 运行 Isaac Lab 的更多详细信息,请参阅 Docker 指南 。使用以下命令进入 Isaac Lab 基础容器:
./docker/container.py enter base
从 Isaac Lab 基础容器内部,您可以运行使用 XR 的 Isaac Lab 脚本。
使用示例遥操作任务运行:
./isaaclab.sh -p scripts/environments/teleoperation/teleop_se3_agent.py \ --task Isaac-PickPlace-GR1T2-Abs-v0 \ --teleop_device dualhandtracking_abs \ --enable_pinocchio
在下一步骤中,您将希望保留容器运行。 但是一旦完成,您可以停止容器:
./docker/container.py stop \ --files docker-compose.cloudxr-runtime.patch.yaml \ --env-file .env.cloudxr-runtime
选项2:使用 Docker 作为本地进程运行 Isaac Lab 和 CloudXR Runtime 容器
Isaac Lab 可以作为连接到 CloudXR Runtime Docker 容器的本地进程运行。但是,此方法需要手动指定用于 Isaac Lab 实例和 CloudXR Runtime 之间通信的共享目录。
在您的 Isaac Lab 工作站上:
从Isaac Lab存储库的根目录中为临时缓存文件创建一个本地文件夹:
mkdir -p $(pwd)/openxr
启动CloudXR Runtime,将上面创建的目录挂载到容器中的
/openxr
目录中:docker run -it --rm --name cloudxr-runtime \ --user $(id -u):$(id -g) \ --runtime=nvidia \ -e "ACCEPT_EULA=Y" \ --mount type=bind,src=$(pwd)/openxr,dst=/openxr \ -p 48010:48010 \ -p 47998:47998/udp \ -p 47999:47999/udp \ -p 48000:48000/udp \ -p 48005:48005/udp \ -p 48008:48008/udp \ -p 48012:48012/udp \ nvcr.io/nvidia/cloudxr-runtime:0.1.0-isaac
在打算运行Isaac Lab的新终端中,导出以下环境变量,这些环境变量引用了上面创建的目录:
export XDG_RUNTIME_DIR=$(pwd)/openxr/run export XR_RUNTIME_JSON=$(pwd)/openxr/share/openxr/1/openxr_cloudxr.json
现在您可以运行使用XR的Isaac Lab脚本。
使用示例遥操作任务运行:
./isaaclab.sh -p scripts/environments/teleoperation/teleop_se3_agent.py \ --task Isaac-PickPlace-GR1T2-Abs-v0 \ --teleop_device dualhandtracking_abs \ --enable_pinocchio
随着Isaac Lab和CloudXR Runtime的运行:
在Isaac Lab UI中:定位名为 AR 的面板。
单击 Start AR 。
视口应显示正在呈现的两只眼睛,并且您应该看到状态 “AR profile is active” 。

Isaac Lab现在准备好从CloudXR客户端接收连接。 接下来的部分将指导您构建并连接CloudXR客户端。
在Isaac Lab中了解有关远程操作和模拟学习的更多信息
要了解有关Isaac Lab远程操作脚本以及如何在Isaac Lab中构建新的远程操作和模拟学习工作流的更多信息,请参阅 遥操作和模仿学习 。
使用Apple Vision Pro进行远程操作#
本节将带您了解如何为Apple Vision Pro构建和安装Isaac XR远程操作示例客户端,连接到Isaac Lab并远程操作虚拟机器人。
为Apple Vision Pro构建和安装Isaac XR远程操作示例客户端应用程序#
在您的Mac上:
克隆 Isaac XR 远程操作示例客户端 GitHub存储库:
git clone git@github.com:isaac-sim/isaac-xr-teleop-sample-client-apple.git
按照存储库中的README构建并安装应用程序到您的Apple Vision Pro上。
使用Apple Vision Pro远程操作Isaac Lab机器人#
在您的Apple Vision Pro上安装了Isaac XR远程操作示例客户端后,您现在可以连接到Isaac Lab了。
在您的 Isaac Lab 工作站上:
确保Isaac Lab和CloudXR像 使用 CloudXR 运行 Isaac Lab 中描述的那样都在运行,包括使用支持远程操作的脚本启动Isaac Lab。 例如:
./isaaclab.sh -p scripts/environments/teleoperation/teleop_se3_agent.py \ --task Isaac-PickPlace-GR1T2-Abs-v0 \ --teleop_device dualhandtracking_abs \ --enable_pinocchio
备注
请记住,上面的脚本应在Isaac Lab Docker容器内部运行(选项1,推荐),或使用环境变量配置为由运行中的CloudXR Runtime Docker容器共享的目录(选项2)。
定位名为 AR 的面板。
单击 Start AR ,并确保视口显示正在呈现的两只眼睛。
返回到您的Apple Vision Pro:
打开Isaac XR远程操作示例客户端。 您应该看到一个UI窗口:
输入您的Isaac Lab工作站的IP地址。
备注
Apple Vision Pro和Isaac Lab机器必须可以相互访问IP。
我们建议在此过程中使用专用的Wifi 6路由器,因为许多机构无线网络将阻止设备相互访问,使得Apple Vision Pro无法在网络上找到Isaac Lab工作站。
单击 连接 。
第一次尝试连接时,您可能需要允许应用程序访问权限,比如手部跟踪和本地网络使用,然后再次连接。
经过一段时间后,您应该可以在Apple Vision Pro上看到Isaac Lab仿真,以及用于远程操作的控件。
单击 播放 开始远程操作虚拟机器人。 现在,机器人的运动应该由您的手动作指导。
您可以重复使用UI控件 播放 , 停止 和 重置 远程操作会话。
小技巧
对于需要双手操纵的远程操作任务,可以使用visionOS辅助功能来控制远程操作,而无需使用手势。 例如,为了启用对UI的语音控制:
在 Settings > Accessibility > Voice Control 中,打开 Voice Control
在 Settings > Accessibility > Voice Control > Commands > Basic Navigation 中,打开 <item name>
现在,您可以在应用程序连接时说 “播放” , “停止” 和 “重置” 来控制远程操作。
通过移动双手远程操作虚拟机器人。
备注
点表示手关节位置的跟踪。 点与机器人运动之间的延迟或偏移可能是由于机器人关节和/或机器人控制器的限制引起的。
完成示例后,单击 断开连接 以断开与Isaac Lab的连接。
在Isaac Lab中了解有关远程操作和模拟学习的更多信息
请参阅 遥操作和模仿学习 了解如何记录远程操作演示并使用Isaac Lab构建远程操作和模拟学习工作流。
在Isaac Lab中为XR进行开发#
本节将指导您如何在 Isaac Lab 中开发 XR 环境,用于构建远程操作工作流程。
使用启用了 XR 扩展的 Isaac Lab#
为了启用 XR 所需的扩展,并在 UI 中看到 AR 面板,必须通过向使用 app.AppLauncher
的任何 Isaac Lab 脚本传递 --xr
标志来加载带有 XR 体验文件的 Isaac Lab。
例如:您可以通过使用额外的 --xr
标志来调用任何 教程 中启用和使用 XR。
配置 XR 场景放置#
可以使用 XR 锚点在 XR 设备的本地坐标系内放置机器人仿真,并可通过环境配置中的 xr
字段(类型为 openxr.XrCfg
)进行配置。
具体来说:由 openxr.XrCfg
的 anchor_pos
和 anchor_rot
字段指定的姿势将出现在 XR 设备的本地坐标系原点上,这应该在地板上。
备注
在 Apple Vision Pro 上,本地坐标系可以通过按住数字表冠重置到用户下方的地板上的位置。
例如:如果机器人应该出现在用户的位置,则 anchor_pos
和 anchor_rot
属性应设置为机器人正下方地板上的姿势。
备注
通过在位置的 anchor 处创建一个 primitive,并修改 xr/profile/ar/anchorMode
和 /xrstage/profile/ar/customAnchor
设置, openxr.OpenXRDevice
中应用 XR 锚点配置。
如果正在运行的脚本不使用 openxr.OpenXRDevice
,则需要显式执行这一步骤。
优化 XR 性能#
配置物理和渲染时间步
为了提供高保真的沉浸式体验,建议确保仿真渲染时间步大致与 XR 设备显示时间步匹配。
还要确保此时间步可以实时进行模拟和渲染。
Apple Vision Pro 显示器运行在 90Hz,但许多 Isaac Lab 仿真在为 XR 渲染立体视图时无法实现90Hz性能;因此,为了在 Apple Vision Pro 上获得最佳体验,我们建议以90Hz的仿真 dt 和2的渲染间隔运行,这意味着仿真每两个仿真步骤渲染一次,或者如果性能允许,则以45Hz运行。
您仍然可以根据需要设置较低或较高的仿真 dt,但这可能导致在 XR 中渲染时仿真速度快或慢。
通过修改环境的 __post_init__
函数中的 sim.SimulationCfg
来覆盖环境的时间步配置。例如:
@configclass
class XrTeleopEnvCfg(ManagerBasedRLEnvCfg):
def __post_init__(self):
self.sim.dt = 1.0 / 90
self.sim.render_interval = 2
还要注意,默认情况下,CloudXR 试图根据 Isaac Lab 的渲染时间来动态调整其节奏。如果渲染时间变化很大,这可能导致在 XR 渲染时仿真看起来加速或减速。如果出现此问题,CloudXR 可以通过在启动 CloudXR Runtime Docker 容器时将环境变量 NV_PACER_FIXED_TIME_STEP_MS
设置为整数来配置使用固定时间步。
尝试在 CPU 上运行物理计算
目前建议尝试使用 --device cpu
标志在 Isaac Lab 远程操作脚本上运行。这将导致物理计算在 CPU 上进行,当仿真中只有一个环境时可能会降低延迟。
使用 XR 设备输入控制机器人#
Isaac Lab 提供了一个灵活的架构,用于使用 XR 跟踪数据来控制模拟机器人。本节解释了这种架构的组件以及它们如何相互配合。
OpenXR 设备#
isaaclab.devices.OpenXRDevice
是 Isaac Lab 中启用基于 XR 的远程操作的核心组件。该设备与 CloudXR 接口,从 XR 头显接收跟踪数据并将其转换为机器人控制命令。
在本质上,XR 远程操作需要将用户输入(如手部移动和姿势)映射(或 “重映射” )为机器人控制信号。Isaac Lab 通过其 OpenXRDevice 和 Retargeter 架构使其变得简单。OpenXRDevice 通过 Isaac Sim 的 OpenXR API 捕获手部跟踪数据,然后通过一个或多个 Retargeters 将其转换为机器人动作。
在使用 CloudXR 时,OpenXRDevice 还与 XR 设备的用户界面集成,允许用户直接从他们的 XR 环境触发仿真事件。
重映射架构#
Retargeters 是将原始跟踪数据转换为有意义的机器人控制信号的专业组件。它们实现了 isaaclab.devices.RetargeterBase
接口,并在初始化期间传递给 OpenXRDevice。
Isaac Lab 提供了三种主要的手部跟踪 retargeters:
Se3RelRetargeter (isaaclab.devices.openxr.retargeters.Se3RelRetargeter
)
从相对手部运动生成增量机器人命令
适用于精确操纵任务
Se3AbsRetargeter (isaaclab.devices.openxr.retargeters.Se3AbsRetargeter
)
将手部位置直接映射到机器人末端执行器位置
实现了1:1的空间控制
GripperRetargeter (isaaclab.devices.openxr.retargeters.GripperRetargeter
)
根据拇指-食指距离控制夹具状态
与位置 retargeters 一起用于完整的机器人控制
GR1T2Retargeter (isaaclab.devices.openxr.retargeters.GR1T2Retargeter
)
将 OpenXR 手部跟踪数据重新定位到 GR1T2 手部末端执行器命令
处理左手和右手,将手部姿势转换为 GR1T2 机器人手的关节角度
支持跟踪手部关节的可视化
可以组合 retargeters 以同时控制不同的机器人功能。
使用带有手部跟踪的 Retargeters#
以下是设置手部跟踪的示例:
from isaaclab.devices import OpenXRDevice
from isaaclab.devices.openxr.retargeters import Se3AbsRetargeter, GripperRetargeter
# Create retargeters
position_retargeter = Se3AbsRetargeter(
bound_hand=OpenXRDevice.TrackingTarget.HAND_RIGHT,
zero_out_xy_rotation=True,
use_wrist_position=False # Use pinch position (thumb-index midpoint) instead of wrist
)
gripper_retargeter = GripperRetargeter(bound_hand=OpenXRDevice.TrackingTarget.HAND_RIGHT)
# Create OpenXR device with hand tracking and both retargeters
device = OpenXRDevice(
env_cfg.xr,
retargeters=[position_retargeter, gripper_retargeter],
)
# Main control loop
while True:
# Get the latest commands from the XR device
commands = device.advance()
if commands is None:
continue
# Apply the commands to the environment
obs, reward, terminated, truncated, info = env.step(commands)
if terminated or truncated:
break
扩展 Retargeting 系统#
Retargeting 系统设计为可扩展。您可以通过扩展 isaaclab.devices.RetargeterBase
类并实现处理传入跟踪数据的 retarget
方法来创建自定义 retargeters:
from isaaclab.devices.retargeter_base import RetargeterBase
from isaaclab.devices import OpenXRDevice
class MyCustomRetargeter(RetargeterBase):
def retarget(self, data: dict)-> Any:
# Access hand tracking data using TrackingTarget enum
right_hand_data = data[OpenXRDevice.TrackingTarget.HAND_RIGHT]
# Extract specific joint positions and orientations
wrist_pose = right_hand_data.get("wrist")
thumb_tip_pose = right_hand_data.get("thumb_tip")
index_tip_pose = right_hand_data.get("index_tip")
# Access head tracking data
head_pose = data[OpenXRDevice.TrackingTarget.HEAD]
# Process the tracking data
# Return control commands in appropriate format
...
随着 OpenXR 能力的扩展超出手部跟踪以涵盖头部跟踪和其他功能,可以开发额外的 retargeters 将这些数据映射到各种机器人控制范式。
为 XR UI 事件添加回调#
The OpenXRDevice 可以处理由用户与 XR UI 元素(如按钮和菜单)互动触发的事件。当用户与这些元素交互时,设备会触发已注册的回调函数:
# Register callbacks for teleop control events
device.add_callback("RESET", reset_callback)
device.add_callback("START", start_callback)
device.add_callback("STOP", stop_callback)
当用户与 XR UI 交互时,这些回调将被触发以控制模拟或录制过程。您还可以使用客户端自定义键添加自定义消息,这些消息将触发这些回调,从而允许通过直接用户互动的编程方式控制模拟。自定义键可以是与回调注册匹配的任何字符串值。
已知问题#
[omni.kit.xr.system.openxr.plugin] Message received from CloudXR does not have a field called 'type'
此错误消息可以安全地忽略。这是由 Apple Vision Pro 的 CloudXR 框架发送的一个被弃用的、不向后兼容的数据消息引起的,并将在未来的 CloudXR 框架版本中修复。
XR_ERROR_VALIDATION_FAILURE: xrWaitFrame(frameState->type == 0)
when stopping AR Mode此错误消息可以安全地忽略。这是由 AR 模式的退出处理程序中的竞争条件引起的。
[omni.usd] TF_PYTHON_EXCEPTION
when starting/stopping AR Mode此错误消息可以安全地忽略。这是由 AR 模式的进入/退出处理程序中的竞争条件引起的。
Invalid version string in _ParseVersionString
这个错误消息可能是由使用较旧版本的 USD 创作的着色器资产引起的,通常可以忽略。