robot_lab train的整体逻辑

Go2机器人推理(Play)流程详细分析

概述

本文档详细分析了使用命令 python scripts/rsl_rl/base/play.py --task RobotLab-Isaac-Velocity-Rough-Unitree-Go2-v0 进行Go2机器人推理的完整流程,基于实际的代码实现,包括模型加载、环境配置调整、推理循环以及可视化等关键组件。

1. 推理启动流程

1.1 命令行参数解析

# 在 play.py 中
parser = argparse.ArgumentParser(description="Train an RL agent with RSL-RL.")# 推理专用参数
parser.add_argument("--video", action="store_true", default=False, help="Record videos during training.")
parser.add_argument("--video_length", type=int, default=200, help="Length of the recorded video (in steps).")
parser.add_argument("--disable_fabric", action="store_true", default=False, help="Disable fabric and use USD I/O operations.")
parser.add_argument("--num_envs", type=int, default=None, help="Number of environments to simulate.")
parser.add_argument("--task", type=str, default=None, help="Name of the task.")
parser.add_argument("--use_pretrained_checkpoint", action="store_true",help="Use the pre-trained checkpoint from Nucleus.")
parser.add_argument("--real-time", action="store_true", default=False, help="Run in real-time, if possible.")
parser.add_argument("--keyboard", action="store_true", default=False, help="Whether to use keyboard.")# 添加RSL-RL和AppLauncher参数
cli_args.add_rsl_rl_args(parser)
AppLauncher.add_app_launcher_args(parser)

关键推理参数:

  • --task: 指定任务环境(与训练时相同)
  • --video: 启用视频录制功能
  • --video_length: 视频录制长度(默认200步)
  • --num_envs: 推理环境数量(默认会被调整为50)
  • --real-time: 实时运行模式
  • --keyboard: 启用键盘控制
  • --use_pretrained_checkpoint: 使用预训练检查点
  • --checkpoint: 指定特定检查点路径

1.2 相机和视频配置

# 如果启用视频录制,自动启用相机
if args_cli.video:args_cli.enable_cameras = True# 启动Isaac Sim应用
app_launcher = AppLauncher(args_cli)
simulation_app = app_launcher.app

2. 环境配置调整(推理专用优化)

2.1 基础环境配置加载

def main():# 解析环境配置env_cfg = parse_env_cfg(args_cli.task, device=args_cli.device, num_envs=args_cli.num_envs, use_fabric=not args_cli.disable_fabric)# 解析智能体配置agent_cfg: RslRlOnPolicyRunnerCfg = cli_args.parse_rsl_rl_cfg(args_cli.task, args_cli)

2.2 推理专用环境调整

# 1. 减少环境数量以提高推理效率
env_cfg.scene.num_envs = 50  # 从训练时的4096减少到50# 2. 地形配置调整
env_cfg.scene.terrain.max_init_terrain_level = None  # 随机生成机器人位置
if env_cfg.scene.terrain.terrain_generator is not None:env_cfg.scene.terrain.terrain_generator.num_rows = 5      # 减少地形行数env_cfg.scene.terrain.terrain_generator.num_cols = 5      # 减少地形列数env_cfg.scene.terrain.terrain_generator.curriculum = False # 禁用课程学习# 3. 禁用观测噪声以获得一致性能
env_cfg.observations.policy.enable_corruption = False# 4. 移除训练时的随机扰动
env_cfg.events.randomize_apply_external_force_torque = None  # 禁用随机外力
env_cfg.events.push_robot = None                            # 禁用机器人推力扰动

推理环境优化说明:

  • 环境数量:从4096减少到50,降低计算负载
  • 地形简化:减少地形复杂度,专注于展示性能
  • 禁用随机化:去除所有随机干扰因素
  • 禁用课程学习:使用固定难度级别

2.3 键盘控制模式配置

