From 5dd7bf5024071bbc08b644817ccdb341a410cec8 Mon Sep 17 00:00:00 2001
From: Joaquim Casals <jcasals@iri.upc.edu>
Date: Mon, 1 Apr 2019 12:18:55 +0200
Subject: [PATCH] Added no-default (with error) option for params server

---
 include/base/params_server.hpp                |  8 ++++++++
 .../processor_frame_nearest_neighbor_filter.h |  8 ++++----
 .../base/processor/processor_params_image.h   | 20 +++++++++----------
 .../processor_tracker_feature_trifocal.h      | 14 ++++++-------
 include/base/sensor/sensor_GPS_fix.h          |  2 +-
 include/base/sensor/sensor_camera.h           | 10 +++++-----
 include/base/sensor/sensor_diff_drive.h       | 12 +++++------
 include/base/sensor/sensor_odom_2D.h          |  4 ++--
 include/base/sensor/sensor_odom_3D.h          | 10 +++++-----
 test/gtest_param_server.cpp                   |  3 +++
 10 files changed, 51 insertions(+), 40 deletions(-)

diff --git a/include/base/params_server.hpp b/include/base/params_server.hpp
index b7fe91f30..55f268d78 100644
--- a/include/base/params_server.hpp
+++ b/include/base/params_server.hpp
@@ -65,6 +65,14 @@ public:
             return converter<T>::convert(def_value);
         }
     }
+    template<typename T>
+    T getParam(std::string key) const {
+        if(_params.find(key) != _params.end()){
+            return converter<T>::convert(_params.find(key)->second);
+        }else{
+            throw std::runtime_error("The following key: '" + key + "' has not been found in the parameters server and no default value was provided.");
+        }
+    }
     std::vector<ParamsInitSensor> getSensors(){
         std::vector<ParamsInitSensor> rtn = std::vector<ParamsInitSensor>();
         std::transform(this->_paramsSens.begin(), this->_paramsSens.end(), back_inserter(rtn), [](const std::pair<std::string,ParamsInitSensor> v){return v.second;});
diff --git a/include/base/processor/processor_frame_nearest_neighbor_filter.h b/include/base/processor/processor_frame_nearest_neighbor_filter.h
index 3f28b915d..9a66768a9 100644
--- a/include/base/processor/processor_frame_nearest_neighbor_filter.h
+++ b/include/base/processor/processor_frame_nearest_neighbor_filter.h
@@ -42,16 +42,16 @@ struct ProcessorParamsFrameNearestNeighborFilter : public ProcessorParamsLoopClo
     ProcessorParamsFrameNearestNeighborFilter(std::string _unique_name, const paramsServer& _server):
         ProcessorParamsLoopClosure(_unique_name, _server)
     {
-        buffer_size_ = _server.getParam<int>(_unique_name + "/buffer_size", "");
-        sample_step_degree_ = _server.getParam<int>(_unique_name + "/sample_step_degree", "");
-        auto distance_type_str = _server.getParam<std::string>(_unique_name + "/distance_type", "");
+        buffer_size_ = _server.getParam<int>(_unique_name + "/buffer_size");
+        sample_step_degree_ = _server.getParam<int>(_unique_name + "/sample_step_degree");
+        auto distance_type_str = _server.getParam<std::string>(_unique_name + "/distance_type");
         if(distance_type_str.compare("LC_POINT_ELLIPSE")) distance_type_ = LoopclosureDistanceType::LC_POINT_ELLIPSE;
         else if(distance_type_str.compare("LC_ELLIPSE_ELLIPSE")) distance_type_ = LoopclosureDistanceType::LC_ELLIPSE_ELLIPSE;
         else if(distance_type_str.compare("LC_POINT_ELLIPSOID")) distance_type_ = LoopclosureDistanceType::LC_POINT_ELLIPSOID;
         else if(distance_type_str.compare("LC_ELLIPSOID_ELLIPSOID")) distance_type_ = LoopclosureDistanceType::LC_ELLIPSOID_ELLIPSOID;
         else if(distance_type_str.compare("LC_MAHALANOBIS_DISTANCE")) distance_type_ = LoopclosureDistanceType::LC_MAHALANOBIS_DISTANCE;
         else throw std::runtime_error("Failed to fetch a valid value for the enumerate LoopclosureDistanceType. Value provided: " + distance_type_str);
-        probability_ = _server.getParam<Scalar>(_unique_name + "/probability", "");
+        probability_ = _server.getParam<Scalar>(_unique_name + "/probability");
     }
   virtual ~ProcessorParamsFrameNearestNeighborFilter() = default;
 
diff --git a/include/base/processor/processor_params_image.h b/include/base/processor/processor_params_image.h
index 5d200dd08..33e92c38e 100644
--- a/include/base/processor/processor_params_image.h
+++ b/include/base/processor/processor_params_image.h
@@ -24,11 +24,11 @@ struct ProcessorParamsTrackerFeatureImage : public ProcessorParamsTrackerFeature
     ProcessorParamsTrackerFeatureImage(std::string _unique_name, const paramsServer& _server):
         ProcessorParamsTrackerFeature(_unique_name, _server)
     {
-        yaml_file_params_vision_utils = _server.getParam<std::string>(_unique_name + "/yaml_file_params_vision_utils", "");
-        min_response_for_new_features = _server.getParam<Scalar>(_unique_name + "/min_response_for_new_features", "");
-        distance = _server.getParam<Scalar>(_unique_name + "/distance", "");
-        pixel_noise_std = _server.getParam<Scalar>(_unique_name + "/pixel_noise_std", "");
-        pixel_noise_var = _server.getParam<Scalar>(_unique_name + "/pixel_noise_var", "");
+        yaml_file_params_vision_utils = _server.getParam<std::string>(_unique_name + "/yaml_file_params_vision_utils");
+        min_response_for_new_features = _server.getParam<Scalar>(_unique_name + "/min_response_for_new_features");
+        distance = _server.getParam<Scalar>(_unique_name + "/distance");
+        pixel_noise_std = _server.getParam<Scalar>(_unique_name + "/pixel_noise_std");
+        pixel_noise_var = _server.getParam<Scalar>(_unique_name + "/pixel_noise_var");
     }
 };
 
