diff --git a/README.md b/README.md index f541e6b5b14750aaa8523c13898f0a217ec2c62c..517c3c023a933a11e2c0025f3c92a0987352a98f 100644 --- a/README.md +++ b/README.md @@ -6,10 +6,10 @@ A C++ Toolbox with utilities for 2D laser scan processing, made at IRI (www.iri. **Canonical Scan Matching - CSM** -To enable the compilation of iterative closest point algorithms, [CSM](https://github.com/AndreaCensi/csm) should be installed. Clone, compile and install: +To enable the compilation of iterative closest point algorithms, [CSM](https://github.com/AndreaCensi/csm) should be installed. We recommend to install it from our [forked repository](https://gitlab.iri.upc.edu/labrobotica/algorithms/csm.git) to avoid several error messages. Clone, compile and install: ```sh cd <your/path> -git clone https://github.com/AndreaCensi/csm.git +git clone https://gitlab.iri.upc.edu/labrobotica/algorithms/csm.git cd csm cmake . make diff --git a/src/icp.cpp b/src/icp.cpp index f74e5d2ce40a0e21945622483522399f13a16f2b..8a18328e53bbe2dddc2f9821f37cc36851da1c49 100644 --- a/src/icp.cpp +++ b/src/icp.cpp @@ -21,48 +21,61 @@ //--------LICENSE_END-------- #include "icp.h" #include <algorithm> +#include <unistd.h> +#include <fcntl.h> using namespace laserscanutils; unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); std::mt19937 generator (seed); std::uniform_real_distribution<double> dis(0.0, 1.0); -class LDWrapper { -public: - LDP laser_data; - LDWrapper(const LaserScan& scan, const LaserScanParams& scan_params) - { - int num_rays = scan.ranges_raw_.size(); - laser_data = ld_alloc_new(num_rays); - int i = 0; - for(auto it : scan.ranges_raw_){ - laser_data->theta[i] = scan_params.angle_min_ + i*scan_params.angle_step_; - - if(scan_params.range_min_ <= it and it <= scan_params.range_max_ and 0 <= it and it <= 100){ - laser_data->readings[i] = it;//*100/scan_params.range_max_; - laser_data->valid[i] = 1; - }else{ - laser_data->readings[i] = NAN; - laser_data->valid[i] = 0; +class LDWrapper +{ + public: + LDP laser_data; + + LDWrapper(const LaserScan& scan, const LaserScanParams& scan_params) + { + int num_rays = scan.ranges_raw_.size(); + laser_data = ld_alloc_new(num_rays); + int i = 0; + for(auto it : scan.ranges_raw_) + { + laser_data->theta[i] = scan_params.angle_min_ + i*scan_params.angle_step_; + + if (scan_params.range_min_ <= it and + it <= scan_params.range_max_ and + 0 <= it and it <= 100) + { + laser_data->readings[i] = it; + laser_data->valid[i] = 1; + } + else + { + laser_data->readings[i] = NAN; + laser_data->valid[i] = 0; + } + laser_data->cluster[i] = -1; + ++i; } - laser_data->cluster[i] = -1; - ++i; - } - laser_data->min_theta = laser_data->theta[0]; - laser_data->max_theta = laser_data->theta[num_rays-1]; + laser_data->min_theta = laser_data->theta[0]; + laser_data->max_theta = laser_data->theta[num_rays-1]; - laser_data->odometry[0] = 0.0; - laser_data->odometry[1] = 0.0; - laser_data->odometry[2] = 0.0; + laser_data->odometry[0] = 0.0; + laser_data->odometry[1] = 0.0; + laser_data->odometry[2] = 0.0; - laser_data->true_pose[0] = 0.0; - laser_data->true_pose[1] = 0.0; - laser_data->true_pose[2] = 0.0; - } - ~LDWrapper(){ - ld_free(laser_data); - } + laser_data->true_pose[0] = 0.0; + laser_data->true_pose[1] = 0.0; + laser_data->true_pose[2] = 0.0; + + } + + ~LDWrapper() + { + ld_free(laser_data); + } }; ICP::ICP() @@ -75,10 +88,15 @@ 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) { +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); + //sm_debug_write(true); LDWrapper laser_scan_current = LDWrapper(_current_ls, _current_scan_params); LDWrapper laser_scan_ref = LDWrapper(_ref_ls, _ref_scan_params); @@ -128,29 +146,6 @@ icpOutput ICP::align(const LaserScan &_current_ls, const LaserScan &_ref_ls, con csm_input.gpm_extend_range_deg = _icp_params.gpm_extend_range_deg; csm_input.gpm_interval = _icp_params.gpm_interval; - // std::cout<< "=========================================================================================================================================\n"; - // std::cout << "csm max_angular_correction_deg " << csm_input.max_angular_correction_deg << " icp max_angular_correction_deg " << _icp_params.max_angular_correction_deg << "\n"; - // std::cout << "csm max_linear_correction " << csm_input.max_linear_correction << " icp max_linear_correction " << _icp_params.max_linear_correction << "\n"; - // std::cout << "csm epsilon_xy " << csm_input.epsilon_xy << " icp epsilon_xy " << _icp_params.epsilon_xy << "\n"; - // std::cout << "csm epsilon_theta " << csm_input.epsilon_theta << " icp epsilon_theta " << _icp_params.epsilon_theta << "\n"; - // std::cout << "csm sigma " << csm_input.sigma << " icp sigma " << _icp_params.sigma << "\n"; - // std::cout << "csm restart " << csm_input.restart << " icp restart " << _icp_params.restart << "\n"; - // std::cout << "csm restart_threshold_mean_error " << csm_input.restart_threshold_mean_error << " icp restart_threshold_mean_error " << _icp_params.restart_threshold_mean_error << "\n"; - // std::cout << "csm restart_dt " << csm_input.restart_dt << " icp restart_dt " << _icp_params.restart_dt << "\n"; - // std::cout << "csm restart_dtheta " << csm_input.restart_dtheta << " icp restart_dtheta " << _icp_params.restart_dtheta << "\n"; - // std::cout << "csm clustering_threshold " << csm_input.clustering_threshold << " icp clustering_threshold " << _icp_params.clustering_threshold << "\n"; - // std::cout << "csm orientation_neighbourhood " << csm_input.orientation_neighbourhood << " icp orientation_neighbourhood " << _icp_params.orientation_neighbourhood << "\n"; - // std::cout << "csm do_alpha_test " << csm_input.do_alpha_test << " icp do_alpha_test " << _icp_params.do_alpha_test << "\n"; - // std::cout << "csm do_alpha_test_thresholdDeg " << csm_input.do_alpha_test_thresholdDeg << " icp do_alpha_test_thresholdDeg " << _icp_params.do_alpha_test_thresholdDeg << "\n"; - // std::cout << "csm do_visibility_test " << csm_input.do_visibility_test << " icp do_visibility_test " << _icp_params.do_visibility_test << "\n"; - // std::cout << "csm outliers_remove_doubles " << csm_input.outliers_remove_doubles << " icp outliers_remove_doubles " << _icp_params.outliers_remove_doubles << "\n"; - // std::cout << "csm debug_verify_tricks " << csm_input.debug_verify_tricks << " icp debug_verify_tricks " << _icp_params.debug_verify_tricks << "\n"; - // std::cout << "csm gpm_theta_bin_size_deg " << csm_input.gpm_theta_bin_size_deg << " icp gpm_theta_bin_size_deg " << _icp_params.gpm_theta_bin_size_deg << "\n"; - // std::cout << "csm gpm_extend_range_deg " << csm_input.gpm_extend_range_deg << " icp gpm_extend_range_deg " << _icp_params.gpm_extend_range_deg << "\n"; - // std::cout << "csm gpm_interval " << csm_input.gpm_interval << " icp gpm_interval " << _icp_params.gpm_interval << "\n"; - // std::cout << "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - // "000000000000000000000000000000000\n"; - //Not implemented (yet) in CSM // csm_input.laser_x = _icp_params.laser_x; // csm_input.laser_y = _icp_params.laser_y; @@ -193,15 +188,11 @@ icpOutput ICP::align(const LaserScan &_current_ls, const LaserScan &_ref_ls, con } else { - std::cout << "ICP NOT VALID, providing first guess transformation and identity covariance\n"; + //std::cout << "ICP NOT VALID, 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; }