blob: e973b3749e54cf8529ea680126d3194677293ff5 [file] [log] [blame]
<!DOCTYPE html><html lang="en-us" >
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="generator" content="Source Themes Academic 4.8.0">
<meta name="author" content="Fraunhofer FOKUS">
<meta name="description" content="The OMNeT&#43;&#43; Federate design is based on amicrosimulation where every participating vehicle respectively node is individually modeled and simulated and all entities are clued together in a scenario with one instance the manages the interaction between them.">
<link rel="alternate" hreflang="en-us" href="https://www.eclipse.org/mosaic/docs/extending_mosaic/omnetpp_details/">
<meta name="theme-color" content="#68145C">
<script src="/mosaic/js/mathjax-config.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/academicons/1.8.6/css/academicons.min.css" integrity="sha512-MCWBwPSput2UWNwyznVFLbD2iUc1e5VsdD1zahsWVzkDSUzyHhMZ4kCS3wgYSRm0mU+glwD/Q9lSJrDPwbUL2A==" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.0-1/css/all.min.css" integrity="sha512-ZYg+hQvLlM0W9C3P6vTpes5LmJ66G2EsroxDNzwD6qiulckldb29eD9I672HL2X+LH5nRhY1sQqZLJGB+aUUPg==" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fancybox/3.5.7/jquery.fancybox.min.css" integrity="sha512-H9jrZiiopUdsLpg94A333EfumgUBpO9MdbxStdeITo+KEIMaNfHNvwyjjDJb+ERPaRS6DpyRlKbvPUasNItRyw==" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/styles/atom-one-light.min.css" crossorigin="anonymous" title="hl-light">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/styles/atom-one-light.min.css" crossorigin="anonymous" title="hl-dark" disabled>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.5.1/leaflet.css" integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ==" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/lazysizes/5.2.2/lazysizes.min.js" integrity="sha512-TmDwFLhg3UA4ZG0Eb4MIyT1O1Mb+Oww5kFG0uHqXsdbyZz9DcvYQhKpGgNkamAI6h2lGGZq2X8ftOJvF/XjTUg==" crossorigin="anonymous" async></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.1.0/es5/tex-chtml.min.js" integrity="sha512-uwL1UtpYdWra2iqJlAW8Ts0s9Os6IxWLDJDF/BnWdhDmT7DEMFba3GPsFwmV3QiTNcUyl2GB5vsgycB/MOvo9g==" crossorigin="anonymous" async></script>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lato:400,400i,700,700i%7CRoboto+Mono&display=swap">
<link rel="stylesheet" href="/mosaic/css/academic.css">
<link rel="manifest" href="/mosaic/index.webmanifest">
<link rel="icon" type="image/png" href="/mosaic/images/icon_hu6bdfb97c7e23190c70e41ca0e15a9fce_30436_32x32_fill_lanczos_center_2.png">
<link rel="apple-touch-icon" type="image/png" href="/mosaic/images/icon_hu6bdfb97c7e23190c70e41ca0e15a9fce_30436_192x192_fill_lanczos_center_2.png">
<link rel="canonical" href="https://www.eclipse.org/mosaic/docs/extending_mosaic/omnetpp_details/">
<meta property="twitter:card" content="summary">
<meta property="og:site_name" content="Eclipse MOSAIC – A Multi-Domain and Multi-Scale Simulation Framework for Connected and Automated Mobility">
<meta property="og:url" content="https://www.eclipse.org/mosaic/docs/extending_mosaic/omnetpp_details/">
<meta property="og:title" content="OMNeT&#43;&#43; Federate Implementation | Eclipse MOSAIC – A Multi-Domain and Multi-Scale Simulation Framework for Connected and Automated Mobility">
<meta property="og:description" content="The OMNeT&#43;&#43; Federate design is based on amicrosimulation where every participating vehicle respectively node is individually modeled and simulated and all entities are clued together in a scenario with one instance the manages the interaction between them."><meta property="og:image" content="https://www.eclipse.org/mosaic/images/logo.svg">
<meta property="twitter:image" content="https://www.eclipse.org/mosaic/images/logo.svg"><meta property="og:locale" content="en-us">
<meta property="article:published_time" content="2019-05-05T00:00:00&#43;01:00">
<meta property="article:modified_time" content="2019-05-05T00:00:00&#43;01:00">
<title>OMNeT&#43;&#43; Federate Implementation | Eclipse MOSAIC – A Multi-Domain and Multi-Scale Simulation Framework for Connected and Automated Mobility</title>
</head>
<body id="top" data-spy="scroll" data-offset="70" data-target="#TableOfContents" class=" page-mosaic page-docs page-extending_mosaic page-omnetpp_details ">
<aside class="search-results" id="search">
<div class="container">
<section class="search-header">
<div class="row no-gutters justify-content-between mb-3">
<div class="col-10 col-md-3">
<div class="logo" style="background-image: url(/mosaic/img/logos/mosaic/EclipseMOSAIC-Logo-RGB-positiv.svg)"></div>
</div>
<div class="col-2 col-md-4 col-search-close">
<a class="js-search" href="#"><i class="fas fa-times-circle text-muted" aria-hidden="true"></i></a>
</div>
</div>
<div id="search-box">
<input name="q" id="search-query" placeholder="Search..." autocapitalize="off"
autocomplete="off" autocorrect="off" spellcheck="false" type="search">
</div>
</section>
<section class="section-search-results">
<div id="search-hits">
</div>
</section>
</div>
</aside>
<nav class="navbar navbar-expand-lg navbar-light compensate-for-scrollbar" id="navbar-main">
<div class="container">
<div class="d-none d-lg-inline-flex">
<a style="visibility:visible;" class="navbar-brand" href="/mosaic/"><img src="/mosaic/images/logo.svg" alt="Eclipse MOSAIC – A Multi-Domain and Multi-Scale Simulation Framework for Connected and Automated Mobility"></a>
</div>
<button type="button" class="navbar-toggler" data-toggle="collapse"
data-target="#navbar-content" aria-controls="navbar" aria-expanded="false" aria-label="Toggle navigation">
<span><i class="fas fa-bars"></i></span>
</button>
<div class="navbar-brand-mobile-wrapper d-inline-flex d-lg-none">
<a class="navbar-brand" href="/mosaic/"><img src="/mosaic/images/logo.svg" alt="Eclipse MOSAIC – A Multi-Domain and Multi-Scale Simulation Framework for Connected and Automated Mobility"></a>
</div>
<div class="navbar-collapse main-menu-item collapse justify-content-start" id="navbar-content">
<ul class="navbar-nav d-md-inline-flex">
<li class="nav-item">
<a class="nav-link " href="/mosaic/about"><span>About</span></a>
</li>
<li class="nav-item">
<a class="nav-link " href="/mosaic/news"><span>News</span></a>
</li>
<li class="nav-item">
<a class="nav-link active" href="/mosaic/docs"><span>Documentation</span></a>
</li>
<li class="nav-item">
<a class="nav-link " href="/mosaic/tutorials"><span>Tutorials</span></a>
</li>
<li class="nav-item">
<a class="nav-link " href="/mosaic/download"><span>Download</span></a>
</li>
<li class="nav-item">
<a class="nav-link " href="/mosaic/community"><span>Community</span></a>
</li>
</ul>
</div>
<ul class="nav-icons navbar-nav flex-row ml-auto d-flex pl-md-2">
<li class="nav-item">
<a class="nav-link js-search" href="#" aria-label="Search"><i class="fas fa-search" aria-hidden="true"></i></a>
</li>
<li class="nav-item ">
<a href="https://github.com/eclipse/mosaic" target="blank">
<i class="fab fa-github" aria-hidden="true"></i>
</a>
</li>
</ul>
</div>
</nav>
<div class="docs container">
<div class="row flex-xl-nowrap">
<div class="docs-sidebar col-12 col-md-3 col-xl-3">
<form class="docs-search d-flex align-items-center">
<button class="btn docs-toggle d-md-none p-0 mr-3" type="button" data-toggle="collapse" data-target="#docs-nav" aria-controls="docs-nav" aria-expanded="false" aria-label="Toggle section navigation">
<span><i class="fas fa-bars"></i></span>
</button>
<input name="q" type="search" class="form-control" placeholder="Search..." autocomplete="off">
</form>
<nav class="collapse docs-links" id="docs-nav">
<div class="docs-toc-item">
<a class="docs-toc-link" href="/mosaic/docs/getting_started">Getting Started</a>
<ul class="nav docs-sidenav">
<li >
<a href="/mosaic/docs/getting_started/">Download</a>
</li>
<li >
<a href="/mosaic/docs/getting_started/run_mosaic/">Run Eclipse MOSAIC</a>
</li>
</ul>
</div>
<div class="docs-toc-item">
<a class="docs-toc-link" href="/mosaic/docs/run_simulations">Run Simulations</a>
<ul class="nav docs-sidenav">
<li >
<a href="/mosaic/docs/run_simulations/">Run a single simulation</a>
</li>
<li >
<a href="/mosaic/docs/run_simulations/results/">Simulation Results</a>
</li>
</ul>
</div>
<div class="docs-toc-item">
<a class="docs-toc-link" href="/mosaic/docs/visualization">Visualization</a>
<ul class="nav docs-sidenav">
<li >
<a href="/mosaic/docs/visualization/">WebSocket Visualizer</a>
</li>
<li >
<a href="/mosaic/docs/visualization/filevis/">File Output</a>
</li>
<li >
<a href="/mosaic/docs/visualization/statistics/">Statistics Output</a>
</li>
<li >
<a href="/mosaic/docs/visualization/itef/">ITEF</a>
</li>
<li >
<a href="/mosaic/docs/visualization/phabmap/">PHABMap</a>
</li>
</ul>
</div>
<div class="docs-toc-item">
<a class="docs-toc-link" href="/mosaic/docs/simulators">Simulators</a>
<ul class="nav docs-sidenav">
<li >
<a href="/mosaic/docs/simulators/">Overview</a>
</li>
<li >
<a href="/mosaic/docs/simulators/application_simulator/">Application Simulator</a>
</li>
<li >
<a href="/mosaic/docs/simulators/traffic_simulator_sumo/">Traffic - Eclipse SUMO</a>
</li>
<li >
<a href="/mosaic/docs/simulators/network_simulator_omnetpp/">Network - OMNeT&#43;&#43;</a>
</li>
<li >
<a href="/mosaic/docs/simulators/network_simulator_ns3/">Network - ns-3</a>
</li>
<li >
<a href="/mosaic/docs/simulators/network_simulator_sns/">Network - SNS</a>
</li>
<li >
<a href="/mosaic/docs/simulators/network_simulator_cell/">Network - Cell</a>
</li>
<li >
<a href="/mosaic/docs/simulators/environment_simulator/">Environment Simulator</a>
</li>
<li >
<a href="/mosaic/docs/simulators/battery_simulator/">Battery Simulator</a>
</li>
</ul>
</div>
<div class="docs-toc-item">
<a class="docs-toc-link" href="/mosaic/docs/building_scenarios">Building Scenarios</a>
<ul class="nav docs-sidenav">
<li >
<a href="/mosaic/docs/building_scenarios/">Simulation Scenarios</a>
</li>
<li >
<a href="/mosaic/docs/building_scenarios/scenario_convert/">Scenario Convert</a>
</li>
<li >
<a href="/mosaic/docs/building_scenarios/scenario_configuration/">Additional Scenario Configuration</a>
</li>
</ul>
</div>
<div class="docs-toc-item">
<a class="docs-toc-link" href="/mosaic/docs/develop_applications">Create Applications</a>
<ul class="nav docs-sidenav">
<li >
<a href="/mosaic/docs/develop_applications/">Basics</a>
</li>
<li >
<a href="/mosaic/docs/develop_applications/communication/">V2X Communication</a>
</li>
<li >
<a href="/mosaic/docs/develop_applications/event_scheduler/">Event Scheduling</a>
</li>
<li >
<a href="/mosaic/docs/develop_applications/road_traffic/">Scenario Database</a>
</li>
</ul>
</div>
<div class="docs-toc-item">
<a class="docs-toc-link" href="/mosaic/docs/extending_mosaic">Extending Eclipse MOSAIC</a>
<ul class="nav docs-sidenav">
<li >
<a href="/mosaic/docs/extending_mosaic/">Core Concepts</a>
</li>
<li >
<a href="/mosaic/docs/extending_mosaic/simulator_coupling/">Simulator Coupling</a>
</li>
<li >
<a href="/mosaic/docs/extending_mosaic/interactions/">Interactions</a>
</li>
<li >
<a href="/mosaic/docs/extending_mosaic/application_ambassador_details/">Application Ambassador</a>
</li>
<li >
<a href="/mosaic/docs/extending_mosaic/sumo_ambassador_details/">Sumo Ambassador</a>
</li>
<li class="active">
<a href="/mosaic/docs/extending_mosaic/omnetpp_details/">OMNeT&#43;&#43; Federate</a>
</li>
<li >
<a href="/mosaic/docs/extending_mosaic/delay_models/">Delay Models</a>
</li>
</ul>
</div>
<div class="docs-toc-item">
<a class="docs-toc-link" href="/mosaic/docs/api_docs/">API Documentation</a>
<ul class="nav docs-sidenav">
<li >
<a href="/mosaic/docs/api_docs/">Javadoc</a>
</li>
</ul>
</div>
</nav>
</div>
<div class="docs-toc d-none d-xl-block col-xl-2">
<ul class="nav toc-top">
<li><a href="#" id="back_to_top" class="docs-toc-title">Contents</a></li>
</ul>
<nav id="TableOfContents">
<ul>
<li>
<ul>
<li><a href="#node-internals">Node Internals</a></li>
<li><a href="#simulation-setup">Simulation Setup</a></li>
<li><a href="#simulator-coupling">Simulator Coupling</a></li>
<li><a href="#the-omnet-ambassador">The OMNeT++ Ambassador</a></li>
<li><a href="#the-time-representation">The Time Representation</a></li>
</ul>
</li>
</ul>
</nav>
</div>
<style>
@media (min-width:1140px) {
.docs-sidebar {
flex: 0 1 320px;
}
.docs-toc {
flex: 0 1 280px;
}
main.docs-content.no-docs-toc {
padding-bottom: 0 !important;
max-width: calc(100% - 320px) !important;
flex: 0 1 calc(100% - 320px);
width: 100%;
}
main.docs-content {
padding-bottom: 0 !important;
max-width: calc(100% - 600px) !important;
flex: 0 1 calc(100% - 600px);
width: 100%;
}
}
@media (max-width: 770px) {
main.docs-content {
max-width: 100% !important;
width: 100%;
}
}
@media (min-width: 771px) and(max-width: 1139px) {
main.docs-content.no-docs-toc {
padding-bottom: 0 !important;
max-width: calc(100% - 320px) !important;
width: 100%;
}
}
</style>
<main class="docs-content col-12 col-md-9 col-xl-auto py-md-3 pl-md-4" role="main">
<article class="article">
<div class="docs-article-container">
<h1>OMNeT&#43;&#43; Federate Implementation</h1>
<div class="article-style">
<p>The OMNeT++ Federate design is based on amicrosimulation where every participating vehicle respectively
node is individually modeled and simulated and all entities are clued together in a scenario with
one instance the manages the interaction between them. That means at first the internals of one node
are introduced which incorporate mainly the communication stack and a mobilitymodel. Afterwards,
especially the scenario management is presented which builds up on the individual nodes and controls
themajor part of the simulation. These both aspects are in similar way needed formost mobile communication
simulation with OMNeT++ even in an isolated setup. However, specifically for interaction and
synchronization with the other simulators in the Eclipse MOSAIC environment, a third pillar is necessary. This
scheduler module is very important for the system as it implements the time management and event
scheduling according to Eclipse MOSAIC specific concepts.</p>
<h3 id="node-internals">Node Internals</h3>
<p>The main part of the node model consists of the communication stack. The submodules for communication
are adopted from the INETMANET framework. Hence, it is primarily important to define the
connections between the individual modules. However, there are also modules which needed to be
implemented for the dedicated purpose of the coupling within the Eclipse MOSAIC environment. Finally, all
modules are linked together to a compound module using the NED language. The following figure depicts the node architecture. It needs to be said that the concept currently supports two different
kinds of nodes for Vehicles and RSUs, while V2X-based traffic lights are treated as RSUs. For the first
approach these two kinds of nodes have the equal construction in terms of modules. The difference at the
moment is that they can be configured with different values for parameters e.g. that Vehicles and RSUs
have a different antenna height which is important for Two Ray Ground ReflectionModel. Furthermore,
this concept is capable for later extensions e.g. for simulations when RSUs should be equipped with an
additional network interface to build the bridge fromAd hoc Domain to the Fixed Infrastructure Domain
(i.e. Internet).</p>
<figure id="figure-architecture-of-one-node">
<a data-fancybox="" href="../images/implementation_simcoupling.jpeg" data-caption="Architecture of one Node">
<img src="../images/implementation_simcoupling.jpeg" alt="" >
</a>
<figcaption data-pre="Figure " data-post=":" class="numbered">
Architecture of one Node
</figcaption>
</figure>
<h5 id="communication-stack">Communication Stack</h5>
<p>The right part of the block diagram in the figure above depicts the communication stack. It is based on the
module Wlan which is a compound module itself and covers the complete IEEE 802.11 network interface
card with the MAC and PHY Layer and the Radio Channel. The configuration of different values for
standard parameters e.g. the PHY bit rate or size of the contention window of the MAC can be exchanged
within the omnetpp.ini-file (which introduces the parameters of the according module ned-files). Please
note that the configuration allows different values for each kind of nodes and hence it is possible to
configure another propagation model or carrier frequency for Vehicles compared to RSUs. Even if
the possibility for such a configuration exists, it should be avoided and common parameters should
consistently be configured twice with the same value.</p>
<p>The next module in the communication stack is the NetworkLayer. Once again it is a compound module
and already a collection of most important protocols. The following protocols from version IPv4 are
supported in this layer.</p>
<ul>
<li>IP (Internet Protocol) of course as primary protocol of the Network Layer</li>
<li>ICMP (Internet ControlMessage Protocol) for information and error messages</li>
<li>IGMP (Internet GroupManagement Protocol) for management ofmulticast functionality</li>
<li>ARP (Address Resolution Protocol) for mapping of IP Addresses toMAC Addresses</li>
</ul>
<p>Furthermore, the standalone modules InterfaceTable and RoutingTable are related to the Network
Layer. The first one is needed to support multiple Network Interface Cards e.g. for wireless and fixed LAN
in one node. It is already included for possible further extensions as previously mentioned, but up to
now it has only one entry which is the Network Interface Card for Wlan. The second one is a table for
simple Routing. This module is needed for correct instantiation of a node via the FlatNetworkGenerator
as explained later in this section.</p>
<p>The <code>TransportLayer</code> of the communication stack is made up of TCP for reliable connections and UDP.</p>
<p>The modules <code>VSimRTIReliableApp</code> and <code>VSimRTIUnreliableApp</code> of Application Layer are the entry
points for application messages for the communication stack for the following reasons. The communication
oriented models of INETMANET have their focus more on the framing for communication and less on
the real content. That means that content is often modeled with dummy payloads where only the length is
of interest. In contrast, V2X applications which are simulated in the
<a href="https://www.eclipse.org/mosaic/docs/simulators/application_simulator/">Application Simulator</a>.
Rely on the correct transmission of contents. Hence, the modules <code>VSimRTIReliableApp</code> and <code>VSimRTIUnreliableApp</code>
are introduced to bridge this gap. They are triggered by the Eclipse MOSAIC ScenarioManager
to send new messages to lower layers and forward messages themselves back to the ScenarioManager
upon reception. The main tasks are generally acting as an application within the scope of OMNeT++ and
encapsulating themessage contents to packets to prepare them for sending. While functionality of an
UDP application is fully supported in <code>VSimRTIUnreliableApp</code>, the complete TCP application functionality
is restricted in <code>VSimRTIReliableApp</code>. Note that up to now it is not entirely clarified if and how TCP should
be supported in V2X use cases for safety and traffic efficiency with their broadcast characteristics, think
of different roles of server and client in TCP. When the Eclipse MOSAIC ScenarioManager properties are detailed
later in this section, it is also explained how the connection between the Eclipse MOSAIC ScenarioManager and
the Eclipse MOSAIC Apps is realized. This connection needs to be established dynamically and is therefore not
assigned with a connecting arrow like the fixed connections between the modules of communication
stack.</p>
<h5 id="mobility-model">Mobility Model</h5>
<p>The second important component of the node is the mobility module <code>VSimRTIMobility</code>, which extends
the BasicMobility. Unlike other mobility models as RandomWaypoint it does not generate node movements
itself and has a straight static character. Node position updates are always triggered by the Eclipse MOSAIC
ScenarioManager. Hence,mobility is completely controlled by Eclipse MOSAIC and in turn by the coupled traffic
simulator. After successful position update the <code>VSimRTIMobility</code> module informs other modules about
this event via the NotificationBoard.</p>
<h5 id="additional-functionality">Additional Functionality</h5>
<p>At last, the module NotificationBoard is defined for each node. This module was already mentioned in
the model overview of INETMANET. It enables a very efficient way for dynamic communication between
the individual modules. There is no direct and static connection needed between the modules, because
modules can subscribe dynamically for notification about dedicated events.</p>
<h3 id="simulation-setup">Simulation Setup</h3>
<p>The setup of the complete simulation is illustrated in the following Figure 3 From the view of OMNeT++,
the simulation is a network which has a dynamic topology and is referenced as the simulated network
in the omnetpp.ini-file for configuration. The ini-file gives access to all parameters which are offered
to be configured by the included simple modules. The parameters are referred to by their hierarchical
names with the simulated network as root module. As it is possible to assign already default values for
parameters in the modules NED file, not every parameter needs to be configured in the ini-file. The
simulation consists of basically three parts.</p>
<figure id="figure-architecture-of-the-whole-simulation-scenario">
<a data-fancybox="" href="../images/implementation_simulation.jpeg" data-caption="Architecture of the whole Simulation Scenario">
<img src="../images/implementation_simulation.jpeg" alt="" >
</a>
<figcaption data-pre="Figure " data-post=":" class="numbered">
Architecture of the whole Simulation Scenario
</figcaption>
</figure>
<h5 id="simulated-nodes">Simulated Nodes</h5>
<p>Obviously the major part of the simulation is dedicated to the nodes. They are compound modules either
from type Vehicle or RSU and have the properties as described in the previous section. The number
of nodes in the simulation can vary over simulation time and is dynamically managed by the Eclipse MOSAIC
ScenarioManager.</p>
<h5 id="common-communication-dependent-modules">Common Communication Dependent Modules</h5>
<p>The second part covers the modules which actually count to the communication stack, but are common
for all simulated nodes. These modules are the ChannelControl and the FlatNetworkGenerator.
The ChannelControl keeps track of all nodes, their positions and Radio Channels. The main task is to
determine which nodes are in communication range and which other nodes are within interference
distance. The FlatNetworkGenerator is part of the Network Layer. It is used to instantiate a network
with a flat topology and assigns the IP addresses to all nodes. Additionally it runs Dijstra’s shortest path
algorithm to discover the routes and adds them into the routing tables. It is assumed that the routing
tables are of kind of the RoutingTable from the specific NetworkLayer package. This is the reason why
every node is equipped with the RoutingTable submodule. This approach works out for the current
simulation purposes, but when any Ad hoc Routing protocols will be introduced to the simulation model
the FlatNetworkGenerator and the RoutingTable modules are likely be obsolete and would have to be
replaced.</p>
<h5 id="eclipse-mosaic-scenariomanager">Eclipse MOSAIC ScenarioManager</h5>
<p>The <code>ScenarioManager</code> is an experimental feature that implements a central control instance in
simulations with INETMANET framework. It is loaded with a script in XML notation and is used to setup and control simulation experiments. Actually the original ScenarioManager and the new
Eclipse MOSAIC ScenarioManager have nearly nothing in common but the fact that both are used as a central
management instance to enhance simple configurations to simulate more sophisticated scenarios. The
general tasks of the Eclipse MOSAIC ScenarioManager contain the simulation start up with instantiation of
common modules as ChannelControl and initialization of the Eclipse MOSAIC EventScheduler (detailed later)
and the controlled simulation shut down. But most important beside these are the management of node
mobility and management of V2X communication which are triggered by Eclipse MOSAIC during simulation.</p>
<p>The <strong>Mobility Management</strong> is responsible for administration of simulated nodes and their mobility.
This includes introducing nodes to simulation, updating node positions and removing nodes from
simulation.</p>
<p>The node introduction method is triggered by Eclipse MOSAIC with the commands <code>ADD_NODES</code> or <code>ADD_RSU_NODES</code> respectively. It adds the node according to its node id to the managed modules and creates the complete compound module. Important for later message handling is the setup of connections to the dedicated Eclipse MOSAIC App, which is done via so called gates. At the moment, the Eclipse MOSAIC Apps are statically initialized, but the concept is suitable to be extended later when other transport protocols and in turn
applications have to be simulated.</p>
<p>Upon <code>MOVE_NODE</code> command, which contains the affected node id and new position to be updated, the
node is moved via the <code>VSimRTIMobility</code> module.</p>
<p>At last the <code>REMOVE_NODE</code> command indicates that a node leaves the simulation. On this event, the according node is deleted and unregistered from managed modules.</p>
<p>The <strong>CommunicationManagement</strong> controls the sending and receiving of V2X messages.</p>
<p>The <code>SEND_V2X_MESSAGE</code> command initiates the sending process. It contains the sender node id and
the transport protocol. Thus the Eclipse MOSAIC ScenarioManager can select the according Eclipse MOSAIC app at the according node.</p>
<p>When a message from another node successfully arrives at the application layer the Eclipse MOSAIC ScenarioManager
is notified by the according node. Then, it sets up a <code>RECV_V2X_MESSAGE</code> which is sent back
to Eclipse MOSAIC via the Eclipse MOSAIC EventScheduler. This intermediate step is introduced, since the Eclipse MOSAIC
EventScheduler is the only instance, which is connected to Eclipse MOSAIC and which knows when it is safe to
receive and send interactions.</p>
<h3 id="simulator-coupling">Simulator Coupling</h3>
<p>OMNeT++ is connected to Eclipse MOSAIC according to the concept of high-level-architecture (HLA). That
means that the OMNeT++ simulation program itself is encapsulated in the OMNeT++ federate. To
enable the coupling according to Eclipse MOSAIC concept, two components needed to be developed. First, the
OMNeT++ federate is extended with the customized Eclipse MOSAIC EventScheduler, which can receive and
send interactions forMobility and CommunicationManagement. The second component is the OMNeT++
Ambassador that can handle on the one hand the OMNeT++ specific connection and on the other
hand the well-defined interface to Eclipse MOSAIC. The emphasis of both components lies in the synchronized
exchange of interactions i.e. a time management mechanism must be jointly realized by them. For this
purpose the conservative synchronization mechanism is implemented. The following figure gives an overview
of the included compenents.</p>
<figure id="figure-overview-of-simulator-coupling">
<a data-fancybox="" href="../images/implementation_vehicle.jpeg" data-caption="Overview of Simulator Coupling">
<img src="../images/implementation_vehicle.jpeg" alt="" >
</a>
<figcaption data-pre="Figure " data-post=":" class="numbered">
Overview of Simulator Coupling
</figcaption>
</figure>
<h5 id="eclipse-mosaic-eventscheduler">Eclipse MOSAIC EventScheduler</h5>
<p>The Eclipse MOSAIC EventScheduler extends the simple standard scheduler of OMNeT++ to be able to implement the time management for the Conservative Synchronization with Eclipse MOSAIC. It is the only module in OMNeT++ which has access to the event queue or Future Event Set (FES). Since the OMNeT++ simulation
is an event driven simulation the scheduler has to fulfill two tasks. The first task is the actual scheduling
part which is always invoked by the simulation kernel to schedule the next event. It allows all events from
the FES to be processed up to the granted logical time $T$. If there are only events with a later time $T'$ than
$T$ left in the FES, it sends the Next Event Request (NER) to the OMNeT++ Ambassador at Eclipse MOSAIC side and
blocks the OMNeT++ simulation. Then the second task comes into operation. If necessary, it coordinates
the Receive Interaction procedure and merges the external events from Eclipse MOSAIC and hence from other
federates to the internal FES. Events with the same time stamp are ordered to the FES according to first
come first serve mechanism. Note that the handling of these simultaneous events is generally important
to ensure repeatable execution of simulations. The decision about ordering is in control of the federate
itself, since the RTI does not sufficiently have the information to do this. After the Receive Interaction
step, the RTI completes the time management cycle with the Time Advance Grant for $T'$. At this point the
scheduler can set its logical time to $T = T'$ and unblock the further processing.</p>
<p>Additionally the Eclipse MOSAIC EventScheduler provides the service for other modules to send interactions back
to the OMNeT++ Ambassador, since it is also the one module which is connected to Eclipse MOSAIC. Currently,
this is used by the Eclipse MOSAIC ScenarioManager to report the <code>RECEIVE_V2X_MESSAGES</code>.</p>
<h4 id="eclipse-mosaic-omnet-federate-development">Eclipse MOSAIC OMNeT++ Federate Development</h4>
<p>This section provides a description how to set up the <strong>OMNeT++ IDE</strong> for the Eclipse MOSAIC OMNeT++ Federate Development.</p>
<p>At this point it is awaited, that the
<a href="https://www.eclipse.org/mosaic/docs/simulators/network_simulator_omnetpp/">OMNeT++ Federate</a> is successfully installed.</p>
<h5 id="prepare-omnet-ide">Prepare OMNeT++ IDE</h5>
<ol>
<li>
<p>Create an empty directory somewhere inside your home directory. We will call it <code>&lt;omnetpp_workspace&gt;</code> from here on. This directory will be used as a workspace in your OMNeT++ IDE.</p>
</li>
<li>
<p>Open your OMNeT++ IDE by executing <code>omnetpp</code> in your terminal.</p>
</li>
<li>
<p>Select <code>&lt;omnetpp_workspace&gt;</code> as workspace and continue by clicking <code>Launch</code>.</p>
</li>
<li>
<p>Close the &ldquo;Welcome&rdquo; screen.</p>
</li>
<li>
<p>Since your workspace is empty, the OMNeT++ IDE will ask you if you want to install the INET framework and OMNeT++ programming examples.<br>
<figure id="figure-omnet-ide-install-inet">
<a data-fancybox="" href="../images/omnetpp-ide-install-inet.png" data-caption="OMNeT&#43;&#43; IDE: Install INET">
<img src="../images/omnetpp-ide-install-inet.png" alt="" >
</a>
<figcaption data-pre="Figure " data-post=":" class="numbered">
OMNeT++ IDE: Install INET
</figcaption>
</figure>
Decide by yourself if you want to do that:</p>
<ul>
<li>By clicking <code>OK</code> the INET framework is going to be installed into an <code>inet</code> folder in your <code>&lt;omnetpp_workspace&gt;</code></li>
<li>If you already have INET installed somewhere you can skip the installation and import your existing INET project:
<ol>
<li><code>Cancel</code> the dialog.</li>
<li>Choose <code>File</code> &gt; <code>Open Projects from File System...</code></li>
<li>In the new window choose the directory of your existing INET installation as <code>Import Source</code> and click <code>Finish</code></li>
</ol>
</li>
</ul>
</li>
<li>
<p>The project <code>inet</code> should now be visible in the <code>Project Explorer</code> of your OMNeT++ IDE.</p>
</li>
<li>
<p>Right-click on free space in the <code>Project Explorer</code> and choose <code>New</code> &gt; <code>OMNeT++ Project...</code></p>
<figure id="figure-omnet-ide-create-new-omnet-project">
<a data-fancybox="" href="../images/omnetpp-ide-new-project.png" data-caption="OMNeT&#43;&#43; IDE: Create new OMNeT&#43;&#43; Project">
<img src="../images/omnetpp-ide-new-project.png" alt="" >
</a>
<figcaption data-pre="Figure " data-post=":" class="numbered">
OMNeT++ IDE: Create new OMNeT++ Project
</figcaption>
</figure>
</li>
<li>
<p>In the new window:</p>
<ol>
<li>Name the new project <code>federate</code></li>
<li><strong>Uncheck</strong> the box before <code>Use default location</code>, click <code>Browse</code> and select:<br>
<code>&lt;mosaic&gt;/bin/fed/omnetpp/omnetpp_federate_src/src</code><br>
<figure id="figure-omnet-ide-create-new-omnet-project">
<a data-fancybox="" href="../images/omnetpp-ide-new-project-2.png" data-caption="OMNeT&#43;&#43; IDE: Create new OMNeT&#43;&#43; Project">
<img src="../images/omnetpp-ide-new-project-2.png" alt="" >
</a>
<figcaption data-pre="Figure " data-post=":" class="numbered">
OMNeT++ IDE: Create new OMNeT++ Project
</figcaption>
</figure>
</li>
<li>Click <code>Next</code></li>
</ol>
</li>
<li>
<p>On the following <code>Initial Contents</code> page select <code>Empty Project</code> and continue by clicking <code>Finish</code><br>
You should now find two projects in the <code>Project Explorer</code> of your OMNeT++ IDE: <code>inet</code> and <code>federate</code></p>
</li>
<li>
<p>Right-click on the <code>federate</code> project and choose <code>Properties</code></p>
<ol>
<li>Go to <code>Project references</code> and <strong>check</strong> the box before <code>inet</code><br>
<figure id="figure-choose-project-references">
<a data-fancybox="" href="../images/omnetpp-ide-project-references.png" data-caption="Choose project references">
<img src="../images/omnetpp-ide-project-references.png" alt="" >
</a>
<figcaption data-pre="Figure " data-post=":" class="numbered">
Choose project references
</figcaption>
</figure>
</li>
</ol>
</li>
</ol>
<p>That&rsquo;s it! None of the files should now be marked with an error symbol.</p>
<hr>
<h5 id="configure-rebuild-configuration">Configure Rebuild Configuration</h5>
<p>Since the Eclipse MOSAIC OMNeT++ Federate is not a classic OMNeT++ project, it cannot be build regulary with
the OMNeT++ IDE by just clicking on the <code>Build</code> button. However, to make the build process easy and intuitive
we provide a simple build script and the following desciption how to configure the OMNeT++ IDE to enable
building on a single click:</p>
<ol>
<li>In the OMNeT++ IDE select <code>Run</code> &gt; <code>External Tools</code> &gt; <code>External Tools Configuration...</code></li>
<li>Double-click in the left column on <code>Program</code> to create a new configuration.</li>
<li>Call it <code>rebuild federate</code></li>
<li>In the <code>Main</code> tab:
<ol>
<li>Under <code>Location</code> choose <code>Browse Workspace...</code> and select <code>federate/rebuild_federate.sh</code></li>
<li>Still in the <code>Main</code> tab under <code>Working Directory</code> choose <code>Browse Workspace...</code> and select <code>federate</code>
<figure id="figure-omnet-ide-build-configuration">
<a data-fancybox="" href="../images/omnetpp-ide-build-config.png" data-caption="OMNeT&#43;&#43; IDE Build Configuration">
<img src="../images/omnetpp-ide-build-config.png" alt="" >
</a>
<figcaption data-pre="Figure " data-post=":" class="numbered">
OMNeT++ IDE Build Configuration
</figcaption>
</figure>
</li>
</ol>
</li>
<li>In the <code>Build</code> tab <strong>uncheck</strong> the box before <code>Build before launch</code><br>
<figure id="figure-omnet-ide-build-configuration">
<a data-fancybox="" href="../images/omnetpp-ide-build-config-2.png" data-caption="OMNeT&#43;&#43; IDE Build Configuration">
<img src="../images/omnetpp-ide-build-config-2.png" alt="" >
</a>
<figcaption data-pre="Figure " data-post=":" class="numbered">
OMNeT++ IDE Build Configuration
</figcaption>
</figure>
</li>
<li>Now you can <code>Apply</code> your changes and click on <code>Run</code>.</li>
<li>Since you have built the project at least once, you can rebuild it again by clicking here:<br>
<figure id="figure-run-rebuild">
<a data-fancybox="" href="../images/omnetpp-ide-run-rebuild.png" data-caption="Run rebuild">
<img src="../images/omnetpp-ide-run-rebuild.png" alt="" >
</a>
<figcaption data-pre="Figure " data-post=":" class="numbered">
Run rebuild
</figcaption>
</figure>
</li>
</ol>
<p><strong>The following video shows the above described steps:</strong></p>
<video controls >
<source src="../images/omnetpp-ide-rebuild-federate.mp4" type="video/mp4">
</video>
<hr>
<h5 id="configure-debug-configuration">Configure Debug Configuration</h5>
<p>To debug the Eclipse MOSAIC OMNeT++ Federate during simulation you need to create a Debug Configuration. The following
instruction will tell you how to that:</p>
<ol>
<li>In your OMNeT++ IDE choose <code>Run</code> &gt; <code>Debug Configurations...</code></li>
<li>In the new window double-click on <code>OMNeT++ Simulation</code> in the left column and name the new created debug configuration <code>federate</code>.</li>
<li>In the <code>Executable</code> row check <code>other</code> and type <code>/federate/federate</code></li>
<li>In the <code>Working dir</code> row type <code>/federate</code></li>
<li>In the <code>Ini file(s)</code> row type <code>debug.ini omnetpp.ini</code></li>
<li>At the end of the page click on the <code>More &gt;&gt;</code> link. And make sure all fields in the <code>Advanced</code> area are <strong>empty</strong>.</li>
<li>For <code>Projects to build</code> select <code>Do not build automatically before launch</code></li>
<li>Now <code>Apply</code> your changes and try your configuration by clicking <code>Debug</code></li>
</ol>
<p><strong>The following images shows the final debug configuration:</strong></p>
<figure id="figure-final-debug-configuration">
<a data-fancybox="" href="../images/omnetpp-ide-debug-config.png" data-caption="Final debug configuration">
<img src="../images/omnetpp-ide-debug-config.png" alt="" >
</a>
<figcaption data-pre="Figure " data-post=":" class="numbered">
Final debug configuration
</figcaption>
</figure>
<hr>
<h3 id="the-omnet-ambassador">The OMNeT++ Ambassador</h3>
<p>The OMNeT++ Ambassador is the intermediate component between OMNeT++ and Eclipse MOSAIC. As it
implements the interface of an abstract federate ambassador in Eclipse MOSAIC. In the initialization phase the
Ambassador applies for the TimeManagement policies time constrained and time regulated at the RTI.
Remind that time constrained means that the time advances of the OMNeT++ Federate are dependent on
the other simulators in the federation and time regulating means that the OMNeT++ Federate itself can
prevent other federates from advancing their time.</p>
<p>The OMNeT++ simulation starts initially with an empty event queue and hence it needs to receive an
interaction to fill the event queue with the first events to be processed. That means that the typical time
management cycle in the Ambassador starts at step two with the Receive Interaction procedure. Note
that messages within Eclipse MOSAIC usually effect more than one interaction e.g. a VehicleUpdates interaction
contains information for added nodes and moved nodes. These are exchanged with OMNeT++ using a
simple byte protocol. After this procedure the third step of time management cycle is processed with
the initial Time Advance Grant. This is the point when the OMNeT++ simulation is able to start and the
initialization phase is finished. Hence the time management cycle can be executed from first step which
is waiting for a new NER until no federate requests further events and the simulation is finished.</p>
<h3 id="the-time-representation">The Time Representation</h3>
<p>One important issue for the simulation coupling is the common representation of the logical time at the
RTI and the different federates in the federation. Normally, the time is a federate-defined abstract data
type. The requirements for such a time are the ability for comparison and addition and most important
the possibility of conversion without the loss of precision. Otherwise, deadlocks in the synchronization
procedure are guaranteed. On the one hand Eclipse MOSAIC treats times as a 64-bit integer with a resolution of
nanoseconds. On the other hand the OMNeT++ simulation time is represented by the type <code>simtime_t</code>
which is a typedef to double. It is generally known that conversions from floating point to fixed point are
vulnerable to rounding errors. To circumvent this issue the underlying raw 64-bit integer of the <code>simtime_t</code>
representation is also made accessible, which works perfect if the scale exponent for time precision was
previously initialized to $-9$ (i.e. nanoseconds).</p>
</div>
<div class="article-widget">
<div class="post-nav row col-12">
<div class="post-nav-item col-6">
<div class="meta-nav">Previous</div>
<a href="/mosaic/docs/extending_mosaic/sumo_ambassador_details/" rel="next">Sumo Ambassador Implementation</a>
</div>
<div class="post-nav-item col-6">
<div class="meta-nav">Next</div>
<a href="/mosaic/docs/extending_mosaic/delay_models/" rel="prev">Delay Models</a>
</div>
</div>
</div>
</div>
<footer class="site-footer">
<div class="row">
<div class="col-sm-4 mb-3 mb-md-0">
<b>Eclipse MOSAIC</b>
<ul>
<li>
<a href="/mosaic/download/" title="Download Eclipse MOSAIC" >
Download Eclipse MOSAIC
</a>
</li>
<li>
<a href="/mosaic/docs" title="Documentation" >
Documentation
</a>
</li>
<li>
<a href="/mosaic/tutorials" title="Tutorials" >
Tutorials
</a>
</li>
<li>
<a href="/mosaic/community/#projects" title="Projects" >
Projects
</a>
</li>
<li>
<a href="/mosaic/publications" title="Publications" >
Publications
</a>
</li>
</ul>
</div>
<div class="col-sm-4 mb-3 mb-md-0">
<b>Community</b>
<ul>
<li>
<a href="/mosaic/community" title="Eclipse MOSAIC Community" >
Eclipse MOSAIC Community
</a>
</li>
<li>
<a href="/mosaic/contribution" title="How to contribute" >
How to contribute
</a>
</li>
<li>
<a href="https://github.com/eclipse/mosaic" title="Github" target="_blank" rel="noopener">
Github
</a>
</li>
<li>
<a href="/mosaic/get_in_contact" title="Contact &amp; Mailing list" >
Contact & Mailing list
</a>
</li>
</ul>
</div>
<div class="col-sm-4 mb-3 mb-md-0">
<b>Eclipse Foundation</b>
<ul>
<li>
<a href="https://www.eclipse.org/" title="About Eclipse Foundation" target="_blank" rel="noopener">
About Eclipse Foundation
</a>
</li>
<li>
<a href="https://www.eclipse.org/legal/privacy.php" title="Privacy Policy" target="_blank" rel="noopener">
Privacy Policy
</a>
</li>
<li>
<a href="https://www.eclipse.org/legal/termsofuse.php" title="Website terms of use" target="_blank" rel="noopener">
Website terms of use
</a>
</li>
<li>
<a href="https://www.eclipse.org/legal/copyright.php" title="Copyright" target="_blank" rel="noopener">
Copyright
</a>
</li>
<li>
<a href="https://www.eclipse.org/legal" title="Legal" target="_blank" rel="noopener">
Legal
</a>
</li>
</ul>
</div>
</div>
<div class="row justify-content-center mt-3 position-relative">
<p class="powered-by text-center font-italic mb-0 pb-0">
Powered by the
<a href="https://sourcethemes.com/academic/" target="_blank" rel="noopener">Academic theme</a> for
<a href="https://gohugo.io" target="_blank" rel="noopener">Hugo</a>.
<br>
Header image &#169; fanjianhua/ iStock
</p>
</div>
</footer>
</article>
</main>
</div>
</div>
<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha384-vk5WoKIaW/vJyUAd9n/wmopsmNhiy+L2Z+SBxGYnUkunIxVxAv/UtMOhba/xskxh" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.imagesloaded/4.1.4/imagesloaded.pkgd.min.js" integrity="sha512-S5PZ9GxJZO16tT9r3WJp/Safn31eu8uWrzglMahDT4dsmgqWonRY9grk3j+3tfuPr9WJNsfooOR7Gi7HL5W2jw==" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.isotope/3.0.6/isotope.pkgd.min.js" integrity="sha512-Zq2BOxyhvnRFXu0+WE6ojpZLOU2jdnqbrM1hmVdGzyeCa1DgM3X5Q4A/Is9xA1IkbUeDd7755dNNI/PzSf2Pew==" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fancybox/3.5.7/jquery.fancybox.min.js" integrity="sha512-uURl+ZXMBrF4AwGaWmEetzrd+J5/8NRkWAvJx5sbPSSuOb0bZLqf+tOzniObO00BjHa/dD7gub9oCGMLPQHtQA==" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/8.4.8/mermaid.min.js" integrity="sha512-1tS1YUns336Mtxl+vkaLcADPwE1CPNVy3WEf7nrI7DGMMb6/FAVBgL2IzAWVBkB6vVuK94s2zVoiXcw1QZ9S1g==" crossorigin="anonymous" title="mermaid"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/highlight.min.js" integrity="sha512-1LdB3V708w6G4QRl7NsVdTr7MDibyRXr9stQZ+EGjEE0ZPMZkA//ir7kCWmFyxdAJNIRXdR/ZeJmCV0boyiCXw==" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/languages/java.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/languages/json.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/languages/xml.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/languages/shell.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/languages/dos.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.5.1/leaflet.js" integrity="sha512-GffPMF3RvMeYyc1LWMHtK8EbPv0iNZ8/oTtHPx9/cc2ILxQ+u905qIwdpULaqDkyBKgOaB57QTMg7ztg8Jm2Og==" crossorigin="anonymous"></script>
<script>const code_highlighting = true;</script>
<script>const isSiteThemeDark = false;</script>
<script>
const search_config = {"indexURI":"/mosaic/index.json","minLength":1,"threshold":0.3};
const i18n = {"no_results":"No results found","placeholder":"Search...","results":"results found"};
const content_type = {
'post': "Posts",
'project': "Projects",
'publication' : "Publications",
'talk' : "Talks"
};
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/anchor-js/4.1.1/anchor.min.js" integrity="sha512-aZotBPy6dqn8yVaLJwSrkJ+QxuxV695A4dgodAMvTU5JyNi5mhrr+LeaD3GSS+lx1SMFKNs0tu5ZMJEgNZQP2Q==" crossorigin="anonymous"></script>
<script>
anchors.add();
</script>
<script id="search-hit-fuse-template" type="text/x-template">
<div class="search-hit" id="summary-{{key}}">
<div class="search-hit-content">
<div class="search-hit-name">
<a href="{{relpermalink}}">{{title}}</a>
<div class="article-metadata search-hit-type">{{type}}</div>
<p class="search-hit-description">{{snippet}}</p>
</div>
</div>
</div>
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fuse.js/3.2.1/fuse.min.js" integrity="sha512-o38bmzBGX+hD3JHWUFCDA09btWaqrNmoJ3RXLlrysA7PP01Kgs4UlE4MhelE1v5dJR3+cxlR4qQlotsW7jKsnw==" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/jquery.mark.min.js" integrity="sha512-mhbv5DqBMgrWL+32MmsDOt/OAvqr/cHimk6B8y/bx/xS88MVkYGPiVv2ixKVrkywF2qHplNRUvFsAHUdxZ3Krg==" crossorigin="anonymous"></script>
<script type="application/javascript" src="/mosaic/js/academic.min.1824b36a85a484362f116f1e24481eb9.js"></script>
<script type="application/javascript" src="/mosaic/js/mosaic-wg-cards.js"></script>
<div id="modal" class="modal fade" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Cite</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<pre><code class="tex hljs"></code></pre>
</div>
<div class="modal-footer">
<a class="btn btn-outline-primary my-1 js-copy-cite" href="#" target="_blank">
<i class="fas fa-copy"></i> Copy
</a>
<a class="btn btn-outline-primary my-1 js-download-cite" href="#" target="_blank">
<i class="fas fa-download"></i> Download
</a>
<div id="modal-error"></div>
</div>
</div>
</div>
</div>
</body>
</html>