Robotics research / 01

Netbots

An interactive overview of a simulation-first navigation testbed: differential-drive robots, networked state updates, and repeatable experiments designed to make system behaviour easier to inspect.

MuJoCo 3.14.0 ns-3.48 Python integration
FIG 01 / ROBOT NAVIGATIONSIMULATION ENVIRONMENT
Three TurtleBot robots in a bright robotics lab, rendered as a technical wireframe illustration. Three TurtleBot robots in a dark robotics lab, rendered as a technical wireframe illustration.
03TURTLEBOT AGENTS
LABSIMULATION SPACE
01NAVIGATION TESTBED
01 — ARCHITECTURE

A small system with clearly defined roles.

Physics and control stay deliberately simple. The network is the research subject, so its effects can be isolated, replayed, and measured.

01 / PHYSICS↗

MuJoCo

Simulates the warehouse floor, robot chassis, wheels and leader–follower motion. Ground-truth states anchor the analysis.

02 / NETWORK⇄

ns-3

Models UDP state broadcasts, delay, jitter, packet loss and sender-side queueing. Every packet event can be traced.

03 / GLUE + ANALYSIS⌁

Python

Coordinates simulation time, delivers messages to robot beliefs, computes metrics, and produces plots and summary tables.

DATA PATH / ONE EXPERIMENTSHARED TIME BASE · t = 0
STEP 01

Robot state

MuJoCo advances the robots and exposes their state at generation time.

x, y, θ, v, ω
STEP 02

Network transport

ns-3 assigns each update a fate: delivery time, loss, or queue drop.

TX → RX / DROP
STEP 03

Belief + metrics

Python applies fresh messages, advances controllers, and records outcomes.

CSV → METRICS → PLOTS
Important boundary: the controller only reads a beliefs list. Network conditions affect what it knows, not the physics model directly.
02 — EXPERIMENTS

Progress markers / controlled experiments

The baseline and one-factor sweeps vary network conditions or the communication policy. Select a sweep to inspect the recorded results below.

Measured sweep explorer

COORDINATION GAP ERROR · METRES
Recorded values from the README; chart values are not simulated live.
READOUT

Delay increases coordination error in this sweep.

As delay rises from 50 to 400 ms, mean gap error increases from 0.097 m to 0.232 m. The baseline is 0.065 m.

SOURCE: summary.csv · 5 SEEDS × 60 S

Two network coupling modes

Choose the mode based on what must depend on live robot state.

ns-3 runs first and fixes packet fates; Python then replays those events against the recorded generation-time state. Suitable when send times and packet fate are state-independent.

Receiver safety rules

A belief is useful only while its message history is valid.

  • Duplicate packetsDiscard same src + seq
  • Out-of-order packetsDiscard older seq
  • Stale beliefHold after 1 s
  • Delivery timingFirst tick ≥ arrival
03 — METRICS

Observe state freshness and motion.

Packet-level statistics describe network delivery. Age of Information and gap error connect those delivery patterns to coordination.

BASELINE / EXPECTED

Reference measurements

Expected baseline result, identical across seeds according to the README.

Packet delivery
1.000
PDR · all expected deliveries
Mean latency
0.436 ms
Receive time − generation time
Age of info
0.052 s
Mean age of newest applied state
Gap error
0.065 m
Deviation from the 1 m target
HOW TO READ THEM

Four useful signals

  • PDR
    Packet delivery ratio
    rx / (tx · (N−1))
  • Latency
    Packet transit time
    t_rx − t_gen
  • AoI
    Freshness at receiver
    t − t_gen(newest)
  • Gap error
    Spacing between followers
    abs(distance − 1 m)
INTERPRETATION NOTERESULTS ARE TASK-SPECIFIC

The README reports non-monotone results in some delay and robot-count sweeps and explicitly says those effects have not been investigated. Treat them as properties of this simple controller, not as general findings.

04 — UNDER THE HOOD

Designed for repeatable, inspectable runs.

The project records enough detail to trace a summary metric back to experiment configuration, packet events, deliveries, and robot trajectories.

Network model and controlled impairments
Each ns-3 node uses UDP/IPv4 on a SimpleNetDevice attached to a JitterChannel. Robots broadcast 56-byte state updates at 10 Hz. Delay is channel base delay; jitter adds per-receiver, per-packet delay; loss uses a RateErrorModel; background CBR traffic creates sender-side queueing. This is a controlled impairment model, not a Wi-Fi model: it has no MAC contention, collisions, or PHY.
Clocks, ticks, and delivery timing
MuJoCo and ns-3 both start at t = 0 and advance 1:1 in seconds. Bookkeeping uses integer nanoseconds. Physics advances in 2 ms ticks; a message is consumed at the first tick at or after its ns-3 arrival time, never earlier. Coupled mode advances in 10 ms epochs.
What gets saved for each experiment?
Each results directory contains summary.csv, meta.json with the specification and effective configuration plus tool versions, PNG figures, and per-run files such as config.json, trace.csv, deliveries.csv, and robots.csv. The trace includes transmit, receive, and drop events with timing, sender, destination, sequence, byte count, packet kind, and drop reason.
Known limitations
There is no obstacle avoidance; shelves are visual-only scenery with collisions disabled. The controller uses a simple pursuit law and does not extrapolate stale beliefs. MuJoCo runs headless and trajectories are plotted with matplotlib. Coupled send decisions occur at 10 ms epoch boundaries, and message delivery is consumed at 2 ms tick resolution.
05 — REPRODUCE

Reproduce the experiment.

Use Ubuntu 24.04 natively or through WSL2 on Windows. Setup downloads ns-3.48 and creates a dedicated Python virtual environment.

01 / SYSTEM DEPENDENCIES
sudo apt-get install -y g++ cmake ninja-build python3-venv python3-dev
02 / PROJECT SETUP
bash setup.sh
03 / TEST + BASELINE
PY=~/.venvs/netbots/bin/python
$PY -m unittest discover -s tests -t .
$PY experiments/run.py experiments/configs/baseline.json
$PY analysis/summarize.py
04 / ALL EXPERIMENTS
bash experiments/run_all.sh

Baseline: approximately 35 seconds for 5 seeds × 60 seconds. Full experiment suite: approximately 15 minutes. Quick variants can use --seeds 1 --duration 20.