# Flexiv Rizon 视觉伺服(`~/ros2`) 独立工作空间:腕部 D405 眼在手上、手眼标定、YOLO 找工件、法兰悬停跟踪、DH 夹爪、入孔检测。 **一份仓库即可跑完整跟踪与检测**,不依赖 `camera_test` 或装配 HMI。 工作目录必须是 ASCII 路径(推荐克隆到 `~/ros2`)。 | 项 | 值 | |----|-----| | 配置 | [`config/site.yaml`](config/site.example.yaml)(从 example 复制,不进 git) | | 操作 | [`scripts/`](scripts/README.md) | | 目录说明 | **[docs/WORKSPACE.md](docs/WORKSPACE.md)**(每个文件夹做什么) | | Conda | `ros_flexiv` | | ROS | Humble | ## 克隆后 ```bash cd ~/ros2 cp config/site.example.yaml config/site.yaml # 编辑 site.yaml:robot.sn / robots[].ip / camera.serial / paths.yolo_weights # 权重文件放到 models/<分组>/(二进制不在 git 里;布局与标签见 models/README.md) conda activate ros_flexiv source scripts/env.sh ./scripts/build_all.sh source scripts/env.sh ``` 示教器:**AUTO + Remote Ethernet**,关掉 Flexiv Studio(RDK 独占)。 ```bash # 三个终端必须带同一个 --arm(89=左 91=右) bash ~/ros2/scripts/run_real.sh --arm 89 bash ~/ros2/scripts/run_camera_d405.sh --arm 89 --preview bash ~/ros2/scripts/run_visual_servo_rt.sh --arm 89 --control ``` 改 `site.yaml`:锁高 / YOLO / 伺服 → 重启第三终端;分辨率 / 曝光 → 重启相机。 ## 功能入口 | 功能 | 命令 | |------|------| | 实机 | `scripts/run_real.sh --arm 89\|91` | | 腕部相机 | `scripts/run_camera_d405.sh --arm … --preview` | | 顶视 D435 | `scripts/run_camera_d435.sh --preview` | | 列出相机 | `scripts/list_realsense.sh` | | 跟踪 | `scripts/run_visual_servo_rt.sh --arm … [--control]` | | 回 home | `scripts/go_home.sh --arm …` | | 手眼 | `scripts/run_handeye.sh --arm … teach` → `merge` → `calibrate` | | PGEA / RGI 夹爪 | `scripts/run_gripper.sh --arm 89\|91 --cli …` | | 双爪 ROS | `scripts/run_dual_gripper.sh` | | 入孔检测 | `scripts/run_hole_detect.sh --arm … --preview` | | Orisys 触觉 | `scripts/run_tactile.sh [--cli]` | | Gazebo 仿真 | `scripts/run_sim_gz.sh [--gui]`(停:`scripts/stop_sim_gz.sh`) | | 看配置 | `scripts/show_site_config.sh` | 89 与 91 **各有** 手眼、相机序列号、锁高、named poses,禁止混用。 ## 文档 | 文档 | 内容 | |------|------| | [docs/HANDBOOK.md](docs/HANDBOOK.md) | **新手手册**(这台机器在干什么 / 改哪里 / 怎么验 / 出问题查哪) | | [docs/FRAMEWORK_RULES.md](docs/FRAMEWORK_RULES.md) | **框架规则**(改代码前先读;含历史反例的症状表) | | [docs/WORKSPACE.md](docs/WORKSPACE.md) | 每个目录 / 脚本 / 包 | | [docs/QUICKSTART.md](docs/QUICKSTART.md) | 环境与第一次跑通 | | [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | 进程与几何 | | [docs/SITE_CONFIG.md](docs/SITE_CONFIG.md) | `site.yaml` 字段 | | [docs/HANDEYE.md](docs/HANDEYE.md) | 手眼标定 | | [docs/TRACKING.md](docs/TRACKING.md) | 视觉伺服 | | [docs/GRIPPER.md](docs/GRIPPER.md) | PGEA + RGI | | [docs/HOLE_DETECT.md](docs/HOLE_DETECT.md) | 入孔检测 | | [docs/TACTILE.md](docs/TACTILE.md) | Orisys 视触觉 | | [devices/sim/gazebo/README.md](devices/sim/gazebo/README.md) | Gazebo 仿真手册(使用方法 / 建模要求 / 导入格式 / 配置方式 / 避坑清单) | | [docs/INTERFACES.md](docs/INTERFACES.md) | ROS / 脚本接口 | | [docs/TRAJECTORIES.md](docs/TRAJECTORIES.md) | 轨迹回放 | ## 上传 git 时 - **要提交**:`src/` `scripts/` `docs/` `devices/` `config/site.example.yaml` `models/README.md` `models/**/*.labels.yaml` `handeye/` - **不要提交**:`config/site.yaml`(含本机 IP/序列号)、`handeye/tmp/`(临时产物)、`build/` `install/` `log/`、YOLO `.pt/.onnx/.engine`、`thirdparty/` `vendor/` - 规则已写在 `.gitignore` ### `handeye/` 是个例外,说明一下 `handeye/poses/`(示教点)与 `handeye/results/`(标定结果)**是入库的**, 尽管它们属于某台现场的数据。理由是:手眼标定要用真机示教十几分钟, 是费了真机时间换来的资产,入库才有一份可回滚的备份;一旦没入库, 一次误删就得重新上真机采点。所以这两类文件按"资产"对待,而不是按"配置"。 因此**别人克隆后必须重新标定,并把结果覆盖到 `handeye/results/<臂号>_<模式>.yaml`**。 不要直接用仓库里现成的 `T_4x4` —— 那是属于另一台机器、另一个相机安装位的, 用错的表现是跟踪始终差几厘米,且很难怀疑到标定值上。 示教点同理:`handeye/poses/` 里的关节角只在对应的那台臂上有意义。 (注:`config/site.yaml` 不入库、而 `handeye/` 入库,看似矛盾,其实是 "配置属于站点、不入库;标定成果属于资产、入库"这条区分。早期这两类的 边界没写清,导致 README 的说明和仓库实际状态不一致。)