15 #ifndef BELUGA_SENSOR_DATA_LANDMARK_MAP_HPP
16 #define BELUGA_SENSOR_DATA_LANDMARK_MAP_HPP
19 #include <range/v3/view/filter.hpp>
64 auto same_category_landmarks_view =
65 landmarks_ | ranges::views::filter([detection_category = detection_category](
const auto& l) {
66 return detection_category == l.category;
71 auto min = std::min_element(
72 same_category_landmarks_view.begin(), same_category_landmarks_view.end(),
73 [&detection_position_in_world](
const auto& a,
const auto& b) {
74 const auto& landmark_a_position_in_world = a.detection_position_in_robot;
75 const auto& landmark_b_position_in_world = b.detection_position_in_robot;
77 const auto landmark_b_squared_in_world_squared =
78 (landmark_a_position_in_world - detection_position_in_world).squaredNorm();
79 const auto landmark_b_distance_in_world_squared =
80 (landmark_b_position_in_world - detection_position_in_world).squaredNorm();
81 return landmark_b_squared_in_world_squared < landmark_b_distance_in_world_squared;
84 if (min == same_category_landmarks_view.end()) {
88 return min->detection_position_in_robot;
101 auto same_category_landmarks_view =
102 landmarks_ | ranges::views::filter([detection_category = detection_category](
const auto& l) {
103 return detection_category == l.category;
107 const auto world_in_sensor_transform = sensor_pose_in_world.inverse();
113 const auto minimization_function = [&detection_bearing_in_sensor, &world_in_sensor_transform](
114 const auto& a,
const auto& b) {
115 const auto& landmark_a_position_in_world = a.detection_position_in_robot;
116 const auto& landmark_b_position_in_world = b.detection_position_in_robot;
119 const auto landmark_a_bearing_in_sensor = (world_in_sensor_transform * landmark_a_position_in_world).normalized();
120 const auto landmark_b_bearing_in_sensor = (world_in_sensor_transform * landmark_b_position_in_world).normalized();
124 const auto dot_product_a = landmark_a_bearing_in_sensor.dot(detection_bearing_in_sensor);
125 const auto dot_product_b = landmark_b_bearing_in_sensor.dot(detection_bearing_in_sensor);
127 return dot_product_a > dot_product_b;
130 auto min = std::min_element(
131 same_category_landmarks_view.begin(), same_category_landmarks_view.end(), minimization_function);
133 if (min == same_category_landmarks_view.end()) {
138 const auto landmark_position_in_sensor = world_in_sensor_transform * min->detection_position_in_robot;
139 return landmark_position_in_sensor.normalized();