遥操作和模仿学习#

遥操作#

我们提供接口以便在 SE(2) 和 SE(3) 空间中提供机器人控制命令。在 SE(2) 遥操作的情况下,返回的命令是x-y线速度和yaw角度率,而在 SE(3) 中,返回的命令是一个表示姿态变化的 6-D 向量。

要使用键盘设备进行反向运动学(IK)控制:

./isaaclab.sh -p scripts/environments/teleoperation/teleop_se3_agent.py --task Isaac-Lift-Cube-Franka-IK-Rel-v0 --num_envs 1 --teleop_device keyboard

为了更流畅的操作和离轴操作,我们推荐使用 SpaceMouse 作为输入设备。提供更流畅的演示将使得策略更容易克隆行为。要使用 SpaceMouse,只需相应地更改远程操作设备:

./isaaclab.sh -p scripts/environments/teleoperation/teleop_se3_agent.py --task Isaac-Lift-Cube-Franka-IK-Rel-v0 --num_envs 1 --teleop_device spacemouse

备注

如果未检测到 SpaceMouse,您可能需要通过运行 sudo chmod 666 /dev/hidraw<#> 来授予额外的用户权限,其中 <#> 对应于连接的 SpaceMouse 的设备索引。

为了确定设备索引,运行 ls -l /dev/hidraw* 列出所有 hidraw 设备。通过运行 cat /sys/class/hidraw/hidraw<#>/device/uevent 在每个先前步骤列出的设备上,识别与 SpaceMouse 对应的设备。

我们建议使用Isaac Lab的本地部署来使用SpaceMouse。如果使用容器部署 (Docker 指南),必须通过在 docker-compose.yaml 文件中添加一个带有设备路径的 devices 属性,将SpaceMouse手动挂载到 isaac-lab-base 容器中:

devices:
   - /dev/hidraw<#>:/dev/hidraw<#>

其中 <#> 是连接的SpaceMouse的设备索引。

如果您正在使用 IsaacLab + CloudXR 容器部署 (设置 CloudXR 远程操作),您可以在 docker/docker-compose.cloudxr-runtime.patch.yaml 文件的 services -> isaac-lab-base 部分下添加 devices 属性。

Isaac Lab 仅兼容 3Dconnexion 的 SpaceMouse Wireless 和 SpaceMouse Compact 型号。

对于从事用手部追踪的扩展现实(XR)设备受益的任务,Isaac Lab支持使用NVIDIA CloudXR将场景沉浸式流传给可兼容的XR设备进行远程操作。请注意,当使用手部追踪时,我们建议使用任务的绝对变体 (Isaac-Stack-Cube-Franka-IK-Abs-v0),其需要 handtracking_abs 设备:

./isaaclab.sh -p scripts/environments/teleoperation/teleop_se3_agent.py --task Isaac-Stack-Cube-Franka-IK-Abs-v0 --teleop_device handtracking_abs --device cpu

备注

请查看 设置 CloudXR 远程操作 了解如何在Isaac Lab中使用CloudXR的更多信息。

脚本打印配置的遥操作事件。对于键盘,它们如下:

Keyboard Controller for SE(3): Se3Keyboard
   Reset all commands: R
   Toggle gripper (open/close): K
   Move arm along x-axis: W/S
   Move arm along y-axis: A/D
   Move arm along z-axis: Q/E
   Rotate arm along x-axis: Z/X
   Rotate arm along y-axis: T/G
   Rotate arm along z-axis: C/V

对于 SpaceMouse,具体如下:

SpaceMouse Controller for SE(3): Se3SpaceMouse
   Reset all commands: Right click
   Toggle gripper (open/close): Click the left button on the SpaceMouse
   Move arm along x/y-axis: Tilt the SpaceMouse
   Move arm along z-axis: Push or pull the SpaceMouse
   Rotate arm: Twist the SpaceMouse

下一节描述了如何使用遥操作设备进行模仿学习的数据收集。

模仿学习#

