2 Commits

Author SHA1 Message Date
arm_dev c1cd862eea 真机落地前的仿真补齐:夹持/腕力/真值位姿,让仿真能验证 S07–S09
这批是 09-24 那轮仿真工作的收尾,一直没提交。内容按目的分四块:

1) 仿真真能「夹住」工件
   sim_grasp_lock:给规与夹爪之间加接触锁(默认关,run_gauge_assembly --sim 才开)。
   没有它时仿真里规只靠摩擦,S08 棘轮一转就滑出指间,于是把「仿真不真」误读成
   「力判据不对」。新增 test_sim_grasp_lock.py。

2) 腕部力传感器进仿真
   sim_wrist_ft(+ config/wrist_ft.yaml):S07 的首选判据是腕部 FT 的轴向突变,
   而仿真里以前根本没有腕部力,S07 只能退到触觉兜底,两套判据从没在同一场景下比过。
   现在两条通道都在,接触判定可对照。

3) 真值位姿可查(不再靠猜)
   sim_live_pose / sim_pose_service:把 Gazebo 里刚体的实测位姿发布出来,
   stage2 的真值路径按**实测**位姿算孔位,而不是按场景文件里的标称位姿。
   顺带把真值孔位的推导(truth_holes)独立出来并补测。

4) 工具几何成为可配置项
   config/sim_tool_geometry.yaml + stage2 的 tool_tip_below_flange_m 启动参数:
   仿真里规会在指间下滑,工具长每次装夹都不同(实测见过 243/254mm),
   悬停高度与 S07 下探预算必须按实测值算,不能再写死。

应用层同时跟进:gauge_fsm / gauge_config 把「悬停时工具尖端入没入工件」的判据
(hover_z_guard)与拖件判定(drag_verdict)收成纯函数并补测;stage3 搜孔、
site 导出、run_gauge_assembly 与若干文档同步。
新增 test_gauge_exit_lift / test_gauge_gripper_client / test_node_handler_collisions。

测试:全仓库 1085 passed。
2026-09-28 10:17:06 +08:00
arm_dev 811e71df1f 仿真上料:夹爪真能夹住通止规(新增 sim_load_gauge.py + 夹爪出力钳位)
仿真里没有"人把规塞进夹爪"这一步,之前整条流程拖到 S07 才暴露(下探 25mm
什么也没碰到,看着像力阈值问题)。新增 scripts/sim_load_gauge.py 顶这一步。

上料为什么难(四个原因叠加,都实测踩过):
  1. URDF 里夹爪关节 effort=80Nm → 位置控制器把规顶飞。urdf_normalize 新增
     _clamp_grip_effort:按握力 45N 与指节杠杆反推,指节 4.79Nm / 主关节 45N。
  2. **指腹接触面不在 tcp_frame 原点上**:URDF 里 inner_finger_pad_joint
     z=0.0235、finger_tcp_joint z=0.0360(同父链节同方向)→ 指腹中心比
     tcp_frame 高 12.5mm。所以规尖→指腹中心是 0.043,不是夹持段中心的
     0.0555。用错值的现象极迷惑:gz 报得出 Contacts、也能读到接触,但规
     就是托不住、一路滑下去。ΔZ 扫描实测:0/±5mm 掉、+10~+15mm 夹住。
  3. 摆完位就自由落体:ROS 往返 100ms+ 而物理步进 1ms,等合爪指令到达,
     规已掉 125mm。改成**像人手一样托着** —— 合爪期间 50Hz 按当前指腹位姿
     把规瞬移回两指之间,托到真夹住为止。
  4. 合到多少不猜:从松到紧扫开口,扫到"松手后不掉"为止。指腹实际接触面
     未必在 tcp_frame 原点,拿"指间间距=开口"反推闭合量会差好几毫米。

结果:漂移 0.4mm、两指 |fnormal|≈46.5N(正好是 45N 设计握力)。
另修 _set_gauge_pose 的 ign service 口径说明与 _gauge_pose_now 的解析。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-24 14:42:56 +08:00