fac2d5384d
此前仓库有规则文档(FRAMEWORK_RULES)、有目录表(WORKSPACE)、有各模块说明,
但**缺一份"从零进来的人读什么"**:业务目标没有一处讲清("通止规装配"散落在
7 个文件里各提一句),测试怎么跑在 docs/ 里一次都没写过,改一个东西该动哪个文件
要靠翻源码猜。
docs/HANDBOOK.md(416 行,新增)
1. 这台机器在干什么 —— 通止规是检验螺纹的量具(通端应旋到底、止端应旋不进);
为什么值得自动化(留下可追溯的力曲线);三段主线的数据流;日志三行判进度。
★ 1.4 节是**承诺书**:逐项标 ✅/⚠️/❌,并给出"哪条命令能证明它已就绪"。
如实写明还没做的四项:自动拉起全部服务、夹爪持规自检、D435 手眼标定、
装配合格判定。指不出验证命令的,就老实标 ❌(R6.1)。
2. 系统长什么样 —— 三层各有硬边界;两块**独占资源**(RDK、D405 USB)
以及各自的冲突表现;从像素到关节的全链路加上"每步的口径写错会怎么表现"。
3. 我要改东西,改哪里 —— 决策表(改 X → 动 Y → 用 Z 验),覆盖换臂/悬高/夹爪/
入孔/触觉/相机/仿真场景/权重/新品牌设备/命名位姿。每行都外链权威文档,
不复制内容(M2)。
4. 怎么验 —— 三层验收(不报错不算验收 / 物理量命中真值 / 任务成功)+ 命令清单 +
**单元测试怎么跑**(此前 docs/ 里没有任何一处写过)。含 608 项分包清单。
4.4 节专讲"验收工具自己也会失效",把 M1/R5.3/R6.6 串成一条线。
5. 出问题按现象查 —— 三处权威文档的分工表 + 15 行"现象 → 先怀疑什么",
覆盖 8 条仿真坑与全部触觉坑(坑 1/2/5/6/7/9/10)。
6. 术语表 + 未做的事(按优先级)+ 往下读的路线。
顺带写进规则的(docs/FRAMEWORK_RULES.md)
R6.7 验收命令必须真跑过 —— 本仓库已经因此踩过两次(CRLF 死脚本被五处文档推荐)
R6.8 install/ 构建产物会互相污染 —— 见下面这个发现
第 7 节清单加两条(第 10 条真跑过命令、第 11 条构建环境对不对)
第 8 节反例表加三行症状
★ 顺带发现一个哑弹(R6.8,**已记录未修**)
colcon build 会把当时激活的那个 python 的绝对路径写进每个入口脚本的 shebang。
实测:install/ 里 31/59 条指向仿真环境 ros_gz_sim,install_sim/ 里 31/55 条
(后者是对的)—— 说明真机 install/ 是在仿真 conda 环境里构建出来的,违反 R5.7。
$ head -1 install/arm_interfaces/lib/arm_interfaces/device_check
#!/home/cc/anaconda3/envs/ros_gz_sim/bin/python3.11
为什么现在没炸:两个 conda 环境的 Python 依赖当前完全相同(pyrealsense2 / serial /
cv2 / numpy / torch / ultralytics / tensorrt 都在),指错了也照样 import 成功。
这是一颗哑弹 —— 哪天某个环境多装或少装一个包,真机栈就会以"模块找不到"的形式炸,
而人是不会想到去查 shebang 的。
修法(写进 R6.8,待执行):在真机 conda 环境里重建 install/,再
`grep -l ros_gz_sim install/*/lib/*/* | wc -l` 应当变成 0。
预防:构建脚本开头应断言当前 conda 环境与目标一致(待补)。
验收
- 文档内所有相对链接与反引号路径引用均存在(脚本检查,0 坏链)
- 文档里给的每条命令都实际执行过:
ros2 run arm_interfaces device_check 通过
device_check --list-brands 列出 5 类设备
scripts/show_site_config.sh 存在
check_sim_cameras.py / check_sim_scene.py / check_text_only.py 存在
for d in src/*/test ... pytest 循环 608 passed
- 单测 608 passed,与改动前一致(本次只改文档)
Co-authored-by: Cursor <cursoragent@cursor.com>
101 lines
4.9 KiB
Markdown
101 lines
4.9 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/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 的说明和仓库实际状态不一致。)
|