98f4277849
这四个都是「现场看着正常、结果不对」的故障源,共同特征是**不报错**,所以要把它们
从流程里拎出来单独判,并且给出可执行的下一步,而不是只报一个失败。
scripts/lib/usb_health.py
RealSense 协商到 480Mbps(USB 2.0)时能出图、不报错,只是帧率掉到 1/2 且
深度不稳定。这里解析 sysfs 拓扑,把「速率对不对」独立于「有没有图」来判,
并在 --watch 下统计掉线/重连次数(线/口/供电 Hub 的问题会表现为反复抖)。
scripts/lib/v4l_health.py
触觉相机有两类完全不同的坏法,处置方式相反,以前都只表现为「没有 /dev/video*」:
· unplugged —— sysfs 里也没有,是没插/线坏
· wedged —— sysfs 里在、/dev/video* 没有,是 USB 端点了卡死(要复位或重插)
2026-09-28 现场左指就是 wedged(1-3.4.1 在 uvcvideo 下,video 节点缺失)。
scripts/lib/rdk_status.py
ros2_control 卡在 wait_for_operational 时,现象是「栈起来了但关节全是 0、
流程一直等」。原因全在 OperationalStatus 上,而它只有 RDK 读得到。
这里把状态翻成人话 + 处置(Auto(Remote) / 松急停 / 清故障)。
判据取自厂商头文件原话:IN_MANUAL_MODE = "need to switch to Auto (Remote) mode"。
scripts/lib/real_geometry_check.py
手眼矩阵与悬停几何。手眼写坏不会报错,只会让位姿整体偏几毫米到几厘米;
判据:R 正交(|RᵀR−I| ≤ 2e-3)、det(R)=+1、平移量级在 10–500mm。
悬停几何直接复用 gauge_fsm.hover_z_guard(流程里唯一判定处,不另写一套);
工件面未标定(site.yaml 写 0.0 = 未知)时**明确报 FAIL 并说明判不了**,
而不是按 0.0 算出一个假的「已修正」结论。
测试:test_usb_health / test_v4l_health / test_real_geometry_check 共 33 例,
全部钉在「判据要能报错」上(故意弄坏的输入必须被抓到)。
顺带 .gitignore 补 log_real/:真机各终端日志是运行产物,与 log_sim/ 对称。
arm_application
现场业务包。操作员用 ~/ros2/scripts/*.sh,不要直接改这里的默认 yaml。
节点(console_scripts)
| 可执行文件 | 源文件 | 作用 |
|---|---|---|
realsense_color_pub |
realsense_color_pub.py |
D405 发布 + 预览 |
perception_node |
perception_node.py |
YOLO + 平面中心 → 点 |
servo_node |
servo_node.py |
100 Hz hover / 锁高 |
handeye_teach |
handeye_teach.py |
拖拽记点 |
handeye_calibrate |
handeye_calibrate.py |
走点 + 解 T |
handeye_waypoints |
handeye_waypoints.py |
旧巡航记点(可选) |
dh_pgea / dh_pgea_cli |
dh_pgea_node.py / dh_pgea.py |
左臂 PGEA |
dual_gripper / dual_gripper_cli |
dual_gripper_node.py / dual_gripper_cli.py |
PGEA+RGI |
hole_detect |
hole_detect_node.py |
入孔检测 |
tactile / tactile_cli |
tactile_node.py / tactile_cli.py |
Orisys 视触觉 |
goto_ee_plane |
goto_ee_plane.py |
可选:抬高再回 home(默认启动不再调用) |
demo_named_poses |
demo_named_poses.py |
mock/实机点位示例 |
run_joint_trajectory |
run_joint_trajectory.py |
轨迹回放 |
gauge_assembly |
gauge_assembly_node.py |
通止规装配主流程(S00–S11 状态机,见 docs/GAUGE_ASSEMBLY.md) |
库模块见包内 __init__.py。接口总表:docs/INTERFACES.md。
通止规装配的模块分工(gauge_*)
主流程拆成"纯逻辑 + 一层 ROS 壳",纯逻辑都能离线单测:
| 文件 | 管什么 |
|---|---|
gauge_fsm.py |
状态/事件/转移表(唯一权威,转移表是数据不是 if/else) |
gauge_kin.py |
URDF 限位、预绕角、实测"绕工具 Z 转了多少度" |
gauge_config.py |
site.yaml → gauge_assembly 段解析与校验(键名/单位/类型/交叉矛盾) |
gauge_gripper.py |
夹爪后端选择(契约 / 真机 Trigger)+ 状态字解读 |
gauge_boot.py |
S00 自检清单(必检/选检,缺了会怎样) |
gauge_assembly_node.py |
ROS 壳:发指令、读反馈、把事件交给状态机 |
配置
| 文件 | 角色 |
|---|---|
config/perception.yaml servo.yaml |
默认值,被 site.yaml 覆盖 |
config/hole_detect.yaml |
two_stage 缺省;被 site.yaml hole_detect 覆盖 |
config/hole_insert.yaml |
yolo/hough 缺省 |
config/orisys/dd03.json |
已迁走:型号配置随 SDK 放在 devices/sensors/orisys/models/dd03/config.json,路径写在 site.yaml tactile.config_file |
config/handeye_result_89.yaml / _91.yaml |
该臂手眼 T(标定写入;禁止混用) |
config/handeye_poses_89.yaml / _91.yaml |
该臂示教关节 |
launch/visual_servo.launch.py |
感知 + 伺服 + 手眼 TF |
launch/dh_pgea.launch.py |
左臂 PGEA |
launch/dual_gripper.launch.py |
双爪 |
launch/hole_detect.launch.py |
入孔检测 |
launch/tactile.launch.py |
视触觉 |
launch/gauge_assembly.launch.py |
通止规装配(只发布手眼静态 TF;前置服务自己先起) |