Quick reference for myself since I keep forgetting the tradeoffs.

QoS 0 (At most once): Fire and forget. No acknowledgment. Message might be lost. Use for high-frequency sensor data where losing one message doesn’t matter—e.g., streaming lidar points.

QoS 1 (At least once): Broker acknowledges receipt. Message guaranteed to arrive but might arrive multiple times. Use for commands where duplicates are harmless—e.g., “set speed to 0.5 m/s”.

QoS 2 (Exactly once): Four-way handshake guarantees exactly one delivery. Expensive. Use when duplicates would cause problems—e.g., “increment counter” or “dispense item”.

For FleetSense, we use QoS 0 for the shared perception data. The robots publish at 10 Hz. Missing a frame doesn’t matter. The latency savings from skipping acknowledgments is worth more than guaranteed delivery.

For fleet coordination commands (task assignments, rerouting), we use QoS 1. The command handlers are idempotent anyway.