Mapbase

From Rsewiki
Revision as of 10:11, 5 September 2011 by Jca (talk | contribs)

The mapbase plugin were created for the masters thesis Mission Management for Mobile Robots by Anders Beck. http://www.elektro.dtu.dk/English/research/publications_elektro.aspx?lg=showcommon&id=246287

Part of the thesis is reproduced here:

Mapbase on-line functions

The on-line commands for mapbase is (with some maps from the Tåstrup environemnt loaded):

>> mapbase help
>> <help subject="Mapbase">
--- available Mapbase options
help             This message
mapload=[file]   Loads data in file into database
graphload=[file] Loads graph data into database
export           Exports the entire map in XML format
mapLines         Export map lines
list          Display current contents of database
status:  has 77 nodes, 486 edges, 25 lines, 0 points
current node = 'taastrup' at (708000.00x, 6174000.00y, 0.0000h)
</help>

In addition some inter-plugin variables and function calls are available.

>> var mapbase
>> <help subject="var list" name="mapbase">
Description:                  Database for maprelated information.
  connMapPose=0 0 0          Return value of Connetor mappose
  edge(ds)                   Get feature value from [s] extracted from the edge id [d]
  edge(ss)                   Get feature value from [s] extracted from the edge name
                             [s]. Syntax: (edgename,featurename)
  node(ds)                   Get feature value from [s] extracted from the node id [d]
  node(ss)                   Get feature value from [s] extracted from the node name
                             [s]. Syntax: (nodename,featurename)
  connector(ds)              Get feature value from [s] extracted from the connector id
                             [d]
  connector(ss)              Get feature value from [s] extracted from the connector
                             name [s]. Syntax: (connname,featurename) (This is not
                             working properly, if unknown connectorname is entered)
  getConnMapPose(s)          Get the mappose of a connector (returns in var
                             connMapPose)
  addMapLine(sdddddd)        Add a mapline to current reference node. Parameters are
                             addMapLine("name", startX, startY, endX, endY, radius,
                             isObstacle). If isObstacle==0, then line is for localizer
                             only. Coordinates are in map coordinates (see graph for
                             position of node).
(H: has time series, L: is logged, R: replay)
</help>

Load a map

The mapbase was loaded and configured with this part of the aurobotserver .ini file:

...
module load="mapbase.so.0"
mapbase mapload="./apple_cherry_map.xml"
mapbase graphload="./apple_cherry_graph.xml"
...

Use of mapbase

The map

An example of using the mapbase plugin, is getting a pointer to the plugin-class, and using its functions directly. This method in another plugin (aumapobst.so.0) fetches some maplines and forwards them to the locater (aulocater.so.0):

int UResMapObst::sendMapLinesToLocalizer(int client, bool justObstacles)
{
 UResMapbase * mapbase;
 bool isOK;
 mapline ml;
 int i, n = 0;
 U2Dseg line, sb, sf, sl, sr;
 U2Dpos bl, fl, br, fr, xp; // search box
 UPose ps1, ps2, ps3;
 U2Dpos po1, po2, po3, po4;
 UPosition pos1, pos2;
 UPoseTime pt;
 const int MRL = 500;
 char reply[MRL];
 // Acquire mapbase resource:
 mapbase = (UResMapbase *) getStaticResource("mapbase", false, false);
 if (mapbase != NULL)
 { // resources are available
   for(i = 0; i < (int) mapbase->maplines.size(); i++)
   {
     ml = mapbase->maplines[i];
     isOK = ml.isObstacle or not justObstacles;
     if (isOK and true)
     { // this line is to be included
       snprintf(reply, MRL, "addline startx=\"%.6f\" starty=\"%.6f\" endx=\"%.6f\" endy=\"%.6f\" name=\"%s\"\n",
              ml.x_s, ml.y_s, ml.x_e, ml.y_e, ml.number);
       getCorePointer()->postCommand(client, reply);
       n++;
       // debug
       printf("----- %s", reply);
       // debug end
     }
   }
   varMapLineCnt->setInt(n);
 }
 return n;
}


The graph

An example of using the graph nodes (in the apple_cherry_graph.xml loaded above) is the mission rule used on the cherry orchard mission:

