4 #include <gsl/gsl_matrix.h>
9 #include "../csm_all.h"
21 for(i=0;i<ld->
nrays;i++) {
24 if( r <= min_reading || r > max_reading)
40 sm_debug(
"sm_icp: laser_sens has %d/%d; laser_ref has %d/%d rays valid\n",
49 sm_debug(
"sm_icp: laser_sens has %d/%d; laser_ref has %d/%d rays valid (after removing outside interval [%f, %f])\n",
59 if(
params->use_corr_tricks ||
params->debug_verify_tricks)
65 if(
params->do_alpha_test) {
75 gsl_vector * x_new = gsl_vector_alloc(3);
78 if(
params->do_visibility_test) {
83 gsl_vector * minus_x_old = gsl_vector_alloc(3);
86 gsl_vector_free(minus_x_old);
92 if(!
icp_loop(
params, x_old->data, x_new->data, &error, &nvalid, &iterations)) {
93 sm_error(
"icp: ICP failed for some reason. \n");
102 double best_error = error;
103 gsl_vector * best_x = gsl_vector_alloc(3);
104 gsl_vector_memcpy(best_x, x_new);
107 (error/nvalid)>(
params->restart_threshold_mean_error) ) {
108 sm_debug(
"Restarting: %f > %f \n",(error/nvalid),(
params->restart_threshold_mean_error));
110 double dt =
params->restart_dt;
111 double dth =
params->restart_dtheta;
114 double perturb[6][3] = {
117 {0,0,dth}, {0,0,-dth}
120 int a;
for(a=0;a<6;a++){
121 sm_debug(
"-- Restarting with perturbation #%d\n", a);
123 gsl_vector * start = gsl_vector_alloc(3);
124 gvs(start, 0,
gvg(x_new,0)+perturb[a][0]);
125 gvs(start, 1,
gvg(x_new,1)+perturb[a][1]);
126 gvs(start, 2,
gvg(x_new,2)+perturb[a][2]);
127 gsl_vector * x_a = gsl_vector_alloc(3);
128 double my_error;
int my_valid;
int my_iterations;
129 if(!
icp_loop(&my_params, start->data, x_a->data, &my_error, &my_valid, &my_iterations)){
130 sm_error(
"Error during restart #%d/%d. \n", a, 6);
133 iterations+=my_iterations;
135 if(my_error < best_error) {
136 sm_debug(
"--Perturbation #%d resulted in error %f < %f\n", a,my_error,best_error);
137 gsl_vector_memcpy(best_x, x_a);
138 best_error = my_error;
140 gsl_vector_free(x_a); gsl_vector_free(start);
152 if(
params->use_corr_tricks)
158 if(
params->do_compute_covariance) {
160 val cov0_x, dx_dy1, dx_dy2;
163 &cov0_x, &dx_dy1, &dx_dy2);
183 res->
error = best_error;
187 gsl_vector_free(best_x);
189 gsl_vector_free(x_new);
190 gsl_vector_free(x_old);
231 if(
params->use_corr_tricks ||
params->debug_verify_tricks)
238 if(
params->do_alpha_test) {
248 gsl_vector * x_new = gsl_vector_alloc(3);
251 if(
params->do_visibility_test) {
256 gsl_vector * minus_x_old = gsl_vector_alloc(3);
257 ominus(x_old,minus_x_old);
259 gsl_vector_free(minus_x_old);
265 if(!
icp_loop(
params, x_old->data, x_new->data, &error, &nvalid, &iterations)) {
266 sm_error(
"icp: ICP failed for some reason. \n");
274 double best_error = error;
275 gsl_vector * best_x = gsl_vector_alloc(3);
276 gsl_vector_memcpy(best_x, x_new);
279 (error/nvalid)>(
params->restart_threshold_mean_error) ) {
280 sm_debug(
"Restarting: %f > %f \n",(error/nvalid),(
params->restart_threshold_mean_error));
281 double dt =
params->restart_dt;
282 double dth =
params->restart_dtheta;
285 double perturb[6][3] = {
288 {0,0,dth}, {0,0,-dth}
291 int a;
for(a=0;a<6;a++){
292 sm_debug(
"-- Restarting with perturbation #%d\n", a);
294 gsl_vector * start = gsl_vector_alloc(3);
295 gvs(start, 0,
gvg(x_new,0)+perturb[a][0]);
296 gvs(start, 1,
gvg(x_new,1)+perturb[a][1]);
297 gvs(start, 2,
gvg(x_new,2)+perturb[a][2]);
298 gsl_vector * x_a = gsl_vector_alloc(3);
299 double my_error;
int my_valid;
int my_iterations;
300 if(!
icp_loop(&my_params, start->data, x_a->data, &my_error, &my_valid, &my_iterations)){
301 sm_error(
"Error during restart #%d/%d. \n", a, 6);
304 iterations+=my_iterations;
306 if(my_error < best_error) {
307 sm_debug(
"--Perturbation #%d resulted in error %f < %f\n", a,my_error,best_error);
308 gsl_vector_memcpy(best_x, x_a);
309 best_error = my_error;
311 gsl_vector_free(x_a); gsl_vector_free(start);
322 if(
params->do_compute_covariance) {
324 val cov0_x, dx_dy1, dx_dy2;
327 &cov0_x, &dx_dy1, &dx_dy2);
347 res->
error = best_error;
351 gsl_vector_free(x_new);
352 gsl_vector_free(x_old);
353 gsl_vector_free(best_x);