机器人系统很容易出现一种假进度:控制端能点按钮,设备后台有列表,接口文档也写了不少。等真机接进来才发现,控制端显示“执行中”,机器人其实没有收到;后台显示“在线”,只是五分钟前有过一次心跳;同一条启动指令因为网络重试发了两遍,设备却真的执行了两次。
这时再问先补哪一端,已经晚了。前面完成的是页面,不是控制链路。
红数科技梳理这类项目时,通常先拿一台设备、一个操作者和一项简单任务走完整个过程。设备完成身份校验并上线,控制端能看到它当前是否允许接令;操作者发出任务,后台记录并转交;设备回复已接收、执行中、已完成或失败,页面跟着真实状态变化。中途断网、设备忙碌或安全条件不满足,系统也要给出说得清的结果,不能一直转圈。
这一项任务跑稳了,后面的功能才有地方接。

先定的不是页面,而是控制边界和设备状态
控制端到底能做什么,要先看设备本体、机器人控制器和现场安全系统已经承担了什么。网页、平板或普通移动端可以提交任务、请求暂停、查看状态,却不应被当作安全功能本身。急停、安全门、光栅、限位和安全 PLC 等联锁,仍应在经过风险评估的安全回路和控制层实现。网络断了、浏览器卡住,现场安全不能跟着失效。
这个边界定下来以后,再把首期会出现的设备状态写清楚。比如未连接、待机、自检、就绪、执行中、暂停、故障、急停、维护,不只是给页面换一种颜色。每个状态允许接收哪些命令,什么条件下可以转到下一个状态,失败后回到哪里,都要有同一份定义。ROS 2 的受管节点把未配置、非活动、活动和已结束设为明确状态,并通过受控转换改变状态;项目不一定使用 ROS 2,但这种做法很值得保留:状态变化必须有条件、有结果,不能由前端根据几条零散消息自行猜。
有一个细节经常被忽略:“接口返回成功”到底成功了什么?后台收到请求、消息进入队列、设备收到命令、设备开始动作、任务完成,是五件不同的事。控制类功能不能用一个 success 全部带过。至少要让控制端分得清已受理、已送达、执行中、完成、拒绝和失败,也要知道最后一次状态是什么时间产生的。

接口联调要跟着首条任务一起开始
把前后端分别做好再集中联调,放在机器人项目里风险很高。设备通信会碰到实时状态、异步结果、断线重连和消息乱序,很多问题在静态接口文档里看不出来。页面还没完整时,就可以先定接口契约、准备设备模拟器,让控制端、后台与设备侧围绕同一项任务不断对照。
首批接口不用多,但几个字段不能含糊:
| 要定清楚的内容 | 首期至少回答的问题 |
|---|---|
| 设备身份 | 这台设备是谁,所属项目和型号是什么,凭什么接入系统 |
| 状态与时间 | 当前状态是什么,设备何时产生,后台何时收到,数据是否已经过期 |
| 命令标识 | 每次命令是否有唯一编号,重试时怎样避免重复执行 |
| 受理与结果 | 后台受理、设备确认、开始执行和最终完成怎样分别返回 |
| 错误说明 | 是设备离线、模式不允许、参数不合法、安全条件不满足,还是执行中故障 |
| 版本 | 接口、设备程序和配置版本不一致时,系统怎样识别和处理 |
HTTP 查询和管理接口可以用 OpenAPI 维护一份机器和人都能读取的契约;设备事件、任务进度和告警这类异步消息,则可以用 AsyncAPI 或同等方式把通道、消息和发送接收方向写清楚。选哪种协议要看现场网络、设备能力和时延要求,关键不在文档工具,而在控制端、后台和设备侧使用的是同一组对象、状态、字段含义与错误口径。
模拟器也不是只返回一组正常数据。它至少要能模拟离线、超时、重复回包、乱序、设备忙、拒绝执行和执行中故障。真机还没有到场时,团队就能先发现页面会不会误报成功、后台能不能去重、旧状态会不会覆盖新状态。到了现场,联调重点才会落在真实驱动、时序、网络和安全条件上,而不是从头争论字段是什么意思。