@@ -46,13 +46,13 @@ struct ProcessorParamsTrackerLandmarkImage : public ProcessorParamsTrackerLandma
     ProcessorParamsTrackerLandmarkImage(std::string _unique_name, const paramsServer& _server):
         ProcessorParamsTrackerLandmark(_unique_name, _server)
     {
-        yaml_file_params_vision_utils = _server.getParam<std::string>(_unique_name + "/yaml_file_params_vision_utils", "");
+        yaml_file_params_vision_utils = _server.getParam<std::string>(_unique_name + "/yaml_file_params_vision_utils");
 
-        min_response_for_new_features = _server.getParam<Scalar>(_unique_name + "/min_response_for_new_features", "");
-        distance = _server.getParam<Scalar>(_unique_name + "/distance", "");
+        min_response_for_new_features = _server.getParam<Scalar>(_unique_name + "/min_response_for_new_features");
+        distance = _server.getParam<Scalar>(_unique_name + "/distance");
 
-        pixel_noise_std = _server.getParam<Scalar>(_unique_name + "/pixel_noise_std", "");
-        pixel_noise_var = _server.getParam<Scalar>(_unique_name + "/pixel_noise_var", "");
+        pixel_noise_std = _server.getParam<Scalar>(_unique_name + "/pixel_noise_std");
+        pixel_noise_var = _server.getParam<Scalar>(_unique_name + "/pixel_noise_var");
     }
 };
 }
diff --git a/include/base/processor/processor_tracker_feature_trifocal.h b/include/base/processor/processor_tracker_feature_trifocal.h
index 1033e3347..fa3984253 100644
--- a/include/base/processor/processor_tracker_feature_trifocal.h
+++ b/include/base/processor/processor_tracker_feature_trifocal.h
@@ -32,13 +32,13 @@ struct ProcessorParamsTrackerFeatureTrifocal : public ProcessorParamsTrackerFeat
     ProcessorParamsTrackerFeatureTrifocal(std::string _unique_name, const paramsServer& _server):
         ProcessorParamsTrackerFeature(_unique_name, _server)
     {
-        yaml_file_params_vision_utils = _server.getParam<std::string>(_unique_name + "/yaml_file_params_vision_utils", "");
-        n_cells_h = _server.getParam<int>(_unique_name + "/n_cells_h", "");
-        n_cells_v = _server.getParam<int>(_unique_name + "/n_cells_v", "");
-        min_response_new_feature = _server.getParam<int>(_unique_name + "/min_response_new_feature", "");
-        max_euclidean_distance = _server.getParam<Scalar>(_unique_name + "/max_euclidean_distance", "");
-        pixel_noise_std = _server.getParam<Scalar>(_unique_name + "/pixel_noise_std", "");
-        min_track_length_for_factor = _server.getParam<int>(_unique_name + "/min_track_length_for_factor", "");
+        yaml_file_params_vision_utils = _server.getParam<std::string>(_unique_name + "/yaml_file_params_vision_utils");
+        n_cells_h = _server.getParam<int>(_unique_name + "/n_cells_h");
+        n_cells_v = _server.getParam<int>(_unique_name + "/n_cells_v");
+        min_response_new_feature = _server.getParam<int>(_unique_name + "/min_response_new_feature");
+        max_euclidean_distance = _server.getParam<Scalar>(_unique_name + "/max_euclidean_distance");
+        pixel_noise_std = _server.getParam<Scalar>(_unique_name + "/pixel_noise_std");
+        min_track_length_for_factor = _server.getParam<int>(_unique_name + "/min_track_length_for_factor");
     }
 };
 
