遥操作和模仿学习#
遥操作#
我们提供接口以便在 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
: 采取一个动作并返回末端执行器控制器的目标姿态。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 一起使用。