From 7b35cbe4809456bad9f2adba7321dc384b53d105 Mon Sep 17 00:00:00 2001
From: jcasals <jcasals@iri.upc.edu>
Date: Wed, 30 Oct 2019 12:59:14 +0100
Subject: [PATCH] Added align functionality for two arbitrary laser scans from
 different sensors

---
 src/icp.cpp | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/icp.h   | 23 ++++++++++++------
 2 files changed, 85 insertions(+), 8 deletions(-)

diff --git a/src/icp.cpp b/src/icp.cpp
index c137f9b..2abc4fc 100644
--- a/src/icp.cpp
+++ b/src/icp.cpp
@@ -1,4 +1,6 @@
 #include "icp.h"
+#include <algorithm>
+
 using namespace laserscanutils;
 unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
 std::mt19937 generator (seed);
@@ -56,6 +58,74 @@ ICP::~ICP()
 
 }
 
+icpOutput ICP::align(const LaserScan &_current_ls, const LaserScan &_ref_ls, const LaserScanParams &_current_scan_params, const LaserScanParams &_ref_scan_params,const icpParams &_icp_params,
+           Eigen::Vector3s &_transf_ref_current) {
+  // Uncomment to enable debug messages from the CSM library
+  // sm_debug_write(true);
+
+  LDWrapper laser_scan_current = LDWrapper(_current_ls, _current_scan_params);
+  LDWrapper laser_scan_ref = LDWrapper(_ref_ls, _ref_scan_params);
+
+  int num_rays = _current_ls.ranges_raw_.size();
+
+  sm_params csm_input{};
+  sm_result csm_output{};
+
+  csm_input.min_reading = max(_current_scan_params.range_min_, _ref_scan_params.range_min_);
+  csm_input.max_reading = min(_current_scan_params.range_max_, _ref_scan_params.range_max_);
+  csm_input.sigma = _ref_scan_params.range_std_dev_;
+
+  csm_input.laser_ref = laser_scan_ref.laser_data;
+  csm_input.laser_sens = laser_scan_current.laser_data;
+
+  csm_input.first_guess[0] = _transf_ref_current(0);
+  csm_input.first_guess[1] = _transf_ref_current(1);
+  csm_input.first_guess[2] = _transf_ref_current(2);
+
+  csm_input.use_point_to_line_distance = _icp_params.use_point_to_line_distance;
+  csm_input.max_correspondence_dist = _icp_params.max_correspondence_dist;
+  csm_input.max_iterations = _icp_params.max_iterations;
+  csm_input.use_corr_tricks = _icp_params.use_corr_tricks;
+  csm_input.outliers_maxPerc = _icp_params.outliers_maxPerc;
+  csm_input.outliers_adaptive_order = _icp_params.outliers_adaptive_order;
+  csm_input.outliers_adaptive_mult = _icp_params.outliers_adaptive_mult;
+
+  csm_input.do_compute_covariance = 1;
+
+  sm_icp(&csm_input, &csm_output);
+
+  icpOutput result{};
+  result.nvalid = csm_output.nvalid;
+  result.valid = csm_output.valid;
+  result.error = csm_output.error;
+
+  if (result.valid == 1) {
+    result.res_transf(0) = csm_output.x[0];
+    result.res_transf(1) = csm_output.x[1];
+    result.res_transf(2) = csm_output.x[2];
+
+    for (int i = 0; i < 3; ++i)
+      for (int j = 0; j < 3; ++j)
+        result.res_covar(i, j) =
+            // gsl_matrix_get(csm_output.cov_x_m, i, j);                 // NOT
+            // COMPILING
+            csm_output.cov_x_m
+                ->data[i * csm_output.cov_x_m->tda + j]; // This does the same
+  } else {
+    std::cout << "ICP valid != 1, providing first guess transformation and "
+                 "identity covariance\n";
+    result.res_transf = _transf_ref_current;
+    result.res_covar = Eigen::Matrix3s::Identity();
+  }
+
+  // std::cout << "Number of valid correspondences: " << csm_output.nvalid <<
+  // '\n'; std::cout << "Number of iterations: " << csm_output.iterations <<
+  // '\n'; std::cout << "Error: " << csm_output.error << '\n';
+
+  return result;
+}
+
+//Legacy code
 icpOutput ICP::align(const LaserScan &_last_ls, const LaserScan &_origin_ls, const LaserScanParams& scan_params, const icpParams &icp_params, Eigen::Vector3s &_last_transf)
 {
     // Uncomment to enable debug messages from the CSM library
diff --git a/src/icp.h b/src/icp.h
index d6345fc..740e28e 100644
--- a/src/icp.h
+++ b/src/icp.h
@@ -1,10 +1,10 @@
 #ifndef ICP_H_
 #define ICP_H_
 
-#include <chrono>
-#include <random>
 #include "laser_scan.h"
+#include <chrono>
 #include <csm/csm_all.h>
+#include <random>
 // using namespace CSM;
 
 namespace laserscanutils{
@@ -33,12 +33,19 @@ class ICP
         ICP();
         ~ICP();
 
-    static icpOutput align(const LaserScan &_last_ls, const LaserScan &_reference_ls, const LaserScanParams& scan_params, const icpParams &icp_params, Eigen::Vector3s &_last_transf);
-
-    static void printTwoLaserData(sm_params &params);
-    static void printLaserData(LDP &laser_data);
-};
-
+            static icpOutput align(const LaserScan &_current_ls,
+                                   const LaserScan &_ref_ls,
+                                   const LaserScanParams &_current_scan_params,
+                                   const LaserScanParams &_ref_scan_params,
+                                   const icpParams &_icp_params,
+                                   Eigen::Vector3s &_transf_ref_current);
+            static icpOutput align(const LaserScan &_last_ls, const LaserScan &_reference_ls,
+                                   const LaserScanParams &scan_params, const icpParams &icp_params,
+                                   Eigen::Vector3s &_last_transf);
+
+          static void printTwoLaserData(sm_params & params);
+          static void printLaserData(LDP & laser_data);
+        };
 }
 
 #endif
-- 
GitLab