7.4 KiB
工位前端与设备后端
启动: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 发生变化后拒绝新操作并提示重启,已执行任务继续使用原快照,避免运行中换臂或换相机。