使用遥操作设备,还可以收集用于示范学习(LfD)的数据。为此,我们提供脚本将数据收集到开放的 HDF5 格式中。

收集演示#

要收集环境 Isaac-Stack-Cube-Franka-IK-Rel-v0 的遥操作示范,请使用以下命令:

# step a: create folder for datasets
mkdir -p datasets
# step b: collect data with a selected teleoperation device. Replace <teleop_device> with your preferred input device.
# Available options: spacemouse, keyboard, handtracking, handtracking_abs, dualhandtracking_abs
./isaaclab.sh -p scripts/tools/record_demos.py --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --teleop_device <teleop_device> --dataset_file ./datasets/dataset.hdf5 --num_demos 10
# step a: replay the collected dataset
./isaaclab.sh -p scripts/tools/replay_demos.py --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --dataset_file ./datasets/dataset.hdf5

备注

堆叠立方体的顺序应为蓝色(底部)、红色(中间)、绿色(顶部)。

小技巧

在使用XR设备时,我们建议使用任务的 Isaac-Stack-Cube-Franka-IK-Abs-v0 版本和 --teleop_device handtracking_abs 来收集演示,该命令可控制末端执行器使用手部的绝对位置。

为了后续步骤成功,通常需要大约 10 次成功演示。

以下是一些执行演示并成功进行策略训练的技巧:

  • 保持演示简短。简短的演示意味着策略需要做出的决策更少,从而使训练变得更容易。

  • 走一条直接的路径。不要沿着任意轴线移动,而是直线朝着目标前进。

  • 不要暂停。请执行平滑、连续的动作。由于策略并不明显地解释何时以及为何要暂停,因此连续的动作更容易学习。

如果在进行演示时出现错误,或者当前的演示由于其他原因不应被记录,请按 R 键丢弃当前演示,并重置到新的起始位置。

备注

非确定性可能会在回放过程中观察到,因为在使用 env.reset 时,IsaacLab 中的物理现象无法确定性地重现。

预先录制的演示#

我们提供了一个预先录制的 dataset.hdf5 ,包含 10 个关于 Isaac-Stack-Cube-Franka-IK-Rel-v0 的人类示范,您可以在 这里 下载该数据集。如果您不希望收集自己的示范,可以在接下来的教程步骤中使用此数据集。

备注

使用预录制的数据集是可选的。

生成额外的演示#

额外的演示可以使用 Isaac Lab Mimic 生成。

Isaac Lab Mimic 是 Isaac Lab 中的一个功能,允许自动生成额外的示范,从而使得一个策略即使仅通过少量的手动示范也能够成功学习。

在下面的示例中,我们将展示如何使用Isaac Lab Mimic生成额外的演示,可用于训练基于状态的策略 (使用 Isaac-Stack-Cube-Franka-IK-Rel-Mimic-v0 环境)或视觉运动策略 (使用 Isaac-Stack-Cube-Franka-IK-Rel-Visuomotor-Mimic-v0 环境)。

重要

以下各节中的所有命令必须保持一致的策略类型。例如,如果选择使用基于状态的策略,那么所有使用的命令都应来自 “基于状态的策略” 选项卡。

为了使用 Isaac Lab Mimic 和录制的数据集,首先在录制中注释子任务:

./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/annotate_demos.py \
--device cuda --task Isaac-Stack-Cube-Franka-IK-Rel-Mimic-v0 --auto \
--input_file ./datasets/dataset.hdf5 --output_file ./datasets/annotated_dataset.hdf5
./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/annotate_demos.py \
--device cuda --enable_cameras --task Isaac-Stack-Cube-Franka-IK-Rel-Visuomotor-Mimic-v0 --auto \
--input_file ./datasets/dataset.hdf5 --output_file ./datasets/annotated_dataset.hdf5

然后,使用 Isaac Lab Mimic 生成一些额外的示范:

