35 #include "nav2_amcl/pf/pf.hpp"
36 #include "nav2_amcl/pf/pf_pdf.hpp"
37 #include "nav2_amcl/pf/pf_kdtree.hpp"
39 #include "nav2_amcl/portable_utils.hpp"
44 static int pf_resample_limit(
pf_t * pf,
int k);
49 int min_samples,
int max_samples,
50 double alpha_slow,
double alpha_fast,
51 pf_init_model_fn_t random_pose_fn)
58 pf = calloc(1,
sizeof(
pf_t));
60 pf->random_pose_fn = random_pose_fn;
62 pf->min_samples = min_samples;
63 pf->max_samples = max_samples;
72 pf->dist_threshold = 0.5;
75 for (j = 0; j < 2; j++) {
78 set->sample_count = max_samples;
79 set->samples = calloc(max_samples,
sizeof(
pf_sample_t));
81 for (i = 0; i < set->sample_count; i++) {
82 sample = set->samples + i;
83 sample->pose.v[0] = 0.0;
84 sample->pose.v[1] = 0.0;
85 sample->pose.v[2] = 0.0;
86 sample->weight = 1.0 / max_samples;
90 set->kdtree = pf_kdtree_alloc(3 * max_samples);
92 set->cluster_count = 0;
93 set->cluster_max_count = max_samples;
94 set->clusters = calloc(set->cluster_max_count,
sizeof(
pf_cluster_t));
96 set->mean = pf_vector_zero();
97 set->cov = pf_matrix_zero();
103 pf->alpha_slow = alpha_slow;
104 pf->alpha_fast = alpha_fast;
107 pf_init_converged(pf);
113 void pf_free(
pf_t * pf)
117 for (i = 0; i < 2; i++) {
118 free(pf->sets[i].clusters);
119 pf_kdtree_free(pf->sets[i].kdtree);
120 free(pf->sets[i].samples);
133 set = pf->sets + pf->current_set;
136 pf_kdtree_clear(set->kdtree);
138 set->sample_count = pf->max_samples;
140 pdf = pf_pdf_gaussian_alloc(mean, cov);
143 for (i = 0; i < set->sample_count; i++) {
144 sample = set->samples + i;
145 sample->weight = 1.0 / pf->max_samples;
146 sample->pose = pf_pdf_gaussian_sample(pdf);
149 pf_kdtree_insert(set->kdtree, sample->pose, sample->weight);
152 pf->w_slow = pf->w_fast = 0.0;
154 pf_pdf_gaussian_free(pdf);
157 pf_cluster_stats(pf, set);
160 pf_init_converged(pf);
165 void pf_init_model(
pf_t * pf, pf_init_model_fn_t init_fn,
void * init_data)
171 set = pf->sets + pf->current_set;
174 pf_kdtree_clear(set->kdtree);
176 set->sample_count = pf->max_samples;
179 for (i = 0; i < set->sample_count; i++) {
180 sample = set->samples + i;
181 sample->weight = 1.0 / pf->max_samples;
182 sample->pose = (*init_fn)(init_data);
185 pf_kdtree_insert(set->kdtree, sample->pose, sample->weight);
188 pf->w_slow = pf->w_fast = 0.0;
191 pf_cluster_stats(pf, set);
194 pf_init_converged(pf);
197 void pf_init_converged(
pf_t * pf)
200 set = pf->sets + pf->current_set;
205 int pf_update_converged(
pf_t * pf)
211 set = pf->sets + pf->current_set;
212 double mean_x = 0, mean_y = 0;
214 for (i = 0; i < set->sample_count; i++) {
215 sample = set->samples + i;
217 mean_x += sample->pose.v[0];
218 mean_y += sample->pose.v[1];
220 mean_x /= set->sample_count;
221 mean_y /= set->sample_count;
223 for (i = 0; i < set->sample_count; i++) {
224 sample = set->samples + i;
225 if (fabs(sample->pose.v[0] - mean_x) > pf->dist_threshold ||
226 fabs(sample->pose.v[1] - mean_y) > pf->dist_threshold)
249 void pf_update_sensor(
pf_t * pf, pf_sensor_model_fn_t sensor_fn,
void * sensor_data)
256 set = pf->sets + pf->current_set;
259 total = (*sensor_fn)(sensor_data, set);
264 for (i = 0; i < set->sample_count; i++) {
265 sample = set->samples + i;
266 w_avg += sample->weight;
267 sample->weight /= total;
270 w_avg /= set->sample_count;
271 if (pf->w_slow == 0.0) {
274 pf->w_slow += pf->alpha_slow * (w_avg - pf->w_slow);
276 if (pf->w_fast == 0.0) {
279 pf->w_fast += pf->alpha_fast * (w_avg - pf->w_fast);
283 for (i = 0; i < set->sample_count; i++) {
284 sample = set->samples + i;
285 sample->weight = 1.0 / set->sample_count;
292 void pf_update_resample(
pf_t * pf,
void * random_pose_data)
306 set_a = pf->sets + pf->current_set;
307 set_b = pf->sets + (pf->current_set + 1) % 2;
312 c = (
double *)malloc(
sizeof(
double) * (set_a->sample_count + 1));
314 for (i = 0; i < set_a->sample_count; i++) {
315 c[i + 1] = c[i] + set_a->samples[i].weight;
319 pf_kdtree_clear(set_b->kdtree);
323 set_b->sample_count = 0;
325 w_diff = 1.0 - pf->w_fast / pf->w_slow;
341 while (set_b->sample_count < pf->max_samples) {
342 sample_b = set_b->samples + set_b->sample_count++;
344 if (drand48() < w_diff) {
345 sample_b->pose = (pf->random_pose_fn)(random_pose_data);
374 for (i = 0; i < set_a->sample_count; i++) {
375 if ((c[i] <= r) && (r < c[i + 1])) {
379 assert(i < set_a->sample_count);
381 sample_a = set_a->samples + i;
383 assert(sample_a->weight > 0);
386 sample_b->pose = sample_a->pose;
389 sample_b->weight = 1.0;
390 total += sample_b->weight;
393 pf_kdtree_insert(set_b->kdtree, sample_b->pose, sample_b->weight);
396 if (set_b->sample_count > pf_resample_limit(pf, set_b->kdtree->leaf_count)) {
403 pf->w_slow = pf->w_fast = 0.0;
409 for (i = 0; i < set_b->sample_count; i++) {
410 sample_b = set_b->samples + i;
411 sample_b->weight /= total;
415 pf_cluster_stats(pf, set_b);
418 pf->current_set = (pf->current_set + 1) % 2;
420 pf_update_converged(pf);
428 int pf_resample_limit(
pf_t * pf,
int k)
434 return pf->max_samples;
438 b = 2 / (9 * ((double) k - 1));
439 c = sqrt(2 / (9 * ((
double) k - 1))) * pf->pop_z;
442 n = (int) ceil((k - 1) / (2 * pf->pop_err) * x * x * x);
444 if (n < pf->min_samples) {
445 return pf->min_samples;
447 if (n > pf->max_samples) {
448 return pf->max_samples;
464 double m[4], c[2][2];
468 pf_kdtree_cluster(set->kdtree);
471 set->cluster_count = 0;
473 for (i = 0; i < set->cluster_max_count; i++) {
474 cluster = set->clusters + i;
476 cluster->mean = pf_vector_zero();
477 cluster->cov = pf_matrix_zero();
479 for (j = 0; j < 4; j++) {
482 for (j = 0; j < 2; j++) {
483 for (k = 0; k < 2; k++) {
484 cluster->c[j][k] = 0.0;
491 set->mean = pf_vector_zero();
492 set->cov = pf_matrix_zero();
493 for (j = 0; j < 4; j++) {
496 for (j = 0; j < 2; j++) {
497 for (k = 0; k < 2; k++) {
503 for (i = 0; i < set->sample_count; i++) {
504 sample = set->samples + i;
509 cidx = pf_kdtree_get_cluster(set->kdtree, sample->pose);
511 if (cidx >= set->cluster_max_count) {
514 if (cidx + 1 > set->cluster_count) {
515 set->cluster_count = cidx + 1;
518 cluster = set->clusters + cidx;
520 cluster->weight += sample->weight;
522 weight += sample->weight;
525 cluster->m[0] += sample->weight * sample->pose.v[0];
526 cluster->m[1] += sample->weight * sample->pose.v[1];
527 cluster->m[2] += sample->weight * cos(sample->pose.v[2]);
528 cluster->m[3] += sample->weight * sin(sample->pose.v[2]);
530 m[0] += sample->weight * sample->pose.v[0];
531 m[1] += sample->weight * sample->pose.v[1];
532 m[2] += sample->weight * cos(sample->pose.v[2]);
533 m[3] += sample->weight * sin(sample->pose.v[2]);
536 for (j = 0; j < 2; j++) {
537 for (k = 0; k < 2; k++) {
538 cluster->c[j][k] += sample->weight * sample->pose.v[j] * sample->pose.v[k];
539 c[j][k] += sample->weight * sample->pose.v[j] * sample->pose.v[k];
545 for (i = 0; i < set->cluster_count; i++) {
546 cluster = set->clusters + i;
548 cluster->mean.v[0] = cluster->m[0] / cluster->weight;
549 cluster->mean.v[1] = cluster->m[1] / cluster->weight;
550 cluster->mean.v[2] = atan2(cluster->m[3], cluster->m[2]);
552 cluster->cov = pf_matrix_zero();
555 for (j = 0; j < 2; j++) {
556 for (k = 0; k < 2; k++) {
557 cluster->cov.m[j][k] = cluster->c[j][k] / cluster->weight -
558 cluster->mean.v[j] * cluster->mean.v[k];
564 cluster->cov.m[2][2] = -2 * log(
566 cluster->m[2] * cluster->m[2] +
567 cluster->m[3] * cluster->m[3]));
575 set->mean.v[0] = m[0] / weight;
576 set->mean.v[1] = m[1] / weight;
577 set->mean.v[2] = atan2(m[3], m[2]);
580 for (j = 0; j < 2; j++) {
581 for (k = 0; k < 2; k++) {
582 set->cov.m[j][k] = c[j][k] / weight - set->mean.v[j] * set->mean.v[k];
588 set->cov.m[2][2] = -2 * log(sqrt(m[2] * m[2] + m[3] * m[3]));
626 int pf_get_cluster_stats(
627 pf_t * pf,
int clabel,
double * weight,
633 set = pf->sets + pf->current_set;
635 if (clabel >= set->cluster_count) {
638 cluster = set->clusters + clabel;
640 *weight = cluster->weight;
641 *mean = cluster->mean;