diff --git a/include/base/sensor/sensor_GPS_fix.h b/include/base/sensor/sensor_GPS_fix.h
index e1f443f8a..dd2e85700 100644
--- a/include/base/sensor/sensor_GPS_fix.h
+++ b/include/base/sensor/sensor_GPS_fix.h
@@ -18,7 +18,7 @@ struct IntrinsicsGPSFix : public IntrinsicsBase
     IntrinsicsGPSFix(std::string _unique_name, const paramsServer& _server):
         IntrinsicsBase(_unique_name, _server)
     {
-        noise_std = _server.getParam<Eigen::Vector3s>(_unique_name + "/noise_std", "");
+        noise_std = _server.getParam<Eigen::Vector3s>(_unique_name + "/noise_std");
     }
         virtual ~IntrinsicsGPSFix() = default;
 };
diff --git a/include/base/sensor/sensor_camera.h b/include/base/sensor/sensor_camera.h
index 8d2cd2e82..44bd1dd0b 100644
--- a/include/base/sensor/sensor_camera.h
+++ b/include/base/sensor/sensor_camera.h
@@ -25,11 +25,11 @@ struct IntrinsicsCamera : public IntrinsicsBase
     IntrinsicsCamera(std::string _unique_name, const paramsServer& _server):
         IntrinsicsBase(_unique_name,  _server)
     {
-        width = _server.getParam<unsigned int>(_unique_name + "/width", "");
-        height = _server.getParam<unsigned int>(_unique_name + "/height", "");
-        pinhole_model_raw = _server.getParam<Eigen::Vector4s>(_unique_name + "/pinhole_model_raw", "");
-        pinhole_model_rectified = _server.getParam<Eigen::Vector4s>(_unique_name + "/pinhole_model_rectified", "");
-        distortion = _server.getParam<Eigen::VectorXs>(_unique_name + "/distortion", "");
+        width = _server.getParam<unsigned int>(_unique_name + "/width");
+        height = _server.getParam<unsigned int>(_unique_name + "/height");
+        pinhole_model_raw = _server.getParam<Eigen::Vector4s>(_unique_name + "/pinhole_model_raw");
+        pinhole_model_rectified = _server.getParam<Eigen::Vector4s>(_unique_name + "/pinhole_model_rectified");
+        distortion = _server.getParam<Eigen::VectorXs>(_unique_name + "/distortion");
     }
         virtual ~IntrinsicsCamera() = default;
 };
