1ac5472788
真机与仿真**同参数同结果**的一个几何错误:流程里的"悬停高度"是按**相机**
定的(要看清孔得离工件面 ~0.17m),不是按**工具**定的 —— 而工具装在法兰
下面、比相机长得多。仿真里实测:
悬停法兰 0.632 − 工具长 0.243 = 尖端 0.389
工件上表面 0.412
→ **悬停这一刻,通止规已经插进工件 23mm**
后果极具误导性:S07 一路压到顶都等不到"台肩落面"那一下,最后报
"下探 N mm 都没触发接触判据" —— 看起来像**力阈值标错了**,实际是几何错。
上一轮就是照这个假象去调阈值的,白费。
新增三个纯函数 + 两个配置项:
- gauge_fsm.tool_clearance_m(法兰 z, 工具长, 面 z) → 尖端离面多高(负=已插入)
- gauge_fsm.descend_needed_m(...) → 台肩落面还需下压多少
判"到底了"的是**台肩落面**,不是尖端碰面。台肩在规尖上方 30mm,
所以按尖端算会**少算 30mm** —— 那正是"预算 25mm 永远到不了落面"的 bug。
- gauge_fsm.descend_budget_m(needed) → 预算 = 1.5×需求,含绝对下限
- site.yaml: tool_tip_below_flange_m(0.243 的来历写清了:
TCP 0.200 + 规尖到指腹接触面 0.043,而 0.043 不是"夹持段中心到尖端"
的 0.0555 —— 指腹接触面比 TCP 原点高 12.5mm)
- site.yaml: workpiece_surface_z_m(0 = 用 stage2 实测孔位兜底)
S07 启动时现在会打印(本轮实测输出):
S07 工具几何:悬停法兰 z=0.6317、工具尖端在法兰下方 243.0mm
→ 尖端 z=0.3887,工件上表面 z=0.4117
悬停时尖端离面 -23.0mm(**已经插进工件了**);台肩落面还需下压 +7.0mm
配的预算不够走完落面那一段时,就地按几何改大并告警(不是静默用错的数)。
回归测试 5 项,其中 test_shipped_budget_covers_shipped_gauge_and_hover
专防"预算又调回不够"这个 bug 复发。
Co-authored-by: Cursor <cursoragent@cursor.com>
arm_application
现场业务包。操作员用 ~/ros2/scripts/*.sh,不要直接改这里的默认 yaml。
节点(console_scripts)
| 可执行文件 | 源文件 | 作用 |
|---|---|---|
realsense_color_pub |
realsense_color_pub.py |
D405 发布 + 预览 |
perception_node |
perception_node.py |
YOLO + 平面中心 → 点 |
servo_node |
servo_node.py |
100 Hz hover / 锁高 |
handeye_teach |
handeye_teach.py |
拖拽记点 |
handeye_calibrate |
handeye_calibrate.py |
走点 + 解 T |
handeye_waypoints |
handeye_waypoints.py |
旧巡航记点(可选) |
dh_pgea / dh_pgea_cli |
dh_pgea_node.py / dh_pgea.py |
左臂 PGEA |
dual_gripper / dual_gripper_cli |
dual_gripper_node.py / dual_gripper_cli.py |
PGEA+RGI |
hole_detect |
hole_detect_node.py |
入孔检测 |
tactile / tactile_cli |
tactile_node.py / tactile_cli.py |
Orisys 视触觉 |
goto_ee_plane |
goto_ee_plane.py |
可选:抬高再回 home(默认启动不再调用) |
demo_named_poses |
demo_named_poses.py |
mock/实机点位示例 |
run_joint_trajectory |
run_joint_trajectory.py |
轨迹回放 |
gauge_assembly |
gauge_assembly_node.py |
通止规装配主流程(S00–S11 状态机,见 docs/GAUGE_ASSEMBLY.md) |
库模块见包内 __init__.py。接口总表:docs/INTERFACES.md。
通止规装配的模块分工(gauge_*)
主流程拆成"纯逻辑 + 一层 ROS 壳",纯逻辑都能离线单测:
| 文件 | 管什么 |
|---|---|
gauge_fsm.py |
状态/事件/转移表(唯一权威,转移表是数据不是 if/else) |
gauge_kin.py |
URDF 限位、预绕角、实测"绕工具 Z 转了多少度" |
gauge_config.py |
site.yaml → gauge_assembly 段解析与校验(键名/单位/类型/交叉矛盾) |
gauge_gripper.py |
夹爪后端选择(契约 / 真机 Trigger)+ 状态字解读 |
gauge_boot.py |
S00 自检清单(必检/选检,缺了会怎样) |
gauge_assembly_node.py |
ROS 壳:发指令、读反馈、把事件交给状态机 |
配置
| 文件 | 角色 |
|---|---|
config/perception.yaml servo.yaml |
默认值,被 site.yaml 覆盖 |
config/hole_detect.yaml |
two_stage 缺省;被 site.yaml hole_detect 覆盖 |
config/hole_insert.yaml |
yolo/hough 缺省 |
config/orisys/dd03.json |
已迁走:型号配置随 SDK 放在 devices/sensors/orisys/models/dd03/config.json,路径写在 site.yaml tactile.config_file |
config/handeye_result_89.yaml / _91.yaml |
该臂手眼 T(标定写入;禁止混用) |
config/handeye_poses_89.yaml / _91.yaml |
该臂示教关节 |
launch/visual_servo.launch.py |
感知 + 伺服 + 手眼 TF |
launch/dh_pgea.launch.py |
左臂 PGEA |
launch/dual_gripper.launch.py |
双爪 |
launch/hole_detect.launch.py |
入孔检测 |
launch/tactile.launch.py |
视触觉 |
launch/gauge_assembly.launch.py |
通止规装配(只发布手眼静态 TF;前置服务自己先起) |