The Virtual Satellite Network Emulator System (VSNES) is a Python-based tool designed to simulate satellite networks, including satellite orbits, ground stations, and communication channels. It provides tools for visualizing scenarios in Cesium, managing virtual machines (VMs) and containers for emulation, and propagating satellite orbits using TLE data. VSNES can be integrated into AI workflows by exposing a Model Context Protocol (MCP) server, enabling AI agents such as Claude to autonomously configure, launch, and monitor satellite network emulations.
Documentation: https://fundacio-i2cat.github.io/vsnes/
A new browser-based control panel is served by the Cesium visualization server (Class/static/). It includes a custom design system with Orbitron and Lato fonts, icon set, and a responsive layout. The frontend communicates with the REST API to load configs, manage VMs, and control the simulation without using the CLI.
- Orbit Propagation: Supports SGP4 and Two-Body models for satellite orbit propagation.
- Node Management: Handles satellites and ground stations as nodes in the network.
- Communication Channels: Simulates communication delays and properties between nodes.
- Visualization: Generates CZML files for Cesium-based 3D visualization.
- VM Management: Creates, starts, stops, and deletes virtual machines for emulation.
- Server Integration: Provides a Flask-based server for Cesium visualizations and API endpoints.
- REST API: Full HTTP API for programmatic control of the emulator lifecycle.
- MCP Server: AI-agent-friendly tool interface via the Model Context Protocol.
- Simulation NTP: Custom NTP server serving simulation time to emulated VMs.
- Routing Protocol Selection: Choose
olsrd,babel, ornoneper scenario ([Routing]inconfig.toml) — VSNES gates the daemon's discovery to in-LOS neighbours and manages its full lifecycle (start/restart/stop) automatically; only one protocol's rules are ever installed. - Mixed Node Types:
vm,vm_external,container,container_externalper node — internal VMs/containers are created and torn down by VSNES; external ones are only validated over the network.
Contains the core classes and modules for the emulator.
-
Core Classes:
Node.py: Base class for all nodes (satellites and ground stations).Orbit.py: Base class for handling satellite orbits using TLE data.Scenario.py: Manages the overall emulation scenario.
-
Extended Classes:
Satellite.py: ExtendsNodeto represent satellites.Ground_Station.py: ExtendsNodeto represent ground stations.
-
Orbit Propagation Models:
SGP4.py: Implements the SGP4 model for orbit propagation.TwoBody.py: Implements a two-body model for orbit propagation.
-
Communication and Channels:
Channel.py: Handles communication channels between nodes.channel_threshold.py: Defines thresholds and parameters for channel configurations.
-
Routing:
routing.py: Registry of mesh routing protocols (olsrd,babel) selected by[Routing]inconfig.toml— firewall gating of out-of-LOS peers and daemon start/stop.
-
Orbital Data:
tle_generator.py: Generates TLE files for N satellites in one orbital plane (CLI and used by the MCPgenerate_tletool).
-
Time Management:
Time_parameters.py: Manages time-related settings for the emulation.
-
Server and Visualization:
Server.py: Flask server for Cesium visualization (port 5500).static/: Web dashboard assets (CSS, JS, fonts, icons).templates/: HTML and CZML templates for Cesium.
- Ensure that the TLE file specified in the
SpaceSegmentsection exists and contains valid TLE data.sample.tlecontains a sample TLE file. To build a synthetic single-plane constellation, usepython3 Class/tle_generator.py <N> <output.tle>(seeClass/README.md) or the MCPgenerate_tletool. - The
clone_VMsection is only required fortype = 'vm'nodes. - The
Channelssection allows you to define multiple communication links between nodes. - libvirt implements DHCP, so if you want to avoid modifying the configuration of each VM to allocate a static IP:
- Get the MAC address of the VM:
$ virsh domiflist <VM_name> - Apply the DHCP rule:
$ virsh net-edit default
<dhcp> ... <host mac="<VM_MAC>" name="VM_name" ip="<VM_static_IP>"/>
- Restart the network, in this example
default:$ virsh net-destroy defaultand$ virsh net-start default - Reboot the VM:
$ virsh shutdown <VM_name>and$ virsh start <VM_name>
- Get the MAC address of the VM:
- Be careful if a kernel-level VPN is up in the host, as it will affect the routing table and make VMs not reachable. In that case, consider disabling the VPN.
Libvirt Dashboard utilizes Prometheus to visualize metrics of VMs in Grafana.
Developed within i2-22-RDI-IoT A2 DSS Sim. Aquest projecte ha rebut finançament per part del Govern de la Generalitat de Catalunya dins del marc de l'estrategia NewSpace a Catalunya.
Developed by Fundació Privada Internet i Innovació Digital a Catalunya (i2CAT). Find more information at https://i2cat.net/tech-transfer/
Licensed under the GNU AFFERO GENERAL PUBLIC LICENSE. See https://www.gnu.org/licenses/agpl-3.0.en.html.
For licensing enquiries: techtransfer@i2cat.net
