# checkpoint_0617(G2 22维吸盘搬铝板 GO-1 模型)真机测试套件 本目录汇总在 G2 机器人上测试 `checkpoint_0617`(22 维吸盘搬铝板 VLA 模型)的全部脚本、命令与排障结论。 - 机器人:智元 G2(agibot-g2),`agi@172.16.64.220`,30Hz,3 路彩色相机 + 22 维 qpos/action - 任务 prompt:`reach into the bin, attach both suction cups to the part and lift it out level` - 路径配置由 [`go1_env.py`](go1_env.py) 解析(`GO1_*` 环境变量 + 仓库相对默认;见 [../README.md](../README.md) 配置章节) - 推理引擎:带 torch+gdk 的 venv(机器人上 `/data/agi/venvs/go1_torch/bin/python`),模型代码 `$GO1_AGIBOT_WORLD` > **运行命令以 [COMMANDS_v2.md](COMMANDS_v2.md) 为准**(实测验证版)。本文档 §4 命令、§5「起步卡死」结论较早——**起步卡死后来已解决**:头预下俯 ~0.50(看到料箱)+ 开腰(躯干前倾带动伸手)后当前 checkpoint 能完成"弯腰探入→双臂伸到铝板正上方",详见 COMMANDS_v2.md。 --- ## 0. 环境(机器人上每个终端先跑) ```bash ssh agi@172.16.64.220 # 真机脚本在机器人上跑; 离线脚本任意机器均可 cd /go1_sft_go2 # 仓库根, 下面以 deploy/ 为脚本目录 (D=deploy) source "${GO1_WORKSPACE:-/home/agi/workspace}/env.sh" # 机器人侧 GDK 运行时 export TMPDIR=/data/agi/tmp # 机器人临时目录 export GO1_CKPT=${GO1_CKPT:-/data/agi/checkpoint_0617} # 可选; 默认 /checkpoint_22000 PY=/data/agi/venvs/go1_torch/bin/python ; D=deploy ``` > 路径由 [`go1_env.py`](go1_env.py) 解析(`GO1_*` 环境变量 + 仓库相对默认)。 --- ## 1. ⭐ 22 维 state/action 正确布局(lerobot 序,FIXED) > 由转换器 profile 写死:`/home/agi/workspace/go2_data_recorder/offline/profiles/go1.py` 的 `GO2_SUCTION_EXTRACT_V1` ``` [0:7] 左臂 (idx21-27) [7:14] 右臂 (idx61-67) [14] 左吸盘 (state=是否吸住 / action=指令位) [15] 右吸盘 [16:21] 下半身 (idx01-05: 踝/膝/髋/腰roll/腰yaw) [21] 头pitch (仅 idx13) ``` **与原始 qpos 序(DEFAULT_JOINT_NAMES_Go2 = 身体5+头3+左臂7+右臂7)完全不同!** 这是本项目最关键的坑。 qpos ↔ lerobot 映射: | 模型维 | 机器人 qpos | |---|---| | [0:7] 左臂 | qpos[8:15] | | [7:14] 右臂 | qpos[15:22] | | [14],[15] 吸盘 | EVS08 holding / 指令 | | [16:21] 下半身 | qpos[0:5] | | [21] 头pitch | qpos[7] (idx13) | --- ## 2. 三大根因(全部已解决) | 问题 | 根因 | 解法 | |---|---|---| | **手臂跳变→整机断电重启** | 臂用错 API(`joint_servo_control`,顺序错位即跳变)| 改用 **`move_arm_joint_servo(positions14, period, control_group=2)`**(demo 验证、顺序正确)| | **运动"一顿一顿"** | 30Hz + control_period=0.04(与发送间隔不匹配)| **100Hz + control_period=0.01(= 发送周期)+ 细步长(slew 按 rad/s)** | | **乱动 / action[0] 离当前 ~3rad** | **关节顺序错位**:按 qpos 序喂 state、解 action,模型期望 lerobot 序 | 按上表重排 state 输入 + action 解码(v2/v3 已修)| 修复验证(三重): - 离线 `openloop_verify`:喂正确序 state → pred≈gt(误差 0.02~0.12)、action[0]≈当前(0.029) - 真机只读 `infer_stage_a_v2`:\|action[0]-state\| 从 2.99 → 0.72 - 真机闭环 `infer_stage_c_v3`:home 位 action[0] 仅 0.07,平滑无崩溃 --- ## 3. 脚本清单 ### ✅ 当前正确版(用这些) | 脚本 | 用途 | 动机器人 | |---|---|---| | `openloop_verify_0617.py` | 离线 pred vs 训练真值(验证推理正确)| 否 | | `infer_stage_a_v2_0617.py` | 真机只读:抓相机+关节→推理→打印(正确序)| 否 | | `infer_stage_c_v3_0617.py` | **闭环主脚本**(正确 IO + 100Hz 平滑 + 头pitch clamp + 吸盘仅记录)| 是 | | `pose_io_0617.py` | 位姿快照 `--save` / 恢复 `--restore`(默认位姿 saved_init_pose.npy)| restore 时是 | | `go_home_servo_0617.py` | 平滑驱动到 home/指定位姿(`--target-npy`)| 是 | | `verify_arm_order_0617.py` | 臂关节顺序验证门(发当前值零运动)| 是(微) | | `smallstep_test_0617.py` | 单关节小步跟踪/顺序测试 | 是(微) | | `smooth_all_test_0617.py` | 逐关节平滑测试(臂14+头3+腰5)| 是 | | `squat_test_0617.py` | 下蹲/起立协调平滑测试 | 是 | | `verify_headwaist_0617.py` | 头/腰发当前值门测试 | 是(微) | | `check_model_load_0617.py` | 1 级纯加载冒烟(注意:其 state 维度旧,仅测加载)| 否 | ### 数据文件 - `saved_init_pose.npy` — **默认恢复位姿**(当前 home:身体站立+双臂对称收拢) - `kick_qpos.npy` — 演示 frame450 partway 伸出位("轻推启动"用) ### ❌ 已废弃(错序/旧逻辑) 旧版 `infer_stage_a_0617` / `infer_stage_c_0617` / `infer_stage_c_v2_0617` / `ramp_to_start_0617` / `openloop_check_0617` / `go_to_init_pose_0617` / `go_head_init_0617` 已从本仓库移除(错序/旧逻辑,勿用)。 --- ## 4. 完整测试流程(命令) > 规范流程见 [COMMANDS_v2.md](COMMANDS_v2.md);以下为速览(路径用 `$D=deploy`,环境见 §0)。 ```bash # ① 离线验证推理正确(不动机器人) $PY $D/openloop_verify_0617.py 2>/dev/null | grep -E "frame|p0|pred|gt" # ② 真机只读(确认 action[0]≈当前) $PY $D/infer_stage_a_v2_0617.py 2>/dev/null | grep -E "iter|action\[0\]-state|suction" # ③ 自检臂控制权(腕5°来回; moved~5°=可控, moved~0=遥操占着需释放) $PY $D/smallstep_test_0617.py --live --joint 6 --delta-deg 5 2>/dev/null | grep -E "moved|verdict" # ④ 复位到 init + 头下俯看料箱(⚠️动机器人) $PY $D/pose_io_0617.py --restore --live --speed 0.4 $PY $D/head_pitch_test_0617.py --live --pitch 0.50 # ⑤ 闭环(⚠️动机器人): 开腰 + 头冻结在下俯【关键! 勿加 --no-waist, 否则不起手】 LOG=run_$(date +%H%M%S).log $PY $D/infer_stage_c_v3_0617.py --live --no-head \ --max-chunks 30 --exec-frames 30 --max-slew 0.3 --max-time-s 120 > $LOG 2>&1 grep -E "^ chunk|done|release" $LOG | tail -34 # ⑥ 快照当前位姿为默认恢复位(只读) $PY $D/pose_io_0617.py --save ``` ### infer_stage_c_v3 参数 | 参数 | 默认 | 说明 | |---|---|---| | `--live` | 关 | 加上才动;不加=dry-run | | `--no-waist` / `--no-head` | 关 | 冻结腰/头 | | `--max-slew` | 0.5 | rad/s(100Hz 平滑)| | `--exec-frames` | 15 | 每 chunk 下发帧数(1~30) | | `--max-chunks` | 3 | chunk 数 | | `--max-time-s` | 30 | 总时长上限 | | `--sanity-delta` | 1.5 | 首步关节delta>此值(rad)才拒(垃圾兜底) | --- ## 5. 闭环"起步卡死"——✅ 已解决 > **结论更新(晚于本节原文)**:起步卡死的**真因是两个可控阻塞**,不是当时推测的"模仿学习起步停顿/需更晚checkpoint":① 头 pitch=0 严重 OOD(头镜头看墙、料箱被切在画面底边)② `--no-waist` 冻死了模型最想动的腰(躯干前倾带动伸手)。**头预下俯 ~0.50 + 开腰**后,当前 checkpoint 即能完成"弯腰探入→双臂伸到铝板正上方"。详见 [COMMANDS_v2.md](COMMANDS_v2.md)。下方原始分析保留作记录。 修对一切后,**checkpoint-22000 闭环从 home 静止启动会卡住**:每个 chunk 都预测≈home(手臂不伸出、只有头 pitch 小幅摆),不主动发起抓取。 - **原因**:模仿学习"起步停顿"——演示每段开头在 home 停留 ~360 帧(12s)才由人发起,模型学成"看到 home→停",闭环自我维持成不动点。**非推理/执行 bug**(openloop 证明喂 mid-task 状态时模型会正确继续动作)。 - **注意**:修复前"双臂能张开"是顺序错位制造的**垃圾大动作假象**(还引发过流重启),不是模型在干活。 - **治法**:①训练时裁掉每段开头静止帧 / 加时间-进度条件 ②用训练更久的 checkpoint ③临时"轻推启动":先用 `go_home_servo --target-npy kick_qpos.npy` 推到 partway 伸出位,再接闭环(验证模型会接着做)。 --- ## 6. 安全 / 恢复 - **臂控制权**:跑前用 ③ 自检;遥操占着臂时 `move_arm_joint_servo` 返回 0 但臂不动(提优先级也抢不回,需遥操侧释放)。`get_whole_body_status` 的 `left/right_arm_control` 标志不可靠,以实测小步动作为准。 - **急停**:所有 live 脚本支持 Ctrl-C 立即停并保持当前位姿;结束自动 `set_control_mode(priority=1)` 交还。 - **腰**:默认 `--no-waist` 冻结;放开是 COM 大行程,先小幅验证(小幅增量腰动作已验证安全)。 - **吸盘**:v3 只记录 dim14/15,**不实际下发**(EVS08 actuation 未接)。 - **手动交还控制权**: ```bash $PY -c "import agibot_gdk as g,time; g.gdk_init(); r=g.Robot(); time.sleep(0.5); \ m=g.MotionControlMode(); m.control_mode=g.ControlMode.CTRL_JOINT_POSITION; \ m.input_source=g.InputSource.INPUT_GDK; m.safe_mode=g.SafeMode.SAFE_NORMAL; \ m.target=g.Target.TARGET_ARMS; m.priority=1; print(r.set_control_mode(m)); g.gdk_release()" ``` --- ## 7. 状态小结(2026-06-21) - ✅ 部署链路完全打通且正确:IO 顺序/归一化/预处理、臂API、平滑、安全门控、位姿快照恢复 - ✅ 全身平滑控制验证(单关节臂/头/腰 + 协调下蹲起立) - ⚠️ 待解:① checkpoint 起步卡死(需更晚 checkpoint / 裁静止帧重训)② 腰下蹲大行程 COM 未验 ③ 吸盘 EVS08 actuation 未接 - 另:`README_checkpoint_0617_deploy.md` 是早期部署文档(部分内容已被本 README 更新覆盖,以本 README 为准)