Files
ros_contorl/docs/HANDEYE.md
arm_dev b903161113 左臂换成 tool10120938 后,手眼仍按旧 tool1 和 8×11 板求解,顶视迁臂又按短跳 rest-to-rest,真机上要么整体偏一截,要么中途弹射启停。
眼在手上改用该 TCP 做 AX=XB,再折回相机→法兰;A5 内角点改为 11×8,09-04 / 10-09 旧结果留在 backup。一阶段 D435 迁臂改成一条 FollowJointTrajectory(余弦加减速,近处降速,XY 进门槛后再单独收垂直),跟踪锁高与悬停齐平,避免倾斜相机下先降一截把孔位重投影偏掉。--no-descent 只降到离面 15 mm;跳过三阶段时触觉 USB 打不开不再空等几分钟。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-12 15:04:23 +08:00

97 lines
5.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 手眼标定
两种装法,两块板,两台相机,两份结果。**禁止混用**:
| 模式 | 相机 | 板 | 板怎么摆 | 结果文件 | `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 换掉。