@@ -31,15 +31,14 @@ void InputStream::init(const InputChannel & input_channel)
31
31
input_topic_ = input_channel.input_topic ;
32
32
long_name_ = input_channel.long_name ;
33
33
short_name_ = input_channel.short_name ;
34
- expected_interval_ = input_channel.expected_interval ; // [s]
35
34
36
35
// Initialize queue
37
36
objects_que_.clear ();
38
37
39
38
// Initialize latency statistics
40
- latency_mean_ = input_channel. expected_latency ; // [s]
39
+ latency_mean_ = 0.2 ; // [s] (initial value)
41
40
latency_var_ = 0.0 ;
42
- interval_mean_ = expected_interval_ ; // [s] (initial value)
41
+ interval_mean_ = 0.0 ; // [s] (initial value)
43
42
interval_var_ = 0.0 ;
44
43
45
44
latest_measurement_time_ = node_.now ();
@@ -49,7 +48,7 @@ void InputStream::init(const InputChannel & input_channel)
49
48
bool InputStream::getTimestamps (
50
49
rclcpp::Time & latest_measurement_time, rclcpp::Time & latest_message_time) const
51
50
{
52
- if (!is_time_initialized_ ) {
51
+ if (!isTimeInitialized () ) {
53
52
return false ;
54
53
}
55
54
latest_measurement_time = latest_measurement_time_;
@@ -79,35 +78,50 @@ void InputStream::onMessage(
79
78
80
79
void InputStream::updateTimingStatus (const rclcpp::Time & now, const rclcpp::Time & objects_time)
81
80
{
82
- // Filter parameters
83
- constexpr double gain = 0.05 ;
81
+ // Update latency statistics
82
+ // skip initial messages for the latency statistics
83
+ if (initial_count_ > 4 ) {
84
+ const double latency = (now - objects_time).seconds ();
85
+ if (initial_count_ < 16 ) {
86
+ // set higher gain for the initial messages
87
+ constexpr double initial_gain = 0.5 ;
88
+ latency_mean_ = (1.0 - initial_gain) * latency_mean_ + initial_gain * latency;
89
+ } else {
90
+ constexpr double gain = 0.05 ;
91
+ latency_mean_ = (1.0 - gain) * latency_mean_ + gain * latency;
92
+ const double latency_delta = latency - latency_mean_;
93
+ latency_var_ = (1.0 - gain) * latency_var_ + gain * latency_delta * latency_delta;
94
+ }
95
+ }
84
96
85
97
// Calculate interval, Update interval statistics
86
- if (is_time_initialized_ ) {
98
+ if (initial_count_ > 4 ) {
87
99
const double interval = (now - latest_message_time_).seconds ();
88
- // Check if the interval is regular
89
- // The interval is considered regular if it is within 0.5 and 1.5 times the expected interval
90
- bool is_interval_regular =
91
- interval > 0.5 * expected_interval_ && interval < 1.5 * expected_interval_;
92
-
93
- if (is_interval_regular) {
94
- interval_mean_ = (1.0 - gain) * interval_mean_ + gain * interval;
95
- const double interval_delta = interval - interval_mean_;
96
- interval_var_ = (1.0 - gain) * interval_var_ + gain * interval_delta * interval_delta;
100
+ if (initial_count_ < 24 ) {
101
+ // Initialization
102
+ constexpr double initial_gain = 0.5 ;
103
+ interval_mean_ = (1.0 - initial_gain) * interval_mean_ + initial_gain * interval;
104
+ } else {
105
+ // The interval is considered regular if it is within 0.5 and 1.5 times the mean interval
106
+ bool update_statistics = interval > 0.5 * interval_mean_ && interval < 1.5 * interval_mean_;
107
+ if (update_statistics) {
108
+ constexpr double gain = 0.05 ;
109
+ interval_mean_ = (1.0 - gain) * interval_mean_ + gain * interval;
110
+ const double interval_delta = interval - interval_mean_;
111
+ interval_var_ = (1.0 - gain) * interval_var_ + gain * interval_delta * interval_delta;
112
+ }
97
113
}
98
114
}
99
115
100
116
// Update time
101
117
latest_message_time_ = now;
102
118
latest_measurement_time_ =
103
119
latest_measurement_time_ < objects_time ? objects_time : latest_measurement_time_;
104
- if (!is_time_initialized_) is_time_initialized_ = true ;
105
120
106
- // Update latency statistics
107
- const double latency = (latest_message_time_ - objects_time).seconds ();
108
- latency_mean_ = (1.0 - gain) * latency_mean_ + gain * latency;
109
- const double latency_delta = latency - latency_mean_;
110
- latency_var_ = (1.0 - gain) * latency_var_ + gain * latency_delta * latency_delta;
121
+ // Update the initial count, count only first 32 messages
122
+ if (initial_count_ < 32 ) {
123
+ initial_count_++;
124
+ }
111
125
}
112
126
113
127
void InputStream::getObjectsOlderThan (
@@ -195,17 +209,6 @@ void InputManager::getObjectTimeInterval(
195
209
if (input_streams_.at (target_stream_idx_)->isTimeInitialized ()) {
196
210
rclcpp::Time latest_measurement_time =
197
211
input_streams_.at (target_stream_idx_)->getLatestMeasurementTime ();
198
- // if the object_latest_time is newer than the next expected message time, set it older
199
- // than the next expected message time
200
- rclcpp::Time next_expected_message_time =
201
- latest_measurement_time +
202
- rclcpp::Duration::from_seconds (
203
- target_stream_interval_ -
204
- 1.0 *
205
- target_stream_interval_std_); // next expected message time with 1 sigma safety margin
206
- object_latest_time = object_latest_time > next_expected_message_time
207
- ? next_expected_message_time
208
- : object_latest_time;
209
212
210
213
// if the object_latest_time is older than the latest measurement time, set it as the latest
211
214
// object time
0 commit comments