第3章:AGV通信协议:Wi-Fi、ZigBee、5G、私有协议对比;MQTT在AGV中的应用
通信协议选型,是AGV系统里最容易被低估的环节。
很多人觉得,不就是让车连上网嘛,Wi-Fi不就行了?
嗯,我在项目里见过太多次因为通信问题导致的调度瘫痪。车跑着跑着断了,调度指令发不出去,两辆车在路口撞上——说白了,通信选型直接决定了系统的可靠性和天花板。
3.1 主流通信协议对比
先看一张对比表,心里有个底:
| 协议 | 带宽 | 时延 | 覆盖范围 | 抗干扰 | 成本 | 典型场景 |
|---|---|---|---|---|---|---|
| Wi-Fi | 高(100Mbps+) | 10-50ms | 室内100m | 中等 | 低 | 仓储、产线 |
| ZigBee | 低(250kbps) | 30-100ms | 室内50m(可组网) | 强 | 极低 | 传感器、小数据量 |
| 5G | 极高(1Gbps+) | 1-10ms | 广域(km级) | 强 | 高 | 大型园区、远程控制 |
| 私有协议 | 按需定制 | 可低至1ms | 受限 | 极强 | 高(开发成本) | 军工、高可靠场景 |
3.2 各协议深度分析
Wi-Fi:最通用的选择,但坑不少
Wi-Fi是AGV项目里最常见的方案。部署简单,设备便宜,带宽也够用。
但我得提醒你,Wi-Fi有个致命弱点——漫游切换。
AGV在仓库里来回跑,AP之间切换时,Wi-Fi会有几百毫秒甚至几秒的断连。我遇到过最夸张的一次,AGV在AP切换时正好执行急停指令,结果指令丢了,车直接撞上了货架。
1. 确保AP重叠区域至少20%
2. 使用支持快速漫游的802.11r协议
3. 关键指令(如急停)走独立信道或冗余链路
ZigBee:低功耗,但别指望它传大包
ZigBee的优势是功耗低、自组网能力强。适合AGV上的传感器数据采集,比如温度、振动、电量等。
但你要用它来传路径规划指令?我劝你慎重。
ZigBee的带宽只有250kbps,传一个完整的路径点列表可能就要好几秒。而且它的时延不稳定,在复杂电磁环境下可能飙升到几百毫秒。
5G:未来已来,但成本还在
5G在AGV领域的应用,这两年越来越多了。低时延、高带宽、广覆盖,理论上完美。
但实际部署时,有几个问题:
- 成本高:5G模组比Wi-Fi贵一个数量级,基站建设费用更高
- 覆盖问题:室内5G信号穿透力差,需要部署小基站
- 运营商依赖:网络不在自己手里,出问题只能等运营商处理
我个人觉得,5G更适合大型园区、跨楼宇的AGV调度场景。比如港口、机场、大型物流中心。小仓库用5G,有点杀鸡用牛刀了。
私有协议:最可靠,也最折腾
私有协议,说白了就是自己写一套通信规则。用433MHz、2.4GHz等ISM频段,或者用LoRa、NB-IoT等。
优势很明显:时延可控、抗干扰强、安全性高。
但代价也大:开发周期长、维护成本高、兼容性差。
- 军工、航天等对安全性要求极高的场景
- 电磁环境极其恶劣,Wi-Fi/5G无法正常工作
- 需要极低时延(<5ms)的实时控制
否则,我建议优先考虑标准协议。
3.3 MQTT在AGV中的应用
聊完底层协议,咱们说说应用层协议。MQTT是我在AGV项目里用得最多的。
为什么是MQTT?
- 轻量级:报文头只有2字节,适合带宽有限的场景
- 发布/订阅模式:调度系统和AGV之间解耦,新增车辆不用改代码
- QoS机制:支持消息确认,保证指令不丢
- 持久会话:AGV断线重连后,能收到离线期间的消息
MQTT在AGV中的典型架构
我习惯这样设计:
AGV1 --> MQTT Broker (Mosquitto/EMQX) <-- 调度系统
AGV2 --> MQTT Broker <-- 调度系统
AGV3 --> MQTT Broker <-- 调度系统
每个AGV订阅自己的指令主题,比如:
agv/001/command:接收调度指令agv/001/status:上报状态agv/001/position:上报位置
调度系统订阅所有AGV的状态主题,同时向各AGV的指令主题发布消息。
避坑:QoS等级选择
MQTT有三个QoS等级:
- QoS 0:最多发一次,不确认。适合状态上报,丢了也无所谓
- QoS 1:至少发一次,会重试。适合普通指令
- QoS 2:恰好发一次,最可靠。适合急停、关键路径变更
代码示例:AGV MQTT客户端(Python)
import paho.mqtt.client as mqtt
import json
class AGVClient:
def __init__(self, agv_id, broker_ip):
self.agv_id = agv_id
self.client = mqtt.Client(client_id=f"agv_{agv_id}")
self.client.on_connect = self.on_connect
self.client.on_message = self.on_message
# 连接Broker
self.client.connect(broker_ip, 1883, 60)
def on_connect(self, client, userdata, flags, rc):
print(f"AGV {self.agv_id} 连接成功")
# 订阅自己的指令主题
client.subscribe(f"agv/{self.agv_id}/command", qos=1)
def on_message(self, client, userdata, msg):
command = json.loads(msg.payload)
print(f"收到指令: {command}")
# 执行指令...
def report_status(self, status):
# 上报状态,用QoS 0
self.client.publish(
f"agv/{self.agv_id}/status",
json.dumps(status),
qos=0
)
def report_position(self, x, y, theta):
# 上报位置,用QoS 1
pos = {"x": x, "y": y, "theta": theta}
self.client.publish(
f"agv/{self.agv_id}/position",
json.dumps(pos),
qos=1
)
3.4 选型建议
说了这么多,到底怎么选?
我个人的经验是:
- 小型仓库(10台以内):Wi-Fi + MQTT,性价比最高
- 中型园区(10-50台):Wi-Fi为主,关键区域用5G做冗余
- 大型物流中心(50台以上):5G + MQTT,或者私有协议 + MQTT
- 特殊环境(冷库、强电磁):私有协议 + MQTT
通信协议选型,没有绝对的对错。关键是你得清楚自己的场景需求,然后做出取舍。嗯,这一章就到这里,下一章咱们聊聊路径规划的核心算法。