全自动传菜系统方案设计
流程概览
订单来了(TG/收银系统)
↓
┌──────────────────────────────────────────────────┐
│ VM160 AI 中枢 │
│ │
│ ① → 传菜机器人A:【去厨房3号窗口取菜】 │
│ ② → 机械臂A:【夹起菜放电梯平台】 │
│ ③ → 电梯:【去3楼】 │
│ ④ → 机械臂B:【把菜拿出来放机器人B托盘】 │
│ ⑤ → 传菜机器人B:【送到8号桌】 │
│ ⑥ → 人拿菜 → 机器人B回电梯口 │
│ │
└──────────────────────────────────────────────────┘
设备清单
| 设备 | 控制方式 | 硬件方案 |
|---|---|---|
| 传菜机器人 A/B | ROS 2 API | Segway 开发者版 / 擎朗(有 SDK 的型号) |
| 机械臂 A(厨房侧) | MoveIt2 运动规划 | myCobot 280 + RK3588 |
| 机械臂 B(楼层侧) | MoveIt2 运动规划 | myCobot 280 + RK3588 |
| 传菜电梯 | 干触点继电器并联 | ESP32 + 2路继电器模块(¥31) |
| 电梯门控制 | 干触点 + 红外感应 | ESP32 另一路继电器 |
| 工位确认摄像头 | HTTP 图传 | ESP32-CAM × 2(¥120) |
AI 中枢调度逻辑
def deliver_order(table_id, floor, dish):
# ① 机器人 A 去厨房取菜
robot_a.navigate("kitchen_window_3")
# ② 确认到位 + 开门 + 机械臂抓取
if camera.is_robot_at_elevator("A"):
elevator.open_door()
arm_a.pick_from_robot(robot_a.position)
arm_a.place_on_elevator()
elevator.close_door()
robot_a.go_home("kitchen")
# ③ 电梯到目标楼层
elevator.go_to_floor(floor)
# ④ 对侧机械臂接菜
if camera.is_elevator_arrived(floor):
robot_b.navigate("elevator_entrance")
elevator.open_door()
arm_b.pick_from_elevator()
arm_b.place_on_robot(robot_b.position)
elevator.close_door()
# ⑤ 机器人 B 送菜
robot_b.navigate(table_id)
# ⑥ 等待拿走 + 回家
while not robot_b.dish_taken():
sleep(1)
robot_b.navigate("elevator_entrance")
关键设计点
视觉定位(AprilTag)
每个工位(厨房窗口、电梯平台)贴 AprilTag 视觉标记,摄像头 + OpenCV 自动纠偏,解决机械臂抓取 ±5mm 定位误差。
并发控制
VM160 维护"电梯占用锁":
if elevator.busy:
queue.append(order) # 排队等待
else:
elevator.lock()
execute_delivery()
elevator.unlock()
同一时间只允许一个任务使用电梯,防止两台机器人撞车。
本地降级
电梯口部署 RK3588 本地控制 ESP32 + 机械臂,网络断时不瘫痪。
预算(入门级)
| 设备 | 数量 | 单价 | 小计 |
|---|---|---|---|
| 传菜机器人(Segway 底盘) | 2 | ¥20,000 | ¥40,000 |
| myCobot 280 | 2 | ¥4,000 | ¥8,000 |
| RK3588 开发板 | 2 | ¥600 | ¥1,200 |
| ESP32 + 继电器模块 | 3 | ¥30 | ¥90 |
| ESP32-CAM | 2 | ¥60 | ¥120 |
| 合计 | ≈¥49,410 |
关键坑点
| 坑 | 解决 |
|---|---|
| 机械臂抓取定位不准 | 工位装 AprilTag 视觉标记,摄像头自动纠正 |
| 机器人和电梯时间不同步 | 全程摄像头做到位确认,不等死时间 |
| 多设备并发打架 | VM160 电梯占用锁,串行排队 |
| 网络延迟(WiFi 不稳定) | 电梯口 RK3588 本地控制,断网不自乱 |
| 机械臂抓不住盘子 | 定制防滑夹具 + 压力传感器反馈 |