25 #include "nav2_amcl/sensors/laser/laser.hpp"
31 double z_hit,
double z_short,
double z_max,
double z_rand,
double sigma_hit,
32 double lambda_short,
double chi_outlier,
size_t max_beams,
map_t * map)
33 : Laser(max_beams, map)
37 sigma_hit_ = sigma_hit;
40 lambda_short_ = lambda_short;
41 chi_outlier_ = chi_outlier;
53 double obs_range, obs_bearing;
58 self =
reinterpret_cast<BeamModel *
>(data->laser);
63 for (j = 0; j < set->sample_count; j++) {
64 sample = set->samples + j;
68 pose = pf_vector_coord_add(self->laser_pose_, pose);
72 step = (data->range_count - 1) / (self->max_beams_ - 1);
73 for (i = 0; i < data->range_count; i += step) {
74 obs_range = data->ranges[i][0];
77 if (isnan(obs_range)) {
81 obs_bearing = data->ranges[i][1];
84 map_range = map_calc_range(
85 self->map_, pose.v[0], pose.v[1],
86 pose.v[2] + obs_bearing, data->range_max);
90 z = obs_range - map_range;
91 pz +=
self->z_hit_ * exp(-(z * z) / (2 * self->sigma_hit_ * self->sigma_hit_));
95 pz +=
self->z_short_ *
self->lambda_short_ * exp(-self->lambda_short_ * obs_range);
99 if (obs_range == data->range_max) {
100 pz +=
self->z_max_ * 1.0;
104 if (obs_range < data->range_max) {
105 pz +=
self->z_rand_ * 1.0 / data->range_max;
119 total_weight += sample->weight;
126 BeamModel::sensorUpdate(
pf_t * pf, LaserData * data)
128 if (max_beams_ < 2) {
131 pf_update_sensor(pf, (pf_sensor_model_fn_t) sensorFunction, data);