From a1c8e0a0933aec7204b614af199025efcf600f7c Mon Sep 17 00:00:00 2001 From: Matteo Cypriani Date: Wed, 14 May 2014 17:04:44 -0400 Subject: [PATCH] [Positioner] New option filter.cp-reset-distance The new option positioning.filter.cp-reset-distance allows to disable the filter when the unfiltered location of the mobile terminal is found to be close enough to a capture point. --- owlps-positioner/cfg/owlps-positioner.conf | 10 ++++ owlps-positioner/positioning.cc | 53 ++++++++++++++++------ owlps-positioner/userinterface.cc | 4 ++ 3 files changed, 53 insertions(+), 14 deletions(-) diff --git a/owlps-positioner/cfg/owlps-positioner.conf b/owlps-positioner/cfg/owlps-positioner.conf index ca848e2..2cd70a3 100644 --- a/owlps-positioner/cfg/owlps-positioner.conf +++ b/owlps-positioner/cfg/owlps-positioner.conf @@ -257,6 +257,16 @@ mobile-csv-file = /usr/local/etc/owlps/mobiles.csv # This option also controls the activation of the filter (0 = disabled). #max-speed = 0 +# With this option set to a positive number, the filtering is temporary +# disabled when the mobile terminal is found to be close enough to a +# capture point. This option determines this "close enough" distance, in +# metres. +# This is useful in deployments where the system is much more accurate +# when the mobile is close to a capture point, such as underground +# mining tunnels; in such environments, 15 m appears to be a reasonable +# value to start experimenting. +#cp-reset-distance = 0 + [output] # The following options are related to the output of the results. diff --git a/owlps-positioner/positioning.cc b/owlps-positioner/positioning.cc index e083822..0f8a4f4 100644 --- a/owlps-positioner/positioning.cc +++ b/owlps-positioner/positioning.cc @@ -194,34 +194,63 @@ void Positioning::loop() */ void Positioning::filter(const Request &request, Result &result) { - // Don't apply filter if filtering is disabled + /* Don't apply filter if filtering is disabled */ float max_speed = Configuration::float_value("positioning.filter.max-speed") ; if (max_speed <= 0) return ; - // Don't apply filter if it is the first result we compute for this - // mobile (hence we don't have previous results to compare to) + /* Don't apply filter if it is the first result we compute for this + * mobile (hence we don't have previous results to compare to) */ const Mobile *const mobile = request.get_mobile() ; const ResultList &last_results = mobile->get_last_results() ; if(last_results.empty()) return ; - // Don't apply filter if the "algorithm" is the real position + /* Don't apply filter if the "algorithm" is the real position */ string algo_name = result.get_algorithm() ; if (algo_name == "Real") return ; + /* Print the common message in verbose mode */ + const Timestamp ×tamp = result.get_request()->get_time_sent() ; + if (Configuration::is_configured("verbose")) + cerr + << "Filtering (algorithm " << algo_name << "): " + << "for request sent at " << timestamp + << " by mobile " << mobile->get_mac_addr() << ", " ; + + /* Don't apply filter if the reset distance is configured and the + * mobile is within this distance */ + // Get the unfiltered coordinates: + const Point3D &pos = result.get_position() ; + float reset_distance = + Configuration::float_value("positioning.filter.cp-reset-distance") ; + if (reset_distance > 0) + { + float dist_closest_cp = Stock::distance_from_closest_cp(pos) ; + assert(dist_closest_cp >= 0) ; + if (dist_closest_cp <= reset_distance) + { + if (Configuration::is_configured("verbose")) + cerr + << "the mobile appears to be within the reset distance" + << " of " << reset_distance + << " m from a CP; no filtering.\n" ; + return ; + } + } + + /* Okay, now let's get to it! */ + const Result &prev_result = last_results.get_result_for_algo(algo_name) ; // Calculate the travel time (duration) - const Timestamp ×tamp = result.get_request()->get_time_sent() ; const Timestamp &prev_timestamp = last_results.get_request()->get_time_sent() ; Timestamp duration = prev_timestamp.elapsed(timestamp) ; - // Get the current and previous coordinates - const Point3D &pos = result.get_position() ; + // Get the previous coordinates const Point3D &prev_pos = prev_result.get_position() ; // Recompute the result by interpolation @@ -229,13 +258,9 @@ void Positioning::filter(const Request &request, Result &result) if (filtered_pos != pos) { if (Configuration::is_configured("verbose")) - cerr - << "Filtering (algorithm " << algo_name << "): " - << "for request sent at " << timestamp - << " by mobile " << mobile->get_mac_addr() - << ", " << pos - << " was replaced by " << filtered_pos - << ".\n" ; + cerr << pos << " was replaced by " << filtered_pos << ".\n" ; result.set_position(filtered_pos) ; } + else if (Configuration::is_configured("verbose")) + cerr << "the original position looked good enough and was kept.\n" ; } diff --git a/owlps-positioner/userinterface.cc b/owlps-positioner/userinterface.cc index ff79928..6af4fa4 100644 --- a/owlps-positioner/userinterface.cc +++ b/owlps-positioner/userinterface.cc @@ -332,6 +332,10 @@ void UserInterface::fill_positioning_options() po::value()->default_value(0), "Maximal speed at which the mobiles can move, in km/h (0 = unlimited" " speed).") + ("positioning.filter.cp-reset-distance", + po::value()->default_value(0), + "Disable filtering when the computed position is at this distance (in" + " m) from a CP or closer (0 = never disable filtering).") ; file_options->add(options) ;