G1 编程与工程 IsaacLab

G1-23dof 强化学习策略部署架构

2026-04-12 · 4 min read

G1-23dof 强化学习策略部署架构

文档版本:V1.0
机器人平台:Unitree G1-23dof(23自由度版本)
仿真框架:IsaacLab 2.3.0 + IsaacSim 5.1.0
部署平台:Unitree Real Robot / Gazebo Simulation
编写日期:2026-04-12
相关文档G1-23dof 强化学习网络架构深度解析


1. 部署流程总览

┌─────────────────────────────────────────────────────────────────┐
│                         训练阶段                                 │
│  IsaacLab + IsaacSim → PPO 训练 → .pt 模型                     │
│  路径: logs/rsl_rl/unitree_g1_23dof_velocity/policies/         │
└──────────────────────────┬──────────────────────────────────────┘
                           │ ONNX Export (或直接 .pt)
                           ▼
┌─────────────────────────────────────────────────────────────────┐
│                        仿真验证阶段                              │
│  Gazebo + unitree_lab_locomotion → 控制验证                     │
└──────────────────────────┬──────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────────────┐
│                        真机部署阶段                              │
│  Unitree G1 → FSM Controller → LowCmd / LowState DDS 通信       │
└─────────────────────────────────────────────────────────────────┘

2. FSM 控制器架构

2.1 有限状态机设计

G1-23dof 部署采用有限状态机(FSM)管理不同控制模式:

// FSM 状态列表
enum class FSMStateID {
    Passive   = 1,  // 电机无力模式,安全停机
    FixStand  = 2,  // 固定站立模式,PD 控制维持姿态
    Velocity  = 3,  // RL 速度控制模式
    StairClimbing = 4,  // RL 楼梯攀爬模式
};

2.2 状态转换图

                    ┌──────────────┐
                    │   Passive   │◄─────────────────────┐
                    │  (安全停机)  │                      │
                    └──────┬───────┘                      │
                           │ RT + Up                       │
                           ▼                               │
                    ┌──────────────┐                      │
                    │  FixStand   │                       │
                    │  (固定站立)  │                       │
                    └──────┬───────┘                      │
                           │ start + Y                     │
                           ▼                               │
              ┌────────────────────────┐                 │
              │       Velocity         │                 │
              │   (RL 速度控制)         │                 │
              └────────────┬────────────┘                 │
                           │ RT + B                      │
                           └──────────────────────────────┘
                           │
                           │ start + LB
                           ▼
              ┌────────────────────────┐
              │    StairClimbing       │
              │   (RL 楼梯攀爬)         │
              └────────────┬────────────┘
                           │ RT + B
                           └──────────────────────────────┘

2.3 FSM 配置文件

FSM:
  _:  # enabled states
    Passive:
      id: 1
    FixStand:
      id: 2
    Velocity:
      id: 3
      type: RLBase     # RL 基类,接收 RL 策略输出
    StairClimbing:
      id: 4
      type: RLBase

  Passive:
    # 转换条件: RT + Up → FixStand
    transitions:
      FixStand: RT + up.on_pressed
    # 电机模式: 1=力控模式
    mode: [1,1,1,...]  # 23 个关节全部力控
    kd: [3,3,3,...]    # PD 参数

  FixStand:
    # 转换条件: RT + B → Passive; start + Y → Velocity
    transitions:
      Passive: RT + B.on_pressed
      Velocity: start + Y.on_pressed
      StairClimbing: start + LB.on_pressed
    # PD 控制参数
    kp: [100.,100.,100.,150.,40.,40.,  ...]  # 23 个关节
    kd: [2.,2.,2.,4.,2.,2.,  ...]
    # 目标姿态 ts + qs
    ts: [0, 3]           # 0s 开始,3s 完成
    qs: [[], [...] ]     # 第 2 个关节目标姿态

  Velocity:
    policy_dir: ../../../logs/rsl_rl/unitree_g1_23dof_velocity
    # 加载训练好的 RL 策略

3. 策略加载与执行

3.1 策略加载流程

// main.cpp
int main(int argc, char** argv) {
    // 1. 解析命令行参数
    auto vm = param::helper(argc, argv);

    // 2. 初始化 Unitree DDS 网络
    unitree::robot::ChannelFactory::Instance()->Init(0, network);

    // 3. 初始化 FSM State(订阅 LowCmd/LowState)
    init_fsm_state();

    // 4. 设置机器人类型(23dof)
    FSMState::lowcmd->msg_.mode_machine() = 4;

    // 5. 创建并启动 FSM
    auto fsm = std::make_unique<CtrlFSM>(param::config["FSM"]);
    fsm->start();

    // 6. 主循环(FSM 自主运行)
    while (true) { sleep(1); }
}

3.2 RLBase 状态执行逻辑

class RLBase {
    // 策略网络加载
    void loadPolicy(const std::string& policy_dir) {
        // 加载 .pt 或 ONNX 模型
        policy = torch::jit::load(policy_dir + "/policy.pt");
        policy.eval();
    }

