← Back to portfolio
Field report
Field report · robotics / simulation

A six-wheeled rover that maps a maze without cheating.

A CoppeliaSim simulation built around the JPL Open Source Rover's real rocker-bogie kinematics, designed to explore an unknown 15×15 grid maze, map every visited cell, and fully traverse it without ever crossing a boundary exit.

Robotics dev
role on the project
Simulation
when it happened
CoppeliaSim + Python
core stack
Full traversal
outcome proven
01 · Overview

Context

The project set out to answer a deceptively simple question: could a wheeled planetary rover, dropped into the center of an unmapped 15×15 grid maze, drive itself out while building a complete and accurate map of every traversed cell? Rather than simplifying the system into a differential-drive platform, the build used a full simulated model of the JPL Open Source Rover, a six-wheeled, four-steerable-joint rocker-bogie platform that introduced realistic vehicle kinematics, wheel slip, and collision behavior into the navigation problem.

The simulation ran in CoppeliaSim Edu using the Bullet 2.78 physics engine inside a 15m × 15m maze built from 1m × 1m cells with 0.1m walls. The maze contained no unreachable pockets, but there were open exits along its outer boundary that the rover had to learn to identify and treat as forbidden; otherwise, the robot could confuse them with ordinary corridors and leave the maze prematurely.

02 · Challenge

02Drive like a rover, not a point mass

There were two interconnected challenges. First, the rover had to navigate continuously through the maze without leaving it, using realistic vehicle motion rather than pivoting in place. This meant implementing true Ackermann steering geometry, computing different inner and outer wheel angles and speeds for each turn, and converting linear velocity commands into the correct angular velocity of each of the six independently driven wheels.

Second, the system needed to map the maze as it explored it, visiting every reachable cell and recording each cell's grid position, position in meters relative to the maze center, and which sides were open or walled. Repeated readings of the same cell needed to be merged to cancel out sensor noise and produce a reliable map instead of a noisy grid.

Project snapshot. Platform: CoppeliaSim, Bullet physics · focus: autonomous maze exploration and mapping · impact: full traversal with an exported 2D map.
03 · Journey

03What was built

The rover carried a single Hokuyo URG-04LX-UG01 laser rangefinder on a rotating joint, sweeping a 240° arc to read distance in three directions — left, front, and right — at each decision point. A four-state machine managed the full system behavior: FORWARD cruised at 0.50 m/s, reading the laser every cycle and slowing to 40% speed as a wall approached; BACKUP reversed at 0.25 m/s to safe clearance before a fresh scan; TURN_ACK executed a 90° Ackermann turn using precomputed inner and outer steering angles, tracked through a low-pass-filtered yaw estimate; and SPIN_180 performed an in-place counter-clockwise spin reserved for true dead ends.

At every junction, the rover evaluated left, straight, right, and back in that priority order and selected the direction leading to the least-visited neighboring cell. This made the robot actively steer toward unexplored territory rather than simply following a wall. A tried[] list at each junction prevented repeated failed attempts, and the state reset cleanly once the rover physically advanced into a new cell.

Maze solver robot in CoppeliaSim
The six-wheeled rocker-bogie rover mid-exploration inside the CoppeliaSim maze.
04 · Architecture

04System thinking

Sensing and fallback

The sensing pipeline used a three-tier fallback approach: reading the laser via string signal, point cloud, or joint rotation plus proximity sensor, whichever the simulation environment supported. This protected the rover from single-API failures and improved robustness under changing runtime conditions.

Kinematics and navigation

True Ackermann steering was computed using physical geometry values including track width, wheelbase, and wheel radius. The turning radius and backup clearance were tuned to allow rotation within a 1m corridor while keeping wheels rolling without excessive slipping.

Cell classification

Laser readings under ~1.10m were treated as walls, readings between ~1.10m and 4.50m were considered open corridor, and readings at or beyond 4.50m were treated as maze exits and explicitly excluded from the map. This prevented the rover from mistaking the boundary for a traversable corridor.

Mapping logic

Every visit to a cell merged newly read openings with prior readings, allowing the system to avoid false walls or false openings from noisy single scans and preserve a stable map.

Maze rover simulation screenshot
The sensing, kinematics, and mapping layers running together in a live simulation pass.
05 · Impact

Results and lessons

The rover successfully traversed the full maze and produced a complete cell-by-cell map, including a rendered grid view and a diagnostic printout, while never crossing an open boundary exit. The work exposed several realistic simulation issues: a laser API that did not exist in the installed CoppeliaSim version, junction logic that could trap the rover in infinite loops, exit readings being misclassified as open corridor data, and Ackermann turns clipping walls until the turning radius and backup clearance were retuned.

The broader lesson was that autonomous navigation engineering is rarely about a single headline algorithm. A large share of the real effort lives in sensing robustness, state transitions, edge-case handling, and making the system resilient to API quirks, sensor noise, and repeated junction encounters. The project therefore became a strong demonstration of disciplined system design rather than just maze traversal.

Generated maze map and rover path
The rendered grid map and diagnostic printout produced after the rover fully traversed the maze.