Files
ros_contorl/src/arm_application
arm_dev 98f4277849 真机开工体检四件套:USB 链路 / V4L 设备 / RDK 状态 / 手眼几何
这四个都是「现场看着正常、结果不对」的故障源,共同特征是**不报错**,所以要把它们
从流程里拎出来单独判,并且给出可执行的下一步,而不是只报一个失败。

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/ 对称。
2026-09-28 10:17:32 +08:00
..

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;前置服务自己先起)