-
Notifications
You must be signed in to change notification settings - Fork 2
Designing your Scenario
Your scenario model consists of your network topology and the messages that communicate across it. To define your scenario, identify the ROS2 messages that flow between robots and the configuration of robot network. Construct your scenario model by creating your communication and network components.
Model communication flows between robots by defining ROS2 messages that flow between network nodes. ROS2 communicates between robots using the DDS communication protocol. Communication is sent from publishers and is received by registered subscribers. A publication consists of the publication topic name, the size and frequency of the publication, and QoS properties set for the publication. A subscription consists of the topic name and QoS properties set for the subscription.
Robot swarms are role-based. First we define publication and subscription topics and assign them to roles. Then we define robots by name and assign roles to them.
The publisher, subscriber, and robot properties are defined using comma-separated (CSV) entries in Scenario files as follows, where properties consist of role-based definitions for publication and subscription topics and the names of robots and their role:
-
Publisher - Define publisher topics by role. Also defines the QoS policy (defined below) for publishing the topic. Publisher entries have this format:
Publisher, Role, Topic, Frequency, Size, History, Depth, Reliability, Durability
This example defines a publisher role for a
red_team
robot whereodometry
messages are simulated by transmitting 10 bytes at 500 Hz using a QoS policy ofkeep_last, 0, reliable, volatile
:Publisher, red_team, odometry, 10, 500, keep_last, 0, reliable, volatile
-
Subscriber - Define subscriber topics by role. Also defines the QoS policy (defined below) for the topic. Subscriber entries have this format:
Subscriber, Role, Topic, History, Depth, Reliability, Durability
This example defines a subscriber role for Ground Station
GS
"robots" for receivingodometry
data using a QoS policy ofkeep_last, 0, reliable, volatile
:Subscriber, GS, odometry, keep_last, 0, reliable, volatile
-
Robot - Define robot names and the role the robots will take:
Robot, Name, Role
This example assigns robot
R1
to theGS
role:Robot, R1, GS
The QoS policy consists of settings for History, Depth, Reliability, and Durability, see https://index.ros.org/doc/ros2/Concepts/About-Quality-of-Service-Settings/. Here is the QoS syntax for scenario files:
-
History
controls history depth. Modes arekeep_all
andkeep_last
. Forkeep_last
, useDepth
. -
Depth
defines history depth whenHistory
mode iskeep_last
. -
Reliability
regulates reliability of data received. Modes arereliable
andbest_effort
. Forreliable
, DDS will track transmissions and attempt to repair lost transmissions. Forbest_effort
, DDS will not track transmissions and will not attempt to repair lost transmissions. -
Durability
provides durability by transmitting previously transmitted data to readers that join late. Modes aretransient_local
andvolatile
.
Several GUI tools are available for defining complex network configurations, https://dl.acm.org/doi/10.5555/2685617.2685639, https://ieeexplore.ieee.org/document/7148414?reload=true&arnumber=7148414. We describe working with the miniedit
tool because it is packaged with mininet-wifi.
Here are the steps for building the network topology for your Scenario using miniedit
:
-
Start the
miniedit
GUI network editor:~/gits/mininet-wifi/examples/miniedit.py
-
Build your scenario's network configuration using the
miniedit
GUI. -
Save the network configuration as a Python script by opening the
File
menu and selectingExport level 2 script
. -
Edit the saved Python script to make it compatible with the mininet_runner tool:
-
Open the script with an editor.
-
Comment out the lines at the bottom of function
myNetwork
which start the command line interpreter and then stop the network:# CLI(net) # net.stop()
and add this line in its place to return the network object that gets created:
return net
-
While here, you might also wish to rename nodes, change node positions, or rearrange lines to make the code more readable.
-
You might also want to make adjustments. See https://usermanual.wiki/Pdf/mininetwifidraftmanual.297704656/view. For example to add mobility, see Section 5.6.
-
Save your modified Python script.
-
In this example we define a swarm consisting of a ground station (GS
) robot R1
and four red_team
robots R2
through R5
. The ground station is publishing odometry information to the red team robots at 500 Hz. The publisher and the subscriber for the odometry
topic both use the same QoS policy.
Define publication and subscription parameters for the odometry
topic and assign them to roles GS
and red_team
. Then assign these roles to specific robots in our swarm. When the simulation starts, communication will flow between these robots as allowed by their network configuration:
# Publisher, Role, Topic, Frequency, Size, History, Depth, Reliability, Durability
Publisher, GS, odometry, 10, 500, keep_last, 0, reliable, volatile
# Subscribers, Role, Topic, History, Depth, Reliability, Durability
Subscriber, red_team, odometry, keep_last, 0, reliable, volatile
# Robot, Name, Role
Robot, R1, GS
Robot, R2, red_team
Robot, R3, red_team
Robot, R4, red_team
Robot, R5, red_team
Define an ad-hoc network of five stations. Using miniedit
, create a central station with four stations around it and define ad-hoc links between each:
- Click the station (laptop) icon
- Click the five places to drop three stations. You may need to adjust their positions later so they are in range of each other.
- Click the link (line) icon
- For each station, click down on one station, drag the cursor, and release the click on another station to connect stations with a link.
- Click the selection (arrow) icon
- Right click each link to define the connection type as ad-hoc and to set the source and destination properties for wlan0.
- Save the network as a Python script by selecting the File menu and selecting
Export level 2 script
.
The view might look as follows:
Here is the saved file:
#!/usr/bin/python
from mininet.log import setLogLevel, info
from mn_wifi.net import Mininet_wifi
from mn_wifi.node import Station, OVSKernelAP
from mn_wifi.cli import CLI
from mn_wifi.link import wmediumd, adhoc
from mn_wifi.wmediumdConnector import interference
from subprocess import call
def myNetwork():
net = Mininet_wifi(topo=None,
build=False,
link=wmediumd,
wmediumd_mode=interference,
ipBase='10.0.0.0/8')
info( '*** Adding controller\n' )
info( '*** Add switches/APs\n')
info( '*** Add hosts/stations\n')
sta3 = net.addStation('sta3', ip='10.0.0.3',
position='376.0,104.0,0')
sta5 = net.addStation('sta5', ip='10.0.0.5',
position='384.0,373.0,0')
sta4 = net.addStation('sta4', ip='10.0.0.4',
position='204.0,235.0,0')
sta1 = net.addStation('sta1', ip='10.0.0.1',
position='379.0,239.0,0')
sta2 = net.addStation('sta2', ip='10.0.0.2',
position='534.0,235.0,0')
info("*** Configuring Propagation Model\n")
net.setPropagationModel(model="logDistance", exp=3)
info("*** Configuring wifi nodes\n")
net.configureWifiNodes()
info( '*** Add links\n')
net.addLink(sta1, cls=adhoc, ssid='new-ssid', mode='g', channel=1, intf='sta1-wlan0')
net.addLink(sta2, cls=adhoc, ssid='new-ssid', mode='g', channel=1, intf='sta2-wlan0')
net.addLink(sta1, cls=adhoc, ssid='new-ssid', mode='g', channel=1, intf='sta1-wlan0')
net.addLink(sta3, cls=adhoc, ssid='new-ssid', mode='g', channel=1, intf='sta3-wlan0')
net.addLink(sta1, cls=adhoc, ssid='new-ssid', mode='g', channel=1, intf='sta1-wlan0')
net.addLink(sta4, cls=adhoc, ssid='new-ssid', mode='g', channel=1, intf='sta4-wlan0')
net.addLink(sta1, cls=adhoc, ssid='new-ssid', mode='g', channel=1, intf='sta1-wlan0')
net.addLink(sta5, cls=adhoc, ssid='new-ssid', mode='g', channel=1, intf='sta5-wlan0')
net.plotGraph(max_x=1000, max_y=1000)
info( '*** Starting network\n')
net.build()
info( '*** Starting controllers\n')
for controller in net.controllers:
controller.start()
info( '*** Starting switches/APs\n')
info( '*** Post configure nodes\n')
CLI(net)
net.stop()
if __name__ == '__main__':
setLogLevel( 'info' )
myNetwork()
Now edit this file to make it compatible with the mininet runner. Here, we additionally rename station names to robot names, change coordinates of stations, change the plot size, organize the code to be more readable, and remove some redundant addLink
lines:
#!/usr/bin/python
from mininet.log import setLogLevel, info
from mn_wifi.net import Mininet_wifi
from mn_wifi.node import Station, OVSKernelAP
from mn_wifi.cli import CLI
from mn_wifi.link import wmediumd, adhoc
from mn_wifi.wmediumdConnector import interference
from subprocess import call
def myNetwork():
net = Mininet_wifi(topo=None,
build=False,
link=wmediumd,
wmediumd_mode=interference,
ipBase='10.0.0.0/8')
info( '*** Adding controller\n' )
info( '*** Add switches/APs\n')
info( '*** Add hosts/stations\n')
R1 = net.addStation('R1', ip='10.0.0.1', position='0.0,0.0,0')
R2 = net.addStation('R2', ip='10.0.0.2', position='1.0,0.0,0')
R3 = net.addStation('R3', ip='10.0.0.3', position='0.0,1.0,0')
R4 = net.addStation('R4', ip='10.0.0.4', position='-1.0,0.0,0')
R5 = net.addStation('R5', ip='10.0.0.5', position='0.0,-1.0,0')
info("*** Configuring Propagation Model\n")
net.setPropagationModel(model="logDistance", exp=3)
info("*** Configuring wifi nodes\n")
net.configureWifiNodes()
info( '*** Add links\n')
net.addLink(R1, cls=adhoc, ssid='new-ssid', mode='g', channel=1, intf='R1-wlan0')
net.addLink(R2, cls=adhoc, ssid='new-ssid', mode='g', channel=1, intf='R2-wlan0')
net.addLink(R3, cls=adhoc, ssid='new-ssid', mode='g', channel=1, intf='R3-wlan0')
net.addLink(R4, cls=adhoc, ssid='new-ssid', mode='g', channel=1, intf='R4-wlan0')
net.addLink(R5, cls=adhoc, ssid='new-ssid', mode='g', channel=1, intf='R5-wlan0')
net.plotGraph(min_x=-2, min_y=-2, max_x=2, max_y=2)
info( '*** Starting network\n')
net.build()
info( '*** Starting controllers\n')
for controller in net.controllers:
controller.start()
info( '*** Starting switches/APs\n')
info( '*** Post configure nodes\n')
# CLI(net)
# net.stop()
return net
if __name__ == '__main__':
setLogLevel( 'info' )
myNetwork()
Run the example1 scenario using the mininet runner, specifying the example1.csv
scenario message configuration file, the example1.py
network topology setup script, and the log output file:
cd ~/gits/mininet_testbed
./mininet_runner.bash scenarios/example1.py scenarios/example1.csv _mininet_test_outfile
Plot the results of the example1 scenario simulation:
cd ~/gits/mininet_testbed
./plot_analytics.py _mininet_test_outfile five_reliable -w five_reliable
The example1 scenario is described further in Demos.
An alternate workflow is to not provide a network property setup file but to instead put these settings directly into the CSV file (Type none
for the Python filename). This approach only supports ad-hoc network configurations. this workflow is depracated and may be removed.
For ad-hoc networks, we can define stations, links, radio propagation, robot mobility and some other properties directly within the CSV file instead of using miniedit by adding CSV entries. These entries are ignored when using GUI-generated code:
-
Stations - Station definitions for each robot such as location for fixed-location stations:
Station, Name, param=value, ...
For example settings, see
addStation
in the examples in the mininet-wifi repository. -
Links - Radio link information for the network link on each robot:
Link, Name, param=value, ...
For example settings, see
addLink
in the examples in the mininet-wifi repository. -
Propagation Model - The radio signal propagation model:
Propagation Model, param=value, ...
See
setPropagationModel
in the examples in the mininet-wifi repository. -
Mobility Model - The mobility model:
Mobility Model, param=value, ...
See
setMobilityModel
in the examples in the mininet-wifi repository.Alternative to Mobility Model, we can define start and stop points for individual robots using
Start Mobility
,Mobility
, andStop Mobility
, see example usage in the mininet-wifi repository. -
Plot Graph - How to plot the real-time mobility graph:
Plot Graph, param=value, ...
See
plotGraph
in the examples in the mininet-wifi repository.