From a00c7ca97c3a452069c646981c4867860dd27eba Mon Sep 17 00:00:00 2001
From: Joaquim Casals <jcasals@iri.upc.edu>
Date: Tue, 19 Mar 2019 09:25:12 +0100
Subject: [PATCH] Added auto_conf for sensors. Missing Sensor_Laser_2D

---
 hello_wolf/sensor_range_bearing.h       |  7 +++++++
 include/base/sensor/sensor_GPS.h        |  1 +
 include/base/sensor/sensor_GPS_fix.h    |  6 ++++++
 include/base/sensor/sensor_IMU.h        | 11 +++++++++++
 include/base/sensor/sensor_camera.h     | 10 ++++++++++
 include/base/sensor/sensor_diff_drive.h | 22 ++++++++++++++++++++++
 include/base/sensor/sensor_odom_2D.h    |  6 ++++++
 include/base/sensor/sensor_odom_3D.h    | 11 ++++++++++-
 8 files changed, 73 insertions(+), 1 deletion(-)

diff --git a/hello_wolf/sensor_range_bearing.h b/hello_wolf/sensor_range_bearing.h
index e74d8cc6e..140cc7483 100644
--- a/hello_wolf/sensor_range_bearing.h
+++ b/hello_wolf/sensor_range_bearing.h
@@ -9,6 +9,7 @@
 #define HELLO_WOLF_SENSOR_RANGE_BEARING_H_
 
 #include "base/sensor/sensor_base.h"
+#include "base/params_server.hpp"
 
 namespace wolf
 {
@@ -18,6 +19,12 @@ struct IntrinsicsRangeBearing : public IntrinsicsBase
 {
         Scalar noise_range_metres_std       = 0.05;
         Scalar noise_bearing_degrees_std    = 0.5;
+    IntrinsicsRangeBearing(std::string _unique_name, const paramsServer& _server):
+        IntrinsicsBase(_unique_name, _server)
+    {
+        noise_range_metres_std = _server.getParam<Scalar>(_unique_name + "/noise_range_metres_std", "0.05");
+        noise_bearing_degrees_std = _server.getParam<Scalar>(_unique_name + "/noise_bearing_degrees_std", "0.5");
+    }
 };
 
 WOLF_PTR_TYPEDEFS(SensorRangeBearing)
diff --git a/include/base/sensor/sensor_GPS.h b/include/base/sensor/sensor_GPS.h
index 17b6f2033..046c5fd94 100644
--- a/include/base/sensor/sensor_GPS.h
+++ b/include/base/sensor/sensor_GPS.h
@@ -20,6 +20,7 @@ namespace wolf {
 struct IntrinsicsGPS : public IntrinsicsBase
 {
         // add GPS parameters here
+    using IntrinsicsBase::IntrinsicsBase;
         virtual ~IntrinsicsGPS() = default;
 };
 
diff --git a/include/base/sensor/sensor_GPS_fix.h b/include/base/sensor/sensor_GPS_fix.h
index 17db7c12c..e1f443f8a 100644
--- a/include/base/sensor/sensor_GPS_fix.h
+++ b/include/base/sensor/sensor_GPS_fix.h
@@ -4,6 +4,7 @@
 
 //wolf includes
 #include "base/sensor/sensor_base.h"
+#include "base/params_server.hpp"
 
 // std includes
 
@@ -14,6 +15,11 @@ struct IntrinsicsGPSFix : public IntrinsicsBase
 {
         Eigen::Vector3s noise_std;
         // Empty -- it acts only as a typedef for IntrinsicsBase, but allows future extension with parameters
+    IntrinsicsGPSFix(std::string _unique_name, const paramsServer& _server):
+        IntrinsicsBase(_unique_name, _server)
+    {
+        noise_std = _server.getParam<Eigen::Vector3s>(_unique_name + "/noise_std", "");
+    }
         virtual ~IntrinsicsGPSFix() = default;
 };
 
diff --git a/include/base/sensor/sensor_IMU.h b/include/base/sensor/sensor_IMU.h
index 2c8efa2c9..6e67632aa 100644
--- a/include/base/sensor/sensor_IMU.h
+++ b/include/base/sensor/sensor_IMU.h
@@ -3,6 +3,7 @@
 
 //wolf includes
 #include "base/sensor/sensor_base.h"
+#include "base/params_server.hpp"
 #include <iostream>
 
 namespace wolf {
@@ -27,6 +28,16 @@ struct IntrinsicsIMU : public IntrinsicsBase
         Scalar wb_rate_stdev = 0.00001;
 
         virtual ~IntrinsicsIMU() = default;
+    IntrinsicsIMU(std::string _unique_name, const paramsServer& _server):
+        IntrinsicsBase(_unique_name, _server)
+    {
+        w_noise = _server.getParam<Scalar>(_unique_name + "/w_noise", "0.001");
+        a_noise = _server.getParam<Scalar>(_unique_name + "/a_noise", "0.004");
+        ab_initial_stdev = _server.getParam<Scalar>(_unique_name + "/ab_initial_stdev", "0.01");
+        wb_initial_stdev = _server.getParam<Scalar>(_unique_name + "/wb_initial_stdev", "0.01");
+        ab_rate_stdev = _server.getParam<Scalar>(_unique_name + "/ab_rate_stdev", "0.00001");
+        wb_rate_stdev = _server.getParam<Scalar>(_unique_name + "/wb_rate_stdev", "0.00001");
+    }
 };
 
 WOLF_PTR_TYPEDEFS(SensorIMU);
diff --git a/include/base/sensor/sensor_camera.h b/include/base/sensor/sensor_camera.h
index c7db047c3..a4961ae7f 100644
--- a/include/base/sensor/sensor_camera.h
+++ b/include/base/sensor/sensor_camera.h
@@ -3,6 +3,7 @@
 
 //wolf includes
 #include "base/sensor/sensor_base.h"
+#include "base/params_server.hpp"
 
 namespace wolf
 {
@@ -18,6 +19,15 @@ struct IntrinsicsCamera : public IntrinsicsBase
         Eigen::Vector4s pinhole_model_rectified;///< k = [u_0, v_0, alpha_u, alpha_v]  vector of pinhole intrinsic parameters
         Eigen::VectorXs distortion;             ///< d = [d_1, d_2, d_3, ...] radial distortion coefficients
 
+    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", "");
+    }
         virtual ~IntrinsicsCamera() = default;
 };
 
diff --git a/include/base/sensor/sensor_diff_drive.h b/include/base/sensor/sensor_diff_drive.h
index 0f5cf4259..1ca24f1b9 100644
--- a/include/base/sensor/sensor_diff_drive.h
+++ b/include/base/sensor/sensor_diff_drive.h
@@ -11,6 +11,7 @@
 //wolf includes
 #include "base/sensor/sensor_base.h"
 #include "base/diff_drive_tools.h"
+#include "base/params_server.hpp"
 
 namespace wolf {
 
@@ -32,7 +33,28 @@ struct IntrinsicsDiffDrive : public IntrinsicsBase
 
   Scalar left_gain_  = 0.01;
   Scalar right_gain_ = 0.01;
+    IntrinsicsDiffDrive(std::string _unique_name, const paramsServer& _server):
+        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_", "");
+
+        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;
+        else throw std::runtime_error("Failed to fetch a valid value for the enumerate DiffDriveModel. Value provided: " + model_str);
+
+        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_gain_ = _server.getParam<Scalar>(_unique_name + "/left_gain", "0.01");
+        right_gain_ = _server.getParam<Scalar>(_unique_name + "/right_gain", "0.01");
+    }
   virtual ~IntrinsicsDiffDrive() = default;
 };
 
