# 手眼标定 两种装法,两块板,两台相机,两份结果。**禁止混用**: | 模式 | 相机 | 板 | 板怎么摆 | 结果文件 | `T_4x4` 含义 | |------|------|----|----------|----------|--------------| | `eye_in_hand` | 腕部 D405 | A5,内角点 11×8,15 mm | 板放台面不动 | `handeye/results/<臂号>_eye_in_hand.yaml` | 相机 → 法兰(89 按 `tool10120938` TCP 求解后再折算) | | `eye_to_hand` | 顶置 D435 | A4,内角点 11×8,20 mm | **板夹在 `tool10120938` 上** | `handeye/results/<臂号>_d435_eye_to_hand.yaml` | 相机 → 这条臂的基座 | | 臂 | 眼在手上结果 | 眼在手外结果 | 示教关节 | 工作目录 | |----|--------------|--------------|----------|----------| | 89 左 | `89_eye_in_hand.yaml` | `89_d435_eye_to_hand.yaml` | `poses/89_<模式>.yaml` | `tmp/89/` | | 91 右 | `91_eye_in_hand.yaml` | `91_d435_eye_to_hand.yaml` | `poses/91_<模式>.yaml` | `tmp/91/` | 目录结构、按键、稳定性参数见 `handeye/README.md`。棋盘尺寸只改 `config/site.yaml` → `handeye.boards.<模式>`(内角点 = 方格数 − 1)。 没配过的模式会被 `run_handeye.sh` 当场拦下,不会静默用另一块板的尺寸。 ## 眼在手上(腕部 D405 + A5 板) 左臂 89 现行工具是 Studio **`tool10120938`**(2026-10-12 示教的 TCP)。 `run_real.sh --arm 89` 会切到这个工具;标定用 `/tcp_pose`(即该 TCP)做 AX=XB,再左乘 `T_flange_to_tool` 折成 **相机 → 法兰** 写入 `T_4x4` (伺服 / 静态 TF 的父系仍是法兰)。旧的 2026-09-04 / tool1 结果在 `handeye/results/backup/89_eye_in_hand_flange_tool1_20260904.yaml`。 `teach`(RDK 软拖拽)与 `run_real.sh` **互斥**。全程带同一 `--arm`。 板:A5,内角点 **11×8**,方格 15 mm,放台面后不要动。 ```bash # 0) 确认配置(应看到 tool10120938 与 11x8 / 0.015 m) bash ~/ros2/scripts/run_handeye.sh --arm 89 show # 1) 停掉 run_real.sh 和视觉伺服 # 2) 示教 8–12 个姿态(棋盘清晰、占画面 30–70%,姿态拉开) bash ~/ros2/scripts/run_handeye.sh --arm 89 teach # 窗口:d=拖拽 Enter=拍照 q=结束(窗口只显示画面,不做棋盘检测) # 接着采、不清空旧点: teach --append # 3) 写入该臂 handeye/poses/89_eye_in_hand.yaml bash ~/ros2/scripts/run_handeye.sh --arm 89 merge # 4) 再开实机(会切到 tool10120938)+ 腕部相机,棋盘不要动 bash ~/ros2/scripts/run_real.sh --arm 89 bash ~/ros2/scripts/run_camera_d405.sh --arm 89 --preview bash ~/ros2/scripts/run_handeye.sh --arm 89 calibrate ``` 91 把 `--arm 89` 改成 `--arm 91`。 ## 眼在手外(顶置 D435 + A4 板) 物理摆法与上面**反过来**:相机固定,板跟着臂动。板若还摆在台面上, `target→camera` 不变,方程退化(解不出来或解出垃圾)。 左臂 89 的“手”同样是 **`tool10120938`**:把 A4 板**刚性夹在该工具的夹爪里** (夹正、标定过程不要松)。`run_real.sh` 会切到这个工具,AX=XB 用 `/tcp_pose`。 `T_4x4` 仍是 **相机 → 这条臂的基座**,**不要**再乘 `T_flange_to_tool` (相机和基座都在世界里不动)。2026-10-09 那份在 `handeye/results/backup/89_d435_eye_to_hand_20261009.yaml`。 板:A4,内角点 **11×8**,方格 20 mm(12×9 格)。印面朝上对着 D435。 ```bash # 0) 确认配置(应看到 d435、11x8 / 0.02 m、89_d435_eye_to_hand.yaml、tool10120938) bash ~/ros2/scripts/run_handeye.sh --arm 89 show --mode eye_to_hand # 1) 夹好 A4 板。停掉 run_real.sh、视觉伺服、腕部 D405(RDK + USB 独占) # 2) 示教 8–12 个姿态:板在 D435 画面里换位置、换倾角,占画面 30–70% bash ~/ros2/scripts/run_handeye.sh --arm 89 teach --mode eye_to_hand --points 12 # 窗口:d=拖拽 Enter=拍照 q=结束(窗口只显示画面,不做棋盘检测) # 3) 写入 handeye/poses/89_eye_to_hand.yaml(不要手抄眼在手上那份) bash ~/ros2/scripts/run_handeye.sh --arm 89 merge --mode eye_to_hand # 4) 再开实机(会切到 tool10120938)+ 顶置 D435,板不要松 bash ~/ros2/scripts/run_real.sh --arm 89 bash ~/ros2/scripts/run_camera_d435.sh --preview bash ~/ros2/scripts/run_handeye.sh --arm 89 calibrate --mode eye_to_hand ``` `show` 必须同时看到 `camera=d435`、`board 11x8 inner, square=0.02 m`、 `89_d435_eye_to_hand.yaml`、`tool10120938`。不是这四样就停。 **不要**改 `paths.handeye_file` 去指向这份结果 —— 那会把腕部 D405 的 TF 换掉。 ## 结果怎么用 - **眼在手上**:`visual_servo.launch.py` / `stage2_locate.launch.py` / `gauge_assembly.launch.py` 读 `paths.handeye_file`,发布 `{法兰}` → `{腕部相机}_color_optical_frame`。`servo_node` 用同一份 T 做 `hover` / `lookat`。换结果后**重启**对应节点。 - **眼在手外**:`gauge_assembly.launch.py` 按 `handeye/results/<臂号>_<相机>_eye_to_hand.yaml` 自己找,发布 `{基座}` → `{手外相机}_color_optical_frame`。S03 粗定位查的就是这条 TF。 **不要**改 `paths.handeye_file` 去指向它 —— 那会把腕部精拍定位的 TF 换掉。