Go to the documentation of this file.
54 pf_t *
pf_alloc(
int min_samples,
int max_samples,
int N_aux_particles,
55 double alpha_slow,
double alpha_fast,
double crossover_alpha ,
double mutation_prob ,
65 pf = calloc(1,
sizeof(
pf_t));
86 for (j = 0; j < 2; j++)
90 set->updated_index = NULL;
91 set->updated_count = 0;
92 set->sample_count = max_samples;
95 for (i = 0; i <
set->sample_count; i++)
97 sample =
set->samples + i;
98 sample->
pose.
v[0] = 0.0;
99 sample->
pose.
v[1] = 0.0;
100 sample->
pose.
v[2] = 0.0;
101 sample->
weight = 1.0 / max_samples;
106 set->cluster_count = 0;
107 set->cluster_max_count = max_samples;
137 for (i = 0; i < 2; i++)
169 for (i = 0; i <
set->sample_count; i++)
171 sample =
set->samples + i;
179 for (i = 0; i <
set->sample_count; i++)
181 sample =
set->samples + i;
188 {
for (
int j = 0; j <
set->sample_count; j++)
189 { sample =
set->samples + j ;
228 for (i = 0; i <
set->sample_count; i++)
230 sample =
set->samples + i;
232 sample->
pose = (*init_fn) (pf, init_data , e_init_data);
238 for (i = 0; i <
set->sample_count; i++)
240 sample =
set->samples + i;
242 sample->
pose = (*init_fn) (pf, init_data , e_init_data);
246 {
for (
int j = 0; j <
set->sample_count; j++)
247 { sample =
set->samples + j ;
252 aux_sample->
weight = 1.0 ;
283 double mean_x = 0, mean_y = 0;
285 for (i = 0; i <
set->sample_count; i++){
286 sample =
set->samples + i;
288 mean_x += sample->
pose.
v[0];
289 mean_y += sample->
pose.
v[1];
291 mean_x /=
set->sample_count;
292 mean_y /=
set->sample_count;
294 for (i = 0; i <
set->sample_count; i++){
295 sample =
set->samples + i;
315 (*action_fn) (action_data,
set);
341 (*laser_fn) (laser_data,
set);
344 for (
int j = 0; j <
set->sample_count; j++)
345 { sample =
set->samples + j ;
351 if(aux_sample->
weight > best)
354 best = aux_sample->
weight;
359 for (i = 0; i <
set->sample_count; i++)
361 sample =
set->samples + i;
365 set->n_effective = 0;
371 set->total_weight = total;
381 for (i = 0; i <
set->sample_count; i++)
383 sample =
set->samples + i;
391 w_avg /=
set->sample_count;
406 for (i = 0; i <
set->sample_count; i++)
408 sample =
set->samples + i;
409 sample->
weight = 1.0 /
set->sample_count;
413 set->n_effective = 1.0/
set->n_effective;
443 assert(sample_a->
weight > 0);
449 total += sample_b->
weight;
461 assert(sample_a->
weight > 0);
467 total += sample_b->
weight;
475 sample_b->
weight /= total;
518 c = (
double*)malloc(
sizeof(
double)*(set_a->
sample_count+1));
584 if((c[i] <= r) && (r < c[i+1]))
587 assert(i<set_a->sample_count);
591 assert(sample_a->
weight > 0);
598 total += sample_b->
weight;
646 if((c[i] <= r) && (r < c[i+1]))
649 assert(i<set_a->sample_count);
653 assert(sample_a->
weight > 0);
660 total += sample_b->
weight;
674 sample_b->
weight /= total;
690 {
int i ,j, num_ch , num_cl;
698 num_ch = num_cl = 0 ;
701 C_h = (
int*)malloc(
sizeof(
int)*(
set->sample_count));
702 C_l = (
int*)malloc(
sizeof(
int)*(
set->sample_count));
704 if(
set->total_weight ==0)
706 total =
set->total_weight ;
707 for(i=0 ; i<
set->sample_count ; i++)
709 sample =
set->samples + i ;
711 if(sample->
weight/total >= 1.0/
set->sample_count)
726 for(i=0 ; i<num_cl ; i++)
729 sample_l =
set->samples +C_l[i] ;
730 sample_h =
set->samples +C_h[(int)r] ;
735 if ( r <= pf->mutation_prob)
756 set->updated_index = C_l;
757 set->updated_count = num_cl;
760 (*laser_fn) (pf, laser_data);
762 set->updated_index = NULL;
763 set->updated_count = 0;
764 free(C_h) ;free(C_l);
791 b = 2 / (9 * ((double) k - 1));
792 c = sqrt(2 / (9 * ((
double) k - 1))) * pf->
pop_z;
795 n = (int) ceil((k - 1) / (2 * pf->
pop_err) * x * x * x);
797 if (n < pf->min_samples)
822 double m[4], c[2][2];
828 set->cluster_count = 0;
832 for (i = 0; i <
set->cluster_max_count; i++)
834 cluster =
set->clusters + i;
840 for (j = 0; j < 4; j++)
842 for (j = 0; j < 2; j++)
843 for (k = 0; k < 2; k++)
844 cluster->
c[j][k] = 0.0;
852 for (j = 0; j < 4; j++)
854 for (j = 0; j < 2; j++)
855 for (k = 0; k < 2; k++)
860 for (i = 0; i <
set->sample_count; i++)
862 sample =
set->samples + i;
870 if (cidx >=
set->cluster_max_count)
872 if (cidx + 1 >
set->cluster_count)
873 set->cluster_count = cidx + 1;
875 cluster =
set->clusters + cidx;
886 cluster->
m[2] += sample->
weight * cos(sample->
pose.
v[2]);
887 cluster->
m[3] += sample->
weight * sin(sample->
pose.
v[2]);
895 for (j = 0; j < 2; j++)
896 for (k = 0; k < 2; k++)
904 for (i = 0; i <
set->cluster_count; i++)
906 cluster =
set->clusters + i;
910 cluster->
mean.
v[2] = atan2(cluster->
m[3], cluster->
m[2]);
915 for (j = 0; j < 2; j++)
916 for (k = 0; k < 2; k++)
917 cluster->
cov.
m[j][k] = cluster->
c[j][k] / cluster->
weight -
922 cluster->
cov.
m[2][2] = -2 * log(sqrt(cluster->
m[2] * cluster->
m[2] +
923 cluster->
m[3] * cluster->
m[3]));
929 set->mean.v[0] = m[0] / weight;
930 set->mean.v[1] = m[1] / weight;
931 set->mean.v[2] = atan2(m[3], m[2]);
934 for (j = 0; j < 2; j++)
935 for (k = 0; k < 2; k++)
936 set->cov.m[j][k] = c[j][k] / weight -
set->mean.v[j] *
set->mean.v[k];
938 set->cov.m[2][0] =
set->cov.m[0][0] +
set->cov.m[1][1];
941 set->cov.m[2][2] = -2 * log(sqrt(m[2] * m[2] + m[3] * m[3]));
952 double m[4], c[2][2];
955 set->cluster_count = 1;
957 cluster =
set->clusters + 0;
963 for (j = 0; j < 4; j++)
965 for (j = 0; j < 2; j++)
966 for (k = 0; k < 2; k++)
967 cluster->
c[j][k] = 0.0;
974 for (j = 0; j < 4; j++)
976 for (j = 0; j < 2; j++)
977 for (k = 0; k < 2; k++)
982 for (i = 0; i <
set->sample_count; i++)
984 sample =
set->samples + i;
997 for (j = 0; j < 2; j++)
998 for (k = 0; k < 2; k++)
1009 cluster->
mean.
v[0] = m[0];
1010 cluster->
mean.
v[1] = m[1];
1011 cluster->
mean.
v[2] = atan2(m[3], m[2]);
1014 set->mean.v[0] = cluster->
mean.
v[0];
1015 set->mean.v[1] = cluster->
mean.
v[1];
1016 set->mean.v[2] = cluster->
mean.
v[2];
1020 for (j = 0; j < 2; j++)
1021 for (k = 0; k < 2; k++)
1023 cluster->
cov.
m[j][k] = c[j][k] -
set->mean.v[j] *
set->mean.v[k];
1024 set->cov.m[j][k] = cluster->
cov.
m[j][k];
1026 cluster->
cov.
m[2][0] = cluster->
cov.
m[0][0] +cluster->
cov.
m[1][1];
1029 set->cov.m[2][0] = cluster->
cov.
m[2][0];
1034 cluster->
cov.
m[2][2] = -2 * log(sqrt(m[2] * m[2] + m[3] * m[3]));
1035 set->cov.m[2][2] = cluster->
cov.
m[2][2];
1051 for (
int j = 0; j < 2; j++)
1061 aux_sample->
pose.
v[0] = 0.0;
1062 aux_sample->
pose.
v[1] = 0.0;
1063 aux_sample->
pose.
v[2] = 0.0;
1064 aux_sample->
weight = 1.0 ;
1081 double mn, mx, my, mrr;
1092 for (i = 0; i <
set->sample_count; i++)
1094 sample =
set->samples + i;
1103 mean->
v[0] = mx / mn;
1104 mean->
v[1] = my / mn;
1107 *var = mrr / mn - (mx * mx / (mn * mn) + my * my / (mn * mn));
1122 if (clabel >=
set->cluster_count)
1124 cluster =
set->clusters + clabel;
1126 *weight = cluster->
weight;
1127 *mean = cluster->
mean;
1128 *cov = cluster->
cov;
pf_matrix_t pf_matrix_zero()
void pf_kdtree_cluster(pf_kdtree_t *self)
bool use_adaptive_sampling
void * e_random_pose_data
int pf_get_cluster_stats(pf_t *pf, int clabel, double *weight, pf_vector_t *mean, pf_matrix_t *cov)
void pf_update_action(pf_t *pf, pf_action_model_fn_t action_fn, void *action_data)
pf_t * pf_alloc(int min_samples, int max_samples, int N_aux_particles, double alpha_slow, double alpha_fast, double crossover_alpha, double mutation_prob, pf_init_model_fn_t random_pose_fn, void *random_pose_data, void *e_random_pose_data)
int pf_kdtree_get_cluster(pf_kdtree_t *self, pf_vector_t pose)
void(* pf_reupdate_sensor_fn_t)(struct _pf_t *pf, void *laser_data)
void(* pf_laser_model_fn_t)(void *laser_data, struct _pf_sample_set_t *set)
void pf_update_sensor(pf_t *pf, pf_laser_model_fn_t laser_fn, void *laser_data)
static double drand48(void)
void pf_update_resample(pf_t *pf)
pf_kdtree_t * pf_kdtree_alloc(int max_size)
static void srand48(long int seedval)
void pf_set_selective_resampling(pf_t *pf, int selective_resampling)
void pf_cluster_stats(pf_t *pf, pf_sample_set_t *set)
void pf_pdf_gaussian_free(pf_pdf_gaussian_t *pdf)
void pf_update_crossover_mutation(pf_t *pf, pf_reupdate_sensor_fn_t laser_fn, void *laser_data)
pf_vector_t pf_vector_zero()
void pf_kdtree_clear(pf_kdtree_t *self)
void pf_init_model(pf_t *pf, pf_init_model_fn_t init_fn, void *init_data, void *e_init_data)
pf_vector_t(* pf_init_model_fn_t)(struct _pf_t *pf, void *init_data, void *e_init_data)
ROSCPP_DECL void set(const std::string &key, bool b)
pf_pdf_gaussian_t * pf_pdf_gaussian_alloc(pf_vector_t x, pf_matrix_t cx)
void pf_set_model_type(pf_t *pf, pf_model_type *pf_model)
void pf_init(pf_t *pf, pf_vector_t mean, pf_matrix_t cov)
void pf_kdtree_insert(pf_kdtree_t *self, pf_vector_t pose, double value)
static int pf_resample_limit(pf_t *pf, int k)
void copy_set(pf_sample_set_t *set_a, pf_sample_set_t *set_b)
pf_init_model_fn_t random_pose_fn
pf_sample_t * aux_samples
void pf_get_cep_stats(pf_t *pf, pf_vector_t *mean, double *var)
void pf_init_converged(pf_t *pf)
void(* pf_action_model_fn_t)(void *action_data, struct _pf_sample_set_t *set)
bool use_crossover_mutation
void pf_kdtree_free(pf_kdtree_t *self)
pf_vector_t pf_pdf_gaussian_sample(pf_pdf_gaussian_t *pdf)
void pf_normlize_weight(pf_t *pf)
int pf_update_converged(pf_t *pf)
gmcl
Author(s): Mhd Ali Alshikh Khalil, adler1994@gmail.com
autogenerated on Wed Mar 2 2022 00:20:14