diff --git a/include/base/sensor/sensor_odom_2D.h b/include/base/sensor/sensor_odom_2D.h
index 798d1bbdd..c489bde2e 100644
--- a/include/base/sensor/sensor_odom_2D.h
+++ b/include/base/sensor/sensor_odom_2D.h
@@ -15,6 +15,12 @@ struct IntrinsicsOdom2D : public IntrinsicsBase
 
         Scalar k_disp_to_disp; ///< ratio of displacement variance to displacement, for odometry noise calculation
         Scalar k_rot_to_rot; ///< ratio of rotation variance to rotation, for odometry noise calculation
+    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", "");
+    }
 };
 
 WOLF_PTR_TYPEDEFS(SensorOdom2D);
diff --git a/include/base/sensor/sensor_odom_3D.h b/include/base/sensor/sensor_odom_3D.h
index be3694b2d..a88b2aed2 100644
--- a/include/base/sensor/sensor_odom_3D.h
+++ b/include/base/sensor/sensor_odom_3D.h
@@ -10,6 +10,7 @@
 
 //wolf includes
 #include "base/sensor/sensor_base.h"
+#include "base/params_server.hpp"
 
 namespace wolf {
 
@@ -22,7 +23,15 @@ struct IntrinsicsOdom3D : public IntrinsicsBase
         Scalar k_rot_to_rot; ///< ratio of rotation variance to rotation, for odometry noise calculation
         Scalar min_disp_var;
         Scalar min_rot_var;
-
+    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", "");
+    }
         virtual ~IntrinsicsOdom3D() = default;
 };
 
-- 
GitLab