遥操作和模仿学习#

遥操作#

我们提供接口以便在 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 对应的设备。

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

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

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 格式中。

收集演示 Collecting demonstrations#

要收集环境 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
./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

备注

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

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

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

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

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

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

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

备注

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

预先录制的演示#

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

备注

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

生成额外的演示 Generating additional demonstrations#

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

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

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

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

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

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

备注

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

备注

Isaac Lab 旨在与带有抓取器的操作臂配合使用。演示中的抓取器命令被单独提取,并在生成额外演示时按时间顺序重放。

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

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

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

此外,可以调整 --num_envs 参数中的环境数量,以加快数据生成。建议的数量为10,甚至可以在笔记本 GPU 上执行。在更强大的台式机上,将其设置为100或更高,以显著加速此步骤。

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 代理:

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

默认情况下,训练脚本将在每 100 个 epoch 保存一次模型检查点。训练好的模型和日志将被保存到 logs/robomimic/Isaac-Stack-Cube-Franka-IK-Rel-v0/bc

可视化结果#

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

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

生成数据时常见的陷阱#

演示时间太长:

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

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

演示不流畅:

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

  • 更好的遥控设备带来更好的数据(即 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。

子任务注解#

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

通常手动注释是最简单的,因为输入示例的数量通常非常少。要执行手动注释,请使用 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 一起使用。