新增 teach --auto-solve:采完点按 q 后自动 merge、重启相机、接着 calibrate, 不再需要手敲第二、三条命令。 但只有 --ros(示教器)模式能真正全程跑通,这一点如实处理而非强行自动: 标定必须通过 run_real.sh 的控制器驱动机械臂走点位,而 --rdk 软拖拽要求 RDK 独占,两者无法同时存在。这是硬件约束,脚本绕不过去。 所以 --rdk --auto-solve 会照常自动 merge,然后打印明确的两步指令, 并提示想要一条命令就改用示教器 Free Drive 模式。 硬跑一个必然失败的 calibrate 只会让人以为标定坏了。 顺带修正一处不可达代码:_need_camera / _need_files / _need_robot 内部用的是 exit(终止整个脚本)而非 return,所以 `if ! _need_camera; then echo ERROR; fi` 里的分支永远不会执行。改为直接调用,由它们自己打印原因并退出。 usage 里补上 --auto-solve 及其限制说明;handeye/README.md 第 5 节补 "一条命令跑完"小节,写明为什么 RDK 模式做不到。 usage() 的 sed 行号改为按首个非注释行自动计算,避免以后加注释又要同步。 测试:224 passed
scripts — 唯一操作入口
实现细节在 docs/WORKSPACE.md 和 docs/。
每天: run_real.sh · run_camera_d405.sh · run_visual_servo_rt.sh · go_home.sh
三阶段串联: run_all.sh --arm 89 [--hole k2] [--skip-stage1](run_pipeline.sh 是它的旧名别名)
手眼: run_handeye.sh(teach / merge / calibrate / show)
夹爪: run_gripper.sh --arm 89|91 · run_dual_gripper.sh
入孔: run_hole_detect.sh --arm … [--preview]
触觉: run_tactile.sh [--cli]
权重: export_yolo_trt.sh
配置: show_site_config.sh · lib/export_site_env.py
环境: env.sh · build_all.sh
RDK: test_rdk_python.sh · rdk_switch_tool.sh · rdk_drag_bridge.py
搁置未用: fetch_isaac_flexiv.sh(拉 Flexiv 的 Isaac Sim / RDK 源码到 thirdparty/;Isaac 路线目前搁置,Gazebo 是选定平台)
lib/parse_arm_args.sh 解析 --arm 89|91。
lib/load_site_config.sh 把 config/site.yaml 变成 SITE_*。
排查脚本卡住时的常识
几个脚本开头会等外部条件(控制器 ACTIVE、相机出图、触觉就绪)。正确的判活顺序是
先 ros2 service list / ros2 topic list 看目标在不在,再去 call / echo:
# 对:服务不存在时立刻返回
timeout 3 ros2 service list | grep -q '^/controller_manager/list_controllers$' || exit 1
timeout 3 ros2 service call /controller_manager/list_controllers ...
# 错:服务不存在时每次 call 都要耗满超时才返回,
# 30 次循环 = 白等两三分钟(实测 63s),看起来就像脚本卡死了
for _i in $(seq 1 30); do timeout 5 ros2 service call ... ; done
run_all.sh / run_stage2_locate.sh / run_stage3_search.sh 已按正确顺序改过;
run_handeye.sh 一开始就是对的。