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

5.1 KiB
Raw Permalink Blame History

手眼标定

两种装法,两块板,两台相机,两份结果。禁止混用:

模式 相机 板 板怎么摆 结果文件 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,放台面后不要动。

# 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。

# 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 换掉。