45 #include "pf_kdtree.h" 50 void pf_draw_statistics(pf_t *pf, rtk_fig_t *fig);
54 void pf_draw_samples(pf_t *pf, rtk_fig_t *fig,
int max_samples)
61 set = pf->sets + pf->current_set;
62 max_samples = MIN(max_samples, set->sample_count);
64 for (i = 0; i < max_samples; i++)
66 sample =
set->samples + i;
68 px = sample->pose.v[0];
69 py = sample->pose.v[1];
70 pa = sample->pose.v[2];
74 rtk_fig_point(fig, px, py);
75 rtk_fig_arrow(fig, px, py, pa, 0.1, 0.02);
84 void pf_draw_hist(pf_t *pf, rtk_fig_t *fig)
88 set = pf->sets + pf->current_set;
90 rtk_fig_color(fig, 0.0, 0.0, 1.0);
91 pf_kdtree_draw(set->kdtree, fig);
98 void pf_draw_cep_stats(pf_t *pf, rtk_fig_t *fig)
103 pf_get_cep_stats(pf, &mean, &var);
106 rtk_fig_color(fig, 0, 0, 1);
107 rtk_fig_ellipse(fig, mean.v[0], mean.v[1], mean.v[2], 3 * var, 3 * var, 0);
114 void pf_draw_cluster_stats(pf_t *pf, rtk_fig_t *fig)
117 pf_cluster_t *cluster;
118 pf_sample_set_t *
set;
122 double weight, o, d1, d2;
124 set = pf->sets + pf->current_set;
126 for (i = 0; i <
set->cluster_count; i++)
128 cluster =
set->clusters + i;
130 weight = cluster->weight;
131 mean = cluster->mean;
135 pf_matrix_unitary(&r, &d, cov);
149 o = atan2(r.m[1][0], r.m[0][0]);
150 d1 = 6 * sqrt(d.m[0][0]);
151 d2 = 6 * sqrt(d.m[1][1]);
153 if (d1 > 1e-3 && d2 > 1e-3)
156 rtk_fig_ellipse(fig, mean.v[0], mean.v[1], o, d1, d2, 0);
157 rtk_fig_line_ex(fig, mean.v[0], mean.v[1], o, d1);
158 rtk_fig_line_ex(fig, mean.v[0], mean.v[1], o + M_PI / 2, d2);
162 rtk_fig_arrow(fig, mean.v[0], mean.v[1], mean.v[2], 0.50, 0.10);
163 rtk_fig_arrow(fig, mean.v[0], mean.v[1], mean.v[2] + 3 * sqrt(cov.m[2][2]), 0.50, 0.10);
164 rtk_fig_arrow(fig, mean.v[0], mean.v[1], mean.v[2] - 3 * sqrt(cov.m[2][2]), 0.50, 0.10);