ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

无人售货机之机械臂分拣上货-仓库里最后十米的执行者

无人售货机之机械臂分拣上货-仓库里最后十米的执行者 05-机械臂分拣上货-仓库里最后十米的执行者作者黒漂技术佬系列URM Ultra 方案理念与架构篇系列压轴篇。前面讲了柜子卖、车运最后这棒交给机械臂——它干的是最脏活累活也最考验精度的活把货从箱子里一件件分拣出来、再塞进柜子的货道。我给它起了个标题叫仓库里最后十米的执行者。为啥是十米因为车把货运到柜子旁那是公里级的物流真正把货送进格子的最后一小段靠的是机械臂。这段距离不长却是整套无人零售闭环里唯一需要精细操作的环节。一、机械臂在系统里的角色需求原文“搭配无人车做分拣、补货、给设备上货。” 三个动作正好对应机械臂的三类任务。它和无人车是搭档关系不是各干各的前置仓里机械臂 SORT 分拣按补货清单把货从货架挑出来 │ ▼ 无人车 REPLENISH 把整批货运到柜子旁 │ ▼ 机械臂 LOAD 上货把货塞进具体货道可以看到机械臂既在仓里干活分拣又在柜旁干活上货。它串起了仓库和终端。二、三类任务SORT / REPLENISH / LOADRobotTaskType是机械臂独有的枚举三个值各管一段类型动作在哪干说明SORT分拣前置仓内按订单/补货清单从货架把商品挑出来REPLENISH补货配合无人车参与补货流程中的分拣/备货环节LOAD上货柜子旁把商品放进售货机货道最关键注意REPLENISH在机械臂和无人车里都出现了但含义不同车的REPLENISH是运输臂的REPLENISH是备货/补货操作。两者通过同一个refNo补货计划号绑在一起这就是设备联动的精髓。三、两个核心模型Robot / RobotTask机械臂在后台对应两张表结构和车几乎对称方便你对照理解。3.1 Robot臂本身// 项目源码机械臂实体EntityTable(namerbt_robot)publicclassRobotextendsBaseEntity{Column(uniquetrue)privateStringrobotNo;// 臂编号如 RBT-0001privateStringname;privateStringmodel;// 如六轴privateRobotStatusstatus;// IDLE/BUSY/OFFLINE/FAULTprivateStringworkspace;// 工作区如前置仓 A 区privateLocalDateTimelastHeartbeat;}和车比臂没有battery它插电干活不用考虑电量多了workspace它固定在某个工位不像车到处跑。演示数据里两台臂RBT-0001工作区前置仓 A 区、RBT-0002“前置仓 B 区”。六轴是指机械臂有 6 个旋转关节灵活度够上货。RobotStatus比车少一个CHARGINGpublicenumRobotStatus{IDLE,BUSY,OFFLINE,FAULT}3.2 RobotTask臂任务// 项目源码机械臂任务EntityTable(namerbt_robot_task)publicclassRobotTaskextendsBaseEntity{Column(uniquetrue)privateStringtaskNo;// 任务号如 RT时间随机privateRobotTaskTypetype;// SORT / REPLENISH / LOADprivateRobotTaskStatusstatus;// PENDING/EXECUTING/COMPLETED/FAILEDprivateLongrobotId;// 派给哪台臂privateStringsource;// 起点如前置仓privateStringtarget;// 终点如设备编号/货道privateStringpayload;// 载荷(JSON)privateStringrefNo;// 关联单号(补货计划号)privateLocalDateTimestartedAt;privateLocalDateTimefinishedAt;}对比车的任务表臂任务用source/target代替fromLocation/toLocation语义一致命名更贴上下料任务状态少了DISPATCHED这中间态臂默认自动抢单不经派发环节。四、状态机和车同构但更自动机械臂状态机和车同构OFFLINE ──心跳──▶ IDLE ──领任务──▶ BUSY ──完成──▶ IDLE └──失败──▶ FAULT任务侧PENDING ──领到──▶ EXECUTING ──▶ COMPLETED └──▶ FAILED差异在怎么领任务。车支持手动派发 抢单臂默认就是抢单// 项目源码机械臂抢下一个任务按 id 升序先到先得publicRobotTasknextTask(StringrobotNo){RobotrobotfindByRobotNo(robotNo);RobotTasktaskrobotTaskRepository.findByStatusOrderByIdAsc(RobotTaskStatus.PENDING).stream().findFirst().orElse(null);if(task!null){task.setStatus(EXECUTING);robot.setStatus(BUSY);// 保存...}returntask;}为啥臂不派发因为臂固定在工位谁空闲谁干最合理不需要运营指定。车要选最合适的那台所以留了派发入口。这套同构状态机 不同调度策略的设计值得记笔记。五、高光时刻一次派发车臂联动这是整套方案最漂亮的一笔。当补货计划ReplenishPlan被派发时后台同时建一个车任务和一个臂任务二者refNo都指向同一个planNo// 项目源码逻辑补货计划派发联动车臂StringfromwarehouseCode!null?warehouseCode:前置仓;StringpayloadJSON.stringify({deviceNo,items:[{slotNo,productName,quantity}]});// 1) 无人车任务仓 → 设备运输VehicleTaskvtvehicleService.createTask(REPLENISH,from,device.getLocation(),payload,planNo,0);if(vehicleId!null)vehicleService.dispatch(vt.getId(),vehicleId);// 2) 机械臂任务仓 → 设备货道上货RobotTaskrtrobotService.createTask(LOAD,from,device.getDeviceNo(),payload,planNo);plan.setStatus(DISPATCHED);// 计划进入已派发一张图看清一次派发两员出动ReplenishPlan(补货计划) │ dispatch ┌────────┴────────┐ ▼ ▼ VehicleTask(REPLENISH) RobotTask(LOAD) 仓→设备(运输) 仓→货道(上货) │ │ 无人车 Agent 机械臂 Agent │ │ 运到柜旁 ──────────▶ 臂把货塞进货道 └──── 计划 COMPLETED ────┘这就是设备间联动的范本一个业务动作拆成跨设备的两个任务用 refNo 绑成一笔。你以后要做车臂无人机的更复杂编排套路一模一样。六、设备端 Agent臂是怎么自己上的urm-robot这个 Python 脚本和车对称也只做三件事循环while True: 1) 心跳上报workspace 2) 领下一个任务GET task/next 3) 有任务就执行模拟3步×1.5秒→ 上报 COMPLETED 4) 没任务就空闲等执行同样是假的打印source → target固定返回 COMPLETED但状态流转真。演示里臂会领到LOAD任务source前置仓、target设备编号跑完上报后台臂状态BUSY→IDLE任务COMPLETED。七、一个诚实的提醒补货后库存没自动回写写 Demo 总要留点待办。这里有个真实细节你必须知道补货计划complete时只把计划状态置 COMPLETED没有自动把货道库存加回去。理由是——真上货动作由机械臂完成时应由设备端调PUT /admin-api/device/{id}/products/{slotNo}/stock回写库存。Demo 里这步需手动触发代码注释已标明。为什么这么设计因为臂上完货是物理事实只有设备端最清楚上没上成功、上了几个。后台不该自作主张假设成功。这正是**“以设备上报为准”**的工程原则。你二次开发时把机械臂 Agent 的execute_task接真实上料反馈再回调updateStock闭环就严丝合缝了。八、机械臂这端的真与假项真假臂/任务 CRUD 与状态机真抢单 / 上报 状态联动真与车通过 refNo 联动真真实抓取、视觉引导上料假延时模拟上货后库存自动回写未实现需设备端回调九、系列收尾三端闭环全景回看五篇写到这里URM Ultra 的方案理念与架构完整了。用一张总图收尾售货机(卖) 无人车(运) 机械臂(上) │ │ │ │ 视觉识别 │ REPLENISH │ LOAD │ 免密扣款 │ 仓→点位 │ 仓→货道 ▼ ▼ ▼ 订单完成 ──低库存──▶ 补货计划 ──派发──▶ 车任务臂任务 ──▶ 上货完成 ──▶ 库存恢复 ▲ │ └──────────────────── 闭环 ───────────────────────────────┘第 01 篇四个工程、五步闭环全景。第 02 篇需求怎么翻成纯视觉 免密支付方案。第 03 篇双门两路锁四摄硬件变Device字段。第 04 篇无人车当前置仓与任务枢纽。第 05 篇机械臂做最后十米的上货执行者。URM Ultra 是个 Demo但它的每一笔状态机、每一次设备联动、每一处接口 Mock的解耦都是真刀真枪的架构思维。你把它读透再去看那些动辄几十个微服务的无人零售中台会发现骨架其实一模一样——只是肉更厚。我是黒漂技术佬方案理念与架构篇到此结束。后续若写编码实战篇咱们再钻进urm-server的 Service 里逐行拆。下期见。
返回列表