arm_dev 04137fb6e5 修复平行夹爪串口通讯问题
今天三次实测都在"首轮咬合结束→张开到 400"之后停住,微抬 Z 3mm 那条
厂家 MoveL 从未下发。日志只写"夹爪 pos 后 8s 未到位(没有 /gripper/states)",
照着去查夹爪开合,方向是错的。

真实原因是串口会话坏了:旧节点从昨天 18:25 一直跑,写命令(FC06)有回显
——ctrl pos=400 有记录、手指也确实张开——读 0x0201 却连续 264 次无应答
(0x0200 和写都有应答)。_on_timer 读失败就 return,一帧状态都不发,
流水线拿不到状态,就在 _shift_flange_z 之前退出了。

改法(都按"读不到要如实说读不到"):

- dh_pgea:串口 EIO/termios 错误从 DhPgeaError 里分出来,单独抛
  DhPgeaBusError。以前 termios.error(5) 从 timer 回调冒出去,整个节点带
  traceback 退出。
- dh_pgea_node:读失败也发 /gripper/states,data 增到 6 个元素,最后一位
  online(1=刚读回,0=离线、前 5 个是旧值);5 元素老消费者不受影响。
  离线时不发 /gripper/joint_states(关节状态没有离线位,不能拿旧开口冒充
  现在的)。EIO 立刻重开串口,连续 30 拍读不到也重开一次,1 秒最多一次。
- pipeline_node:超时不再一律说"未到位",三种情况分开——真没到位 /
  只有离线帧(总线无应答,不是没张开)/ 一帧都没收到(节点没在发)。
- gauge_gripper、operator_gripper_state:离线帧不当有效状态,夹爪页显示
  "总线无应答"。
- gauge_config:登记 unwind_lift_mm 和 unwind_open_permille。这两个键
  上一次只写进了 site.yaml,加载器按"不认识的键"直接拒绝启动
  gauge_assembly 段(test_shipped_site_yaml_s07_step_cannot_deadlock 当时
  是红的)。
- site_io:恢复 7af9e3d 误删的 listed_arms / absolutize_site_paths 等
  (operator_gripper_state 还在导入 listed_arms,操作台夹爪页一导入就
  ImportError)。按 76c9b9c 恢复,只增不减。

实测验收:重启节点后 --cli probe 读回
data=[1.0, 2.0, 9.0, 0.0, 20.0, 1.0],online=1、grip=2(咬住)、pos=9,
0x0201 不再无应答。

单测 931 passed。新增负向用例:离线帧不能被当成有效状态、EIO 必须抛
DhPgeaBusError、夹爪超时不能报成"未到位"。剩余 6 个失败与本次无关
(伺服限速、回调遮蔽、operator_camera_view 直接继承 Node、
site.yaml 缺 screw_stage_depth_mm、臂控制器未激活,以及 parallel_cli
用例因当前有真实夹爪节点占着串口而走了另一条分支)。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-20 10:10:37 +08:00
2026-10-20 09:18:24 +08:00
2026-10-20 09:18:24 +08:00
2026-10-20 10:10:37 +08:00
2026-10-20 09:18:24 +08:00
2026-10-20 09:18:24 +08:00
2026-10-20 10:10:37 +08:00

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/ENVIRONMENT.md 在另一台电脑上装出和本机相同的 ROS / conda / RDK 环境
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.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 的说明和仓库实际状态不一致。)

S
Description
No description provided
Readme 193 MiB
Languages
Makefile 34.3%
Python 24.2%
C 20%
C++ 14.6%
CMake 5.2%
Other 1.7%