Mapbase
(→Use of grapg) |
(→Introduction) |
||
(10 intermediate revisions by one user not shown) | |||
Line 1: | Line 1: | ||
− | The mapbase plugin were created for the masters thesis Mission Management for Mobile Robots by Anders Beck. http:// | + | ===Introduction=== |
+ | |||
+ | The mapbase plugin were created for the masters thesis Mission Management for Mobile Robots by Anders Beck. | ||
+ | |||
+ | http://aut.elektro.dtu.dk/mobotware/doc/Mission_Management_for_Mobile_Robots.pdf.pdf | ||
+ | |||
+ | The mapbase describes a graph that consist of nodes and edges (that connect the nodes), a nodes can further have a number of map lines and points described in the local coordinatesystem of the node. | ||
+ | |||
+ | The map graph has a reference node that describes a pose in some (world) coordinate system. This pose is then the origin of further sub-nodes (and each of these can then be used as origin in an even more localized coordinate system with its own nodes). | ||
+ | The nodes can be connected with edges, the nodes and edges describe a full graph (one or more connected graphs). Each node and edge can hold additional new attributes, that the user can retrieve. | ||
+ | |||
+ | In a reference node there can further be defined map lines and map points, these points and lines are defined in the coordinate system of the node. The map lines and points can further have attributes, that can be retrieved. | ||
+ | |||
+ | ===Load the mapbase plugin=== | ||
+ | |||
+ | The graph and map-lines are defined in separate files. | ||
+ | |||
+ | A mapbase system can be loaded into any AURS server (camera server (ucamserver), laser server (ulmsserver), or the "empty" server userver. | ||
+ | |||
+ | The mapbase in the examples below were loaded and configured with this part of the AURS .ini file (AURS/build/config/conf_hako2/aunav.ini): | ||
+ | |||
+ | ... | ||
+ | module load="mapbase.so.0" | ||
+ | mapbase mapload="./apple_cherry_map.xml" | ||
+ | mapbase graphload="./apple_cherry_graph.xml" | ||
+ | ... | ||
− | |||
===Mapbase on-line functions=== | ===Mapbase on-line functions=== | ||
Line 47: | Line 71: | ||
</help> | </help> | ||
− | === | + | ===Use of mapbase=== |
− | The | + | ====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; | ||
+ | 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. | ||
+ | |||
+ | The first rule "driveNode" (used as a function) fetches the node pose from mapbase, the second mission rule (cherryFull) provides the node sequence. | ||
+ | |||
+ | The rule interpreter is the plugin (aurule.so.0), where "driveNode" is parh of the "drivebase.rule" set of rules (in AURS/build/config/conf_hako2/drivebase.rule). | ||
+ | |||
+ | <rule name="driveNode"> | ||
+ | <parameters node="' '" hdg="0"/> | ||
+ | <init> | ||
+ | nextNode[2] = 0.0; | ||
+ | </init> | ||
+ | nextNode[0] = mapbase.node(node, 'x') | ||
+ | nextNode[1] = mapbase.node(node, 'y') | ||
+ | nextNode[2] = mapbase.node(node, 'th') + hdg | ||
+ | driveMap(nextNode[0], nextNode[1], nextNode[2]) | ||
+ | </rule> | ||
− | |||
<rule name="cherryFull" run="false"> | <rule name="cherryFull" run="false"> | ||
Line 120: | Line 189: | ||
smrctl.directOrWait = false | smrctl.directOrWait = false | ||
driveNode("taastrup.cherrytrans_3-4N", 0) | driveNode("taastrup.cherrytrans_3-4N", 0) | ||
− | + | ||
driveNode("taastrup.cherrypath_4-5N", 0) | driveNode("taastrup.cherrypath_4-5N", 0) | ||
smrctl.directOrWait = true | smrctl.directOrWait = true | ||
Line 126: | Line 195: | ||
smrctl.directOrWait = false | smrctl.directOrWait = false | ||
driveNode("taastrup.cherrytrans_3-4S", -180) | driveNode("taastrup.cherrytrans_3-4S", -180) | ||
− | + | ||
driveNode("taastrup.cherrypath_2-3S", 180) | driveNode("taastrup.cherrypath_2-3S", 180) | ||
smrctl.directOrWait = true | smrctl.directOrWait = true | ||
Line 132: | Line 201: | ||
smrctl.directOrWait = false | smrctl.directOrWait = false | ||
driveNode("taastrup.cherrytrans_1-2N", 180) | driveNode("taastrup.cherrytrans_1-2N", 180) | ||
− | + | ||
driveNode("taastrup.cherrypath_0-1N", 0) | driveNode("taastrup.cherrypath_0-1N", 0) | ||
smrctl.directOrWait = true | smrctl.directOrWait = true | ||
Line 253: | Line 322: | ||
</map> | </map> | ||
− | ===Mission graph=== | + | ===Mission graph definition=== |
The mapbase can also hold a mission graph nodes and edges. | The mapbase can also hold a mission graph nodes and edges. |
Latest revision as of 08:57, 29 August 2012
Contents |
[edit] Introduction
The mapbase plugin were created for the masters thesis Mission Management for Mobile Robots by Anders Beck.
http://aut.elektro.dtu.dk/mobotware/doc/Mission_Management_for_Mobile_Robots.pdf.pdf
The mapbase describes a graph that consist of nodes and edges (that connect the nodes), a nodes can further have a number of map lines and points described in the local coordinatesystem of the node.
The map graph has a reference node that describes a pose in some (world) coordinate system. This pose is then the origin of further sub-nodes (and each of these can then be used as origin in an even more localized coordinate system with its own nodes). The nodes can be connected with edges, the nodes and edges describe a full graph (one or more connected graphs). Each node and edge can hold additional new attributes, that the user can retrieve.
In a reference node there can further be defined map lines and map points, these points and lines are defined in the coordinate system of the node. The map lines and points can further have attributes, that can be retrieved.
[edit] Load the mapbase plugin
The graph and map-lines are defined in separate files.
A mapbase system can be loaded into any AURS server (camera server (ucamserver), laser server (ulmsserver), or the "empty" server userver.
The mapbase in the examples below were loaded and configured with this part of the AURS .ini file (AURS/build/config/conf_hako2/aunav.ini):
... module load="mapbase.so.0" mapbase mapload="./apple_cherry_map.xml" mapbase graphload="./apple_cherry_graph.xml" ...
[edit] 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>
[edit] Use of mapbase
[edit] 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; 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; }
[edit] 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.
The first rule "driveNode" (used as a function) fetches the node pose from mapbase, the second mission rule (cherryFull) provides the node sequence.
The rule interpreter is the plugin (aurule.so.0), where "driveNode" is parh of the "drivebase.rule" set of rules (in AURS/build/config/conf_hako2/drivebase.rule).
<rule name="driveNode"> <parameters node="' '" hdg="0"/> <init> nextNode[2] = 0.0; </init> nextNode[0] = mapbase.node(node, 'x') nextNode[1] = mapbase.node(node, 'y') nextNode[2] = mapbase.node(node, 'th') + hdg driveMap(nextNode[0], nextNode[1], nextNode[2]) </rule>
<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>
[edit] 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>
[edit] Mission graph definition
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>