38 #include <sys/types.h>
53 max_samples(0), max_obs(0),
113 double beam_skip_distance,
114 double beam_skip_threshold,
115 double beam_skip_error_threshold)
160 double obs_range, obs_bearing;
169 step = (
data->range_count - 1) / (self->max_beams - 1);
170 for (i = 0; i <
data->range_count; i +=
step)
172 obs_range =
data->ranges[i][0];
173 obs_bearing =
data->ranges[i][1];
177 pose.
v[2] + obs_bearing, self->range_max);
181 z = obs_range - map_range;
182 pz +=
self->z_hit * exp(-(z * z) / (2 * self->sigma_hit * self->sigma_hit));
186 pz +=
self->z_short *
self->lambda_short * exp(-self->lambda_short*obs_range);
189 if(obs_range == self->range_max)
190 pz +=
self->z_max * 1.0;
194 pz +=
self->z_rand * 1.0/
self->range_max;
218 double obs_range, obs_bearing;
229 int updated_count =
set->updated_count;
230 int* updated_index =
set->updated_index;
234 int range_count =
data->range_count;
235 if(updated_count > 0)
237 for (j = 0; j < updated_count; j++)
239 sample =
set->samples + updated_index[j];
247 step = (
data->range_count - 1) / (self->max_beams - 1);
248 for (i = 0; i <
data->range_count; i +=
step)
250 obs_range =
data->ranges[i][0];
251 obs_bearing =
data->ranges[i][1];
255 pose.
v[2] + obs_bearing, self->range_max);
259 z = obs_range - map_range;
260 pz +=
self->z_hit * exp(-(z * z) / (2 * self->sigma_hit * self->sigma_hit));
264 pz +=
self->z_short *
self->lambda_short * exp(-self->lambda_short*obs_range);
267 if(obs_range == self->range_max)
268 pz +=
self->z_max * 1.0;
272 pz +=
self->z_rand * 1.0/
self->range_max;
286 printf(
"Num of crossovered samples: %9.6d\n", updated_count);
291 for (j = 0; j <
set->sample_count; j++)
292 { group_weight = 0.0 ;
293 sample =
set->samples + j;
304 step = (
data->range_count - 1) / (self->max_beams - 1);
305 for (i = 0; i <
data->range_count; i +=
step)
307 obs_range =
data->ranges[i][0];
308 obs_bearing =
data->ranges[i][1];
312 pose.
v[2] + obs_bearing, self->range_max);
316 z = obs_range - map_range;
317 pz +=
self->z_hit * exp(-(z * z) / (2 * self->sigma_hit * self->sigma_hit));
321 pz +=
self->z_short *
self->lambda_short * exp(-self->lambda_short*obs_range);
324 if(obs_range == self->range_max)
325 pz +=
self->z_max * 1.0;
329 pz +=
self->z_rand * 1.0/
self->range_max;
341 group_weight += aux_sample->
weight ;
349 for (j = 0; j <
set->sample_count; j++)
351 sample =
set->samples + j;
359 step = (
data->range_count - 1) / (self->max_beams - 1);
360 for (i = 0; i <
data->range_count; i +=
step)
362 obs_range =
data->ranges[i][0];
363 obs_bearing =
data->ranges[i][1];
367 pose.
v[2] + obs_bearing, self->range_max);
371 z = obs_range - map_range;
372 pz +=
self->z_hit * exp(-(z * z) / (2 * self->sigma_hit * self->sigma_hit));
376 pz +=
self->z_short *
self->lambda_short * exp(-self->lambda_short*obs_range);
379 if(obs_range == self->range_max)
380 pz +=
self->z_max * 1.0;
384 pz +=
self->z_rand * 1.0/
self->range_max;
401 for (j = 0; j <
set->sample_count; j++)
403 sample =
set->samples + j;
412 for (i = 0; i <
data->range_count; i +=
step)
414 obs_range =
data->ranges[i][0];
415 obs_bearing =
data->ranges[i][1];
426 z = obs_range - map_range;
427 pz +=
self->z_hit * exp(-(z * z) / (2 * self->sigma_hit * self->sigma_hit));
431 pz +=
self->z_short *
self->lambda_short * exp(-self->lambda_short*obs_range);
435 pz +=
self->z_max * 1.0;
465 double obs_range, obs_bearing;
477 int updated_count =
set->updated_count;
478 int* updated_index =
set->updated_index;
482 int range_count =
data->range_count;
484 double z_hit_denom = 2 * self->sigma_hit * self->sigma_hit;
488 if(updated_count > 0)
490 for (j = 0; j < updated_count; j++)
492 sample =
set->samples + updated_index[j];
500 step = (
data->range_count - 1) / (self->max_beams - 1);
501 for (i = 0; i <
data->range_count; i +=
step)
503 obs_range =
data->ranges[i][0];
504 obs_bearing =
data->ranges[i][1];
510 if(obs_range != obs_range)
516 hit.
v[0] =
pose.
v[0] + obs_range * cos(
pose.
v[2] + obs_bearing);
517 hit.
v[1] =
pose.
v[1] + obs_range * sin(
pose.
v[2] + obs_bearing);
527 z =
self->map->max_occ_dist;
529 z =
self->map->cells[
MAP_INDEX(self->map,mi,mj)].occ_dist;
532 pz +=
self->z_hit * exp(-(z * z) / z_hit_denom);
534 pz +=
self->z_rand * z_rand_mult;
547 printf(
"Num of crossovered samples: %9.6d\n", updated_count);
552 for (j = 0; j <
set->sample_count; j++)
553 { group_weight = 0.0 ;
554 sample =
set->samples + j;
565 step = (
data->range_count - 1) / (self->max_beams - 1);
566 for (i = 0; i <
data->range_count; i +=
step)
568 obs_range =
data->ranges[i][0];
569 obs_bearing =
data->ranges[i][1];
575 if(obs_range != obs_range)
581 hit.
v[0] =
pose.
v[0] + obs_range * cos(
pose.
v[2] + obs_bearing);
582 hit.
v[1] =
pose.
v[1] + obs_range * sin(
pose.
v[2] + obs_bearing);
592 z =
self->map->max_occ_dist;
594 z =
self->map->cells[
MAP_INDEX(self->map,mi,mj)].occ_dist;
597 pz +=
self->z_hit * exp(-(z * z) / z_hit_denom);
599 pz +=
self->z_rand * z_rand_mult;
612 group_weight += aux_sample->
weight ;
620 for (j = 0; j <
set->sample_count; j++)
622 sample =
set->samples + j;
630 step = (
data->range_count - 1) / (self->max_beams - 1);
631 for (i = 0; i <
data->range_count; i +=
step)
633 obs_range =
data->ranges[i][0];
634 obs_bearing =
data->ranges[i][1];
641 if(obs_range != obs_range)
648 hit.
v[0] =
pose.
v[0] + obs_range * cos(
pose.
v[2] + obs_bearing);
649 hit.
v[1] =
pose.
v[1] + obs_range * sin(
pose.
v[2] + obs_bearing);
659 z =
self->map->max_occ_dist;
661 z =
self->map->cells[
MAP_INDEX(self->map,mi,mj)].occ_dist;
664 pz +=
self->z_hit * exp(-(z * z) / z_hit_denom);
666 pz +=
self->z_rand * z_rand_mult;
683 for (j = 0; j <
set->sample_count; j++)
685 sample =
set->samples + j;
694 for (i = 0; i <
data->range_count; i +=
step)
696 obs_range =
data->ranges[i][0];
697 obs_bearing =
data->ranges[i][1];
703 if(obs_range != obs_range)
709 hit.
v[0] =
pose.
v[0] + obs_range * cos(
pose.
v[2] + obs_bearing);
710 hit.
v[1] =
pose.
v[1] + obs_range * sin(
pose.
v[2] + obs_bearing);
720 z =
self->map->max_occ_dist;
722 z =
self->map->cells[
MAP_INDEX(self->map,mi,mj)].occ_dist;
725 pz +=
self->z_hit * exp(-(z * z) / z_hit_denom);
727 pz +=
self->z_rand * z_rand_mult;
751 double obs_range, obs_bearing;
764 int updated_count =
set->updated_count;
765 int* updated_index =
set->updated_index;
769 int range_count =
data->range_count;
771 step = ceil((
data->range_count) /
static_cast<double>(
self->max_beams));
778 double z_hit_denom = 2 *
self->sigma_hit *
self->sigma_hit;
779 double z_rand_mult = 1.0/
self->range_max;
781 double max_dist_prob = exp(-(self->map->max_occ_dist * self->map->max_occ_dist) / z_hit_denom);
797 int *obs_count =
new int[
self->max_beams]();
800 bool *obs_mask =
new bool[
self->max_beams]();
805 bool realloc =
false;
808 if(self->max_obs < self->max_beams){
812 if(self->max_samples <
set->sample_count){
817 self->reallocTempData(
set->sample_count, self->max_beams);
818 fprintf(stderr,
"Reallocing temp weights %d - %d\n", self->max_samples, self->max_obs);
822 if(updated_count > 0)
824 for (j = 0; j < updated_count; j++)
826 sample =
set->samples + updated_index[j];
835 for (i = 0; i <
data->range_count; i +=
step, beam_ind++)
837 obs_range =
data->ranges[i][0];
838 obs_bearing =
data->ranges[i][1];
844 if(obs_range != obs_range)
850 hit.
v[0] =
pose.
v[0] + obs_range * cos(
pose.
v[2] + obs_bearing);
851 hit.
v[1] =
pose.
v[1] + obs_range * sin(
pose.
v[2] + obs_bearing);
861 pz +=
self->z_hit * max_dist_prob;
864 z =
self->map->cells[
MAP_INDEX(self->map,mi,mj)].occ_dist;
866 obs_count[beam_ind] += 1;
868 pz +=
self->z_hit * exp(-(z * z) / z_hit_denom);
874 pz +=
self->z_rand * z_rand_mult;
884 self->temp_obs[j][beam_ind] = pz;
888 sample->
weight *= exp(log_p);
893 int skipped_beam_count = 0;
894 for (beam_ind = 0; beam_ind <
self->max_beams; beam_ind++){
896 obs_mask[beam_ind] =
true;
899 obs_mask[beam_ind] =
false;
900 skipped_beam_count++;
910 if(skipped_beam_count >= (beam_ind * self->beam_skip_error_threshold)){
911 fprintf(stderr,
"Over %f%% of the observations were not in the map - pf may have converged to wrong pose - integrating all observations\n", (100 * self->beam_skip_error_threshold));
915 for (j = 0; j < updated_count; j++)
917 sample =
set->samples + updated_index[j];
922 for (beam_ind = 0; beam_ind <
self->max_beams; beam_ind++){
923 if(error || obs_mask[beam_ind]){
924 log_p += log(self->temp_obs[j][beam_ind]);
928 sample->
weight *= exp(log_p);
933 printf(
"Num of crossovered samples: %9.6d\n", updated_count);
937 if(pf->model.use_optimal_filter)
939 for (j = 0; j <
set->sample_count; j++)
940 { group_weight = 0.0 ;
941 sample =
set->samples + j;
942 for (
int loop=0 ; loop < pf->N_aux_particles ; loop++)
944 aux_sample =
set->aux_samples + (j*pf->N_aux_particles+loop) ;
954 for (i = 0; i <
data->range_count; i +=
step, beam_ind++)
956 obs_range =
data->ranges[i][0];
957 obs_bearing =
data->ranges[i][1];
965 if(obs_range != obs_range){
972 hit.
v[0] =
pose.
v[0] + obs_range * cos(
pose.
v[2] + obs_bearing);
973 hit.
v[1] =
pose.
v[1] + obs_range * sin(
pose.
v[2] + obs_bearing);
984 pz +=
self->z_hit * max_dist_prob;
987 z =
self->map->cells[
MAP_INDEX(self->map,mi,mj)].occ_dist;
989 obs_count[beam_ind] += 1;
991 pz +=
self->z_hit * exp(-(z * z) / z_hit_denom);
998 pz +=
self->z_rand * z_rand_mult;
1009 self->temp_obs[j][beam_ind] = pz;
1013 aux_sample->
weight = exp(log_p);
1014 group_weight += aux_sample->
weight ;
1018 sample->
weight *= group_weight/pf->N_aux_particles;
1019 sample->
last_obs = group_weight/pf->N_aux_particles;
1024 int skipped_beam_count = 0;
1025 for (beam_ind = 0; beam_ind <
self->max_beams; beam_ind++){
1027 obs_mask[beam_ind] =
true;
1030 obs_mask[beam_ind] =
false;
1031 skipped_beam_count++;
1041 if(skipped_beam_count >= (beam_ind * self->beam_skip_error_threshold)){
1042 fprintf(stderr,
"Over %f%% of the observations were not in the map - pf may have converged to wrong pose - integrating all observations\n", (100 * self->beam_skip_error_threshold));
1046 for (j = 0; j <
set->sample_count; j++)
1047 { group_weight = 0.0 ;
1048 sample =
set->samples + j;
1049 for (
int loop=0 ; loop < pf->N_aux_particles ; loop++)
1051 aux_sample =
set->aux_samples + (j*pf->N_aux_particles+loop) ;
1054 sample =
set->samples + j;
1059 for (beam_ind = 0; beam_ind <
self->max_beams; beam_ind++){
1060 if(error || obs_mask[beam_ind]){
1061 log_p += log(self->temp_obs[j][beam_ind]);
1065 aux_sample->
weight = exp(log_p);
1066 group_weight += aux_sample->
weight ;
1069 sample->
weight *= group_weight/pf->N_aux_particles;
1070 sample->
last_obs = group_weight/pf->N_aux_particles;
1076 else if(pf->model.use_crossover_mutation)
1078 for (j = 0; j <
set->sample_count; j++)
1080 sample =
set->samples + j;
1090 for (i = 0; i <
data->range_count; i +=
step, beam_ind++)
1092 obs_range =
data->ranges[i][0];
1093 obs_bearing =
data->ranges[i][1];
1101 if(obs_range != obs_range){
1108 hit.
v[0] =
pose.
v[0] + obs_range * cos(
pose.
v[2] + obs_bearing);
1109 hit.
v[1] =
pose.
v[1] + obs_range * sin(
pose.
v[2] + obs_bearing);
1120 pz +=
self->z_hit * max_dist_prob;
1123 z =
self->map->cells[
MAP_INDEX(self->map,mi,mj)].occ_dist;
1125 obs_count[beam_ind] += 1;
1127 pz +=
self->z_hit * exp(-(z * z) / z_hit_denom);
1134 pz +=
self->z_rand * z_rand_mult;
1145 self->temp_obs[j][beam_ind] = pz;
1149 sample->
weight *= exp(log_p);
1155 int skipped_beam_count = 0;
1156 for (beam_ind = 0; beam_ind <
self->max_beams; beam_ind++){
1158 obs_mask[beam_ind] =
true;
1161 obs_mask[beam_ind] =
false;
1162 skipped_beam_count++;
1172 if(skipped_beam_count >= (beam_ind * self->beam_skip_error_threshold)){
1173 fprintf(stderr,
"Over %f%% of the observations were not in the map - pf may have converged to wrong pose - integrating all observations\n", (100 * self->beam_skip_error_threshold));
1177 for (j = 0; j <
set->sample_count; j++)
1179 sample =
set->samples + j;
1184 for (beam_ind = 0; beam_ind <
self->max_beams; beam_ind++){
1185 if(error || obs_mask[beam_ind]){
1186 log_p += log(self->temp_obs[j][beam_ind]);
1190 sample->
weight *= exp(log_p);
1198 {
for (j = 0; j <
set->sample_count; j++)
1200 sample =
set->samples + j;
1210 for (i = 0; i <
data->range_count; i +=
step, beam_ind++)
1212 obs_range =
data->ranges[i][0];
1213 obs_bearing =
data->ranges[i][1];
1221 if(obs_range != obs_range){
1228 hit.
v[0] =
pose.
v[0] + obs_range * cos(
pose.
v[2] + obs_bearing);
1229 hit.
v[1] =
pose.
v[1] + obs_range * sin(
pose.
v[2] + obs_bearing);
1240 pz +=
self->z_hit * max_dist_prob;
1243 z =
self->map->cells[
MAP_INDEX(self->map,mi,mj)].occ_dist;
1245 obs_count[beam_ind] += 1;
1247 pz +=
self->z_hit * exp(-(z * z) / z_hit_denom);
1254 pz +=
self->z_rand * z_rand_mult;
1265 self->temp_obs[j][beam_ind] = pz;
1269 sample->
weight *= exp(log_p);
1274 int skipped_beam_count = 0;
1275 for (beam_ind = 0; beam_ind <
self->max_beams; beam_ind++){
1277 obs_mask[beam_ind] =
true;
1280 obs_mask[beam_ind] =
false;
1281 skipped_beam_count++;
1291 if(skipped_beam_count >= (beam_ind * self->beam_skip_error_threshold)){
1292 fprintf(stderr,
"Over %f%% of the observations were not in the map - pf may have converged to wrong pose - integrating all observations\n", (100 * self->beam_skip_error_threshold));
1296 for (j = 0; j <
set->sample_count; j++)
1298 sample =
set->samples + j;
1303 for (beam_ind = 0; beam_ind <
self->max_beams; beam_ind++){
1304 if(error || obs_mask[beam_ind]){
1305 log_p += log(self->temp_obs[j][beam_ind]);
1309 sample->
weight *= exp(log_p);
1316 delete [] obs_count;