    // 每周期调用
    void run() {
        // 1. 获取当前传感器状态
        auto obs = getObservation();  // 78D 或 6030D

        // 2. 策略推理
        auto action = policy.forward(obs);

        // 3. 动作后处理(denormalize)
        action = action * scale + default_offset;

        // 4. 发送 LowCmd
        sendCommand(action);
    }
};

4. 关节控制参数

4.1 PD 控制参数(FixStand 模式)

FixStand:
  # 关节顺序: [FL_hip_roll, FL_hip_yaw, FL_hip_pitch, FL_knee, FL_ankle_pitch, FL_ankle_roll,
  #            RL_hip_roll, ...,
  #            WAIST_YAW, WAIST_ROLL, WAIST_PITCH,
  #            AR_shoulder_pitch, ...]

  kp: [
      # 左腿(6关节)
      100., 100., 100.,   150., 40., 40.,
      # 右腿(6关节)
      100., 100., 100.,   150., 40., 40.,
      # 腰部(3关节)
      200., 200., 200.,
      # 右臂(7关节)
      40., 40., 40., 40., 40., 40., 40.,
      # 左臂(7关节)
      40., 40., 40., 40., 40., 40., 40.,
  ]

  kd: [
      # 左腿
      2., 2., 2.,   4., 2., 2.,
      # 右腿
      2., 2., 2.,   4., 2., 2.,
      # 腰部
      5., 5., 5.,
      # 右臂
      10., 10., 10., 10., 10., 10., 10.,
      # 左臂
      10., 10., 10., 10., 10., 10., 10.,
  ]

4.2 PD 参数设计分析

关节组 Kp Kd 设计意图
髋关节(roll/yaw/pitch) 100 2 刚度适中,允许小幅摆动
膝关节 150 4 高刚度,支撑体重
踝关节 40 2 低刚度,缓冲冲击
腰部 200 5 极高刚度,保持躯干稳定
手臂 40 10 低刚度,允许自然摆动

4.3 站立姿态目标(FixStand)

qs = [
    # 时间序列 0s → 3s 插值目标
    0:  [],      # 初始姿态(当前位)
    3:  [        # 3s 目标姿态
        -0.1, 0, 0, 0.3, -0.2, 0,  # 左腿
        -0.1, 0, 0, 0.3, -0.2, 0,  # 右腿
         0, 0, 0,                   # 腰部
         0, 0.25, 0, 0.97, 0.15, 0, 0,  # 右臂
         0, -0.25, 0, 0.97, -0.15, 0, 0,  # 左臂
    ]
]

5. DDS 通信接口

5.1 LowCmd / LowState

Unitree G1 使用 DDS(Data Distribution Service)进行通信:

// 发布者:控制端 → 机器人
class LowCmd {
    LowCmd_t msg_;  // 包含 23 个关节的 q, qd, tau, kp, kd
    void publish();
};

// 订阅者:机器人 → 控制端
class LowState {
    LowState_t msg_;  // 包含 23 个关节的 q, qd, tau 反馈
    void subscribe();
};

5.2 通信频率

通道 频率 用途
LowCmd/LowState 1000Hz 高频控制循环
传感器融合 500Hz IMU、力传感器融合

6. 策略模型导出

6.1 训练输出结构

logs/rsl_rl/unitree_g1_23dof_velocity/
├── models/
│   └── .ptpth          # 最终策略模型
├── legendre_pvex.1.0.0.dict  # 配置字典
├──ppo_actor_critic.1.0.0.pt  # PPO Actor-Critic 权重
└── ...

6.2 ONNX 导出(如需跨平台部署)

# 导出为 ONNX 格式
import torch
model = torch.jit.load("policy.pt")
model.eval()
torch.onnx.export(
    model,
    args=(dummy_input,),
    f="policy.onnx",
    input_names=["obs"],
    output_names=["action"],
    opset_version=14,  # CrossAttention 需要 opset>=14
)

7. 调试与故障排查

7.1 常见启动错误

错误信息 原因 解决方案
The other process is using the lowcmd channel 另一个程序占用了控制通道 关闭其他控制程序
Unmatched robot type mode_machine 与实际机器人不匹配 确认 23dof 模式=4
Connection timeout DDS 网络未就绪 检查网线、网络配置

7.2 手柄控制

# 控制映射(Xbox 手柄)
start + Y     → 进入 Velocity 模式
start + LB    → 进入 StairClimbing 模式
RT + B        → 返回 Passive 模式
RT + Up       → 进入 FixStand 模式

7.3 调试检查项

检查项 预期值
电机温度 < 60°C
关节电流 < 额定电流 80%
通信延迟 < 1ms
策略推理时间 < 1ms(ONNX)或 < 3ms(PyTorch)

版本记录

版本 日期 修改内容 作者
V1.0 2026-04-12 初始版本,部署架构文档 AI Assistant

本文档由 AI 辅助整理自 unitree_lab_locomotion 仓库源码

← 上一篇
G1-23dof Velocity 任务训练配置规范
下一篇 →
G1-23dof Fusion 多传感器融合任务配置规范 (V0~V11)
← 返回博客列表