./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \
--device cuda --num_envs 10 --generation_num_trials 10 \
--input_file ./datasets/annotated_dataset.hdf5 --output_file ./datasets/generated_dataset_small.hdf5
./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \
--device cuda --enable_cameras --num_envs 10 --generation_num_trials 10 \
--input_file ./datasets/annotated_dataset.hdf5 --output_file ./datasets/generated_dataset_small.hdf5

备注

annotate_demos.py 脚本的 output_file 是 generate_dataset.py 脚本的 input_file。

检查生成的数据输出(文件名: generated_dataset_small.hdf5 ),如果满意,生成完整数据集:

./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \
--device cuda --headless --num_envs 10 --generation_num_trials 1000 \
--input_file ./datasets/annotated_dataset.hdf5 --output_file ./datasets/generated_dataset.hdf5
./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \
--device cuda --enable_cameras --headless --num_envs 10 --generation_num_trials 1000 \
--input_file ./datasets/annotated_dataset.hdf5 --output_file ./datasets/generated_dataset.hdf5

展示的数量可以增加或减少,1000 个展示已被证明能够为此任务提供良好的训练结果。

此外,可以调整 --num_envs 参数中的环境数量,以加快数据生成。建议的数量为10,可以在中等规模的笔记本 GPU 上执行。在更强大的台式机上,使用更多的环境可以显著加快这一步的速度。

Robomimic 设置#

作为一个例子,我们将训练一个在 Robomimic 中实现的 BC 代理来训练一个策略。可以使用任何其他框架或训练方法。

要安装 robomimic 框架,请使用以下命令:

# install the dependencies
sudo apt install cmake build-essential
# install python module (for robomimic)
./isaaclab.sh -i robomimic

训练一个智能体#

使用Mimic生成的数据,现在我们可以训练一个针对 Isaac-Stack-Cube-Franka-IK-Rel-v0 的基于状态的BC代理,或者为 Isaac-Stack-Cube-Franka-IK-Rel-Visuomotor-v0 训练一个视觉运动BC代理:

./isaaclab.sh -p scripts/imitation_learning/robomimic/train.py \
--task Isaac-Stack-Cube-Franka-IK-Rel-v0 --algo bc \
--dataset ./datasets/generated_dataset.hdf5
./isaaclab.sh -p scripts/imitation_learning/robomimic/train.py \
--task Isaac-Stack-Cube-Franka-IK-Rel-Visuomotor-v0 --algo bc \
--dataset ./datasets/generated_dataset.hdf5

备注

默认情况下,训练的模型和日志将保存到 IssacLab/logs/robomimic 中。

可视化结果#

通过使用生成的模型进行推理,我们可以可视化策略的结果:

./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py \
--device cuda --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --num_rollouts 50 \
--checkpoint /PATH/TO/desired_model_checkpoint.pth
./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py \
--device cuda --enable_cameras --task Isaac-Stack-Cube-Franka-IK-Rel-Visuomotor-v0 --num_rollouts 50 \
--checkpoint /PATH/TO/desired_model_checkpoint.pth

演示:人形机器人的数据生成和策略训练#

Isaac Lab Mimic支持对多个末端执行器的机器人生成数据。在以下演示中,我们将展示如何生成数据以训练一个Fourier GR-1人形机器人执行拾取和放置任务。

可选:收集和注释演示#

收集人类演示#

备注

GR-1人形机器人环境的数据收集需要使用Apple Vision Pro头戴式显示器。如果您无法访问Apple Vision Pro,您可以跳过此步骤,继续下一步: 生成数据集 。下一步提供了预先记录的带注释数据集。

小技巧

GR1场景利用Apple Vision Pro (AVP)的手腕姿势作为微分 IK 控制器(Pink-IK)的设定点。微分 IK 控制器要求用户的手腕姿势接近机器人的初始或当前姿势,以获得最佳性能。用户的手腕快速移动可能导致其明显偏离目标状态,这可能会阻止 IK 控制器找到最佳解决方案。这可能导致用户的手腕和机器人手腕之间存在不匹配。您可以增加所有 Pink-IK控制器的帧任务 的增益以以较低的延迟跟踪AVP手腕姿势。但是,这可能会导致更多的抖动运动。另外,机器人的手指关节通过 dex-retargeting 库重新定位到用户的手指关节。

