67 m_pastObserverSnapshots.emplace_back(timestamp,
71 if (m_pastObserverSnapshots.size() > kMaxPastObserverStates) {
72 m_pastObserverSnapshots.erase(m_pastObserverSnapshots.begin());
89 KalmanFilterType* observer, units::second_t nominalDt,
Vectord<Rows> y,
91 globalMeasurementCorrect,
92 units::second_t timestamp) {
93 if (m_pastObserverSnapshots.size() == 0) {
101 auto it = std::lower_bound(
102 m_pastObserverSnapshots.cbegin(), m_pastObserverSnapshots.cend(),
104 [](
const auto& entry,
const auto& ts) { return entry.first < ts; });
106 size_t indexOfClosestEntry;
108 if (it == m_pastObserverSnapshots.cbegin()) {
112 if (timestamp < it->first) {
118 indexOfClosestEntry = 0;
119 }
else if (it == m_pastObserverSnapshots.cend()) {
122 indexOfClosestEntry = m_pastObserverSnapshots.size() - 1;
125 int nextIdx = std::distance(m_pastObserverSnapshots.cbegin(), it);
130 int prevIdx = nextIdx - 1;
133 units::second_t prevTimeDiff =
134 units::math::abs(timestamp - m_pastObserverSnapshots[prevIdx].first);
135 units::second_t nextTimeDiff =
136 units::math::abs(timestamp - m_pastObserverSnapshots[nextIdx].first);
137 indexOfClosestEntry = prevTimeDiff < nextTimeDiff ? prevIdx : nextIdx;
140 units::second_t lastTimestamp =
141 m_pastObserverSnapshots[indexOfClosestEntry].first - nominalDt;
148 for (
size_t i = indexOfClosestEntry; i < m_pastObserverSnapshots.size();
150 auto& [key, snapshot] = m_pastObserverSnapshots[i];
152 if (i == indexOfClosestEntry) {
153 observer->SetS(snapshot.squareRootErrorCovariances);
154 observer->SetXhat(snapshot.xHat);
157 observer->Predict(snapshot.inputs, key - lastTimestamp);
158 observer->Correct(snapshot.inputs, snapshot.localMeasurements);
160 if (i == indexOfClosestEntry) {
166 globalMeasurementCorrect(snapshot.inputs, y);
171 snapshot.localMeasurements};