Physics-aware robot
Velocity smoothing and wheel servos run at 20 Hz. Contact behavior, wheel inertia and caster setup are tuned to keep the simulation stable.
A TurtleBot 2 / Kobuki differential-drive robot, simulated in MuJoCo. Compare navigation strategies against the same worlds, sensor model, and evaluation seeds.
MuJoCo arena with generated obstacles, a navigation target, and a repeatable environment for controller evaluation.
The testbed isolates the navigation problem into a repeatable simulation loop. A seeded world is generated, sensor observations become features, a controller chooses linear and angular velocity, and the evaluator records the result.
Walls, obstacles, valid start and goal; seeded for reproducibility.
Depth scan, encoders, IMU, bumpers and odometry.
Rolling local map distilled into 19 navigation features.
Controller returns velocity command (v, ω).
Success, collisions, path length and elapsed time.
Velocity smoothing and wheel servos run at 20 Hz. Contact behavior, wheel inertia and caster setup are tuned to keep the simulation stable.
Each controller is evaluated on the same seed set, so results can be compared across identical generated worlds.
Success is checked against ground truth. Odometry drift can therefore count as a failure rather than being hidden by the robot's estimate.
Swap the controller without changing the surrounding simulation and evaluation harness. Select a method to inspect its role in the experiment.
Combines go-to-goal behavior with Bug-style boundary following to route around obstacles. This provides an interpretable baseline for comparison.
Sensor outputs are combined into a compact local representation. The feature pipeline uses odometry for goal range and bearing, plus local clearance and contact cues.
Astra-like field of view: 60° × 49.5°; range 0.6–8 m. Noise grows quadratically with distance.
RAY-CASTDEPTH SCANDistance from wheel ticks, with 2578.33 ticks per revolution.
ODOMETRYGyroscope and accelerometer with simulated noise and bias.
GYRO + ACCELLeft, centre and right contact signals provide immediate collision cues.
L / C / RCreate an environment, install the two listed dependencies through the project requirements, then run a controller or collect data. Commands below are copied from the project README.
python -m venv .venv
.venv\Scripts\pip install -r requirements.txtpython -m nav run \
-c rule --seed 3 \
--episodes 10 --renderpython -m nav collect \
-c tsk --episodes 120 \
--out data/tskpython -m nav eval \
--controllers rule tsk learned \
--episodes 50 \
--out results/eval.csv \
--json results/summary.jsonThe code is split by responsibility: world generation, simulation, sensor models, feature extraction, controllers, dataset recording and evaluation.
nav/kobuki.xmlRobot MJCF and collision geometry, with a simplified TurtleBot 2 stack.
nav/world.pySeeded arena generation, obstacle clearance, start/goal placement and reachability checks.
nav/sim.pyNavEnv.reset(seed) and step(v, w); wheel servos, collisions and outcomes.
nav/sensors.pyEncoder, IMU, depth camera, bumper and odometry models.
nav/features.pyDepth scan to rolling local map to 19 controller features.
nav/controllers/Rule-based, first-order TSK fuzzy and learned behaviour-cloning controllers.
nav/dataset.pyPer-episode NPZ data, JSONL index and captured configuration.
nav/evaluate.pySame-seed evaluation with success, collisions, path length and time metrics.
The included checks target robot motion, sensor geometry, deterministic data flow and world-generation constraints.
python tests/check_robot.py to check that the robot tracks commands, remains upright and respects its top-speed behavior.python tests/check_sensors.py to test odometry drift, gyro/accel behavior, depth geometry and minimum range, and bumper signals.python tests/check_pipeline.py to check registry extensibility, bit-exact determinism and dataset synchronization.python tests/check_world.py to test spawn rules across 150 seeds per map.impratio=10 reduces soft-contact creep. Success is judged using ground truth, so odometry drift can trigger odom_arrived_off_goal.