scan_estimator_utm.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2024 The urg_stamped Authors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <algorithm>
18 #include <cstdint>
19 #include <memory>
20 #include <utility>
21 #include <vector>
22 
23 #include <ros/time.h>
24 
26 #include <scip2/logger.h>
27 
28 namespace urg_stamped
29 {
30 namespace device_state_estimator
31 {
32 
33 std::pair<ros::Time, bool> ScanEstimatorUTM::pushScanSample(const ros::Time& t_recv, const uint64_t device_wall_stamp)
34 {
35  const ClockState clock = clock_estim_->getClockState();
36  const ros::Time t_stamp = clock.stampToTime(device_wall_stamp);
37  if (!clock.initialized_)
38  {
39  return std::pair<ros::Time, bool>(t_stamp, true);
40  }
41 
42  const auto t_scan = estimateScanTime(t_recv, t_stamp);
43  if (t_scan.second)
44  {
45  recent_t_scans_.emplace_back(t_scan.first);
46  if (recent_t_scans_.size() < SCAN_SAMPLES)
47  {
48  return std::pair<ros::Time, bool>(t_scan.first, true);
49  }
50  recent_t_scans_.pop_front();
51 
52  std::vector<ScanSampleUTM> samples;
53  for (size_t i = 1; i < recent_t_scans_.size(); ++i)
54  {
55  for (size_t j = 0; j < i; ++j)
56  {
57  const ros::Duration t_diff = recent_t_scans_[i] - recent_t_scans_[j];
58  const int num_ideal_scans =
59  std::max(1, static_cast<int>(std::lround(t_diff.toSec() / ideal_scan_interval_.toSec())));
60  const ros::Duration interval = t_diff * (1.0 / num_ideal_scans);
61  samples.emplace_back(recent_t_scans_[i], interval);
62  }
63  }
64 
65  std::sort(samples.begin(), samples.end());
66  const ScanSampleUTM& med = samples[samples.size() / 2];
67 
69  scan_.origin_ = med.t_;
70  }
71 
72  if (scan_.origin_.isZero())
73  {
74  return std::pair<ros::Time, bool>(t_stamp, true);
75  }
76 
77  const ros::Time t_estimated = scan_.fit(t_stamp);
78  const ros::Duration t_comp = t_estimated - t_stamp;
79  const bool valid =
82 
83  return std::pair<ros::Time, bool>(t_estimated, valid);
84 }
85 
86 std::pair<ros::Time, bool> ScanEstimatorUTM::estimateScanTime(const ros::Time& t_recv, const ros::Time& t_stamp)
87 {
88  if (!clock_estim_->getClockState().initialized_)
89  {
90  return std::pair<ros::Time, bool>(t_stamp, false);
91  }
92 
93  const CommDelay comm_delay = clock_estim_->getCommDelay();
94  const ros::Time t_sent = t_recv - comm_delay.min_;
95  const ros::Duration stamp_to_send_raw = t_sent - t_stamp;
96 
97  stamp_to_sends_.push_back(stamp_to_send_raw);
99  {
100  stamp_to_sends_.pop_front();
101  }
102 
103  ros::Duration stamp_to_send = stamp_to_send_raw;
104  for (const auto& s : stamp_to_sends_)
105  {
106  if (s < stamp_to_send)
107  {
108  stamp_to_send = s;
109  }
110  }
111 
112  if (min_stamp_to_send_.isZero() || stamp_to_send < min_stamp_to_send_)
113  {
114  min_stamp_to_send_ = stamp_to_send;
115  }
117  {
119  }
120 
121  const ros::Duration t_frac = stamp_to_send_raw - min_stamp_to_send_ - comm_delay.sigma_;
122 
123  return std::pair<ros::Time, bool>(
124  t_stamp + t_frac,
125  ros::Duration(0) < t_frac && t_frac < ros::Duration(DEVICE_TIMESTAMP_RESOLUTION));
126 }
127 
128 } // namespace device_state_estimator
129 } // namespace urg_stamped
urg_stamped::device_state_estimator::ScanState::interval_
ros::Duration interval_
Definition: device_state_estimator.h:174
urg_stamped::device_state_estimator::ScanEstimatorUTM::stamp_to_sends_
std::deque< ros::Duration > stamp_to_sends_
Definition: device_state_estimator.h:389
urg_stamped::device_state_estimator::ScanSampleUTM::interval_
ros::Duration interval_
Definition: device_state_estimator.h:143
logger.h
s
XmlRpcServer s
time.h
urg_stamped::device_state_estimator::ScanEstimator::scan_
ScanState scan_
Definition: device_state_estimator.h:251
urg_stamped::device_state_estimator::CommDelay
Definition: device_state_estimator.h:42
urg_stamped::device_state_estimator::ScanState::fit
ros::Time fit(const ros::Time &t) const
Definition: device_state_estimator.cpp:38
urg_stamped::device_state_estimator::CommDelay::min_
ros::Duration min_
Definition: device_state_estimator.h:45
urg_stamped::device_state_estimator::ScanSampleUTM::t_
ros::Time t_
Definition: device_state_estimator.h:142
urg_stamped::device_state_estimator::ScanEstimator::clock_estim_
ClockEstimator::Ptr clock_estim_
Definition: device_state_estimator.h:250
TimeBase< Time, Duration >::isZero
bool isZero() const
urg_stamped::device_state_estimator::ScanEstimator::ideal_scan_interval_
ros::Duration ideal_scan_interval_
Definition: device_state_estimator.h:252
urg_stamped::device_state_estimator::ScanEstimatorUTM::STAMP_TO_SEND_SAMPLES
static constexpr size_t STAMP_TO_SEND_SAMPLES
Definition: device_state_estimator.h:385
urg_stamped::device_state_estimator::ScanEstimatorUTM::estimateScanTime
std::pair< ros::Time, bool > estimateScanTime(const ros::Time &t_recv, const ros::Time &t_stamp)
Definition: scan_estimator_utm.cpp:86
urg_stamped::device_state_estimator::ScanEstimatorUTM::pushScanSample
std::pair< ros::Time, bool > pushScanSample(const ros::Time &t_recv, const uint64_t device_wall_stamp) final
Definition: scan_estimator_utm.cpp:33
ros::Time
urg_stamped::device_state_estimator::ScanEstimatorUTM::min_stamp_to_send_
ros::Duration min_stamp_to_send_
Definition: device_state_estimator.h:387
urg_stamped::device_state_estimator::ScanSampleUTM
Definition: device_state_estimator.h:139
urg_stamped::device_state_estimator::ScanEstimatorUTM::SCAN_SAMPLES
static constexpr size_t SCAN_SAMPLES
Definition: device_state_estimator.h:384
device_state_estimator.h
DurationBase< Duration >::toSec
double toSec() const
urg_stamped::device_state_estimator::ClockState::initialized_
bool initialized_
Definition: device_state_estimator.h:63
urg_stamped::device_state_estimator::CommDelay::sigma_
ros::Duration sigma_
Definition: device_state_estimator.h:46
urg_stamped
Definition: device_state_estimator.h:35
urg_stamped::device_state_estimator::ScanState::origin_
ros::Time origin_
Definition: device_state_estimator.h:173
ros::Duration
urg_stamped::device_state_estimator::ClockState
Definition: device_state_estimator.h:57
urg_stamped::device_state_estimator::ClockState::stampToTime
ros::Time stampToTime(const uint64_t stamp) const
Definition: device_state_estimator.cpp:32
urg_stamped::device_state_estimator::ScanEstimatorUTM::recent_t_scans_
std::deque< ros::Time > recent_t_scans_
Definition: device_state_estimator.h:388
DurationBase< Duration >::isZero
bool isZero() const
urg_stamped::device_state_estimator::DEVICE_TIMESTAMP_RESOLUTION
static constexpr double DEVICE_TIMESTAMP_RESOLUTION
Definition: device_state_estimator.h:40


urg_stamped
Author(s): Atsushi Watanabe
autogenerated on Wed Dec 18 2024 03:10:57