25#ifndef NAVMAP_CORE__OCCUPANCY_HPP_
26#define NAVMAP_CORE__OCCUPANCY_HPP_
63 static constexpr float kScale = 1000.0f;
68 return static_cast<int16_t
>(std::clamp(v, -32767.0f, 32767.0f));
70 static float logodds_of(
float p) {
return std::log(p / (1.0f - p));}
82 view_ = nm.
add_layer<int16_t>(
name,
"occupancy log-odds",
"1/1000 log-odds", 0);
95 auto & d = view_->data();
96 if (cid >= d.size()) {
return;}
97 const int v =
static_cast<int>(d[cid]) + delta;
98 d[cid] =
static_cast<int16_t
>(std::clamp(v,
static_cast<int>(min_),
static_cast<int>(max_)));
99 view_->mark_changed(cid);
105 auto & d = view_->data();
106 if (cid < d.size()) {d[cid] = 0; view_->mark_changed(cid);}
114 const int16_t v = value(cid);
120 const std::string &
name()
const {
return name_;}
121 const std::shared_ptr<LayerView<int16_t>> &
view()
const {
return view_;}
126 const auto & d = view_->data();
127 return cid < d.size() ? d[cid] : int16_t{0};
131 std::shared_ptr<LayerView<int16_t>> view_;
132 int16_t hit_, miss_, min_, max_, occ_, free_;
Core container and data structures for EasyNav navigable meshes.
Definition NavMap.hpp:561
std::shared_ptr< LayerView< T > > add_layer(const std::string &name, const std::string &description={}, const std::string &unit={}, T default_value=T{})
Create (or get) a typed per-NavCel layer with a default value.
Definition NavMap.hpp:877
void set_layer_unknown(const std::string &name, double value)
Declare the value of layer name that means "not observed" (NaN allowed).
Definition NavMap.cpp:1353
bool has_layer(const std::string &name) const
Check whether a layer named name exists.
Definition NavMap.cpp:1321
static float probability_of(float logodds)
Definition Occupancy.hpp:71
const std::string & name() const
Definition Occupancy.hpp:120
void update(NavCelId cid, bool occupied)
Definition Occupancy.hpp:90
float probability(NavCelId cid) const
Definition Occupancy.hpp:110
OccupancyLayer(NavMap &nm, const std::string &name="occupancy_logodds", OccupancyParams p={})
Uses (or creates, all unknown) the int16 layer name of nm.
Definition Occupancy.hpp:74
static int16_t to_fixed(float logodds)
Definition Occupancy.hpp:65
void miss(NavCelId cid)
A measurement crossed cid (free evidence).
Definition Occupancy.hpp:89
static constexpr float kScale
int16 units per log-odds unit
Definition Occupancy.hpp:63
void reset(NavCelId cid)
Forgets cid (back to unknown).
Definition Occupancy.hpp:103
static float logodds_of(float p)
Definition Occupancy.hpp:70
const std::shared_ptr< LayerView< int16_t > > & view() const
Definition Occupancy.hpp:121
float logodds(NavCelId cid) const
Definition Occupancy.hpp:109
void add(NavCelId cid, int16_t delta)
Adds delta (fixed point) to cid and clamps to [p_min, p_max].
Definition Occupancy.hpp:93
void hit(NavCelId cid)
A measurement ended in cid (occupied evidence).
Definition Occupancy.hpp:87
OccupancyState state(NavCelId cid) const
Definition Occupancy.hpp:112
Definition Combine.hpp:39
uint32_t NavCelId
Index of a triangle (NavCel) within the global mesh.
Definition NavMap.hpp:59
OccupancyState
Three-state classification of a NavCel.
Definition Occupancy.hpp:52
@ UNKNOWN
Definition Occupancy.hpp:52
@ FREE
Definition Occupancy.hpp:52
@ OCCUPIED
Definition Occupancy.hpp:52
Probabilities of the update rule and of the classification (OctoMap defaults).
Definition Occupancy.hpp:42
float p_max
Clamping: never more certain of occupied than this.
Definition Occupancy.hpp:46
float p_hit
A measurement ends in the NavCel.
Definition Occupancy.hpp:43
float p_occupied
At or above: OCCUPIED.
Definition Occupancy.hpp:47
float p_miss
A measurement crosses the NavCel.
Definition Occupancy.hpp:44
float p_min
Clamping: never more certain of free than this.
Definition Occupancy.hpp:45
float p_free
At or below: FREE (in between: UNKNOWN).
Definition Occupancy.hpp:48