d78e66ce98
背景:这个框架踩过的坑几乎都是同一类——"没报错但结果是错的"。
之前这些教训只存在于聊天记录和零散注释里,改一次代码就要重踩一遍。
现在收敛成一份可引用的文档,并压缩成 .cursor/rules/ 常驻规则。
docs/FRAMEWORK_RULES.md(414 行)
第 0 节 三条元规则:M1 静默失效是头号敌人 / M2 单一数据源 / M3 口径必须显式
第 1 节 配置与数据 R1.1-R1.5(分层优先级、site.yaml 新键必须接线或告警、设备走 devices/、权重走 models/)
第 2 节 几何/单位/坐标系 R2.1-R2.7(米与弧度、frame_id 必须是光学系、深度 mm↔m、
rpy=Rz·Ry·Rx、Gazebo camera_info 不可信、像素门槛绑图幅、位姿容差要写理由)
第 3 节 触觉与力 R3.1-R3.6(力是相对基线的增量、fnormal 压为正、轴向映射必须实测、
接触布尔要用超时、force_scale 口径、仿真图像只能占位)
第 4 节 仿真 R4.1-R4.10(唯一 site.yaml、world 里写 plugin 会挤掉默认系统、搜索路径要在
launch 前设好、上游 description 不许改、场景走 scene.yaml、校验要逐碰撞体、
不用"有话题就算通"验收、停仿真用 stop_sim_gz.sh)
第 5 节 代码与测试 R5.1-R5.7(纯逻辑抽纯函数、校验要有测试证明有效、不许把降级写成通过、
解析外部输出先确认真实格式、删除前扫全仓库引用、别在中文路径 colcon build、真机仿真产物隔离)
第 6 节 文档与提交 R6.1-R6.4(文档与实现不一致立刻修文档、每份文档说明记录什么事实、
结论数字要可复现、提交信息讲为什么并附实测数据)
第 7 节 改动前检查清单
第 8 节 历史反例清单——按"你看到的症状"查表,不是按道理排序
第 9 节 给 AI 的具体指令
.cursor/rules/*.mdc 三份压缩版(常驻)
framework-core.mdc alwaysApply,元规则 + 检查清单 + 禁止项
sim-gazebo.mdc globs=devices/sim/**,src/arm_sim_gazebo/**
config-and-devices.mdc globs=config/**,devices/**,models/**,src/arm_interfaces/**
顺手修掉文档与实现不一致(R6.1)
docs/WORKSPACE.md 此前【完全没有 devices/ 这一层】——通用化落点却没进目录总表。
补 devices/ 一节(kind/brand 目录约定、registry.yaml 与 manifest.yaml 分工、
assets[].required 缺失会报错),补 build_sim/install_sim/log_sim 与 .cursor/rules/,
并把 FRAMEWORK_RULES.md 标为 docs/ 首行
README.md 文档表首行加 FRAMEWORK_RULES.md
顺手删死代码(R5.5:先扫引用)
src/arm_interfaces/arm_interfaces/paths.py 删 assets_root()
它返回 ros2_root()/"assets",而仓库里从来没有 assets/ 这个目录——实际权重树是 models/,
且 models/ 的定位已由 arm_application.weights_layout.default_weights_root() 负责
(带 SITE_WEIGHTS_ROOT 覆盖,且能从 install/ 反查仓库根)。
两个实现并存违反 M2,且这个还指向不存在的路径,属于"照着名字用就踩空"。
src/arm_interfaces/test/test_real_devices.py 从清环境变量列表里去掉 SITE_ASSETS_ROOT
验收
src/arm_application 233 passed / arm_driver_flexiv 69 / arm_interfaces 46 /
arm_kinematics 24 / arm_sim_gazebo 236 = 608 passed
(flexiv_rdk 的 test 需装厂商 flexivrdk 包,仿真环境无此依赖,与本改动无关)
Co-authored-by: Cursor <cursoragent@cursor.com>
100 lines
4.7 KiB
Markdown
100 lines
4.7 KiB
Markdown
# 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/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 的说明和仓库实际状态不一致。)
|