按照 设置 CloudXR 远程操作 中的步骤设置CloudXR运行时和Apple Vision Pro以进行远程操作。在运行单个环境时,使用CPU模拟可获得更好的XR性能。

通过运行以下命令收集一组人类演示。成功的演示要求将物体放置在箱子中,并使机器人的右臂收回到起始位置。Isaac Lab Mimic Env GR-1人形机器人设置为左手有一个子任务,右手有两个子任务。第一个子任务涉及右手保持空闲,而左手拿起并将物体移动到右手将要抓住它的位置。这种设置使Isaac Lab Mimic能够通过使用物体的姿势精确插值右手的轨迹,特别是在数据生成期间姿势被随机化时。因此,在左手拿起物体并将其放在稳定位置时,避免动右手。我们建议进行10次成功演示以获得良好的数据生成结果。成功演示的示例如下:

GR-1人形机器人执行拾取和放置任务

通过运行以下命令收集演示:

./isaaclab.sh -p scripts/tools/record_demos.py \
--device cpu \
--task Isaac-PickPlace-GR1T2-Abs-v0 \
--teleop_device dualhandtracking_abs \
--dataset_file ./datasets/dataset_gr1.hdf5 \
--num_demos 10 --enable_pinocchio

小技巧

如果在数据收集过程中演示失败,可以使用Apple Vision Pro上的XR远程操控客户端中的远程操控控制面板或通过说 “重置” 来重置环境。查看 使用Apple Vision Pro远程操作Isaac Lab机器人 以获取更多详细信息。

机器人使用简化的碰撞网格进行物理计算,该网格与模拟中显示的详细可视网格不同。由于这种差异,您可能偶尔会观察到视觉图中机器人的某些部分似乎穿透其他物体或其自身,尽管在物理模拟中正常处理碰撞。

警告

在首次启动仿真窗口时,可能会遇到以下 DeprecationWarningUserWarning 错误:

DeprecationWarning: get_prim_path is deprecated and will be removed
in a future release. Use get_path.
UserWarning: Sum of faceVertexCounts (25608) does not equal sum of
length of GeomSubset indices (840) for prim
'/GR1T2_fourier_hand_6dof/waist_pitch_link/visuals/waist_pitch_link/mesh'.
Material mtl files will not be created.

可以忽略此错误,不会影响数据收集过程。错误将在未来版本的Isaac Sim中修复。

您可以通过运行以下命令重现收集的演示:

./isaaclab.sh -p scripts/tools/replay_demos.py \
--device cpu \
--task Isaac-PickPlace-GR1T2-Abs-v0 \
--dataset_file ./datasets/dataset_gr1.hdf5 --enable_pinocchio

备注

非确定性可能会在回放过程中观察到,因为在使用 env.reset 时,IsaacLab 中的物理现象无法确定性地重现。

注释演示#

与之前的Franka叠叠物任务不同,GR-1拾取和放置任务使用手动注释来定义子任务。每个演示都需要在右臂的第一个和第二个子任务之间进行单个注释。当右侧机器人手臂完成 “空闲” 子任务并开始向目标物体移动时,应进行此注释(按下 “S” 按钮)。以下是正确注释的示例:

../../_images/gr-1_pick_place_annotation.jpg

通过运行以下命令注释演示:

./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/annotate_demos.py \
--device cpu \
--task Isaac-PickPlace-GR1T2-Abs-Mimic-v0 \
--input_file ./datasets/dataset_gr1.hdf5 \
--output_file ./datasets/dataset_annotated_gr1.hdf5 --enable_pinocchio

备注

脚本打印用于手动注释的键盘命令以及当前正在注释的子任务:

