KLD采样

根据KLD采样计算定位所需的粒子数量,不需要重采样则对粒子集进行排序,选出权重最大的cluster,其位姿为该时刻机器人的最优估计位姿。

// Compute the required number of samples, given that there are k bins
// with samples in them. This is taken directly from Fox et al.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int pf_resample_limit(pf_t *pf, int k)
{
double a, b, c, x;
int n;
if (k <= 1)
return pf->max_samples;
a = 1;
b = 2 / (9 * ((double) k - 1));
// pop_z 为3
c = sqrt(2 / (9 * ((double) k - 1))) * pf->pop_z;
x = a - b + c;
// pop_err 为0.01
n = (int) ceil( (k - 1) / (2 * pf->pop_err) * x * x * x );

if (n < pf->min_samples)
return pf->min_samples;
if (n > pf->max_samples)
return pf->max_samples;

return n;
}

粒子收敛,我们在rviz上看到的particlecloud话题,它的元素个数,粒子数其实是重采样之后的粒子集的粒子数set_b

1
2
3
4
5
6
7
if(  !(++resample_count_ % resample_interval_)  )
{
pf_update_resample(pf_);
resampled = true;
}
pf_sample_set_t* set = pf_->sets + pf_->current_set;
ROS_DEBUG("Num samples: %d\n", set->sample_count);

开始为max_particles,开始滤波后,虽然rviz上粒子看上去收敛到一起,但是粒子数不一定只有那么少。

如果min_particles大于pf_resample_limit计算得到的粒子数,那么particlecloud对应得粒子数是min_particles;如果小于,就是后者。也就是取二者的最大值。 但这个函数返回值并不是单调增或单调