0.引言
-
私有成员变量:
const double ratio_; int64 num_pulses_ = 0; int64 num_samples_ = 0;
-
构造函数设置频率 ratio
FixedRatioSampler(double ratio);
-
成员函数:
// 在比例小于ratio_时返回true, ratio_设置为1时都返回true, 也就是说使用所有的数据 bool FixedRatioSampler::Pulse() { ++num_pulses_; if (static_cast<double>(num_samples_) / num_pulses_ < ratio_) { ++num_samples_; return true; } // 返回false时代表数据可以不用,可以跳过计算 return false; }
1.理解
比例采样器 cartographer::common::FixedRatioSampler 目的是按照固定的比例采样数据。
每次调用 Pulse() 函数就产生一个脉冲(++num_pulse_). 该消息被采纳之后++num_samples_.
加入ratio是0.5,就是采用一半数据。那么每次调用Pulse则会:
0次:num_pulses_ = 1, num_samples_ = 0; 0/1 < 0.5, 采用, num_samples_ = 1;
1次:num_pulses_ = 2, num_samples_ = 1; 1/2 = 0.5, 不采用, num_samples_ = 1;
2次:num_pulses_ = 3, num_samples_ = 1; 1/3 < 0.5, 采用, num_samples_ = 2;
3次:num_pulses_ = 4, num_samples_ = 2; 2/4 = 0.5, 不采用, num_samples_ = 2;
4次:num_pulses_ = 5, num_samples_ = 2; 2/5 < 0.5, 采用, num_samples_ = 3;
3次:num_pulses_ = 6, num_samples_ = 3; 3/6 = 0.5, 不采用, num_samples_ = 3;
3次:num_pulses_ = 7, num_samples_ = 3; 3/7 < 0.5, 采用, num_samples_ = 4;
...
所以这样看来,并不是按照固定速率采用数据。而是对数据进行了按比例选择使用。
所有的距离传感器都只有一个采样器,所以就算不同的传感器也会同等的按照比例来选择。