From de6a588486686768b1ad0ebf3eccf0a155b58cbb Mon Sep 17 00:00:00 2001 From: Mitch Watrous Date: Thu, 10 May 2012 12:30:23 -0700 Subject: [PATCH] Make the ns2 mobility helper class more robust --- src/mobility/helper/ns2-mobility-helper.cc | 90 +++++++++++++++++-- src/mobility/helper/ns2-mobility-helper.h | 18 ++-- .../test/ns2-mobility-helper-test-suite.cc | 24 +++++ 3 files changed, 118 insertions(+), 14 deletions(-) diff --git a/src/mobility/helper/ns2-mobility-helper.cc b/src/mobility/helper/ns2-mobility-helper.cc index 1e0584a23..a7d04fc2e 100644 --- a/src/mobility/helper/ns2-mobility-helper.cc +++ b/src/mobility/helper/ns2-mobility-helper.cc @@ -183,6 +183,13 @@ Ns2MobilityHelper::ConfigNodesMovements (const ObjectStore &store) const { map last_pos; // Stores previous movement scheduled for each node + //***************************************************************** + // Parse the file the first time to get the initial node positions. + //***************************************************************** + + // Look through the whole the file for the the initial node + // positions to make this helper robust to handle trace files with + // the initial node positions at the end. std::ifstream file (m_filename.c_str (), std::ios::in); if (file.is_open ()) { @@ -202,6 +209,77 @@ Ns2MobilityHelper::ConfigNodesMovements (const ObjectStore &store) const ParseResult pr = ParseNs2Line (line); // Parse line and obtain tokens + // Check if the line corresponds with setting the initial + // node positions + if (pr.tokens.size () != 4) + { + continue; + } + + // Get the node Id + nodeId = GetNodeIdString (pr); + iNodeId = GetNodeIdInt (pr); + if (iNodeId == -1) + { + NS_LOG_ERROR ("Node number couldn't be obtained (corrupted file?): " << line << "\n"); + continue; + } + + // get mobility model of node + Ptr model = GetMobilityModel (nodeId,store); + + // if model not exists, continue + if (model == 0) + { + NS_LOG_ERROR ("Unknown node ID (corrupted file?): " << nodeId << "\n"); + continue; + } + + + /* + * In this case a initial position is being seted + * line like $node_(0) set X_ 151.05190721688197 + */ + if (IsSetInitialPos (pr)) + { + DestinationPoint point; + // coord coord value + point.m_finalPosition = SetInitialPosition (model, pr.tokens[2], pr.dvals[3]); + last_pos[iNodeId] = point; + + // Log new position + NS_LOG_DEBUG ("Positions after parse for node " << iNodeId << " " << nodeId << + " position = " << last_pos[iNodeId].m_finalPosition); + } + } + file.close (); + } + + //***************************************************************** + // Parse the file a second time to get the rest of its values + //***************************************************************** + + // The reason the file is parsed again is to make this helper robust + // to handle trace files with the initial node positions at the end. + file.open (m_filename.c_str (), std::ios::in); + if (file.is_open ()) + { + while (!file.eof () ) + { + int iNodeId = 0; + std::string nodeId; + std::string line; + + getline (file, line); + + // ignore empty lines + if (line.empty ()) + { + continue; + } + + ParseResult pr = ParseNs2Line (line); // Parse line and obtain tokens + // Check if the line corresponds with one of the three types of line if (pr.tokens.size () != 4 && pr.tokens.size () != 7 && pr.tokens.size () != 8) { @@ -235,14 +313,10 @@ Ns2MobilityHelper::ConfigNodesMovements (const ObjectStore &store) const */ if (IsSetInitialPos (pr)) { - DestinationPoint point; - // coord coord value - point.m_finalPosition = SetInitialPosition (model, pr.tokens[2], pr.dvals[3]); - last_pos[iNodeId] = point; - - // Log new position - NS_LOG_DEBUG ("Positions after parse for node " << iNodeId << " " << nodeId << - " position = " << last_pos[iNodeId].m_finalPosition); + // This is the second time this file has been parsed, + // and the initial node positions were already set the + // first time. So, do nothing this time with this line. + continue; } else // NOW EVENTS TO BE SCHEDULED diff --git a/src/mobility/helper/ns2-mobility-helper.h b/src/mobility/helper/ns2-mobility-helper.h index d17b15471..a9e5a13c5 100644 --- a/src/mobility/helper/ns2-mobility-helper.h +++ b/src/mobility/helper/ns2-mobility-helper.h @@ -50,6 +50,18 @@ class ConstantVelocityMobilityModel; $ns at $time $node set Z_ Z1 \endverbatim * + * Note that initial position statements may also appear at the end of + * the mobility file like this: + \verbatim + $ns at $time $node setdest x2 y2 speed + $ns at $time $node set X_ x1 + $ns at $time $node set Y_ Y1 + $ns at $time $node set Z_ Z1 + $node set X_ x1 + $node set Y_ y1 + $node set Z_ z1 + \endverbatim + * * The following tools are known to support this format: * - BonnMotion http://net.cs.uni-bonn.de/wg/cs/applications/bonnmotion/ * - SUMO http://sourceforge.net/apps/mediawiki/sumo/index.php?title=Main_Page @@ -57,12 +69,6 @@ class ConstantVelocityMobilityModel; * * See usage example in examples/mobility/ns2-mobility-trace.cc * - * \bug Traces that generate initial position statements at the end of the - * mobility file (e.g. SUMO TraceExporter) will not be read correctly. The - * workaround is to relocate these three initial position statements to the - * beginning of the trace. - * See https://www.nsnam.org/bugzilla/show_bug.cgi?id=1316 - * * \bug Rounding errors may cause movement to diverge from the mobility * pattern in ns-2 (using the same trace). * See https://www.nsnam.org/bugzilla/show_bug.cgi?id=1316 diff --git a/src/mobility/test/ns2-mobility-helper-test-suite.cc b/src/mobility/test/ns2-mobility-helper-test-suite.cc index 14d46e9cc..8b0fb0608 100644 --- a/src/mobility/test/ns2-mobility-helper-test-suite.cc +++ b/src/mobility/test/ns2-mobility-helper-test-suite.cc @@ -300,6 +300,30 @@ public: t->AddReferencePoint ("0", 5, Vector (0, 0, 0), Vector (0, 0, 0)); AddTestCase (t); + // Copy of previous test case but with the initial positions at + // the end of the trace rather than at the beginning. + // + // Several set and setdest. Arguments are interpreted as x, y, speed by default + t = new Ns2MobilityHelperTest ("square setdest (initial positions at end)", Seconds (6)); + t->SetTrace ("$ns_ at 1.0 \"$node_(0) setdest 15 10 5\"\n" + "$ns_ at 2.0 \"$node_(0) setdest 15 15 5\"\n" + "$ns_ at 3.0 \"$node_(0) setdest 10 15 5\"\n" + "$ns_ at 4.0 \"$node_(0) setdest 10 10 5\"\n" + "$node_(0) set X_ 10.0\n" + "$node_(0) set Y_ 10.0\n" + ); + // id t position velocity + t->AddReferencePoint ("0", 0, Vector (10, 10, 0), Vector (0, 0, 0)); + t->AddReferencePoint ("0", 1, Vector (10, 10, 0), Vector (5, 0, 0)); + t->AddReferencePoint ("0", 2, Vector (15, 10, 0), Vector (0, 0, 0)); + t->AddReferencePoint ("0", 2, Vector (15, 10, 0), Vector (0, 5, 0)); + t->AddReferencePoint ("0", 3, Vector (15, 15, 0), Vector (0, 0, 0)); + t->AddReferencePoint ("0", 3, Vector (15, 15, 0), Vector (-5, 0, 0)); + t->AddReferencePoint ("0", 4, Vector (10, 15, 0), Vector (0, 0, 0)); + t->AddReferencePoint ("0", 4, Vector (10, 15, 0), Vector (0, -5, 0)); + t->AddReferencePoint ("0", 5, Vector (10, 10, 0), Vector (0, 0, 0)); + AddTestCase (t); + // Scheduled set position t = new Ns2MobilityHelperTest ("scheduled set position", Seconds (2)); t->SetTrace ("$ns_ at 1.0 \"$node_(0) set X_ 10\"\n"