7.isaac sim4.2 教程-Core API-数据记录
本教程展示了如何使用 DataLogger 记录数据,并在 Omniverse Isaac Sim 中播放这些数据。通过本教程,你将能够在使用 Omniverse Isaac Sim 时记录并回放状态和动作。
1. 记录数据
按照以下步骤使用目标扩展示例记录数据:
打开示例:
打开 Follow Target 示例,路径为
Isaac Examples > Manipulation > Follow Target
。
加载世界:
在 World Controls 下点击 LOAD,加载 Franka 机器人和可视化目标立方体。
选择输出目录:
在 Follow Target 菜单中,选择数据保存的 json 文件的输出目录,选择 Data Logging。
启动任务:
在 Task Controls 下点击 START 启动任务。
开始记录数据:
点击 START LOGGING 开始记录数据。
移动目标立方体:
移动可视化目标立方体,使 Franka 使用 RMPFlowController 跟随它。
保存数据:
几秒钟后,点击 SAVE DATA 保存记录的数据。
创建新场景:
点击 File > New From Stage Template > Empty 创建一个新的空白场景。
确认数据保存:
记录的数据应该已经保存到 Output Directory 文本框中指定的文件中。
这样,您就完成了在 Omniverse Isaac Sim 中通过 DataLogger 记录和保存数据的过程。
1.1 代码概述
打开示例代码:
打开位于
~/.local/share/ov/pkg/isaac-sim-4.2.0/extension_examples/follow_target/follow_target.py
的扩展示例代码。可以使用菜单顶部的 open-source code 按钮来查看该代码。
首先要关注的是 数据记录(logging) 功能。
def _on_logging_event(self, val):world = self.get_world()data_logger = world.get_data_logger()# 获取世界中默认的 DataLogger 对象# 检查 数据记录器 是否已经启动。如果还没有启动,接下来会定义数据记录的方式并开始记录。if not world.get_data_logger().is_started():robot_name = self._task_params["robot_name"]["value"]target_name = self._task_params["target_name"]["value"]# 数据记录函数,它将在每个物理时间步被调用。该函数获取机器人和目标的状态信息def frame_logging_func(tasks, scene):return {"joint_positions": scene.get_object(robot_name).get_joint_positions().tolist(),"applied_joint_positions": scene.get_object(robot_name).get_applied_action().joint_positions.tolist(),"target_position": scene.get_object(target_name).get_world_pose()[0].tolist(),}# 确保每个物理时间步都会调用这个函数来记录数据。data_logger.add_data_frame_logging_func(frame_logging_func)if val:data_logger.start()else:data_logger.pause()return
现在让我们看一下怎么保存数据集:
def _on_save_data_event(self, log_path):world = self.get_world()data_logger = world.get_data_logger()data_logger.save(log_path=log_path) # 把收集到的数据保存到指定的 json 文件中。data_logger.reset()return
2. 回放数据
类似地,我们将使用另一个在 Isaac Examples 中提供的扩展示例来回放记录的数据。
打开 Follow Target 示例,路径为
Isaac Examples > Manipulation > Replay Follow Target
。在 World Controls 下点击 LOAD,加载 Franka 机器人和可视化目标立方体。
在菜单中的 Data Replay 部分的 Data File 栏中,选择上一步录制数据时保存的 json 文件。
点击 Replay Trajectory(回放轨迹),仅回放机械臂动作并等待轨迹回放完成。
点击 Reset 重置场景。
同样,点击 Replay Scene(回放场景),回放动作和立方体的位置。
2.1 代码概述
async def _on_replay_trajectory_event_async(self, data_file):# 从指定的 JSON 文件中加载数据记录器。self._data_logger.load(log_path=data_file)world = self.get_world()await world.play_async()# 添加物理回调函数,以便在每个物理时间步调用。# 通过这种方式,我们可以重放之前记录的机械臂运动轨迹world.add_physics_callback("replay_trajectory", self._on_replay_trajectory_step)returnasync def _on_replay_scene_event_async(self, data_file):self._data_logger.load(log_path=data_file)world = self.get_world()await world.play_async()# 场景同理world.add_physics_callback("replay_scene", self._on_replay_scene_step)returndef _on_replay_trajectory_step(self, step_size):# 在每个物理时间步中应用记录的关节位置到机械臂控制器。# 这样机械臂就会按照记录的轨迹进行运动。if self._world.current_time_step_index < self._data_logger.get_num_of_data_frames():data_frame = self._data_logger.get_data_frame(data_frame_index=self._world.current_time_step_index)self._articulation_controller.apply_action(ArticulationAction(joint_positions=data_frame.data["applied_joint_positions"]))returndef _on_replay_scene_step(self, step_size):# 不只有机械臂的关节位置需要被重放,目标的位置也需要被重放。if self._world.current_time_step_index < self._data_logger.get_num_of_data_frames():target_name = self._task_params["target_name"]["value"]data_frame = self._data_logger.get_data_frame(data_frame_index=self._world.current_time_step_index)self._articulation_controller.apply_action(ArticulationAction(joint_positions=data_frame.data["applied_joint_positions"]))self._world.scene.get_object(target_name).set_world_pose(position=np.array(data_frame.data["target_position"]))return