Autonomous Warehouse Pick-and-Deliver Robot

A TurtleBot 3 with a manipulator arm that maps a warehouse, plans a collision-free route with RRT*, and follows it in Gazebo.

TurtleBot in the Gazebo warehouse world with two moving cylinder obstacles
The robot in our Gazebo warehouse world. The two cylinders stand in for people walking through the aisles.

Self-proposed final project, UC Riverside, Winter 2025 · with Harshini Murugadoss · Source on GitHub · Report (PDF)

Motivation

Warehouse robots tend to be expensive and tied to fixed infrastructure such as floor markers, dedicated lanes, or conveyor-style workflows. Teams chose their own final-project topics, and we picked this one to see how far a low-cost research platform could get on its own. The platform is a TurtleBot 3 Waffle Pi (LiDAR, IMU, wheel encoders) with an OpenManipulator-X arm, and the goal was to map a warehouse, plan a route, drive it safely around people, and pick up an item at the end.

System design

ROS node architecture: Gazebo, TurtleBot3, navigation, path planner, obstacle avoidance, OpenManipulator, manipulation, execution
ROS node-level architecture.

Mapping

We first drove the robot around the warehouse world by teleoperation while GMapping built a 2D occupancy grid from LiDAR scans, fused with IMU and wheel-odometry data. The map is exported as a .pgm image with a YAML file giving its resolution and origin.

To keep the planner from routing the robot too close to walls, inflate.py grows every occupied cell by the robot’s radius (0.2 m) using morphological dilation with a circular kernel. After that, the planner can treat the robot as a single point.

Planning and following the path

rrt_ex.py runs RRT* on the inflated grid. It grows a tree of collision-free segments from the start, rewires nearby nodes to shorten paths as the tree grows, and then traces the final path back from the goal. The waypoints are converted from map pixels to Gazebo world coordinates, which includes flipping the y-axis between image and world frames.

Occupancy grid map of the warehouse generated by GMapping
Occupancy grid built with GMapping.
RRT* path from start to goal on the inflated map
RRT* path from start (green) to goal (red ×) on the inflated map.

robot_move_ttc.py then drives the robot through the waypoints with a closed-loop proportional controller on heading and speed, using odometry for feedback. It moves to the next waypoint once the robot is within 0.2 m of the current one.

People in the aisles

To mimic warehouse workers, we added two cylinders that move along the aisles (move_cylinder_s1.py). The follower node subscribes to each cylinder’s position, velocity, and radius. The plan, as written up in our report, was to estimate time-to-collision with each cylinder and pause or re-plan when a collision was imminent.

Status and next steps

The repository contains working code for mapping, map inflation, RRT* planning, and waypoint following. The time-to-collision avoidance and the arm’s inverse kinematics for pick-and-place are designed in the report but are not complete in the code yet.

Next steps:

  • Finish and evaluate collision avoidance with moving people
  • Add camera-based object detection and integrate the arm
  • Replace the offline map with live SLAM so the robot can handle changes in the layout
  • Deploy on a physical TurtleBot