Advertisement
Advanced Time: 8–10 weeks Robotics

Food Delivery Robot

Build an autonomous indoor food delivery robot with SLAM navigation, multi-compartment heated container, and order management.

Delivery RobotSLAMROSElevator IntegrationSidewalk RobotIoT
DifficultyAdvanced
Duration8–10 weeks
Components10 items
Steps4 steps

Introduction

Build an autonomous indoor food delivery robot with SLAM navigation, multi-compartment heated container, and order management. This comprehensive guide covers everything from design through implementation, testing, and deployment.

Theory & Background

Drive robot through entire building to create SLAM map. After map creation, annotate semantic waypoints: kitchen pickup point, elevator button location, each room door location, charging station. Store waypoints in a YAML file: {kitchen: [x: 5.2, y: 3.1], room_101: [x: 12.4, y: 8.9]}. The order management system dispatches deliveries using these named waypoints rather than raw coordinates.

Advertisement

Components & Requirements

10 components required for this project.

#ComponentPurposeQty
1Differential Drive Mobile Base (large)Payload-capable mobilityx1
2RPLidar A3 (25m range)High-quality SLAM for building navigationx1
3Raspberry Pi 4 (8GB) + SSDROS navigation and order managementx1
4Intel RealSense D455Wide-angle depth sensing for obstacle avoidancex1
5Heated Compartment (12V heating pad)Keeping food at temperature during deliveryx3
6NFC/QR Code Lock on CompartmentsSecure compartment access (customer unlocks)x3
74" TFT Display (compartment UI)Customer-facing order info displayx1
8Elevator Integration Module (RF)Calling elevator between floorsx1
9UGV-grade 24V 20Ah BatteryFull shift operation (8+ hours)x1
10Cloud Order Management ServerReceiving and dispatching delivery ordersx1

Step-by-Step Implementation

Follow these 4 steps carefully.

1
Building Map Creation and Semantic Annotation

Drive robot through entire building to create SLAM map. After map creation, annotate semantic waypoints: kitchen pickup point, elevator button location, each room door location, charging station. Store waypoints in a YAML file: {kitchen: [x: 5.2, y: 3.1], room_101: [x: 12.4, y: 8.9]}. The order management system dispatches deliveries using these named waypoints rather than raw coordinates.

2
Elevator Interface Automation

Robot stops at elevator doors. RF transmitter (paired with elevator control system or using IR remote emulation) calls elevator. Waits for elevator to arrive (proximity sensor detects open doors). Robot enters elevator, presses floor button via a servo-actuated mechanical button presser mounted on robot arm. Waits for door to open on target floor, exits. This requires building management cooperation for elevator system access.

3
Heated Compartment Temperature Control

12V PTC heating elements maintain each compartment at 65°C for hot food. DS18B20 temperature sensor in each compartment. PID controller regulates power to heating element. Insulation: 25mm foam lining + reflective interior reduces heat loss. For cold items: passive insulation with ice packs (active refrigeration too power-hungry). Compartment temperature logged throughout delivery — compliance with food safety regulations (minimum 63°C for hot food).

4
Order Management Integration

Restaurant POS system sends order to cloud API: POST /api/order {order_id, items, compartment, destination_room, customer_id}. Cloud server forwards to robot via WebSocket. Robot confirms receipt, loads food (human places in compartment, locks). Robot drives to destination, arrives, sends customer notification (SMS/app push). Customer taps NFC card or scans QR code to unlock compartment. Robot marks delivery complete, returns to kitchen for next order.

Code & Implementation

Core code for delivery_mission.py:

delivery_mission.py Python
import rospy, actionlib, requests
from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal
from geometry_msgs.msg import Quaternion

WAYPOINTS = {
    'kitchen':  {'x': 5.2,  'y': 3.1},
    'room_101': {'x': 12.4, 'y': 8.9},
    'elevator': {'x': 8.1,  'y': 6.0},
}

client = actionlib.SimpleActionClient('move_base', MoveBaseAction)
client.wait_for_server()

def navigate_to(location):
    wp = WAYPOINTS[location]
    goal = MoveBaseGoal()
    goal.target_pose.header.frame_id = "map"
    goal.target_pose.pose.position.x = wp['x']
    goal.target_pose.pose.position.y = wp['y']
    goal.target_pose.pose.orientation.w = 1.0
    client.send_goal(goal)
    client.wait_for_result()
    return client.get_state() == 3  # SUCCESS

def execute_delivery(order):
    navigate_to('kitchen')
    requests.post('/api/order/ready', json={'order_id': order['id']})
    input("Press Enter when food is loaded...")
    navigate_to('room_' + order['room'])
    send_customer_notification(order['customer_id'])
    wait_for_pickup(order['compartment'])
    requests.post('/api/order/delivered', json={'order_id': order['id']})

Testing & Troubleshooting

Test Food Delivery Robot by verifying each subsystem individually before full integration.

!
Troubleshooting Tips

Verify power voltages, check ground connections, use serial monitor for debug.

Real-World Applications

*Hospital patient meal delivery
*Hotel room service automation
*Office campus food delivery
*University cafeteria delivery
*Quarantine zone contact-free delivery
*Airport lounge meal delivery
*Restaurant tableside delivery
*Senior living facility meal service

Extensions & Next Steps

  • Add robotic arm for unassisted tray loading from kitchen counter
  • Build multi-robot fleet with dynamic load balancing
  • Add predictive ordering (room service pre-delivery based on check-in patterns)
  • Implement contact-free UV sterilization mode between deliveries
  • Add customer satisfaction feedback via touchscreen after delivery

Interactive Playground

Coming Soon

An interactive simulator will be available here — simulate circuits and run code in-browser without hardware.

Frequently Asked Questions

How does the robot handle obstacles like people in hallways?
The ROS Navigation Stack's Dynamic Window Approach (DWA) local planner handles dynamic obstacles in real-time. The depth camera (RealSense D455) detects obstacles not visible to the 2D LIDAR (legs under tables, low obstacles). When a person blocks the path, the robot attempts to navigate around them while maintaining a 0.5m safety distance. If completely blocked for > 30 seconds, the robot stops, plays a polite audio message requesting passage, and retries. Extreme blockage: alert is sent to operations staff.
Advertisement