Files
orisys_arm/station/README.md
T
2026-10-16 17:27:30 +08:00

98 lines
7.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 工位前端与设备后端
启动:`bash station/run_station.sh`。旧入口 `desk/run_desk.sh` 也转到这里。
离线打开界面:`bash station/run_station.sh --offline`。
回归测试:`bash station/run_station.sh --self-test`。
## 界面
侧边导航只保留“首页”和“标定”,顶部保留“设置”按钮及设置界面。顶部左右臂按钮切换当前臂,悬停显示对应设备 IP。
首页左侧为机器人状态、机器人实时预览和夹爪 3D 预留区;右侧为当前臂腕部及共用
手外相机、对应臂左右指光流预留区和三层任务按钮。开始全部流程暂未接入。
标定页预留相机预览、采点、求解和保存区域,后续接入 `handeye/`,当前不运行标定命令。
原手动控制、自动任务、相机与视觉、工艺参数页面均已移除。
没有可靠反馈的使能/TCP 状态显示未知;光流、夹爪 3D 和软件急停尚未接入。
拍照保存当前 RGB 预览至 `~/Pictures/ORISYS/`;放大和全屏预览使用同一图像缓存。
没有查看需求的相机订阅会撤销。离线运行不连接 ROS 或设备,也不下发控制。
## 首页动作接口
- 检测 → `stage_track`,运行现有第一阶段跟踪:D405 优先、丢失目标后 D435 补位;会移动机械臂,不进入对孔或旋入。
- 对孔 → `stage_locate`,只运行第二阶段,明确关闭最终下压和后续旋入。
- 回零 → 所选臂命名点文件中的 `servo.home_pose_name`(默认 `home`),经原生轨迹 Action 返回初始姿态,不是关节全零。
- 停止 → 取消本站任务、通过控制器管理服务暂停对应臂的运动控制器(硬件接口调用 `Robot::Stop`),停止本站流程,再等待新鲜关节反馈持续稳定。失败时明确报告停止未确认,并阻止继续运动。仅下一次显式动作恢复本站暂停的控制器。
有本站任务正在运行时,停止始终指向正在执行的臂,不受界面左右臂切换影响。
没有指定机械臂的后台关闭请求只取消本站任务,不暂停外部控制器。软件停止不替代硬件急停。
外部跟踪/对孔节点存在时拒绝重复启动,不批量结束外部节点;第一阶段子 launch 留在受管进程组内。
动作依赖对应臂关节反馈、控制器归属、相机和手眼配置,检查不通过则拒绝执行。
## 边界与设备归属
Qt 前端只负责控件、绘图和本地状态缓存。`runtime_client.py` 在后台线程通过私有 Unix
socket 提交命令、读取任务结果和状态,绘图/定时刷新不会等待 ROS、串口或脚本。
同一工作区只允许一个工位窗口。后端失联后不重发命令,旧状态会标成过期。
`control_service.py` 是独立后台进程,`tasks.py` 保留任务编号、排队/执行/完成/失败/取消状态,
并按设备锁定资源;界面线程结束不等于动作完成。`ros_gateway.py` 用持续 ROS 订阅读取
关节、夹爪和触觉数据,用原生服务和轨迹 Action 执行操作。工位不另开 RDK 连接,也不读串口。
机械臂连接由现有 ros2_control 硬件驱动持有,串口由对应的常驻夹爪驱动独占。
回点与 home 通过 `/rizon_arm_controller/follow_joint_trajectory` 执行,取消使用目标句柄的回执,
不取消其他客户端的目标。发送前检查关节状态、控制器激活与关节归属;有外部轨迹执行时拒绝抢占。
仅有位置反馈时显示“使能未知”,不把关节消息冒充使能/Remote 状态。
PGEA 的常驻驱动提供:
- `/station/grippers/arm_<臂号>/execute`:`arm_msgs/srv/GripperExecute`。
- `/station/grippers/arm_<臂号>/status`:`arm_msgs/msg/GripperStatus`。
位置字段沿用消息契约,单位为 mm;前端的千分比在后端转换。连接/探测不会初始化、回零。
驱动拒绝非有限值、越界位置、非法力/速度和不支持的旋转操作。写入成功和实际到位分别判断;
结果未知时阻止继续发夹爪运动,要求先探测确认。
## 图像链路
RealSense 采集节点只在显式请求时启动。已有发布者会被复用,工位不会按进程名终止它。
采集配置继续来自 `site.yaml`,算法使用的彩色/深度独立于界面预览。
`cam_bridge.py` 负责 ROS 图像接收与共享内存输出。当前 Qt 界面只请求真机彩色流;
没有查看需求的图像与检测订阅会撤销。预览处理最高 15 fps、彩色宽度上限 848,
算法输入不受影响,采集端现有原图话题的发布速率不会因此降低。
图像或桥进程超过 2 秒未更新时清除旧显示。共享内存由生产者释放,读取者只解除映射。
深度、仿真及标定流的后端能力保留给独立工具,不再提供首页切换入口。
触觉三力和预览由同一个常驻 `arm_application.tactile_node` 提供。后端订阅结构化力反馈,
仅在开启预览时订阅 `/tactile/<side>/image`、`/vector`,不会另外调用传感器 SDK。
关闭预览不停止力反馈。只有两指反馈新鲜时才允许旋入。已有外部触觉节点会被复用;
若其 `image_hz=0`,需在原启动入口启用预览输出。
## 进程与关闭
日常夹爪操作和示教回点不调用 shell。跟踪/对孔使用 Python 生成的 ROS launch 参数,
默认不自动拉额外查看器、红外或触觉流。上电的网络/工具准备与手眼标定保留原维护脚本,
由后端作为明确的系统/标定工具运行。`operator_console.py` 的旧 HTTP/脚本控制路径已经退役。
`processes.py` 只登记并停止自己启动的进程组,不扫描和终止外部进程。Linux 子进程设置
父进程退出信号,后端也监测界面退出,避免留下预览或控制孤儿进程。
“停止动作”取消工位任务,保持采集和驱动;窗口关闭时取消任务并退出自己持有的进程。
软件流程停止不能证明控制器已停稳;轨迹、夹爪停止未确认时会明确报告结果未知。
## 现有工程的边界
- 当前 ROS 控制栈的 controller/action 名称是全局的,因此机械臂动作统一串行;没有假装支持双臂同时控制。
- 本项目未包含 RGI 旋转夹爪实现。可接入同契约的常驻驱动,当前不会猜寄存器或调用缺失的模块。
- 软拖拽只接受 `/station/arms/arm_<臂号>/soft_drag` 常驻控制驱动服务;未提供时按钮禁用,
不再建立第二条 RDK 连接。记录点和轨迹回点不依赖软拖拽桥。
- 缺失的通止规整套状态机入口明确禁用,不再调用不存在的脚本。
- 已运行的旧夹爪节点可以继续提供只读状态;要迁移到新命令服务,需先在其原启动终端停止旧节点,
再用“系统设置 → 连接夹爪”启动新驱动。工位不会擅自抢占串口或杀掉外部节点。
- 仿真预览要求相应 DDS 域可达;切换显示来源不会改写真机控制后端的 DDS 域。
测试使用独立 DDS 域与模拟传输,覆盖 Qt 设备隔离、消息/共享内存图像、命令参数边界、
到位等待、资源互斥、轨迹取消、状态过期、父进程退出和正常关闭。没有以测试名义下发真机运动。
每次后端启动会生成一份私有站点配置快照,所有子进程使用同一份设备身份与参数。
现场 `site.yaml` 发生变化后拒绝新操作并提示重启,已执行任务继续使用原快照,避免运行中换臂或换相机。