<rule name="cherryFull" run="false">
 <init>
   global.drive.compasHeading=false # means math heading (east is 0)
   global.drive.radians=false # means degrees
   global.drive.continueDist = 1.6 # meter, relaxed driving
   # global.drive.continueDist = 0 # meter, tight driving
 </init>
 missionStart("cherryFull")
 smr.do('setvar "hakoliftinggearstateref" 130')
 wait(3) : false
 global.drive.engineRPM = 1900;
 smr.do('setvar "hakoenginespeed" 1900') # RPM
 smr.speed = 0.5 # desired drive speed m/s (0.7m/s~2.5km/h)
 smrctl.directOrWait = false
 #
 global.drive.holdLine=true
 driveNode("taastrup.cherrytrans_9-10S", 0)

 driveNode("taastrup.cherrypath_10-11S", 180)
 smrctl.directOrWait = true
 driveNode("taastrup.cherrypath_10-11N", 180)
 smrctl.directOrWait = false
 driveNode("taastrup.cherrytrans_9-10N", -180)

 driveNode("taastrup.cherrypath_8-9N", 0)
 smrctl.directOrWait = true
 driveNode("taastrup.cherrypath_8-9S", 0)
 smrctl.directOrWait = false
 driveNode("taastrup.cherrytrans_7-8S", -180)

 driveNode("taastrup.cherrypath_6-7S", 180)
 smrctl.directOrWait = true
 driveNode("taastrup.cherrypath_6-7N", 180)
 smrctl.directOrWait = false
 driveNode("taastrup.cherrytrans_8-9N", 0)

 driveNode("taastrup.cherrypath_9-10N", 0)
 smrctl.directOrWait = true
 driveNode("taastrup.cherrypath_9-10S", 0)
 smrctl.directOrWait = false
 driveNode("taastrup.cherrytrans_6-7S", -180)

 driveNode("taastrup.cherrypath_5-6S", 180)
 smrctl.directOrWait = true
 driveNode("taastrup.cherrypath_5-6N", 180)
 smrctl.directOrWait = false
 driveNode("taastrup.cherrytrans_4-5N", -180)

 driveNode("taastrup.cherrypath_3-4N", 0)
 smrctl.directOrWait = true
 driveNode("taastrup.cherrypath_3-4S", 0)
 smrctl.directOrWait = false
 driveNode("taastrup.cherrytrans_2-3S", -180)

 driveNode("taastrup.cherrypath_1-2S", 180)
 smrctl.directOrWait = true
 driveNode("taastrup.cherrypath_1-2N", 180)
 smrctl.directOrWait = false
 driveNode("taastrup.cherrytrans_3-4N", 0)

 driveNode("taastrup.cherrypath_4-5N", 0)
 smrctl.directOrWait = true
 driveNode("taastrup.cherrypath_4-5S", 0)
 smrctl.directOrWait = false
 driveNode("taastrup.cherrytrans_3-4S", -180)

 driveNode("taastrup.cherrypath_2-3S", 180)
 smrctl.directOrWait = true
 driveNode("taastrup.cherrypath_2-3N", 180)
 smrctl.directOrWait = false
 driveNode("taastrup.cherrytrans_1-2N", 180)

 driveNode("taastrup.cherrypath_0-1N", 0)
 smrctl.directOrWait = true
 driveNode("taastrup.cherrypath_0-1S", 0)
 smrctl.directOrWait = false
 driveNode("taastrup.cherrytrans_3-4S", 0)
 #
 missionEnd()
 # wait a bit before saving the MRC log
 wait(2) : false
 <post>
   smr.saveMrcLog()
   print('finished cherryFull')
 </post>
</rule>

Map definition

An example map is listed below (the cherry orchard in KU-Life Tåstrup (apple_cherry_map.xml)):