Annotating episode #0 (demo_0)
   Playing the episode for subtask annotations for eef "right".
   Subtask signals to annotate:
      - Termination:      ['idle_right']

   Press "N" to begin.
   Press "B" to pause.
   Press "S" to annotate subtask signals.
   Press "Q" to skip the episode.

小技巧

如果在注释过程中物体未放入箱子,则可以按 “N” 重新播放该事件并重新注释。或者您可以按 “Q” 跳过该事件并注释下一个。

生成数据集#

如果您跳过了之前的收集和注释步骤,请从 此处 下载预先记录的带注释数据集 dataset_annotated_gr1.hdf5 。将文件放置在 IsaacLab/datasets 下,并运行以下命令以生成一个包含1000个演示的新数据集。

./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \
--device cuda --headless --num_envs 10 --generation_num_trials 1000 --enable_pinocchio \
--input_file ./datasets/dataset_annotated_gr1.hdf5 --output_file ./datasets/generated_dataset_gr1.hdf5

训练一个策略#

使用Robomimic为生成的数据集训练一个策略。

./isaaclab.sh -p scripts/imitation_learning/robomimic/train.py \
--task Isaac-PickPlace-GR1T2-Abs-v0 --algo bc \
--normalize_training_actions \
--dataset ./datasets/generated_dataset_gr1.hdf5

训练脚本将标准化数据集中的操作到范围[-1, 1]。标准化参数保存在模型目录下的 PATH_TO_MODEL_DIRECTORY/logs/normalization_params.txt 文件中。记录标准化参数以备后续在可视化步骤中使用。

备注

默认情况下,训练的模型和日志将保存到 IssacLab/logs/robomimic 中。

可视化结果#

通过运行以下命令,使用之前训练步骤中记录的标准化参数来可视化训练策略的结果:

./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py \
--device cuda \
--enable_pinocchio \
--task Isaac-PickPlace-GR1T2-Abs-v0 \
--num_rollouts 50 \
--norm_factor_min <NORM_FACTOR_MIN> \
--norm_factor_max <NORM_FACTOR_MAX> \
--checkpoint /PATH/TO/desired_model_checkpoint.pth

备注

将上述命令中的 NORM_FACTOR 更改为训练步骤中生成的值。

生成数据时常见的陷阱#

演示时间太长:

  • 更长的时间范围对于策略来说更难学习

  • 从第一个物体开始,尽量减少运动

演示不流畅:

  • 不规则运动很难被策略解读

  • 更好的遥控设备带来更好的数据(即 SpaceMouse 比 Keyboard 更好)

演示中的暂停:

  • 暂停是难以学习的

  • 保持人类动作平滑流畅

过多的子任务:

  • 最小化完成给定任务所需定义的子任务数量

  • 较少的子任务导致较少的轨迹拼接,从而提高了数据生成成功率

缺乏动作噪音:

  • 行动噪声使策略更加稳健

录制裁剪过于紧密:

  • 如果录制在成功项触发的帧上停止,则在回放期间可能不会重新触发

  • 允许在录音结束时留出一些缓冲区

非确定性重放:

  • 在 IsaacLab 中,使用 env.reset 时,物理模拟无法确定性地复现,因此在回放时,演示可能会失败。

  • 收集比需要更多的人类示例,使用在标注过程中成功的示例

  • 所有在 Isaac Lab Mimic 生成的 HDF5 文件中的数据都代表一个成功的演示,并且可以用于训练(即使非确定性在重放时导致失败)。

创建您自己的 Isaac Lab Mimic 兼容环境#

它是如何工作的#

Isaac Lab Mimic 通过将输入的示范分割成子任务来工作。子任务是示范中用户定义的、在所有示范中共有的片段。子任务的例子包括 “抓取物体” 、 “将末端执行器移动到某个预定义位置” 、 “释放物体” 等等。请注意,大多数子任务是相对于机器人与之交互的某个物体来定义的。

子任务需要被定义,然后为每个输入示例添加注释。注释可以通过定义用于子任务检测的启发式算法来实现,如上面示例中所做的那样,或者也可以手动完成。

