352270d1ccf9dc0adb7ecaf0b939a2913eff0b94
前一个提交给了四个单项判据(USB / V4L / RDK / 手眼)。这一批把它们的**判据入口**
补齐并编排成一条命令,产出「结论 + 要人工做的事」:
scripts/lib/real_preflight.py
run_all() 按**现场该处理的顺序**排出结论,不是按代码顺序:
现场配置 → 遗留进程 → 网络 → 机械臂 RDK → 腕部相机 → USB/触觉/几何
顺序是有理由的:遗留的 ros2_control 占着 RDK,会让后面每一项的现象都指向别处,
所以先查它;机械臂能不能动是唯一的人工硬阻断,排在相机之前。
新增 check_cameras —— **本臂配置的那只腕部相机在不在 USB 上**。
这是本次实测暴露的判据缺口:2026-09-28 现场 D405 整个从 lsusb 消失
(只剩顶置 D435),而旧体检**全绿** —— check_usb 只看协商速率,遍历的是
「发现到的」设备,对「这只根本不在了」无话可说。缺 D405 之后踩的是完全不同
的一类错误(点云为空 / 找不到工件),排查方向会被带偏很远。
按 site.yaml 的配置意图核对:robots[<sn>].camera.name → cameras.<name>.model,
比**型号**而不是序列号 —— 实测这台 D435 的 sysfs serial 是空串,按序列号判会
永远判「不在」;序列号只在型号对上时做一次「是不是本臂那只」的提醒(WARN)。
修掉三处会误导现场的输出:
· _run() 改成三返回值(分离 stdout/stderr,RDK 的 C++ 日志会混进 stdout)
之后,_ps_output/网络两处还在按两返回值解包 —— 体检**第一步就崩**,
什么结论都给不出来。现在有 test_run_all_completes_without_crashing 钉住。
· 人工动作里「去查网线」出现过两条(check_network 与 rdk_status 各写一句
意思相同、字面不同的话),去重是按整串文字做的,于是人读到两条、还得判断
「这是一个问题还是两个」。措辞抽到 manual_actions.py,两边字面一致。
· 触觉 wedged 的处置与 v4l_health 同步(免密的 reset 是首选,重插是兜底)。
scripts/lib/manual_actions.py(新)
人工动作措辞的**唯一**来源。判据分在两个文件、还跑在两个不同的 Python 上
(3.11 / 3.10,见 rdk_status 的模块说明),互相 import 不了,所以抽成只依赖
标准库的公共模块。
scripts/run_real_preflight.sh(新)
一条命令的入口:只读、不动臂,不需要机械臂能连上。
实测(2026-09-28,arm 89):体检跑通并给出 NO-GO + 7 条互不重复的人工动作,
新判据抓到「D405 不在 USB 上」(旧版全绿)。同时确认了本机可用的部分:
夹爪 PGEA 初始化完成 / 全开 20.00mm、右指触觉 SDK 300 帧 @29.9Hz、
手眼矩阵自洽、enp4s0 千兆全双工。
测试:test_real_preflight 28 项通过(含跨模块的措辞去重回归、
编排端到端冒烟、腕部相机四种情形)。
Co-authored-by: Cursor <cursoragent@cursor.com>
Flexiv Rizon 视觉伺服(~/ros2)
独立工作空间:腕部 D405 眼在手上、手眼标定、YOLO 找工件、法兰悬停跟踪、DH 夹爪、入孔检测。
一份仓库即可跑完整跟踪与检测,不依赖 camera_test 或装配 HMI。
工作目录必须是 ASCII 路径(推荐克隆到 ~/ros2)。
| 项 | 值 |
|---|---|
| 配置 | config/site.yaml(从 example 复制,不进 git) |
| 操作 | scripts/ |
| 目录说明 | docs/WORKSPACE.md(每个文件夹做什么) |
| Conda | ros_flexiv |
| ROS | Humble |
克隆后
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 独占)。
# 三个终端必须带同一个 --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/run_gauge_assembly.sh --arm … [--dry-run] |
| 看配置 | scripts/show_site_config.sh |
89 与 91 各有 手眼、相机序列号、锁高、named poses,禁止混用。
文档
| 文档 | 内容 |
|---|---|
| docs/HANDBOOK.md | 新手手册(这台机器在干什么 / 改哪里 / 怎么验 / 出问题查哪) |
| docs/FRAMEWORK_RULES.md | 框架规则(改代码前先读;含历史反例的症状表) |
| docs/WORKSPACE.md | 每个目录 / 脚本 / 包 |
| docs/QUICKSTART.md | 环境与第一次跑通 |
| docs/ARCHITECTURE.md | 进程与几何 |
| docs/SITE_CONFIG.md | site.yaml 字段 |
| docs/HANDEYE.md | 手眼标定 |
| docs/TRACKING.md | 视觉伺服 |
| docs/GRIPPER.md | PGEA + RGI |
| docs/HOLE_DETECT.md | 入孔检测 |
| docs/TACTILE.md | Orisys 视触觉 |
| devices/sim/gazebo/README.md | Gazebo 仿真手册(使用方法 / 建模要求 / 导入格式 / 配置方式 / 避坑清单) |
| docs/INTERFACES.md | ROS / 脚本接口 |
| docs/TRAJECTORIES.md | 轨迹回放 |
上传 git 时
- 要提交:
src/scripts/docs/devices/config/site.example.yamlmodels/README.mdmodels/**/*.labels.yamlhandeye/ - 不要提交:
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 的说明和仓库实际状态不一致。)
Description
Languages
Makefile
34.3%
Python
24.2%
C
20%
C++
14.6%
CMake
5.2%
Other
1.7%