设置 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 模拟。

本指南将为您介绍如何:

以及 已知问题

系统要求#

在使用 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 工作站上安装 DockerDocker ComposeNVIDIA 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 工作站上:

  1. 从 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 指南

  2. 使用以下命令进入 Isaac Lab 基础容器:

    ./docker/container.py enter base
    

    从 Isaac Lab 基础容器内部,您可以运行使用 XR 的 Isaac Lab 脚本。

  3. 使用示例遥操作任务运行:

    ./isaaclab.sh -p scripts/environments/teleoperation/teleop_se3_agent.py \
        --task Isaac-PickPlace-GR1T2-Abs-v0 \
        --teleop_device dualhandtracking_abs \
        --enable_pinocchio
    
  4. 在下一步骤中,您将希望保留容器运行。 但是一旦完成,您可以停止容器:

    ./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 工作站上:

  1. 从Isaac Lab存储库的根目录中为临时缓存文件创建一个本地文件夹:

    mkdir -p $(pwd)/openxr
    
  2. 启动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
    
  3. 在打算运行Isaac Lab的新终端中,导出以下环境变量,这些环境变量引用了上面创建的目录:

    export XDG_RUNTIME_DIR=$(pwd)/openxr/run
    export XR_RUNTIME_JSON=$(pwd)/openxr/share/openxr/1/openxr_cloudxr.json
    

    现在您可以运行使用XR的Isaac Lab脚本。

  4. 使用示例遥操作任务运行:

    ./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的运行:

  1. 在Isaac Lab UI中:定位名为 AR 的面板。

    Isaac Lab UI:AR 面板
  2. 单击 Start AR

视口应显示正在呈现的两只眼睛,并且您应该看到状态 “AR profile is active” 。

Isaac Lab视口呈现两只眼睛

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上:

  1. 克隆 Isaac XR 远程操作示例客户端 GitHub存储库:

    git clone git@github.com:isaac-sim/isaac-xr-teleop-sample-client-apple.git
    
  2. 按照存储库中的README构建并安装应用程序到您的Apple Vision Pro上。

使用Apple Vision Pro远程操作Isaac Lab机器人#

在您的Apple Vision Pro上安装了Isaac XR远程操作示例客户端后,您现在可以连接到Isaac Lab了。

在您的 Isaac Lab 工作站上:

  1. 确保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)。

  2. 定位名为 AR 的面板。

  3. 单击 Start AR ,并确保视口显示正在呈现的两只眼睛。

返回到您的Apple Vision Pro:

  1. 打开Isaac XR远程操作示例客户端。 您应该看到一个UI窗口:

    Isaacl Lab UI:AR 面板
  2. 输入您的Isaac Lab工作站的IP地址。

    备注

    Apple Vision Pro和Isaac Lab机器必须可以相互访问IP。

    我们建议在此过程中使用专用的Wifi 6路由器,因为许多机构无线网络将阻止设备相互访问,使得Apple Vision Pro无法在网络上找到Isaac Lab工作站。

  3. 单击 连接

    第一次尝试连接时,您可能需要允许应用程序访问权限,比如手部跟踪和本地网络使用,然后再次连接。

  4. 经过一段时间后,您应该可以在Apple Vision Pro上看到Isaac Lab仿真,以及用于远程操作的控件。

    Isaac Lab UI:AR 面板
  5. 单击 播放 开始远程操作虚拟机器人。 现在,机器人的运动应该由您的手动作指导。

    您可以重复使用UI控件 播放停止重置 远程操作会话。

    小技巧

    对于需要双手操纵的远程操作任务,可以使用visionOS辅助功能来控制远程操作,而无需使用手势。 例如,为了启用对UI的语音控制:

    1. Settings > Accessibility > Voice Control 中,打开 Voice Control

    2. Settings > Accessibility > Voice Control > Commands > Basic Navigation 中,打开 <item name>

    3. 现在,您可以在应用程序连接时说 “播放” , “停止” 和 “重置” 来控制远程操作。

  6. 通过移动双手远程操作虚拟机器人。

    Isaac Lab使用CloudXR进行手工灵巧机器人的远程操作

    备注

    点表示手关节位置的跟踪。 点与机器人运动之间的延迟或偏移可能是由于机器人关节和/或机器人控制器的限制引起的。

  7. 完成示例后,单击 断开连接 以断开与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.XrCfganchor_posanchor_rot 字段指定的姿势将出现在 XR 设备的本地坐标系原点上,这应该在地板上。

备注

在 Apple Vision Pro 上,本地坐标系可以通过按住数字表冠重置到用户下方的地板上的位置。

例如:如果机器人应该出现在用户的位置,则 anchor_posanchor_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 创作的着色器资产引起的,通常可以忽略。