# Go1 PRO ONNX 策略部署测试

## 环境准备

```bash
conda activate free_dog_sdk
cd /Users/chenyouyuan/cyy_ws/deploy_go1_pro
```

## 目录结构

```
deploy_go1_pro/
├── deploy_45dim/          # 45-dim 策略部署
│   ├── deploy_onnx_pro_sdk.py
│   ├── policy.onnx
│   ├── go1_sim2sim.py
│   └── sim2sim_test_deploy.py
├── deploy_wtw/            # Walk-These-Ways 部署（开发中）
│   ├── deploy_isaaclab_onnx_no_torch_wtw_r2.py  (LCM 版本)
│   ├── body_latest.jit
│   └── adaptation_module_latest.jit
├── sim2sim_mujoco_example/
├── logs/
└── test_deploy.md
```

---

## 推荐部署命令（45-dim）

```bash
cd deploy_45dim
python deploy_onnx_pro_sdk.py --onnx policy.onnx --kill-sport --log-dir ../logs \
    --kp 80 --kd 1 --kp-cal 20 --kd-cal 1 \
    --power-factor 7 --position-protect-limit 1.0 \
    --action-ema-alpha 0.3 --print-every 10
```

---

## 测试流程

### Step 0 — 观测数据查验 ✓

```bash
cd deploy_45dim && python deploy_onnx_pro_sdk.py --obs-check --kill-sport --log-dir ../logs
```

| obs 段 | 含义 | 期望 | 结果 |
|---|---|---|---|
| `[0:3]` | gyro×0.25 | ~0 | ✅ |
| `[3:6]` | 投影重力 | ~[0,0,-1] | ✅ |
| `[6:18]` | 关节偏差 | ~0（站姿时） | ⚠️ 蹲姿，正常 |
| `[18:30]` | 关节速度 | ~0 | ✅ |
| `[30:42]` | 上步动作 | [0] | ✅ |
| `[42:45]` | 指令×scale | ~0 | ✅ |

结论：关节初始为阻尼蹲姿（膝盖 ~-2.79rad），ramp 渐变到站姿。

### Step 1 — 遥控器测试 ✓

```bash
cd deploy_45dim && python deploy_onnx_pro_sdk.py --monitor --kill-sport --log-dir ../logs
```

全部按钮（R2/L2/L1/A/B/X/Y/START）上升沿/下降沿检测正常，摇杆四轴 ±1.0。

### Step 2 — 起身 ✓

R2 → CALIBRATE（2s 渐变）→ HOLD（伺服站姿）。

### Step 3 — 急停 ✓

L2 → 立即 IDLE（全阻尼），恢复正常。

### Step 4 — RL 联调 ✓

R2 → RL，摇杆控制速度。

---

## 参数调优记录

### 最终工作参数

| 参数 | 值 | 说明 |
|---|---|---|
| `--kp` | **80** | 与 sim 一致，直连 MCU |
| `--kd` | **1** | sim Kd=0.5+被动0.5=1.0 |
| `--kp-cal` | 20 | ramp 阶段 Kp |
| `--kd-cal` | 1.0 | ramp 阶段 Kd |
| `--power-factor` | 7 | hip:16.6, thigh:16.6, knee:24.9 Nm |
| `--position-protect-limit` | 1.0 | RL 阶段位置偏差保护 |
| `--action-ema-alpha` | **0.3** | 平滑 action 高频换向 |

### 调参过程

| 阶段 | 问题 | 原因 | 解决 |
|---|---|---|---|
| 起身 | 力矩被掐断 | `position_protect=0.5` 膝盖差 1.0rad 触发 | ramp/HOLD 阶段禁用 position_protect |
| 起身 | 力不够 | `Kp=5 / power_factor=3` 太保守 | Kp→20-30, power_factor→7 |
| RL | 高频抖动 | policy 本就会每2-3步换向（sim 和 real 一致），Kd=0.3 刹不住 | Kd→1, 加 EMA 滤波 |
| RL | 关节偏软 | Kp 不够大 | Kp→80 与 sim 对齐 |

### Safety 策略分层

| 阶段 | position_protect | 原因 |
|---|---|---|
| Ramp（起身） | ❌ 禁用 | 大范围移动（膝盖 ~1.0rad） |
| HOLD（站姿） | ❌ 禁用 | 维持固定站姿，本身安全 |
| RL（行走） | ✅ limit=1.0rad | 防策略突跳 |

### EMA 滤波

Policy 输出的 action 在 sim 和真机上方向切换率一致（hips ~40%, calves ~25%），这是模型本身特性。sim 中 Kp=80 硬吃掉了，真机需要用 EMA 平滑：

- `--action-ema-alpha 0.3`：`new = 0.3×raw + 0.7×prev`，时间常数 ~30ms
- 0.2：更强平滑但响应慢
- 1.0：不过滤

### Kd 选择依据

| 来源 | Kp | Kd | Kd/Kp |
|---|---|---|---|
| sim（含被动阻尼 0.5） | 80 | 1.0 (0.5+0.5) | 0.0125 |
| WTW LCM deploy | 20 | 0.5 | 0.025 |
| **最终直连 MCU** | **80** | **1** | **0.0125** |

---

## 状态机

```
                    ┌──────────────────────────────────────┐
                    │              L2 (急停)                │
                    ▼                                       │
IDLE ──R2──► CALIBRATE ──auto──► HOLD ──R2──► RL          │
  ▲                                  ▲           │          │
  └──────────── L2(急停) ────────────┘      R2 ──┘          │
  └─────────────────────────────────────────────────────────┘

IDLE:       全阻尼，等待 R2
CALIBRATE:  渐变到站姿（2s），自动→HOLD
HOLD:       伺服保持站姿，等待 R2 启动 RL
RL:         运行 ONNX 策略，摇杆控制
```

## 遥控器

| 按键 | 功能 |
|---|---|
| R2 | 状态切换（IDLE→起身 / HOLD↔RL） |
| L2 | 急停（任意状态→IDLE） |
| 左杆 Y | 前进/后退 |
| 左杆 X | 平移 |
| 右杆 X | 旋转 |