设备后台先把设备、命令和人记清楚
首期设备后台不必铺得很大,但要经得起设备长期运行。设备档案、接入凭证、实时状态、命令与告警记录、账号权限,通常都得留下准确数据。
设备列表首先要回答的不是“共有多少台”,而是哪台设备现在可信地在线、正在做什么、最后一次通信是什么时候。设备详情要能把一次任务串起来:谁在何时发了什么命令,当时设备处于什么模式,后台何时转交,设备怎样回复,后来状态怎样变化。发生故障后,技术人员不该同时翻控制端截图、服务器日志和现场聊天记录,才能勉强拼出经过。
权限也要跟动作走。查看状态、下发任务、手动控制、修改参数、清除故障、远程升级不是同一级权限。OWASP 2023 年 API 安全风险清单把对象级授权、功能级授权、资源消耗和接口版本管理都列为重要问题。放在设备平台里,意思很直接:知道设备编号不等于有权控制它;能查看一台设备,也不等于能修改参数或批量下发命令。关键操作要记录操作者、目标设备、请求内容、结果和时间,记录还要能够按命令编号追到设备回执。
至于设备利用率排行、能耗趋势、故障分布大屏、复杂工单、地图轨迹和多维经营报表,可以等数据稳定后再做。底层状态还在变、故障码没有统一时,先做出来的报表往往只是把不一致的数据展示得更漂亮。
控制端首期只做操作者完成任务真正需要的部分
控制端的首屏最好让人一眼确认三件事:当前控制的是哪台设备,设备是否处于允许操作的状态,这次操作有没有得到明确结果。设备名称相近时,还需要型号、位置或资产编号帮助二次确认,不能只靠一张设备图片区分。
具体功能围绕一项真实任务收敛即可。操作者登录后选择设备,确认连接与安全状态,填写任务参数并提交,随后能查看进度,必要时请求暂停或停止,失败后知道该怎样处理。手动点动、路径编辑、地图配置、视频、多机协同是否进入首期,要看第一项业务任务是否真的依赖它们,不能因为同类产品常见就全部装进去。
命令按钮点下去以后,界面需要进入可解释的中间状态。没有收到后台确认时,不能直接显示“执行成功”;等待设备回复超过约定时间,要告诉操作者结果未知或已超时,并提供符合现场规则的处理方式。这里尤其不能简单放一个“再试一次”。后台若没有幂等处理,同一个动作可能被设备执行两遍。更稳妥的做法是沿用原命令编号查询结果,确认上一条没有执行,再决定是否重新下发。
控制端还要把“操作停止”和“安全急停”区分开。普通停止请求经过软件与网络传递,可能有延迟,也可能因为通信中断没有到达;急停属于现场安全设计的一部分,不能靠普通接口按钮替代。页面可以如实显示急停或安全联锁状态,但不能让一个醒目的红色按钮造成错误安全感。
真机联调先跑低风险任务,再专门制造故障
接口对通不等于联调完成。真机阶段先在隔离、安全、低速或无负载条件下跑最小任务,逐项核对命令、反馈和现场动作是否一致。随后不要只重复正常流程,要主动断开网络、关闭设备、切换手动模式、触发设备忙、制造参数错误,并验证急停或安全门动作后软件侧收到的状态是否准确。
一轮有用的验收,至少能回答这些问题:
- 同一命令因为超时被重复提交,设备会不会执行两次;
- 设备先离线再重连,后台能否补回最终状态,控制端会不会继续显示旧进度;
- 两名操作者同时控制一台设备,谁获得控制权,另一方看见什么;
- 设备处于手动、维护、故障或急停状态时,后台是否仍会转发不该执行的命令;
- 参数、设备程序或接口版本不兼容时,系统能否在动作前阻止,而不是等设备报出模糊故障;
- 操作失败以后,记录能否说明失败发生在受理、传输、设备校验还是实际执行阶段。
ros2_control 把控制过程表述为读取硬件状态、更新控制输出、再写回硬件,这也提醒项目团队:画面上的目标值只是输入,设备实际反馈才是结果。验收时必须把控制端显示、后台记录和设备动作放在同一条时间线上核对,任何一边自称完成都不算完成。
一条命令最终要能查清是谁发的、发给哪台设备、设备有没有收到、实际做了什么;出了问题,还要知道失败在哪一步,恢复后以哪条状态为准。做到这里,控制端、后台与设备接口才算接上。多机调度、批量任务、远程升级和复杂可视化可以继续往上加,现场不必再靠人盯着几个屏幕猜系统现在到底在做什么。
文中技术依据可参阅 ROS 2 Managed nodes 设计说明、ros2_control 架构文档、OpenAPI Specification 3.2.0、AsyncAPI Specification 3.1.0 与 OWASP API Security Top 10(2023)。具体机器人项目仍需依据设备厂商手册、现场风险评估、适用安全标准和实际控制架构确定实现方式。