if args_cli.keyboard:# 单环境模式env_cfg.scene.num_envs = 1# 禁用超时终止env_cfg.terminations.time_out = None# 关闭命令可视化env_cfg.commands.base_velocity.debug_vis = False# 创建键盘控制器controller = Se2Keyboard(v_x_sensitivity=env_cfg.commands.base_velocity.ranges.lin_vel_x[1],  # 前进后退敏感度v_y_sensitivity=env_cfg.commands.base_velocity.ranges.lin_vel_y[1],  # 左右移动敏感度omega_z_sensitivity=env_cfg.commands.base_velocity.ranges.ang_vel_z[1],  # 转向敏感度)# 替换速度命令观测项为键盘输入env_cfg.observations.policy.velocity_commands = ObsTerm(func=lambda env: torch.tensor(controller.advance(), dtype=torch.float32).unsqueeze(0).to(env.device),)

键盘控制特点:

  • 实时交互:用户可以通过键盘实时控制机器人
  • 单环境:专注于一个机器人的控制
  • 无超时:持续运行直到用户停止
  • 相机跟随:相机会自动跟随机器人移动

3. 模型加载与恢复

3.1 检查点路径解析

# 设置日志根路径
log_root_path = os.path.join("logs", "rsl_rl", agent_cfg.experiment_name)
log_root_path = os.path.abspath(log_root_path)
print(f"[INFO] Loading experiment from directory: {log_root_path}")# 确定检查点路径的优先级
if args_cli.use_pretrained_checkpoint:# 使用预训练检查点resume_path = get_published_pretrained_checkpoint("rsl_rl", args_cli.task)if not resume_path:print("[INFO] Unfortunately a pre-trained checkpoint is currently unavailable for this task.")return
elif args_cli.checkpoint:# 使用指定的检查点路径resume_path = retrieve_file_path(args_cli.checkpoint)
else:# 自动查找最新检查点resume_path = get_checkpoint_path(log_root_path, agent_cfg.load_run, agent_cfg.load_checkpoint)log_dir = os.path.dirname(resume_path)

检查点查找优先级:

  1. 预训练检查点:来自官方发布的预训练模型
  2. 指定检查点:用户明确指定的检查点文件
  3. 自动检查点:从实验目录自动查找最新检查点

3.2 环境创建和包装

