85 using occupancy_t = float;
86 using logit_t = float;
87 using depth_t = unsigned;
89 depth_t hit_depth = 0;
90 depth_t miss_depth = 0;
92 occupancy_t occupancy_hit = 0.75f;
93 occupancy_t occupancy_miss = 0.45f;
94 logit_t occupancy_max_clamp_thres = 0.971f;
95 logit_t occupancy_min_clamp_thres = 0.1192f;
97 unsigned void_region_distance = 2;
99 DownSamplingMethod sample_method = DownSamplingMethod::NONE;
102 bool free_hits =
false;
104 bool verbose =
false;
106 CountSamplingMethod count_sample_method = CountSamplingMethod::NONE;
109 bool void_region_instant_max_occupancy =
true;
111 bool void_region_instant_min_occupancy =
true;
113 bool propagate =
false;
115 bool reset_modified =
true;
120 template <
class Map,
class T,
class... Rest>
129 std::enable_if_t<execution::is_execution_policy_v<ExecutionPolicy>,
bool> =
true>
143 template <
class Map,
class... Ts>
144 void insertHit(
Map& map,
TreeIndex const& node, SoAElement<Ts...>
const& data,
145 logit_t occupancy, logit_t occupancy_min, logit_t occupancy_max)
const
147 if constexpr (Map::hasMapTypes(MapType::OCCUPANCY)) {
148 if constexpr (Map::hasMapTypes(MapType::VOID_REGION)) {
149 if (void_region_instant_max_occupancy && map.voidRegion(node)) {
150 map.occupancyLogitSet(node, occupancy_max,
false);
152 map.occupancyLogitUpdate(node, occupancy,
false);
155 map.occupancyLogitUpdate(node, occupancy,
false);
159 if constexpr (Map::hasMapTypes(MapType::COLOR) && contains_color_v<Ts...>) {
160 using color_type = first_color_t<Ts...>;
164 auto c = data.template get<color_type>();
165 map.colorAdd(node, c,
false);
171 template <
class Map,
class T,
class... Rest>
178 cached_hits_.resize(cloud.size());
179 auto points = cloud.template view<0>();
181 points.begin(), points.end(), cached_hits_.begin(),
182 [&map, d = hit_depth](
auto const& p) { return map.code(TreeCoord(p, d)); });
184 map.create(cached_hits_, cached_hits_.begin());
186 ufo::for_each(std::size_t(0),
static_cast<std::size_t
>(cached_hits_.size()),
187 [
this, &map, &cloud, occ, occ_min, occ_max](std::size_t i) {
188 auto node = cached_hits_[i].node;
193 insertHit(map, node, cloud[i], occ, occ_min, occ_max);
199 std::enable_if_t<execution::is_execution_policy_v<ExecutionPolicy>,
bool> =
true>
207 cached_hits_.resize(cloud.size());
208 auto points = cloud.template view<0>();
210 policy, points.begin(), points.end(), cached_hits_.begin(),
211 [&map, d = hit_depth](
auto const& p) { return map.code(TreeCoord(p, d)); });
213 map.create(policy, cached_hits_, cached_hits_.begin());
215 ufo::for_each(std::forward<ExecutionPolicy>(policy), std::size_t(0),
216 static_cast<std::size_t
>(cached_hits_.size()),
217 [
this, &map, &cloud, occ, occ_min, occ_max](std::size_t i) {
218 auto node = cached_hits_[i].node;
223 insertHit(map, node, cloud[i], occ, occ_min, occ_max);
227 template <
class Map,
class T,
class... Ts>
229 SoAElement<Ts...>
const& data, logit_t occupancy, logit_t occupancy_min,
230 logit_t occupancy_max)
const
232 if constexpr (Map::hasMapTypes(MapType::OCCUPANCY)) {
233 if constexpr (Map::hasMapTypes(MapType::VOID_REGION)) {
234 if (void_region_instant_max_occupancy && map.voidRegion(node)) {
235 map.occupancyLogitSet(node, occupancy_max,
false);
237 map.occupancyLogitUpdate(node, occupancy,
false);
240 map.occupancyLogitUpdate(node, occupancy,
false);
244 if constexpr (Map::hasMapTypes(MapType::COLOR) && contains_color_v<Ts...>) {
245 using color_type = first_color_t<Ts...>;
249 auto c = data.template get<color_type>();
250 if constexpr (map.colorDirectional()) {
251 auto dir = data.template get<0>() - sensor_origin;
252 map.colorAdd(node,
normalize(dir), c,
false);
254 map.colorAdd(node, c,
false);
261 template <
class Map,
class T,
class... Rest>
269 cached_hits_.resize(cloud.size());
270 auto points = cloud.template view<0>();
272 points.begin(), points.end(), cached_hits_.begin(),
273 [&map, d = hit_depth](
auto const& p) { return map.code(TreeCoord(p, d)); });
275 map.create(cached_hits_, cached_hits_.begin());
278 std::size_t(0),
static_cast<std::size_t
>(cached_hits_.size()),
279 [
this, &map, &cloud, &sensor_origin, occ, occ_min, occ_max](std::size_t i) {
280 auto node = cached_hits_[i].node;
285 insertHit(map, sensor_origin, node, cloud[i], occ, occ_min, occ_max);
291 std::enable_if_t<execution::is_execution_policy_v<ExecutionPolicy>,
bool> =
true>
300 cached_hits_.resize(cloud.size());
301 auto points = cloud.template view<0>();
303 policy, points.begin(), points.end(), cached_hits_.begin(),
304 [&map, d = hit_depth](
auto const& p) { return map.code(TreeCoord(p, d)); });
306 map.create(policy, cached_hits_, cached_hits_.begin());
309 std::forward<ExecutionPolicy>(policy), std::size_t(0),
310 static_cast<std::size_t
>(cached_hits_.size()),
311 [
this, &map, &cloud, &sensor_origin, occ, occ_min, occ_max](std::size_t i) {
312 auto node = cached_hits_[i].node;
317 insertHit(map, sensor_origin, node, cloud[i], occ, occ_min, occ_max);
328 void insertMiss(
Map& map, detail::Miss<Dim>
const& miss, logit_t occupancy,
329 logit_t occupancy_min, logit_t occupancy_max)
const
331 if constexpr (Map::hasMapTypes(MapType::VOID_REGION)) {
332 if (miss.void_region) {
333 map.voidRegionSet(miss.node,
true,
false);
337 if constexpr (Map::hasMapTypes(MapType::OCCUPANCY)) {
339 if constexpr (Map::hasMapTypes(MapType::VOID_REGION)) {
340 if (void_region_instant_min_occupancy && map.voidRegion(miss.node)) {
341 map.occupancyLogitSet(miss.node, occupancy_min,
false);
343 map.occupancyLogitUpdate(miss.node, miss.count * occupancy,
false);
346 map.occupancyLogitUpdate(miss.node, miss.count * occupancy,
false);
354 void insertMisses(
Map& map, std::vector<detail::Miss<Dim>>& misses)
const
360 map.create(misses, misses.begin());
363 [
this, &map, occ, occ_min, occ_max](
auto const& miss) {
367 insertMiss(map, miss, occ, occ_min, occ_max);
373 std::enable_if_t<execution::is_execution_policy_v<ExecutionPolicy>,
bool> =
true>
375 std::vector<detail::Miss<Dim>>& misses)
const
381 map.create(std::forward<ExecutionPolicy>(policy), misses, misses.begin());
383 ufo::for_each(std::forward<ExecutionPolicy>(policy), misses.begin(), misses.end(),
384 [
this, &map, occ, occ_min, occ_max](
auto const& miss) {
388 insertMiss(map, miss, occ, occ_min, occ_max);
393 mutable __block std::vector<detail::Hit<Dim>> cached_hits_;