Smart Mobility Simulation is an end-to-end indoor mobility pipeline with two stages:
- A C++ discretizer that converts multi-floor GeoJSON inputs into a navigable graph.
- A CuPy-based GPU simulation that generates agent trajectories and RSSI observations.
discretization/
CMakeLists.txt
main.cpp
simulation/
cuda_simulation.py
precompute_nearest_outdoor.py
| Component | Stack | Purpose |
|---|---|---|
discretization |
C++20, CMake, OpenMP | Build pruned indoor graph and POI set from floor geometry |
simulation/precompute_nearest_outdoor.py |
Python, NumPy, Pandas, joblib | Precompute nearest outdoor node index for each node |
simulation/cuda_simulation.py |
Python, CuPy, SciPy | Run GPU agent simulation and emit positions/RSSI shards |
- CMake
>= 3.28 - C++20 compiler
- OpenMP
- Zlib
- Osmium (
find_package(Osmium REQUIRED))
The repo already vendors:
discretization/vendor/raylibdiscretization/vendor/nlohmann
- Python 3.10+
- CUDA-capable GPU and matching CuPy build
- Python packages:
numpy,pandas,scipy,tqdm,joblib
All runtime files should live in simulation/data/.
Required inputs:
simulation/data/combined_layers.geojsonsimulation/data/ext_doors.geojsonsimulation/data/selected_aps.txt
Generated graph artifacts:
simulation/data/indoor_map_pruned_nodes.csvsimulation/data/indoor_map_pruned_edges.csvsimulation/data/indoor_map_pruned.poi
Simulation dependency:
simulation/data/nearest_outdoor_nodes.csv
From repository root:
cmake -S discretization -B discretization/build
cmake --build discretization/build -jRun from simulation/ so the discretizer resolves data/... correctly:
cd simulation
mkdir -p data
../discretization/build/discretizationThis writes:
data/indoor_map_pruned_nodes.csvdata/indoor_map_pruned_edges.csvdata/indoor_map_pruned.poi
python precompute_nearest_outdoor.pyThen place the output where the simulator expects it:
mv nearest_outdoor_nodes.csv data/nearest_outdoor_nodes.csvpython cuda_simulation.pyPrimary outputs:
agent_positions.csvdata/rssi_shards/shard_*.csv
discretization/main.cppreads fromdata/combined_layers.geojsonanddata/ext_doors.geojson.simulation/cuda_simulation.pyusessimulation/data/...relative paths by default.simulation/precompute_nearest_outdoor.pycurrently definesNODES_FILEas an absolute path. Update that constant if needed before running.