15 #ifndef BELUGA_SENSOR_LIKELIHOOD_FIELD_MODEL_HPP
16 #define BELUGA_SENSOR_LIKELIHOOD_FIELD_MODEL_HPP
26 #include <range/v3/range/conversion.hpp>
27 #include <range/v3/view/all.hpp>
28 #include <range/v3/view/transform.hpp>
77 template <
class OccupancyGr
id>
116 const auto x_offset = transform.translation().x();
117 const auto y_offset = transform.translation().y();
118 const auto cos_theta = transform.so2().unit_complex().x();
119 const auto sin_theta = transform.so2().unit_complex().y();
123 const auto unknown_space_occupancy_likelihood_cubed =
124 unknown_space_occupancy_prob * unknown_space_occupancy_prob * unknown_space_occupancy_prob;
125 return std::transform_reduce(
126 points.cbegin(), points.cend(), 1.0, std::plus{},
127 [
this, x_offset, y_offset, cos_theta, sin_theta,
128 unknown_space_occupancy_likelihood_cubed](
const auto& point) {
132 const auto x = point.first * cos_theta - point.second * sin_theta + x_offset;
133 const auto y = point.first * sin_theta + point.second * cos_theta + y_offset;
135 return likelihood_field_.data_near(x, y).value_or(unknown_space_occupancy_likelihood_cubed);
157 const auto squared_distance = [&grid,
159 std::size_t first, std::size_t second) {
160 return std::min((grid.coordinates_at(first) - grid.coordinates_at(second)).squaredNorm(), squared_max_distance);
163 const auto neighborhood = [&grid](std::size_t index) {
return grid.neighborhood4(index); };
167 const auto to_likelihood = [amplitude =
171 assert(two_squared_sigma > 0.0);
172 assert(amplitude > 0.0);
173 return amplitude * std::exp(-squared_distance / two_squared_sigma) + offset;
178 const auto to_the_cube = [](
auto likelihood) {
return likelihood * likelihood * likelihood; };
180 auto likelihood_data = distance_map | ranges::views::transform(to_likelihood) |
181 ranges::views::transform(to_the_cube) | ranges::to<std::vector>;