# 创建Isaac环境
env = gym.make(args_cli.task, cfg=env_cfg, render_mode="rgb_array" if args_cli.video else None)# 处理多智能体环境转换
if isinstance(env.unwrapped, DirectMARLEnv):env = multi_agent_to_single_agent(env)# 视频录制包装器
if args_cli.video:video_kwargs = {"video_folder": os.path.join(log_dir, "videos", "play"),  # 视频保存目录"step_trigger": lambda step: step == 0,                   # 立即开始录制"video_length": args_cli.video_length,                   # 录制长度"disable_logger": True,                                  # 禁用额外日志}print("[INFO] Recording videos during training.")print_dict(video_kwargs, nesting=4)env = gym.wrappers.RecordVideo(env, **video_kwargs)# RSL-RL环境包装器
env = RslRlVecEnvWrapper(env, clip_actions=agent_cfg.clip_actions)

3.3 模型加载和初始化

print(f"[INFO]: Loading model checkpoint from: {resume_path}")# 创建PPO运行器并加载模型
ppo_runner = OnPolicyRunner(env, agent_cfg.to_dict(), log_dir=None, device=agent_cfg.device)
ppo_runner.load(resume_path)# 获取推理策略
policy = ppo_runner.get_inference_policy(device=env.unwrapped.device)# 提取神经网络模块(兼容不同版本)
try:# RSL-RL 2.3及以上版本policy_nn = ppo_runner.alg.policy
except AttributeError:# RSL-RL 2.2及以下版本policy_nn = ppo_runner.alg.actor_critic

模型加载特点:

  • 版本兼容:支持不同版本的RSL-RL库
  • 设备管理:自动处理GPU/CPU设备转换
  • 推理优化:使用专门的推理策略而非训练策略

4. 模型导出功能

4.1 导出为ONNX和JIT格式

# 设置导出目录
export_model_dir = os.path.join(os.path.dirname(resume_path), "exported")# 导出ONNX格式(跨平台部署)
export_policy_as_onnx(policy=policy_nn,normalizer=ppo_runner.obs_normalizer,  # 包含观测归一化信息path=export_model_dir,filename="policy.onnx",
)# 导出JIT格式(PyTorch部署)
export_policy_as_jit(policy=policy_nn,normalizer=ppo_runner.obs_normalizer,path=export_model_dir,filename="policy.pt",
)

导出格式说明:

  • ONNX格式:跨平台部署,支持多种推理引擎
  • JIT格式:PyTorch原生格式,高性能推理
  • 包含归一化:导出模型包含观测归一化参数

5. 推理主循环

5.1 推理循环实现

dt = env.unwrapped.step_dt  # 获取仿真时间步长# 重置环境
obs, _ = env.get_observations()
timestep = 0# 主推理循环
while simulation_app.is_running():start_time = time.time()# 推理模式执行with torch.inference_mode():# 策略推理actions = policy(obs)# actions = torch.zeros_like(actions)  # 可选:零动作测试# 环境步进obs, _, _, _ = env.step(actions)# 视频录制控制if args_cli.video:timestep += 1# 录制完成后退出if timestep == args_cli.video_length:break# 键盘模式下的相机跟随if args_cli.keyboard:rsl_rl_utils.camera_follow(env)# 实时模式的时间控制sleep_time = dt - (time.time() - start_time)if args_cli.real_time and sleep_time > 0:time.sleep(sleep_time)# 关闭环境
env.close()

5.2 推理循环特点

性能优化:

  • torch.inference_mode():禁用梯度计算,提高推理速度
  • 实时控制:可选的实时运行模式
  • 内存优化:减少不必要的张量操作

交互功能:

  • 视频录制:自动录制指定长度的演示视频
  • 键盘控制:实时人机交互控制
  • 相机跟随:动态视角跟踪

循环控制:

  • 条件退出:视频录制完成或用户中断
  • 时间同步:保持与仿真时间步长一致

6. 实时控制和可视化

6.1 实时模式实现

def real_time_control(dt, start_time):"""实时模式时间控制"""sleep_time = dt - (time.time() - start_time)if args_cli.real_time and sleep_time > 0:time.sleep(sleep_time)

实时特性:

  • 时间同步:确保推理循环与物理时间步长同步
  • 帧率控制:维持稳定的可视化帧率
  • 响应性:保证键盘输入的实时响应

6.2 键盘控制实现

class Se2Keyboard:"""2D移动键盘控制器"""def __init__(self, v_x_sensitivity, v_y_sensitivity, omega_z_sensitivity):self.v_x_sensitivity = v_x_sensitivity    # 前进后退敏感度self.v_y_sensitivity = v_y_sensitivity    # 左右移动敏感度  self.omega_z_sensitivity = omega_z_sensitivity  # 转向敏感度def advance(self):"""获取当前键盘输入状态"""# 返回 [v_x, v_y, omega_z] 速度命令return self.get_keyboard_input()

键盘映射:

  • WASD:基本移动控制
  • 方向键:精确移动控制
  • 鼠标:视角控制
  • ESC:退出程序

6.3 相机跟随系统

def camera_follow(env):"""相机自动跟随机器人"""# 获取机器人当前位置robot_pos = env.unwrapped.scene.robot.data.root_pos_w[0]# 更新相机位置和朝向camera_offset = torch.tensor([2.0, 0.0, 1.5])  # 相机偏移量camera_pos = robot_pos + camera_offset# 设置相机朝向机器人camera_target = robot_pos# 应用相机变换set_camera_view(camera_pos, camera_target)

7. 视频录制系统

7.1 录制配置

if args_cli.video:video_kwargs = {"video_folder": os.path.join(log_dir, "videos", "play"),"step_trigger": lambda step: step == 0,     # 立即开始录制"video_length": args_cli.video_length,      # 录制步数"disable_logger": True,                     # 禁用日志输出}env = gym.wrappers.RecordVideo(env, **video_kwargs)

7.2 录制流程

def video_recording_flow():"""视频录制流程"""timestep = 0while simulation_app.is_running():# 正常推理步骤with torch.inference_mode():actions = policy(obs)obs, _, _, _ = env.step(actions)# 录制控制if args_cli.video:timestep += 1# 达到指定长度后停止录制if timestep == args_cli.video_length:print(f"[INFO] Video recording completed: {timestep} steps")break# 其他循环逻辑...

录制特点:

  • 自动触发:程序启动即开始录制
  • 固定长度:录制指定步数后自动停止
  • 高质量:使用rgb_array渲染模式
  • 自动保存:录制完成后自动保存到指定目录

8. 关键差异对比(训练 vs 推理)

8.1 环境配置差异

配置项训练模式推理模式说明
环境数量409650推理时大幅减少以提高效率
观测噪声启用禁用推理时需要一致性能
域随机化启用禁用推理时使用固定参数
课程学习启用禁用推理时使用固定难度
外力扰动启用禁用推理时避免干扰
地形复杂度简化推理时减少计算负载

8.2 计算模式差异

方面训练模式推理模式
梯度计算启用禁用(torch.inference_mode)
内存使用高(经验缓冲区)低(仅当前状态)
策略采样随机采样确定性输出
网络模式训练模式评估模式
批处理大批量小批量或单步

8.3 功能差异

功能训练模式推理模式
模型更新
视频录制可选
键盘控制
实时运行
模型导出
相机跟随

9. 使用示例

9.1 基本推理

# 基本推理模式
python scripts/rsl_rl/base/play.py \--task RobotLab-Isaac-Velocity-Rough-Unitree-Go2-v0

9.2 视频录制

# 录制200步演示视频
python scripts/rsl_rl/base/play.py \--task RobotLab-Isaac-Velocity-Rough-Unitree-Go2-v0 \--video \--video_length 200

9.3 键盘控制

# 启用键盘实时控制
python scripts/rsl_rl/base/play.py \--task RobotLab-Isaac-Velocity-Rough-Unitree-Go2-v0 \--keyboard \--real-time

9.4 指定检查点

# 使用特定检查点
python scripts/rsl_rl/base/play.py \--task RobotLab-Isaac-Velocity-Rough-Unitree-Go2-v0 \--checkpoint /path/to/model.pt \--video

9.5 预训练模型

# 使用官方预训练模型
python scripts/rsl_rl/base/play.py \--task RobotLab-Isaac-Velocity-Rough-Unitree-Go2-v0 \--use_pretrained_checkpoint \--video

10. 故障排除

10.1 常见问题

问题1:找不到检查点文件

解决方案:
1. 检查训练是否完成并保存了检查点
2. 确认路径是否正确
3. 使用--checkpoint参数指定具体路径

问题2:推理速度太慢

解决方案:
1. 减少环境数量 --num_envs 16
2. 禁用视频录制
3. 使用--headless模式

问题3:视频录制失败

解决方案:
1. 确保启用了相机 --enable_cameras
2. 检查输出目录权限
3. 确认ffmpeg已安装

10.2 性能优化建议

GPU内存优化:

  • 减少并行环境数量
  • 使用较小的观测向量
  • 启用混合精度推理

CPU优化:

  • 使用JIT编译的模型
  • 减少Python开销
  • 启用多线程

11. 总结

Go2机器人的推理(play)流程相比训练流程具有以下特点:

11.1 核心特点

  • 轻量化配置:大幅减少计算资源需求
  • 用户友好:支持实时交互和可视化
  • 部署导向:提供多种模型导出格式
  • 稳定可靠:移除随机化确保一致性能

11.2 主要用途

  • 性能验证:测试训练结果
  • 演示展示:录制演示视频
  • 交互控制:实时人机交互
  • 模型部署:导出部署格式

11.3 技术优势

  • 高效推理:torch.inference_mode()优化
  • 实时响应:支持实时控制和反馈
  • 多模式支持:自动/手动/录制模式
  • 易于使用:简单的命令行接口

这个推理系统为Go2机器人提供了完整的部署和测试解决方案,是从训练到实际应用的重要桥梁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/82903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python Day45

Task: 1.tensorboard的发展历史和原理 2.tensorboard的常见操作 3.tensorboard在cifar上的实战:MLP和CNN模型 效果展示如下,很适合拿去组会汇报撑页数: 作业:对resnet18在cifar10上采用微调策略下,用tens…

MySQL SQL 优化:从 INSERT 到 LIMIT 的实战与原理

在数据库驱动的现代应用中,SQL 查询的性能直接决定了用户体验和系统效率。本文将深入探讨 MySQL (特别是 InnoDB 存储引擎)中常见的 SQL 性能瓶颈,并结合实际案例,详细剖析从数据插入到复杂分页查询的优化策略与底层实…

SQL 基础入门

SQL 基础入门 SQL(全称 Structured Query Language,结构化查询语言)是用于操作关系型数据库的标准语言,主要用于数据的查询、新增、修改和删除。本文面向初学者,介绍 SQL 的基础概念和核心操作。 1. 常见的 SQL 数据…

HTTP 请求协议简单介绍

目录 常见的 HTTP 响应头字段 Java 示例代码:发送 HTTP 请求并处理响应 代码解释: 运行结果: 文件名: 总结: HTTP(HyperText Transfer Protocol)是用于客户端与服务器之间通信的协议。它定…

《100天精通Python——基础篇 2025 第5天:巩固核心知识,选择题实战演练基础语法》

目录 一、踏上Python之旅二、Python输入与输出三、变量与基本数据类型四、运算符五、流程控制 一、踏上Python之旅 1.想要输出 I Love Python,应该使用()函数。 A.printf() B.print() C.println() D.Print() 在Python中想要在屏幕中输出内容,应该使用print()函数…

求解一次最佳平方逼近多项式

例 设 f ( x ) 1 x 2 f(x)\sqrt{1x^2} f(x)1x2 ​,求 [ 0 , 1 ] [0,1] [0,1]上的一个一次最佳平方逼近多项式。 解 : d 0 ∫ 0 1 1 x 2 d x 1 2 ln ⁡ ( 1 2 ) 2 2 ≈ 1.147 d_0\int_{0}^{1}\sqrt{1x^2}dx\frac{1}{2}\ln(1\sqrt{2})\frac{\sqrt…

在Ubuntu上使用 dd 工具制作U盘启动盘

在Ubuntu上使用 dd 工具制作U盘启动盘 在Linux系统中,dd 是一个功能强大且原生支持的命令行工具,常用于复制文件和转换数据。它也可以用来将ISO镜像写入U盘,从而创建一个可启动的操作系统安装盘。虽然图形化工具(如 Startup Disk…

如何理解OSI七层模型和TCP/IP四层模型?HTTP作为如何保存用户状态?多服务器节点下 Session方案怎么做

本篇概览: OSI 七层模型是什么?每一层的作用是什么?TCP/IP四层模型和OSI七层模型的区别是什么? HTTP 本身是无状态协议,HTTP如何保存用户状态? 能不能具体说一下Cookie的工作原理、生命周期、作用域?使用…

深入剖析 RocketMQ 中的 DefaultMQPushConsumerImpl:消息推送消费的核心实现

前言 在 Apache RocketMQ 的消息消费体系中,RocketMQ 提供了DefaultMQPushConsumer(推送消费)和DefaultMQPullConsumer(拉取消费)两种主要消费方式。DefaultMQPushConsumer与DefaultMQPullConsumer在消息获取方式&…

Linux编程:2、进程基础知识

一、进程基本概念 1、进程与程序的区别 程序:静态的可执行文件(如电脑中的vs2022安装程序)。进程:程序的动态执行过程(如启动后的vs2022实例),是操作系统分配资源的单位(如 CPU 时…

React Router 中 navigate 后浏览器返回按钮不起作用的问题记录

React Router 中 navigate 后浏览器返回按钮不起作用的问题记录 在使用 React Router(v6)开发项目时,我遇到了一个让人困惑的问题: 当我从 /article 页面使用 navigate("/article/next") 进行跳转后,点击浏…

[面试精选] 0094. 二叉树的中序遍历

文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 94. 二叉树的中序遍历 - 力扣(LeetCode) 2. 题目描述 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 3. 题目示例 示例 1 : 输入&…

Addressable-配置相关

1、Profile 概述窗口配置 主要用于配置Addressable打包(构建)加载AB包时使用的一些变量,这些变量定义了 在哪里保存打包(构建)的AB包运行时在哪里加载AB包 可以添加自定义变量,以便在打包加载时使用,之后在设置 组中…

aws(学习笔记第四十三课) s3_sns_sqs_lambda_chain

文章目录 aws(学习笔记第四十三课) s3_sns_sqs_lambda_chain学习内容:1. 整体架构1.1 代码链接1.2 整体架构1.3 测试代码需要的修改1.3.1 unit test代码中引入stack的修改1.3.2 test_outputs_created代码中把错误的去掉 2. 代码解析2.1 生成dead_letter_queue死信队…

Python训练营打卡Day43

kaggle找到一个图像数据集,用cnn网络进行训练并且用grad-cam做可视化 进阶:并拆分成多个文件 config.py import os# 基础配置类 class Config:def __init__(self):# Kaggle配置self.kaggle_username "" # Kaggle用户名self.kaggle_key &quo…

hive 3集成Iceberg 1.7中的Java版本问题

hive 3.1.3 集成iceberg 1.7.2创建Iceberg表报错如下: Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/iceberg/mr/hive/HiveIcebergStorageHandler has been compiled by a more recent version of the Java Runtime …

文本切块技术(Splitter)

为什么要分块? 将长文本分解成适当大小的片段,以便于嵌入、索引和存储,并提高检索的精确度。 用ChunkViz工具可视化分块 在线使用 ChunkViz github https://github.com/gkamradt/ChunkViz 如何确定大模型所能接受的最长上下文 可以从…

C++:用 libcurl 发送一封带有附件的邮件

编写mingw C 程序&#xff0c;用 libcurl 发送一封带有附件的邮件 下面是一个使用 MinGW 编译的 C 程序&#xff0c;使用 libcurl 发送带附件的邮件。这个程序完全通过代码实现 SMTP 邮件发送&#xff0c;不依赖外部邮件客户端&#xff1a; // send_email.cpp #include <i…

tensorflow image_dataset_from_directory 训练数据集构建

以数据集 https://www.kaggle.com/datasets/vipoooool/new-plant-diseases-dataset 为例 目录结构 训练图像数据集要求&#xff1a; 主目录下包含多个子目录&#xff0c;每个子目录代表一个类别。每个子目录中存储属于该类别的图像文件。 例如 main_directory/ ...cat/ ...…

遨游Spring AI:第一盘菜Hello World

Spring AI的正式版已经发布了&#xff0c;很显然&#xff0c;接下来我们要做的事情就是写一个Hello World。 总体思路就是在本地搭建一个简单的大模型&#xff0c;然后编写Spring AI代码与模型进行交互。 分五步&#xff1a; 1. 安装Ollama&#xff1b; 2. 安装DeepSeek&…