go1_sft_go2 / deploy /README.md
xianglarry's picture
Upload folder using huggingface_hub
0c95a27 verified
|
Raw
History Blame Contribute Delete
9.73 kB

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_* 环境变量 + 仓库相对默认;见 ../README.md 配置章节)
  • 推理引擎:带 torch+gdk 的 venv(机器人上 /data/agi/venvs/go1_torch/bin/python),模型代码 $GO1_AGIBOT_WORLD

运行命令以 COMMANDS_v2.md 为准(实测验证版)。本文档 §4 命令、§5「起步卡死」结论较早——起步卡死后来已解决:头预下俯 ~0.50(看到料箱)+ 开腰(躯干前倾带动伸手)后当前 checkpoint 能完成"弯腰探入→双臂伸到铝板正上方",详见 COMMANDS_v2.md。


0. 环境(机器人上每个终端先跑)

ssh agi@172.16.64.220                      # 真机脚本在机器人上跑; 离线脚本任意机器均可
cd <path-to>/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}   # 可选; 默认 <repo>/checkpoint_22000
PY=/data/agi/venvs/go1_torch/bin/python ; D=deploy

路径由 go1_env.py 解析(GO1_* 环境变量 + 仓库相对默认)。


1. ⭐ 22 维 state/action 正确布局(lerobot 序,FIXED)

由转换器 profile 写死:/home/agi/workspace/go2_data_recorder/offline/profiles/go1.pyGO2_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;以下为速览(路径用 $D=deploy,环境见 §0)。

# ① 离线验证推理正确(不动机器人)
$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。下方原始分析保留作记录。

修对一切后,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_statusleft/right_arm_control 标志不可靠,以实测小步动作为准。
  • 急停:所有 live 脚本支持 Ctrl-C 立即停并保持当前位姿;结束自动 set_control_mode(priority=1) 交还。
  • :默认 --no-waist 冻结;放开是 COM 大行程,先小幅验证(小幅增量腰动作已验证安全)。
  • 吸盘:v3 只记录 dim14/15,不实际下发(EVS08 actuation 未接)。
  • 手动交还控制权
    $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 为准)