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 仓库源码