diff --git a/include/base/sensor/sensor_diff_drive.h b/include/base/sensor/sensor_diff_drive.h
index b601875b9..2f8a13f0e 100644
--- a/include/base/sensor/sensor_diff_drive.h
+++ b/include/base/sensor/sensor_diff_drive.h
@@ -42,11 +42,11 @@ struct IntrinsicsDiffDrive : public IntrinsicsBase
         IntrinsicsBase(_unique_name, _server)
     {
 
-        left_radius_ = _server.getParam<Scalar>(_unique_name + "/left_radius_", "");
-        right_radius_ = _server.getParam<Scalar>(_unique_name + "/right_radius_", "");
-        separation_ = _server.getParam<Scalar>(_unique_name + "/separation_", "");
+        left_radius_ = _server.getParam<Scalar>(_unique_name + "/left_radius_");
+        right_radius_ = _server.getParam<Scalar>(_unique_name + "/right_radius_");
+        separation_ = _server.getParam<Scalar>(_unique_name + "/separation_");
 
-        auto model_str = _server.getParam<std::string>(_unique_name + "/model", "");
+        auto model_str = _server.getParam<std::string>(_unique_name + "/model");
         if(model_str.compare("Two_Factor_Model")) model_ = DiffDriveModel::Two_Factor_Model;
         else if(model_str.compare("Three_Factor_Model")) model_ = DiffDriveModel::Three_Factor_Model;
         else if(model_str.compare("Five_Factor_Model")) model_ = DiffDriveModel::Five_Factor_Model;
@@ -54,8 +54,8 @@ struct IntrinsicsDiffDrive : public IntrinsicsBase
 
         factors_ = _server.getParam<Eigen::VectorXs>(_unique_name + "/factors", "[1,1,1]");
 
-        left_resolution_ = _server.getParam<Scalar>(_unique_name + "/left_resolution_", "");
-        right_resolution_ = _server.getParam<Scalar>(_unique_name + "/right_resolution_", "");
+        left_resolution_ = _server.getParam<Scalar>(_unique_name + "/left_resolution_");
+        right_resolution_ = _server.getParam<Scalar>(_unique_name + "/right_resolution_");
 
         left_gain_ = _server.getParam<Scalar>(_unique_name + "/left_gain", "0.01");
         right_gain_ = _server.getParam<Scalar>(_unique_name + "/right_gain", "0.01");
diff --git a/include/base/sensor/sensor_odom_2D.h b/include/base/sensor/sensor_odom_2D.h
index 1d71d926d..934ef2615 100644
--- a/include/base/sensor/sensor_odom_2D.h
+++ b/include/base/sensor/sensor_odom_2D.h
@@ -22,8 +22,8 @@ struct IntrinsicsOdom2D : public IntrinsicsBase
     IntrinsicsOdom2D(std::string _unique_name, const paramsServer& _server):
         IntrinsicsBase(_unique_name, _server)
     {
-        k_disp_to_disp = _server.getParam<Scalar>(_unique_name + "/k_disp_to_disp", "");
-        k_rot_to_rot = _server.getParam<Scalar>(_unique_name + "/k_rot_to_rot", "");
+        k_disp_to_disp = _server.getParam<Scalar>(_unique_name + "/k_disp_to_disp");
+        k_rot_to_rot = _server.getParam<Scalar>(_unique_name + "/k_rot_to_rot");
     }
 };
 
diff --git a/include/base/sensor/sensor_odom_3D.h b/include/base/sensor/sensor_odom_3D.h
index 3f3c6c434..c1128098e 100644
--- a/include/base/sensor/sensor_odom_3D.h
+++ b/include/base/sensor/sensor_odom_3D.h
@@ -30,11 +30,11 @@ struct IntrinsicsOdom3D : public IntrinsicsBase
     IntrinsicsOdom3D(std::string _unique_name, const paramsServer& _server):
         IntrinsicsBase(_unique_name, _server)
     {
-        k_disp_to_disp = _server.getParam<Scalar>(_unique_name + "/k_disp_to_disp", "");
-        k_disp_to_rot = _server.getParam<Scalar>(_unique_name + "/k_disp_to_rot", "");
-        k_rot_to_rot = _server.getParam<Scalar>(_unique_name + "/k_rot_to_rot", "");
-        min_disp_var = _server.getParam<Scalar>(_unique_name + "/min_disp_var", "");
-        min_rot_var = _server.getParam<Scalar>(_unique_name + "/min_rot_var", "");
+        k_disp_to_disp = _server.getParam<Scalar>(_unique_name + "/k_disp_to_disp");
+        k_disp_to_rot = _server.getParam<Scalar>(_unique_name + "/k_disp_to_rot");
+        k_rot_to_rot = _server.getParam<Scalar>(_unique_name + "/k_rot_to_rot");
+        min_disp_var = _server.getParam<Scalar>(_unique_name + "/min_disp_var");
+        min_rot_var = _server.getParam<Scalar>(_unique_name + "/min_rot_var");
     }
         virtual ~IntrinsicsOdom3D() = default;
 };
diff --git a/test/gtest_param_server.cpp b/test/gtest_param_server.cpp
index 9dc28c7e4..a17791973 100644
--- a/test/gtest_param_server.cpp
+++ b/test/gtest_param_server.cpp
@@ -24,6 +24,9 @@ TEST(ParamsServer, Default)
   EXPECT_EQ(server.getParam<double>("should_not_exist", "2.6"), 2.6);
   EXPECT_EQ(server.getParam<bool>("my_proc_test/voting_active", "true"), false);
   EXPECT_NE(server.getParam<unsigned int>("my_proc_test/time_tolerance", "23"), 23);
+  EXPECT_THROW({ server.getParam<unsigned int>("test error"); }, std::runtime_error);
+  EXPECT_NE(server.getParam<unsigned int>("my_proc_test/time_tolerance"), 23);
+  EXPECT_EQ(server.getParam<bool>("my_proc_test/voting_active"), false);
 }
 int main(int argc, char **argv)
 {
-- 
GitLab