定义并注释了子任务后,Isaac Lab Mimic 利用少量辅助方法来转换子任务片段,并通过将它们拼接在一起生成新的演示,以匹配当前的任务。

对于每个这样生成的候选演示,Isaac Lab Mimic 使用布尔成功标准来判断演示是否成功执行任务,如果成功,则将其添加到输出数据集。候选演示的成功率在简单情况下可以高达 70%,而在复杂任务和机器人本身的复杂性影响下,成功率可能低于 1%。

配置和子任务定义#

子任务,除了 Isaac Lab Mimic 的其他配置设置外,还在 Mimic 兼容的环境配置类中定义,该类通过扩展现有的环境配置并加入额外的 Mimic 所需参数来创建。

所有 Mimic 所需的配置参数都在 MimicEnvCfg 类中指定。

配置类 FrankaCubeStackIKRelMimicEnvCfg 作为一个示例,用于创建一个与 Mimic 兼容的环境配置类,适用于上面示例中使用的 Franka 堆叠任务。

DataGenConfig 成员包含各种影响数据生成的参数。最初只需要设置 name 参数,其他的可以稍后修改。

子任务是一个 SubTaskConfig 对象的列表,其中最重要的成员是:

  • object_ref 是正在交互的对象。它将用于在数据生成过程中相对于该对象调整动作。如果当前子任务不涉及任何对象,则可以是 None

  • subtask_term_signal 是指示子任务是否处于活动状态的信号的 ID。

对于具有多个末端执行器的环境,可以通过指定子任务约束来强制执行末端执行器之间的子任务顺序。这些约束在 SubTaskConstraintConfig 类中定义。

子任务注解#

一旦子任务被定义,它们需要在源数据中进行标注。有两种方法可以标注源示范的子任务边界: 手动标注或使用启发式方法。

通常手动注释是最简单的,因为输入示例的数量通常非常少。要执行手动注释,请使用 annotate_demos.py 脚本,且不带 --auto 标志。然后按 B 暂停,按 N 继续,按 S 注释子任务边界。

为了更精确的边界,或为了加速对给定任务的重复处理以进行实验,可以实现启发式方法来执行相同的任务。启发式方法是对环境中的观察。如何添加子任务术语的示例可以在 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/stack_env_cfg.py 中找到,其中它们作为一个观察组被添加,名为 SubtaskCfg 。这个示例使用了预构建的启发式方法,但自定义启发式方法也很容易实现。

生成演示的助手#

在 Isaac Lab Mimic 中需要的帮助程序是在环境中定义的。所有要与 Isaac Lab Mimic 一起使用的任务都源自 ManagerBasedRLMimicEnv 基类,并且必须实现以下功能:

  • get_robot_eef_pose: 返回当前机器人末端执行器姿态,该姿态与机器人末端执行器控制器使用的坐标系相同。

  • target_eef_pose_to_action: 获取目标姿态和夹持器动作,供末端执行器控制器使用,并返回一个能够实现目标姿态的动作。

  • action_to_target_eef_pose: 采取一个动作并返回末端执行器控制器的目标姿态。

  • ``actions_to_gripper_actions ``:接收一系列动作,并返回动作中的夹爪驱动部分。

  • get_object_poses: 返回场景中用于数据生成的每个对象的姿势。

  • get_subtask_term_signals: 返回一个字典,包含任务中每个子任务的二进制标志。当子任务已完成时,标志为 true,否则为 false。

该类 FrankaCubeStackIKRelMimicEnv 展示了如何从现有的 Isaac Lab 环境创建一个 Mimic 兼容的环境。

注册环境#

一旦创建了兼容 Mimic 的环境和环境配置类,就可以使用 gym.register 注册一个新的 Mimic 兼容环境。对于上面示例中的 Franka 堆叠任务,Mimic 环境被注册为 Isaac-Stack-Cube-Franka-IK-Rel-Mimic-v0

注册的环境现在已准备好与 Isaac Lab Mimic 一起使用。