<?xml version="1.0" ?>
<map nodename="taastrup">
 <line number="1" perimeter="1.500">
   <start x="-171.049" y="522.576"/>
   <end x="-146.381" y="316.801"/>
 </line>
 <line number="2" perimeter="1.500">
   <start x="-166.177" y="523.663"/>
   <end x="-141.456" y="317.924"/>
 </line>
 <line number="3" perimeter="1.500">
   <start x="-161.306" y="524.751"/>
   <end x="-136.531" y="319.047"/>
 </line>
 <line number="4" perimeter="1.500">
   <start x="-156.434" y="525.838"/>
   <end x="-131.605" y="320.170"/>
 </line>
 <line number="5" perimeter="1.500">
   <start x="-151.562" y="526.926"/>
   <end x="-126.680" y="321.293"/>
 </line>
 <line number="6" perimeter="1.500">
   <start x="-146.691" y="528.013"/>
   <end x="-121.755" y="322.416"/>
 </line>
 <line number="7" perimeter="1.500">
   <start x="-141.819" y="529.101"/>
   <end x="-116.830" y="323.539"/>
 </line>
 <line number="8" perimeter="1.500">
   <start x="-136.947" y="530.188"/>
   <end x="-111.904" y="324.662"/>
 </line>
 <line number="9" perimeter="1.500">
   <start x="-132.076" y="531.276"/>
   <end x="-106.979" y="325.785"/>
 </line>
 <line number="10" perimeter="1.500">
   <start x="-127.204" y="532.363"/>
   <end x="-102.054" y="326.908"/>
 </line>
 <line number="111" perimeter="1.5">
   <start x="144.820" y="391.249"/>
   <end x="156.735" y="259.275"/>
 </line>
 <line number="112" perimeter="1.5">
   <start x="148.456" y="391.686"/>
   <end x="160.292" y="259.670"/>
 </line>
 <line number="113" perimeter="1.5">
   <start x="151.880" y="391.902"/>
   <end x="163.654" y="261.489"/>
 </line>
 <line number="114" perimeter="1.5">
   <start x="155.336" y="392.159"/>
   <end x="167.240" y="260.155"/>
 </line>
 <line number="115" perimeter="1.5">
   <start x="158.810" y="392.547"/>
   <end x="170.822" y="260.477"/>
 </line>
 <line number="116" perimeter="1.5">
   <start x="162.378" y="392.761"/>
   <end x="174.220" y="260.830"/>
 </line>
 <line number="117" perimeter="1.5">
   <start x="166.020" y="390.116"/>
   <end x="177.717" y="261.148"/>
 </line>
 <line number="118" perimeter="1.5">
   <start x="169.469" y="391.844"/>
   <end x="181.187" y="261.472"/>
 </line>
 <line number="119" perimeter="1.5">
   <start x="172.801" y="393.632"/>
   <end x="184.686" y="261.742"/>
 </line>
 <line number="120" perimeter="1.5">
   <start x="176.323" y="394.024"/>
   <end x="188.196" y="262.135"/>
 </line>
 <line number="121" perimeter="1.5">
   <start x="185.746" y="343.686"/>
   <end x="193.214" y="262.447"/>
 </line>
 <line number="122" perimeter="1.5">
   <start x="154.107" y="252.755"/>
   <end x="197.343" y="256.614"/>
 </line>
</map>

Mission graph

The mapbase can also hold a mission graph nodes and edges. An example is the apple_cherry_graph.xml:

<?xml version="1.0" ?>
<graph name="ku_life">
 <nodetype name="waypoint">
   <dimension shape="circle" radius="0.05" />
   <connector name="a" x="0.500" y="-0.500" th="0.00" autoconnect="1" />
   <connector name="b" x="0.500" y="-0.500" th="180.00" autoconnect="1" />
 </nodetype>
 <node name="taastrup" x="708000.0" y="6174000.0" th="0.0">
   
   <node name="applepath_1-2N" type="waypoint" x="146.544" y="392.010" th="-84.929"/>
   <node name="applepath_1-2S" type="waypoint" x="158.417" y="257.037" th="-84.929"/>
   <node name="applepath_2-3N" type="waypoint" x="150.075" y="392.321" th="-84.929"/>
   <node name="applepath_2-3S" type="waypoint" x="161.947" y="257.358" th="-84.929"/>
   <node name="applepath_3-4N" type="waypoint" x="153.509" y="392.623" th="-84.929"/>
   <node name="applepath_3-4S" type="waypoint" x="165.415" y="257.673" th="-84.929"/>
   <node name="applepath_4-5N" type="waypoint" x="156.975" y="392.929" th="-84.929"/>
   <node name="applepath_4-5S" type="waypoint" x="168.924" y="257.992" th="-84.929"/>
   <node name="applepath_5-6N" type="waypoint" x="160.495" y="393.239" th="-84.929"/>
   <node name="applepath_5-6S" type="waypoint" x="172.416" y="258.309" th="-84.929"/>
   <node name="applepath_6-7N" type="waypoint" x="163.962" y="393.544" th="-84.929"/>
   <node name="applepath_6-7S" type="waypoint" x="175.865" y="258.623" th="-84.929"/>
   <node name="applepath_7-8N" type="waypoint" x="167.439" y="393.850" th="-84.929"/>
   <node name="applepath_7-8S" type="waypoint" x="179.349" y="258.940" th="-84.929"/>
   <node name="applepath_8-9N" type="waypoint" x="170.961" y="394.160" th="-84.929"/>
   <node name="applepath_8-9S" type="waypoint" x="182.832" y="259.256" th="-84.929"/>
   <node name="applepath_9-10N" type="waypoint" x="174.588" y="394.468" th="-84.929"/>
   <node name="applepath_9-10S" type="waypoint" x="186.168" y="259.575" th="-84.929"/>
   <node name="appletrans_1-2N" type="waypoint" x="146.874" y="395.502" th="5.271"/>
   <node name="appletrans_1-2S" type="waypoint" x="159.375" y="254.552" th="5.271"/>
   <node name="appletrans_2-3N" type="waypoint" x="150.405" y="395.821" th="5.271"/>
   <node name="appletrans_2-3S" type="waypoint" x="162.906" y="254.871" th="5.271"/>
   <node name="appletrans_3-4N" type="waypoint" x="153.837" y="396.130" th="5.271"/>
   <node name="appletrans_3-4S" type="waypoint" x="166.375" y="255.184" th="5.271"/>
   <node name="appletrans_4-5N" type="waypoint" x="157.302" y="396.443" th="5.271"/>
   <node name="appletrans_4-5S" type="waypoint" x="169.886" y="255.501" th="5.271"/>
   <node name="appletrans_5-6N" type="waypoint" x="160.822" y="396.761" th="5.271"/>
   <node name="appletrans_5-6S" type="waypoint" x="173.376" y="255.816" th="5.271"/>
   <node name="appletrans_6-7N" type="waypoint" x="164.289" y="397.074" th="5.271"/>
   <node name="appletrans_6-7S" type="waypoint" x="176.826" y="256.127" th="5.271"/>
   <node name="appletrans_7-8N" type="waypoint" x="167.765" y="397.388" th="5.271"/>
   <node name="appletrans_7-8S" type="waypoint" x="180.310" y="256.442" th="5.271"/>
   <node name="appletrans_8-9N" type="waypoint" x="171.287" y="397.706" th="5.271"/>
   <node name="appletrans_8-9S" type="waypoint" x="183.792" y="256.756" th="5.271"/>
   <node name="appletrans_9-10N" type="waypoint" x="174.783" y="398.022" th="5.271"/>
   <node name="appletrans_9-10S" type="waypoint" x="187.298" y="256.073" th="5.271"/>
   
   <edge start="applepath_1-2N.a" end="applepath_1-2S.b" length="132.506"/>
   <edge start="applepath_1-2N.b" end="appletrans_2-3N.b" length="4.647"/>
   <edge start="applepath_1-2S.b" end="applepath_1-2N.a" length="132.506"/>
   <edge start="applepath_1-2S.a" end="appletrans_2-3S.b" length="5.345"/>
   <edge start="applepath_2-3N.a" end="applepath_2-3S.b" length="132.496"/>
   <edge start="applepath_2-3N.b" end="appletrans_1-2N.a" length="4.651"/>
   <edge start="applepath_2-3N.b" end="appletrans_3-4N.b" length="4.577"/>
   <edge start="applepath_2-3S.b" end="applepath_2-3N.a" length="132.496"/>
   <edge start="applepath_2-3S.a" end="appletrans_1-2S.a" length="5.348"/>
   <edge start="applepath_2-3S.a" end="appletrans_3-4S.b" length="5.305"/>
   <edge start="applepath_3-4N.a" end="applepath_3-4S.b" length="132.486"/>
   <edge start="applepath_3-4N.b" end="appletrans_2-3N.a" length="4.582"/>
   <edge start="applepath_3-4N.b" end="appletrans_4-5N.b" length="4.606"/>
   <edge start="applepath_3-4S.b" end="applepath_3-4N.a" length="132.486"/>
   <edge start="applepath_3-4S.a" end="appletrans_2-3S.a" length="5.308"/>
   <edge start="applepath_3-4S.a" end="appletrans_4-5S.b" length="5.336"/>
   <edge start="applepath_4-5N.a" end="applepath_4-5S.b" length="132.477"/>
   <edge start="applepath_4-5N.b" end="appletrans_3-4N.a" length="4.612"/>
   <edge start="applepath_4-5N.b" end="appletrans_5-6N.b" length="4.653"/>
   <edge start="applepath_4-5S.b" end="applepath_4-5N.a" length="132.477"/>
   <edge start="applepath_4-5S.a" end="appletrans_3-4S.a" length="5.337"/>
   <edge start="applepath_4-5S.a" end="appletrans_5-6S.b" length="5.325"/>
   <edge start="applepath_5-6N.a" end="applepath_5-6S.b" length="132.467"/>
   <edge start="applepath_5-6N.b" end="appletrans_4-5N.a" length="4.659"/>
   <edge start="applepath_5-6N.b" end="appletrans_6-7N.b" length="4.618"/>
   <edge start="applepath_5-6S.b" end="applepath_5-6N.a" length="132.467"/>
   <edge start="applepath_5-6S.a" end="appletrans_4-5S.a" length="5.325"/>
   <edge start="applepath_5-6S.a" end="appletrans_6-7S.b" length="5.298"/>
   <edge start="applepath_6-7N.a" end="applepath_6-7S.b" length="132.457"/>
   <edge start="applepath_6-7N.b" end="appletrans_5-6N.a" length="4.623"/>
   <edge start="applepath_6-7N.b" end="appletrans_7-8N.b" length="4.630"/>
   <edge start="applepath_6-7S.b" end="applepath_6-7N.a" length="132.457"/>
   <edge start="applepath_6-7S.a" end="appletrans_5-6S.a" length="5.300"/>
   <edge start="applepath_6-7S.a" end="appletrans_7-8S.b" length="5.323"/>
   <edge start="applepath_7-8N.a" end="applepath_7-8S.b" length="132.447"/>
   <edge start="applepath_7-8N.b" end="appletrans_6-7N.a" length="4.635"/>
   <edge start="applepath_7-8N.b" end="appletrans_8-9N.b" length="4.670"/>
   <edge start="applepath_7-8S.b" end="applepath_7-8N.a" length="132.447"/>
   <edge start="applepath_7-8S.a" end="appletrans_6-7S.a" length="5.325"/>
   <edge start="applepath_7-8S.a" end="appletrans_8-9S.b" length="5.323"/>
   <edge start="applepath_8-9N.a" end="applepath_8-9S.b" length="132.437"/>
   <edge start="applepath_8-9N.b" end="appletrans_7-8N.a" length="4.675"/>
   <edge start="applepath_8-9N.b" end="appletrans_9-10N.b" length="4.656"/>
   <edge start="applepath_8-9S.b" end="applepath_8-9N.a" length="132.437"/>
   <edge start="applepath_8-9S.a" end="appletrans_7-8S.a" length="5.325"/>
   <edge start="applepath_8-9S.a" end="appletrans_9-10S.b" length="5.340"/>
   <edge start="applepath_9-10N.a" end="applepath_9-10S.b" length="132.427"/>
   <edge start="applepath_9-10N.b" end="appletrans_8-9N.a" length="4.660"/>
   <edge start="applepath_9-10S.b" end="applepath_9-10N.a" length="132.427"/>
   <edge start="applepath_9-10S.a" end="appletrans_8-9S.a" length="5.343"/>
   <edge start="appletrans_1-2N.a" end="appletrans_2-3N.b" length="3.545"/>
   <edge start="appletrans_1-2S.a" end="appletrans_2-3S.b" length="3.545"/>
   <edge start="appletrans_2-3N.b" end="appletrans_1-2N.a" length="3.545"/>
   <edge start="appletrans_2-3N.a" end="appletrans_3-4N.b" length="3.446"/>
   <edge start="appletrans_2-3S.b" end="appletrans_1-2S.a" length="3.545"/>
   <edge start="appletrans_2-3S.a" end="appletrans_3-4S.b" length="3.483"/>
   <edge start="appletrans_3-4N.b" end="appletrans_2-3N.a" length="3.446"/>
   <edge start="appletrans_3-4N.a" end="appletrans_4-5N.b" length="3.479"/>
   <edge start="appletrans_3-4S.b" end="appletrans_2-3S.a" length="3.483"/>
   <edge start="appletrans_3-4S.a" end="appletrans_4-5S.b" length="3.525"/>
   <edge start="appletrans_4-5N.b" end="appletrans_3-4N.a" length="3.479"/>
   <edge start="appletrans_4-5N.a" end="appletrans_5-6N.b" length="3.535"/>
   <edge start="appletrans_4-5S.b" end="appletrans_3-4S.a" length="3.525"/>
   <edge start="appletrans_4-5S.a" end="appletrans_5-6S.b" length="3.505"/>
   <edge start="appletrans_5-6N.b" end="appletrans_4-5N.a" length="3.535"/>
   <edge start="appletrans_5-6N.a" end="appletrans_6-7N.b" length="3.481"/>
   <edge start="appletrans_5-6S.b" end="appletrans_4-5S.a" length="3.505"/>
   <edge start="appletrans_5-6S.a" end="appletrans_6-7S.b" length="3.463"/>
   <edge start="appletrans_6-7N.b" end="appletrans_5-6N.a" length="3.481"/>
   <edge start="appletrans_6-7N.a" end="appletrans_7-8N.b" length="3.490"/>
   <edge start="appletrans_6-7S.b" end="appletrans_5-6S.a" length="3.463"/>
   <edge start="appletrans_6-7S.a" end="appletrans_7-8S.b" length="3.499"/>
   <edge start="appletrans_7-8N.b" end="appletrans_6-7N.a" length="3.490"/>
   <edge start="appletrans_7-8N.a" end="appletrans_8-9N.b" length="3.537"/>
   <edge start="appletrans_7-8S.b" end="appletrans_6-7S.a" length="3.499"/>
   <edge start="appletrans_7-8S.a" end="appletrans_8-9S.b" length="3.496"/>
   <edge start="appletrans_8-9N.b" end="appletrans_7-8N.a" length="3.537"/>
   <edge start="appletrans_8-9N.a" end="appletrans_9-10N.b" length="3.510"/>
   <edge start="appletrans_8-9S.b" end="appletrans_7-8S.a" length="3.496"/>
   <edge start="appletrans_8-9S.a" end="appletrans_9-10S.b" length="3.520"/>
   <edge start="appletrans_9-10N.b" end="appletrans_8-9N.a" length="3.510"/>
   <edge start="appletrans_9-10S.b" end="appletrans_8-9S.a" length="3.520"/>
   <node name="cherrypath_0-1N" type="waypoint" x="-173.000" y="521.530" th="-83.140"/>
   <node name="cherrypath_0-1S" type="waypoint" x="-148.350" y="315.742" th="-83.140"/>
   <node name="cherrypath_1-2N" type="waypoint" x="-168.113" y="522.620" th="-83.140"/>
   <node name="cherrypath_1-2S" type="waypoint" x="-143.418" y="316.862" th="-83.140"/>
   <node name="cherrypath_2-3N" type="waypoint" x="-163.242" y="523.707" th="-83.140"/>
   <node name="cherrypath_2-3S" type="waypoint" x="-138.493" y="317.985" th="-83.140"/>
   <node name="cherrypath_3-4N" type="waypoint" x="-158.370" y="524.795" th="-83.140"/>
   <node name="cherrypath_3-4S" type="waypoint" x="-133.568" y="319.108" th="-83.140"/>
   <node name="cherrypath_4-5N" type="waypoint" x="-153.498" y="525.882" th="-83.140"/>
   <node name="cherrypath_4-5S" type="waypoint" x="-128.643" y="320.231" th="-83.140"/>
   <node name="cherrypath_5-6N" type="waypoint" x="-148.627" y="526.970" th="-83.140"/>
   <node name="cherrypath_5-6S" type="waypoint" x="-123.718" y="321.354" th="-83.140"/>
   <node name="cherrypath_6-7N" type="waypoint" x="-143.755" y="528.057" th="-83.140"/>
   <node name="cherrypath_6-7S" type="waypoint" x="-118.792" y="322.477" th="-83.140"/>
   <node name="cherrypath_7-8N" type="waypoint" x="-138.883" y="529.144" th="-83.140"/>
   <node name="cherrypath_7-8S" type="waypoint" x="-113.867" y="323.600" th="-83.140"/>
   <node name="cherrypath_8-9N" type="waypoint" x="-134.011" y="530.232" th="-83.140"/>
   <node name="cherrypath_8-9S" type="waypoint" x="-108.942" y="324.723" th="-83.140"/>
   <node name="cherrypath_9-10N" type="waypoint" x="-129.140" y="531.319" th="-83.140"/>
   <node name="cherrypath_9-10S" type="waypoint" x="-104.017" y="325.846" th="-83.140"/>
   <node name="cherrypath_10-11N" type="waypoint" x="-123.770" y="532.400" th="-83.140"/>
   <node name="cherrypath_10-11S" type="waypoint" x="-98.600" y="326.960" th="-83.140"/>
   <node name="cherrytrans_1-2N" type="waypoint" x="-168.592" y="527.1" th="12.58"/>
   <node name="cherrytrans_1-2S" type="waypoint" x="-142.939" y="311.869" th="12.58"/>
   <node name="cherrytrans_2-3N" type="waypoint" x="-163.722" y="528.2" th="12.58"/>
   <node name="cherrytrans_2-3S" type="waypoint" x="-138.013" y="312.992" th="12.58"/>
   <node name="cherrytrans_3-4N" type="waypoint" x="-158.851" y="529.3" th="12.58"/>
   <node name="cherrytrans_3-4S" type="waypoint" x="-133.086" y="314.116" th="12.58"/>
   <node name="cherrytrans_4-5N" type="waypoint" x="-153.981" y="530.4" th="12.58"/>
   <node name="cherrytrans_4-5S" type="waypoint" x="-128.160" y="315.239" th="12.58"/>
   <node name="cherrytrans_5-6N" type="waypoint" x="-149.110" y="531.5" th="12.58"/>
   <node name="cherrytrans_5-6S" type="waypoint" x="-123.234" y="316.362" th="12.58"/>
   <node name="cherrytrans_6-7N" type="waypoint" x="-144.239" y="532.5" th="12.58"/>
   <node name="cherrytrans_6-7S" type="waypoint" x="-118.308" y="317.485" th="12.58"/>
   <node name="cherrytrans_7-8N" type="waypoint" x="-139.369" y="533.6" th="12.58"/>
   <node name="cherrytrans_7-8S" type="waypoint" x="-113.381" y="318.609" th="12.58"/>
   <node name="cherrytrans_8-9N" type="waypoint" x="-134.498" y="535.2" th="12.58"/>
   <node name="cherrytrans_8-9S" type="waypoint" x="-108.455" y="319.732" th="12.58"/>
   <node name="cherrytrans_9-10N" type="waypoint" x="-129.628" y="535.5" th="8.0"/>
   <node name="cherrytrans_9-10S" type="waypoint" x="-103.529" y="320.855" th="12.58"/>
   <edge start="cherrypath_1-2N.a" end="cherrypath_1-2S.b" length="207.234"/>
   <edge start="cherrypath_1-2N.b" end="cherrytrans_2-3N.b" length="6.714"/>
   <edge start="cherrypath_1-2S.b" end="cherrypath_1-2N.a" length="207.234"/>
   <edge start="cherrypath_1-2S.a" end="cherrytrans_2-3S.b" length="6.120"/>
   <edge start="cherrypath_2-3N.a" end="cherrypath_2-3S.b" length="207.205"/>
   <edge start="cherrypath_2-3N.b" end="cherrytrans_1-2N.a" length="6.088"/>
   <edge start="cherrypath_2-3N.b" end="cherrytrans_3-4N.b" length="6.713"/>
   <edge start="cherrypath_2-3S.b" end="cherrypath_2-3N.a" length="207.205"/>
   <edge start="cherrypath_2-3S.a" end="cherrytrans_1-2S.a" length="6.778"/>
   <edge start="cherrypath_2-3S.a" end="cherrytrans_3-4S.b" length="6.121"/>
   <edge start="cherrypath_3-4N.a" end="cherrypath_3-4S.b" length="207.176"/>
   <edge start="cherrypath_3-4N.b" end="cherrytrans_2-3N.a" length="6.089"/>
   <edge start="cherrypath_3-4N.b" end="cherrytrans_4-5N.b" length="6.712"/>
   <edge start="cherrypath_3-4S.b" end="cherrypath_3-4N.a" length="207.176"/>
   <edge start="cherrypath_3-4S.a" end="cherrytrans_2-3S.a" length="6.777"/>
   <edge start="cherrypath_3-4S.a" end="cherrytrans_4-5S.b" length="6.122"/>
   <edge start="cherrypath_4-5N.a" end="cherrypath_4-5S.b" length="207.147"/>
   <edge start="cherrypath_4-5N.b" end="cherrytrans_3-4N.a" length="6.090"/>
   <edge start="cherrypath_4-5N.b" end="cherrytrans_5-6N.b" length="6.711"/>
   <edge start="cherrypath_4-5S.b" end="cherrypath_4-5N.a" length="207.147"/>
   <edge start="cherrypath_4-5S.a" end="cherrytrans_3-4S.a" length="6.776"/>
   <edge start="cherrypath_4-5S.a" end="cherrytrans_5-6S.b" length="6.123"/>
   <edge start="cherrypath_5-6N.a" end="cherrypath_5-6S.b" length="207.118"/>
   <edge start="cherrypath_5-6N.b" end="cherrytrans_4-5N.a" length="6.091"/>
   <edge start="cherrypath_5-6N.b" end="cherrytrans_6-7N.b" length="6.710"/>
   <edge start="cherrypath_5-6S.b" end="cherrypath_5-6N.a" length="207.118"/>
   <edge start="cherrypath_5-6S.a" end="cherrytrans_4-5S.a" length="6.775"/>
   <edge start="cherrypath_5-6S.a" end="cherrytrans_6-7S.b" length="6.124"/>
   <edge start="cherrypath_6-7N.a" end="cherrypath_6-7S.b" length="207.089"/>
   <edge start="cherrypath_6-7N.b" end="cherrytrans_5-6N.a" length="6.091"/>
   <edge start="cherrypath_6-7N.b" end="cherrytrans_7-8N.b" length="6.710"/>
   <edge start="cherrypath_6-7S.b" end="cherrypath_6-7N.a" length="207.089"/>
   <edge start="cherrypath_6-7S.a" end="cherrytrans_5-6S.a" length="6.775"/>
   <edge start="cherrypath_6-7S.a" end="cherrytrans_7-8S.b" length="6.125"/>
   <edge start="cherrypath_7-8N.a" end="cherrypath_7-8S.b" length="207.061"/>
   <edge start="cherrypath_7-8N.b" end="cherrytrans_6-7N.a" length="6.092"/>
   <edge start="cherrypath_7-8N.b" end="cherrytrans_8-9N.b" length="6.709"/>
   <edge start="cherrypath_7-8S.b" end="cherrypath_7-8N.a" length="207.061"/>
   <edge start="cherrypath_7-8S.a" end="cherrytrans_6-7S.a" length="6.774"/>
   <edge start="cherrypath_7-8S.a" end="cherrytrans_8-9S.b" length="6.125"/>
   <edge start="cherrypath_8-9N.a" end="cherrypath_8-9S.b" length="207.032"/>
   <edge start="cherrypath_8-9N.b" end="cherrytrans_7-8N.a" length="6.093"/>
   <edge start="cherrypath_8-9N.b" end="cherrytrans_9-10N.b" length="6.708"/>
   <edge start="cherrypath_8-9S.b" end="cherrypath_8-9N.a" length="207.032"/>
   <edge start="cherrypath_8-9S.a" end="cherrytrans_7-8S.a" length="6.773"/>
   <edge start="cherrypath_8-9S.a" end="cherrytrans_9-10S.b" length="6.126"/>
   <edge start="cherrypath_9-10N.a" end="cherrypath_9-10S.b" length="207.003"/>
   <edge start="cherrypath_9-10N.b" end="cherrytrans_8-9N.a" length="6.094"/>
   <edge start="cherrypath_9-10S.b" end="cherrypath_9-10N.a" length="207.003"/>
   <edge start="cherrypath_9-10S.a" end="cherrytrans_8-9S.a" length="6.772"/>
   <edge start="cherrytrans_1-2N.a" end="cherrytrans_2-3N.b" length="4.990"/>
   <edge start="cherrytrans_1-2S.a" end="cherrytrans_2-3S.b" length="5.053"/>
   <edge start="cherrytrans_2-3N.b" end="cherrytrans_1-2N.a" length="4.990"/>
   <edge start="cherrytrans_2-3N.a" end="cherrytrans_3-4N.b" length="4.990"/>
   <edge start="cherrytrans_2-3S.b" end="cherrytrans_1-2S.a" length="5.053"/>
   <edge start="cherrytrans_2-3S.a" end="cherrytrans_3-4S.b" length="5.053"/>
   <edge start="cherrytrans_3-4N.b" end="cherrytrans_2-3N.a" length="4.990"/>
   <edge start="cherrytrans_3-4N.a" end="cherrytrans_4-5N.b" length="4.990"/>
   <edge start="cherrytrans_3-4S.b" end="cherrytrans_2-3S.a" length="5.053"/>
   <edge start="cherrytrans_3-4S.a" end="cherrytrans_4-5S.b" length="5.053"/>
   <edge start="cherrytrans_4-5N.b" end="cherrytrans_3-4N.a" length="4.990"/>
   <edge start="cherrytrans_4-5N.a" end="cherrytrans_5-6N.b" length="4.990"/>
   <edge start="cherrytrans_4-5S.b" end="cherrytrans_3-4S.a" length="5.053"/>
   <edge start="cherrytrans_4-5S.a" end="cherrytrans_5-6S.b" length="5.053"/>
   <edge start="cherrytrans_5-6N.b" end="cherrytrans_4-5N.a" length="4.990"/>
   <edge start="cherrytrans_5-6N.a" end="cherrytrans_6-7N.b" length="4.990"/>
   <edge start="cherrytrans_5-6S.b" end="cherrytrans_4-5S.a" length="5.053"/>
   <edge start="cherrytrans_5-6S.a" end="cherrytrans_6-7S.b" length="5.053"/>
   <edge start="cherrytrans_6-7N.b" end="cherrytrans_5-6N.a" length="4.990"/>
   <edge start="cherrytrans_6-7N.a" end="cherrytrans_7-8N.b" length="4.990"/>
   <edge start="cherrytrans_6-7S.b" end="cherrytrans_5-6S.a" length="5.053"/>
   <edge start="cherrytrans_6-7S.a" end="cherrytrans_7-8S.b" length="5.053"/>
   <edge start="cherrytrans_7-8N.b" end="cherrytrans_6-7N.a" length="4.990"/>
   <edge start="cherrytrans_7-8N.a" end="cherrytrans_8-9N.b" length="4.990"/>
   <edge start="cherrytrans_7-8S.b" end="cherrytrans_6-7S.a" length="5.053"/>
   <edge start="cherrytrans_7-8S.a" end="cherrytrans_8-9S.b" length="5.053"/>
   <edge start="cherrytrans_8-9N.b" end="cherrytrans_7-8N.a" length="4.990"/>
   <edge start="cherrytrans_8-9N.a" end="cherrytrans_9-10N.b" length="4.990"/>
   <edge start="cherrytrans_8-9S.b" end="cherrytrans_7-8S.a" length="5.053"/>
   <edge start="cherrytrans_8-9S.a" end="cherrytrans_9-10S.b" length="5.053"/>
   <edge start="cherrytrans_9-10N.b" end="cherrytrans_8-9N.a" length="4.990"/>
   <edge start="cherrytrans_9-10S.b" end="cherrytrans_8-9S.a" length="5.053"/>
   <edge start="cherrypath_10-11S.b" end="cherrypath_10-11N.a" length="207.003"/>
   <edge start="cherrypath_10-11S.a" end="cherrytrans_9-10S.a" length="6.126"/>
   <edge start="cherrypath_10-11N.b" end="cherrytrans_9-10N.a" length="6.126"/>
 </node>
</graph>