00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef PF_H
00010 #define PF_H
00011
00012 #include "pf_vector.h"
00013 #include "pf_kdtree.h"
00014
00015 #ifdef __cplusplus
00016 extern "C" {
00017 #endif
00018
00019
00020 struct _pf_t;
00021 struct _rtk_fig_t;
00022
00023
00024
00025 typedef pf_vector_t (*pf_init_model_fn_t) (void *init_data);
00026
00027
00028
00029 typedef pf_vector_t (*pf_action_model_fn_t) (void *action_data, pf_vector_t pose);
00030
00031
00032
00033 typedef double (*pf_sensor_model_fn_t) (void *sensor_data, pf_vector_t pose);
00034
00035
00036
00037 typedef struct
00038 {
00039
00040 pf_vector_t pose;
00041
00042
00043 double weight;
00044
00045 } pf_sample_t;
00046
00047
00048
00049 typedef struct
00050 {
00051
00052 int count;
00053
00054
00055 double weight;
00056
00057
00058 pf_vector_t mean;
00059 pf_matrix_t cov;
00060
00061
00062 double m[4], c[2][2];
00063
00064 } pf_cluster_t;
00065
00066
00067
00068 typedef struct
00069 {
00070
00071 int sample_count;
00072 pf_sample_t *samples;
00073
00074
00075 pf_kdtree_t *kdtree;
00076
00077
00078 int cluster_count, cluster_max_count;
00079 pf_cluster_t *clusters;
00080
00081 } pf_sample_set_t;
00082
00083
00084
00085 typedef struct _pf_t
00086 {
00087
00088 int min_samples, max_samples;
00089
00090
00091 double pop_err, pop_z;
00092
00093
00094
00095 int current_set;
00096 pf_sample_set_t sets[2];
00097
00098 } pf_t;
00099
00100
00101
00102 pf_t *pf_alloc(int min_samples, int max_samples);
00103
00104
00105 void pf_free(pf_t *pf);
00106
00107
00108 void pf_init(pf_t *pf, pf_vector_t mean, pf_matrix_t cov);
00109
00110
00111 void pf_init_model(pf_t *pf, pf_init_model_fn_t init_fn, void *init_data);
00112
00113
00114 void pf_update_action(pf_t *pf, pf_action_model_fn_t action_fn, void *action_data);
00115
00116
00117 void pf_update_sensor(pf_t *pf, pf_sensor_model_fn_t sensor_fn, void *sensor_data);
00118
00119
00120 void pf_update_resample(pf_t *pf);
00121
00122
00123 void pf_get_cep_stats(pf_t *pf, pf_vector_t *mean, double *var);
00124
00125
00126
00127 int pf_get_cluster_stats(pf_t *pf, int cluster, double *weight,
00128 pf_vector_t *mean, pf_matrix_t *cov);
00129
00130
00131 void pf_draw_samples(pf_t *pf, struct _rtk_fig_t *fig, int max_samples);
00132
00133
00134 void pf_draw_hist(pf_t *pf, struct _rtk_fig_t *fig);
00135
00136
00137 void pf_draw_cep_stats(pf_t *pf, struct _rtk_fig_t *fig);
00138
00139
00140 void pf_draw_cluster_stats(pf_t *pf, struct _rtk_fig_t *fig);
00141
00142 #ifdef __cplusplus
00143 }
00144 #endif
00145
00146
00147 #endif