// 单个粒子数据结构
typedef struct
{
// 粒子状态
pf_vector_t pose;
// 粒子权重
double weight;
} pf_sample_t;
// Information for a cluster of samples
// 粒子聚类
typedef struct
{
// 粒子数量
int count;
// 该聚类中的粒子总权重
double weight;
// 聚类统计量
pf_vector_t mean;
pf_matrix_t cov;
// Workspace
double m[4], c[2][2];
} pf_cluster_t;
// 一组样本粒子数据结构
typedef struct _pf_sample_set_t
{
// The samples
int sample_count;
pf_sample_t *samples;
// A kdtree encoding the histogram
pf_kdtree_t *kdtree;
// 聚类数据
int cluster_count, cluster_max_count;
pf_cluster_t *clusters;
// Filter statistics
pf_vector_t mean;
pf_matrix_t cov;
int converged;
} pf_sample_set_t;
// 整个滤波器数据结构
typedef struct _pf_t
{
// This min and max number of samples
int min_samples, max_samples;
// Population size parameters
double pop_err, pop_z;
// The sample sets. We keep two sets and use [current_set]
// to identify the active set.
int current_set;
pf_sample_set_t sets[2];
// Running averages, slow and fast, of likelihood
double w_slow, w_fast;
// Decay rates for running averages
double alpha_slow, alpha_fast;
// Function used to draw random pose samples 随机粒子的生成函数
pf_init_model_fn_t random_pose_fn;
void *random_pose_data; // 随机粒子位姿数据
double dist_threshold; //distance threshold in each axis over which the pf is considered to not be converged
int converged;
} pf_t;