diff --git a/include/subscriber_laser2d.h b/include/subscriber_laser2d.h
index 8b2454949f3ebfa315d26e52908ebca01d54597a..ddaec8f273ca5b20164c1478c8e307394b937fb8 100644
--- a/include/subscriber_laser2d.h
+++ b/include/subscriber_laser2d.h
@@ -41,6 +41,8 @@ class SubscriberLaser2d : public Subscriber
 {
     protected:
         bool laser_intrinsics_set_;
+        laserscanutils::LaserScanParams params_;
+        SensorLaser2dPtr sensor_laser_;
 
     public:
         // Constructor
diff --git a/src/subscriber_laser2d.cpp b/src/subscriber_laser2d.cpp
index 603483a8dc21d0fea63cd691636f40a4006b5aa3..2feb5364bba322343012a751b5a6ea6091eebf5c 100644
--- a/src/subscriber_laser2d.cpp
+++ b/src/subscriber_laser2d.cpp
@@ -9,7 +9,11 @@ SubscriberLaser2d::SubscriberLaser2d(const std::string& _unique_name,
                                      const SensorBasePtr _sensor_ptr)
     : Subscriber(_unique_name, _server, _sensor_ptr)
 {
-    laser_intrinsics_set_ = false;
+    sensor_laser_ = std::dynamic_pointer_cast<SensorLaser2d>(sensor_ptr_);
+    assert(sensor_laser_ != nullptr && "SubscriberLaser2d: sensor provided is not of type SensorLaser2d");
+
+    laser_intrinsics_set_ = not _server.getParam<bool>(prefix_ + "/load_params_from_msg");
+    params_ = sensor_laser_->getScanParams();
 }
 
 
@@ -22,7 +26,10 @@ void SubscriberLaser2d::callback(const sensor_msgs::LaserScan::ConstPtr& msg)
 {
     setLastStamp(msg->header.stamp);
 
-    CaptureLaser2dPtr new_capture = std::make_shared<CaptureLaser2d>(TimeStamp(msg->header.stamp.sec, msg->header.stamp.nsec), sensor_ptr_, msg->ranges);
+    CaptureLaser2dPtr new_capture = std::make_shared<CaptureLaser2d>(TimeStamp(msg->header.stamp.sec,
+                                                                               msg->header.stamp.nsec),
+                                                                     sensor_ptr_,
+                                                                     msg->ranges);
     // auto n = std::min(msg->ranges.size(), new_capture->getScan().ranges_raw_.size());
     // auto total = 0;
     // for(int i = 0; i < n; ++i)
@@ -37,41 +44,76 @@ void SubscriberLaser2d::callback(const sensor_msgs::LaserScan::ConstPtr& msg)
     // std::cout << "Total error " << total << "\n";
 
     // auto sensor_laser_ptr = std::dynamic_pointer_cast<SensorLaser2d>(sensor_ptr_);
-    // auto params = sensor_laser_ptr->getScanParams();
-
-    // WOLF_INFO("MSG ", msg->angle_increment, " PARAMS ", params.angle_step_);
-    // WOLF_INFO("MSG ", msg->angle_max, " PARAMS " , params.angle_max_);
-    // WOLF_INFO("MSG ", msg->angle_min, " PARAMS " , params.angle_min_);
-    // WOLF_INFO("MSG ", msg->range_max, " PARAMS " , params.range_max_);
-    // WOLF_INFO("MSG ", msg->range_min, " PARAMS " , params.range_min_);
+    // params_ = sensor_laser_ptr->getScanParams();
 
+    // WOLF_INFO("MSG ", msg->angle_increment, " PARAMS ", params_.angle_step_);
+    // WOLF_INFO("MSG ", msg->angle_max, " PARAMS " , params_.angle_max_);
+    // WOLF_INFO("MSG ", msg->angle_min, " PARAMS " , params_.angle_min_);
+    // WOLF_INFO("MSG ", msg->range_max, " PARAMS " , params_.range_max_);
+    // WOLF_INFO("MSG ", msg->range_min, " PARAMS " , params_.range_min_);
+    // WOLF_INFO("CaptureLaser ranges: ", new_capture->getScan().ranges_raw_.size());
     // std::cout << "Cap Seq " << new_capture->id() << " " << msg->header.seq << "\n";
+
     //Currently this line is just to bypass the ROS "auto config". from the ROS msg. Maybe we want to explore
     //getting the params from the msg instead of the yaml file in the future.
     //laser_intrinsics_set_ = true;
-    if (!laser_intrinsics_set_)
+    if (not laser_intrinsics_set_)
     {
-        auto sensor_laser_ptr = std::dynamic_pointer_cast<SensorLaser2d>(sensor_ptr_);
-        assert(sensor_laser_ptr != nullptr);
-        laserscanutils::LaserScanParams params = sensor_laser_ptr->getScanParams();
-
-        // params.angle_min_ = msg->angle_min;
-        // params.angle_max_ = msg->angle_max;
-        WOLF_DEBUG("angle min msg", msg->angle_min, " angle max msg", msg->angle_max);
-        // params.angle_min_ = 0.4;
-        // params.angle_max_ = 1.44;
-        WOLF_DEBUG("angle min ", params.angle_min_, " angle max ", params.angle_max_);
-        params.angle_step_ = msg->angle_increment;
-        params.scan_time_ = msg->time_increment;
-        params.range_min_ = msg->range_min;
-        params.range_max_ = msg->range_max;
-        params.range_std_dev_ = 0.05; // TODO: get from param
-        params.angle_std_dev_ = 0.05; // TODO: get from param
-
-        sensor_laser_ptr->setScanParams(params);
+        params_.angle_min_  = msg->angle_min;
+        params_.angle_max_  = msg->angle_max;
+        params_.angle_step_ = msg->angle_increment;
+        params_.scan_time_  = msg->time_increment;
+        params_.range_min_  = msg->range_min;
+        params_.range_max_  = msg->range_max;
+
+        sensor_laser_->setScanParams(params_);
         laser_intrinsics_set_ = true;
 
-        ROS_INFO("LASER 2d: Intrinsics parameters SET");
+        WOLF_DEBUG("SubscriberLaser2d: Loading params from msg:",
+                  "\n\tangle_min       = ", msg->angle_min,
+                  "\n\tangle_max       = ", msg->angle_max,
+                  "\n\tangle_increment = ", msg->angle_increment,
+                  "\n\ttime_increment  = ", msg->time_increment,
+                  "\n\trange_min       = ", msg->range_min,
+                  "\n\trange_max       = ", msg->range_max);
+
+        WOLF_INFO("SubscriberLaser2d: Parameters loaded from msg:",
+                  "\n\tangle_min_     = ", params_.angle_min_,
+                  "\n\tangle_max_     = ", params_.angle_max_,
+                  "\n\tangle_step_    = ", params_.angle_step_,
+                  "\n\tscan_time_     = ", params_.scan_time_,
+                  "\n\trange_min_     = ", params_.range_min_,
+                  "\n\trange_max_     = ", params_.range_max_,
+                  "\n\trange_std_dev_ = ", params_.range_std_dev_, " (not taken from msg)",
+                  "\n\tangle_std_dev_ = ", params_.angle_std_dev_, " (not taken from msg)");
+    }
+    // check coherent params
+    else
+    {
+
+        if (std::abs(params_.angle_min_  - msg->angle_min) > 1e-4 or
+            std::abs(params_.angle_max_  - msg->angle_max) > 1e-4 or
+            std::abs(params_.angle_step_ - msg->angle_increment) > 1e-4 or
+            std::abs(params_.range_min_  - msg->range_min) > 1e-4 or
+            std::abs(params_.range_max_  - msg->range_max) > 1e-4)
+        {
+            WOLF_ERROR("SubscriberLaser2d: Any param in msg different than sensor param! Skipping capture...");
+            WOLF_ERROR_COND(std::abs(params_.angle_min_ - msg->angle_min) > 1e-4,       "\tmsg.angle_min:       ", msg->angle_min,         " - params_.angle_min_:  ", params_.angle_min_,    " - error: ", std::abs(params_.angle_min_ - msg->angle_min));
+            WOLF_ERROR_COND(std::abs(params_.angle_max_ - msg->angle_max) > 1e-4,       "\tmsg.angle_max:       ", msg->angle_max,         " - params_.angle_max_:  ", params_.angle_max_,    " - error: ", std::abs(params_.angle_max_ - msg->angle_max));
+            WOLF_ERROR_COND(std::abs(params_.angle_step_- msg->angle_increment) > 1e-4, "\tmsg.angle_increment: ", msg->angle_increment,   " - params_.angle_step_: ", params_.angle_step_,   " - error: ", std::abs(params_.angle_step_ - msg->angle_increment));
+            WOLF_ERROR_COND(std::abs(params_.range_min_ - msg->range_min) > 1e-9,       "\tmsg.range_min:       ", msg->range_min,         " - params_.range_min_:  ", params_.range_min_,    " - error: ", std::abs(params_.range_min_ - msg->range_min));
+            WOLF_ERROR_COND(std::abs(params_.range_max_ - msg->range_max) > 1e-9,       "\tmsg.range_max:       ", msg->range_max,         " - params_.range_max_:  ", params_.range_max_,    " - error: ", std::abs(params_.range_max_ - msg->range_max));
+            return;
+        }
+    }
+
+    if (std::abs(msg->angle_min + (msg->ranges.size()-1) * msg->angle_increment - msg->angle_max) > msg->angle_increment / 2)
+    {
+        WOLF_ERROR("SubscriberLaser2d: angle_min, angle_max, angle_increment not coherent with ranges.size(): \n",
+                   "msg->angle_min + (msg->ranges.size()-1) * msg->angle_increment - msg->angle_max = ",
+                   msg->angle_min + (msg->ranges.size()-1) * msg->angle_increment - msg->angle_max,
+                   " - Skipping capture...");
+        return;
     }
 
     new_capture->process();