当前位置: 首页 > news >正文

7.isaac sim4.2 教程-Core API-数据记录

本教程展示了如何使用 DataLogger 记录数据,并在 Omniverse Isaac Sim 中播放这些数据。通过本教程,你将能够在使用 Omniverse Isaac Sim 时记录并回放状态和动作。

1. 记录数据

按照以下步骤使用目标扩展示例记录数据:

  1. 打开示例

    • 打开 Follow Target 示例,路径为 Isaac Examples > Manipulation > Follow Target

  2. 加载世界

    • World Controls 下点击 LOAD,加载 Franka 机器人和可视化目标立方体。

  3. 选择输出目录

    • Follow Target 菜单中,选择数据保存的 json 文件的输出目录,选择 Data Logging

  4. 启动任务

    • Task Controls 下点击 START 启动任务。

  5. 开始记录数据

    • 点击 START LOGGING 开始记录数据。

  6. 移动目标立方体

    • 移动可视化目标立方体,使 Franka 使用 RMPFlowController 跟随它。

  7. 保存数据

    • 几秒钟后,点击 SAVE DATA 保存记录的数据。

  8. 创建新场景

    • 点击 File > New From Stage Template > Empty 创建一个新的空白场景。

  9. 确认数据保存

    • 记录的数据应该已经保存到 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 中提供的扩展示例来回放记录的数据。

  1. 打开 Follow Target 示例,路径为 Isaac Examples > Manipulation > Replay Follow Target

  2. World Controls 下点击 LOAD,加载 Franka 机器人和可视化目标立方体。

  3. 在菜单中的 Data Replay 部分的 Data File 栏中,选择上一步录制数据时保存的 json 文件。

  4. 点击 Replay Trajectory(回放轨迹),仅回放机械臂动作并等待轨迹回放完成。

  5. 点击 Reset 重置场景。

  6. 同样,点击 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
http://www.dtcms.com/a/282147.html

相关文章:

  • 多态,内部类(匿名内部类),常用API(1)
  • LVS:高性能负载均衡利器
  • DAC0832的扩展方式有哪些?
  • [硬件电路-28]:从简单到复杂:宇宙、芯片与虚拟世界的共通逻辑
  • Uniswap V2/V3/V4简短说明
  • 定制安全组-openstack定制安全组禁止特定云主机访问其他云主机
  • ST算法和ST表
  • 在Next.js里玩转pdf预览
  • django在线音乐数据采集-22647
  • Django+Celery 进阶:Celery可视化监控与排错
  • JobSet:Kubernetes 分布式任务编排的统一解决方案
  • flink sql读hive catalog数据,将string类型的时间戳数据排序后写入kafka,如何保障写入kafka的数据是有序的
  • 从零开始的云计算生活——番外4,使用 Keepalived 实现 MySQL 高可用
  • Django 接口自动化测试平台实现(一)
  • 蓝光三维扫描技术:汽车轮毂轴承模具检测的高效解决方案
  • 【tower】Rust tower库原理详解以及axum限流实战
  • 在新闻资讯 APP 底部切换不同类型界面,部分界面可以通过 ViewPager 实现滑动切换
  • 枫清科技参编的《人工智能知识工程指南(1.0)》发布
  • 压力测试Apache Bench(ab)
  • 从缓存 CAS 看Kimi K2使用的MuonClip优化器
  • 电力政策解读:山东电网新型储能集中调用的能源管理系统实现点
  • LinkedList集合源码解析
  • 超级天才如何批量制造?天才成长引擎模型:超级天才 = (学习速度泛化力 × 创造力 × 专注力) × 驱动力
  • python基础②-数据结构
  • AlpineLinux的用户管理
  • conda activate 时报错: CondaError: Run ‘conda init‘ before ‘conda activate‘
  • XC7A75T‑2FGG484I Xilinx Artix‑7 FPGA AMD
  • go项目实战
  • 深入解析Linux进程地址空间与虚拟内存管理
  • 虚拟内存管理--请求分页管理方式