23
23
24
24
namespace
25
25
{
26
- float updateProbability (float prior, float true_positive, float false_positive)
26
+ float updateProbability (
27
+ const float & prior, const float & true_positive, const float & false_positive)
27
28
{
28
- return (prior * true_positive) / (prior * true_positive + (1 - prior) * false_positive);
29
+ constexpr float max_updated_probability = 0.999 ;
30
+ constexpr float min_updated_probability = 0.100 ;
31
+ const float probability =
32
+ (prior * true_positive) / (prior * true_positive + (1 - prior) * false_positive);
33
+ return std::max (std::min (probability, max_updated_probability), min_updated_probability);
34
+ }
35
+ float decayProbability (const float & prior, const float & delta_time)
36
+ {
37
+ constexpr float minimum_probability = 0.001 ;
38
+ const float decay_rate = log (0 .5f ) / 0 .3f ; // half-life (50% decay) of 0.3s
39
+ return std::max (prior * std::exp (decay_rate * delta_time), minimum_probability);
29
40
}
30
41
} // namespace
31
42
@@ -45,7 +56,8 @@ Tracker::Tracker(
45
56
std::generate (uuid_.uuid .begin (), uuid_.uuid .end (), bit_eng);
46
57
47
58
// Initialize existence probabilities
48
- existence_probabilities_.resize (channel_size, 0.0 );
59
+ existence_probabilities_.resize (channel_size, 0.001 );
60
+ total_existence_probability_ = 0.001 ;
49
61
}
50
62
51
63
void Tracker::initializeExistenceProbabilities (
@@ -58,7 +70,10 @@ void Tracker::initializeExistenceProbabilities(
58
70
existence_probabilities_[channel_index] = initial_existence_probability;
59
71
60
72
// total existence probability
61
- total_existence_probability_ = existence_probability;
73
+ constexpr float max_probability = 0.999 ;
74
+ constexpr float min_probability = 0.100 ;
75
+ total_existence_probability_ =
76
+ std::max (std::min (existence_probability, max_probability), min_probability);
62
77
}
63
78
64
79
bool Tracker::updateWithMeasurement (
@@ -72,27 +87,26 @@ bool Tracker::updateWithMeasurement(
72
87
++total_measurement_count_;
73
88
74
89
// existence probability on each channel
75
- const double delta_time = (measurement_time - last_update_with_measurement_time_). seconds ();
76
- const double decay_rate = - log ( 0.5 ) / 0.3 ; // 50% decay in 0.3s
90
+ const float delta_time =
91
+ std::abs ((measurement_time - last_update_with_measurement_time_). seconds ());
77
92
constexpr float probability_true_detection = 0.9 ;
78
93
constexpr float probability_false_detection = 0.2 ;
79
94
80
- // update measured channel probability
95
+ // update measured channel probability without decay
81
96
existence_probabilities_[channel_index] = updateProbability (
82
97
existence_probabilities_[channel_index], probability_true_detection,
83
98
probability_false_detection);
99
+
84
100
// decay other channel probabilities
85
101
for (size_t i = 0 ; i < existence_probabilities_.size (); ++i) {
86
- if (i = = channel_index) {
87
- continue ;
102
+ if (i ! = channel_index) {
103
+ existence_probabilities_[i] = decayProbability (existence_probabilities_[i], delta_time) ;
88
104
}
89
- existence_probabilities_[i] *= std::exp (decay_rate * delta_time);
90
105
}
91
106
92
107
// update total existence probability
93
- const float & existence_probability_from_object = object.existence_probability ;
94
108
total_existence_probability_ = updateProbability (
95
- total_existence_probability_, existence_probability_from_object , probability_false_detection);
109
+ total_existence_probability_, object. existence_probability , probability_false_detection);
96
110
}
97
111
98
112
last_update_with_measurement_time_ = measurement_time;
@@ -110,12 +124,11 @@ bool Tracker::updateWithoutMeasurement(const rclcpp::Time & now)
110
124
++total_no_measurement_count_;
111
125
{
112
126
// decay existence probability
113
- double const delta_time = (now - last_update_with_measurement_time_).seconds ();
114
- const double decay_rate = -log (0.5 ) / 0.3 ; // 50% decay in 0.3s
115
- for (size_t i = 0 ; i < existence_probabilities_.size (); ++i) {
116
- existence_probabilities_[i] *= std::exp (-decay_rate * delta_time);
127
+ float const delta_time = (now - last_update_with_measurement_time_).seconds ();
128
+ for (float & existence_probability : existence_probabilities_) {
129
+ existence_probability = decayProbability (existence_probability, delta_time);
117
130
}
118
- total_existence_probability_ *= std::exp (-decay_rate * delta_time);
131
+ total_existence_probability_ = decayProbability (total_existence_probability_, delta_time);
119
132
}
120
133
121
134
return true ;
@@ -134,18 +147,18 @@ void Tracker::updateClassification(
134
147
// Parameters
135
148
// if the remove_threshold is too high (compare to the gain), the classification will be removed
136
149
// immediately
137
- const double gain = 0.05 ;
138
- constexpr double remove_threshold = 0.001 ;
150
+ const float gain = 0.05 ;
151
+ constexpr float remove_threshold = 0.001 ;
139
152
140
153
// Normalization function
141
154
auto normalizeProbabilities =
142
155
[](std::vector<autoware_perception_msgs::msg::ObjectClassification> & classification) {
143
- double sum = 0.0 ;
144
- for (const auto & class_ : classification) {
145
- sum += class_ .probability ;
156
+ float sum = 0.0 ;
157
+ for (const auto & a_class : classification) {
158
+ sum += a_class .probability ;
146
159
}
147
- for (auto & class_ : classification) {
148
- class_ .probability /= sum;
160
+ for (auto & a_class : classification) {
161
+ a_class .probability /= sum;
149
162
}
150
163
};
151
164
@@ -175,7 +188,7 @@ void Tracker::updateClassification(
175
188
classification_.erase (
176
189
std::remove_if (
177
190
classification_.begin (), classification_.end (),
178
- [remove_threshold](const auto & class_ ) { return class_ .probability < remove_threshold; }),
191
+ [remove_threshold](const auto & a_class ) { return a_class .probability < remove_threshold; }),
179
192
classification_.end ());
180
193
181
194
// Normalize tracking classification
0 commit comments