turtlebot3-burger_150.png
turtlebot3-waffle-pi_150.png
turtlebot3-arm_150.png
walking-y2_150.png
turbot3-multi_150.png
turbot3-dl-ros1_150.png
turbot3-ai.png
turbot3-dl-ros2_150.png
turbot3-slam_150.png
turbot3-arm_150.png
turtlebot4-lite_150.png
turtlebot4-pro_150.png
turbot4-dl_150.png
turbot4-ai_150.png
aidriving-racebot_150.png
aidriving-autodrive_150.png
turtlebot-arm_150.png
openmanipulator-x_150.png
Home » OpenDuckMini强化学习框架入门教程 » OpenDuckMini强化学习框架入门教程-推理系统

OpenDuckMini强化学习框架入门教程-推理系统

纠错,疑问,交流: 请进入讨论区请点击进入页面,扫码加入微信群或Q群进行交流

获取最新文章: 扫一扫加入“创客智造”公众号

欢迎加入我们的openduckmini交流群,微信扫描右侧二维码立即进群交流

群二维码

推理系统

  • 理解推理系统,包含推理管线,核心组件,推理流程,与训练环境的区别,用户输入处理,实时性能,观测保存,参考运动可视化和部署选项等

概述

推理系统(Inference System)负责将训练好的策略在 MuJoCo 仿真中实时运行。它实现了从训练到部署的完整管线,允许用户在可视化环境中观察训练好的策略行为,并通过键盘或摇杆与仿真交互。

推理管线总览

训练阶段                         推理阶段
─────────                       ─────────

┌──────────────┐               ┌──────────────┐
│  PPO 训练      │               │  ONNX 模型     │
│  (runner.py)  │               │  (.onnx)      │
└──────┬───────┘               └──────┬───────┘
       │                              │
       ▼                              ▼
┌──────────────┐               ┌──────────────┐
│  JAX 参数     │    export_    │  OnnxInfer    │
│  (Flax)      │──────onnx───→│  (onnx_infer  │
└──────────────┘               │   .py)        │
                               └──────┬───────┘
                                       │
                                       ▼
                               ┌──────────────┐
                               │  MjInfer      │
                               │  (mujoco_     │
                               │   infer.py)   │
                               └──────┬───────┘
                                       │
                          ┌────────────┴────────────┐
                          │                         │
                          ▼                         ▼
                  ┌──────────────┐         ┌──────────────┐
                  │  MuJoCo 仿真  │         │  用户输入      │
                  │  (实时渲染)    │←────────│  (键盘/摇杆)   │
                  └──────────────┘         └──────────────┘

核心组件

OnnxInfer

负责加载 ONNX 模型并执行前向推理:

class OnnxInfer:
    def __init__(self, onnx_model_path, input_name="obs", awd=False):
        self.ort_session = onnxruntime.InferenceSession(
            onnx_model_path, providers=["CPUExecutionProvider"])
    
    def infer(self, inputs):
        outputs = self.ort_session.run(None, {self.input_name: [inputs]})
        return outputs[0][0]

MJInferBase

MuJoCo 推理的基类,加载机器人模型并处理关节/传感器查询:

class MJInferBase:
    def __init__(self, model_path):
        self.model = mujoco.MjModel.from_xml_string(...)
        self.data = mujoco.MjData(self.model)
        # ... 关节管理、传感器地址计算等

MjInfer

主要的推理主类,集成策略网络和仿真循环:

class MjInfer(MJInferBase):
    def __init__(self, model_path, reference_data, onnx_model_path, standing):
        self.policy = OnnxInfer(onnx_model_path, awd=True)
        self.PRM = PolyReferenceMotion(reference_data)  # 可选
        # ... 命令范围、动作历史等初始化

推理流程

1. 加载 ONNX 模型和 MuJoCo 场景
          │
2. 初始化仿真状态 (keyframe "home")
          │
3. 进入主循环
          │
    ┌─────┴─────┐ (循环, ~50 Hz 控制频率)
    │           │
    ▼           │
  用户输入处理   │
  (键盘方向键/  │
   摇杆/头部控制)│
    │           │
    ▼           │
  MuJoCo 仿真步  │
  (mj_step,     │
   decimation=10)│
    │           │
    ▼           │
  控制步 (每     │
  decimation 步) │
    │           │
    ▼           │
  构建观测 →    │
  策略推理 →    │
  合成动作 →    │──→ 继续
  应用动作      │

与训练环境的区别

推理系统的观测构建与训练时略有不同:

方面 训练 推理
物理引擎 MJX (JAX, GPU) MuJoCo (C, CPU)
批处理 并行 2048+ 环境 单环境
动作延迟 随机模拟 (0-3步) 无延迟模拟
观测噪声 添加随机噪声 无噪声(真实传感器数据)
推力扰动 随机施加 无推力(除非用户模拟)
命令更新 每 500 步随机采样 用户实时控制
参考运动 JAX 版本 NumPy 版本

用户输入处理

键盘控制

推理系统通过 key_callback 函数处理键盘输入,支持两种模式:

摇杆模式(默认):

按键 功能
↑/↓ 前进/后退 (lin_vel_x)
←/→ 横向移动 (lin_vel_y)
A/E 左转/右转 (ang_vel_yaw)
P/M 增加/减少步态频率
H 切换头部控制模式

头部控制模式(H 键切换):

按键 功能
↑/↓ 头部俯仰
←/→ 头部偏航
A/E 头部滚动

摇杆支持

ref_motion_viewer.py 支持通过 pygame 使用实体游戏手柄:

左摇杆:前进/后退 + 横向
右摇杆(可选):旋转

实时性能

推理系统以约 50 Hz 的控制频率运行:

self.sim_dt = 0.002        # 仿真步长 (500 Hz)
self.decimation = 10       # 每 10 个仿真步执行一次控制 (50 Hz)

每帧循环:

  1. mj_step():10 次仿真步进 (500 Hz)
  2. 策略推理:ONNX Runtime CPU 推理 (~0.1 ms)
  3. viewer.sync():渲染更新

观测保存

推理过程中,观测数据会自动保存,方便后续分析:

self.saved_obs.append(obs)
# 按 Ctrl+C 退出时保存到文件
pickle.dump(self.saved_obs, open("mujoco_saved_obs.pkl", "wb"))

参考运动可视化

ref_motion_viewer.py 是一个独立的参考运动可视化工具,允许用户在三维环境中观察参考运动数据生成的步态:

uv run playground/open_duck_mini_v2/ref_motion_viewer.py \
    --command 0.0 -0.05 -0.1 \
    --reference_data playground/open_duck_mini_v2/data/polynomial_coefficients.pkl \
    --scene flat_terrain

它支持键盘控制和 pygame 摇杆控制,同时展示参考运动的关节位置。

部署选项

当前推理系统主要用于桌面仿真验证,部署到真实机器人需要:

  1. 将 ONNX 模型加载到机器人上的轻量级推理引擎(如 ONNX Runtime)
  2. 实现传感器数据读取(IMU、关节编码器)
  3. 实现执行器控制输出(PWM 或串行指令)
  4. 确保实时性能(通常需要 50 Hz 控制频率)

纠错,疑问,交流: 请进入讨论区请点击进入页面,扫码加入微信群或Q群进行交流

获取最新文章: 扫一扫加入“创客智造”公众号

欢迎加入我们的openduckmini交流群,微信扫描右侧二维码立即进群交流

群二维码

标签: OpenDuckMini强化学习框架