Galaxis Codebase  1.0.0
Team Galaxis software stack for the Carolo Cup 2023 - ROS2 based software
Localizer.hpp
Go to the documentation of this file.
1 #ifndef LOCALIZER_HPP
2 #define LOCALIZER_HPP
3 
4 #include <cmath>
5 #include <galaxis/linatypes.hpp>
6 #include <utils/logger.hpp>
7 #include <chrono>
8 #include <iostream>
9 #include <mutex>
10 #include <rclcpp/rclcpp.hpp>
11 
12 #include <boost/circular_buffer.hpp>
13 
14 #include <vector>
15 
16 using namespace galaxis::utils;
17 
18 // Attention: units in millimeter
20  rclcpp::Time timestamp;
21  galaxis::lina::Vector2f position = galaxis::lina::Vector2f(0.f, 0.f); // position relative to start in mm
22  double speed = 0; // speed in mm/s
23  double orientation = 0; // yaw angle in radians
24 };
25 
26 // TODO: binary search for get_last_by_time
28 private:
29  boost::circular_buffer<PositionTimepoint> data;
30  std::shared_mutex m_mutex;
31  unsigned int dataSize = 0;
32 
33 public:
34  PositionTimepointBuffer(unsigned int p_size = 200) :
35  data(p_size), dataSize(p_size) {}
36 
37  void add(PositionTimepoint const& element) {
38  m_mutex.lock();
39 
40  if(data.full()) {
41  data.pop_front();
42  }
43  data.push_back(element);
44 
45  m_mutex.unlock();
46  }
47 
48  PositionTimepoint get_last_by_time(rclcpp::Time& timestamp) {
49  m_mutex.lock_shared();
50 
51  if(data.empty()) {
52  log_warning("[Localizer] Position History Lookup failed. ");
53  throw std::runtime_error("Localizer.hpp/PositionTimepointBuffer: Lookup failed!");
54  }
55 
56  PositionTimepoint& element = data.back();
57  for(int i = data.size() - 2; i >= 0; --i) {
58  if(data[i].timestamp < timestamp) {
59  if(std::abs((timestamp - data[i].timestamp).nanoseconds()) < std::abs((timestamp - element.timestamp).nanoseconds())) {
60  element = data[i];
61  }
62  else {
63  // pass (element remains element)
64  }
65  m_mutex.unlock_shared();
66  return element;
67  }
68  element = data[i];
69  }
70 
71  m_mutex.unlock_shared();
72  log_warning("[Localizer] Position History Lookup fall back: ", std::to_string(data.at(data.size() - 1).timestamp.nanoseconds()), " ", std::to_string(timestamp.nanoseconds()), " - Use oldest \n");
73  return element;
74  }
75 
77  m_mutex.lock_shared();
78  auto returnPoint = data.back();
79  m_mutex.unlock_shared();
80 
81  return returnPoint;
82  }
83 
84  bool is_empty() {
85  m_mutex.lock_shared();
86  bool isEmpty = data.empty();
87  m_mutex.unlock_shared();
88 
89  return isEmpty;
90  }
91 };
92 
93 class Localizer {
94 public:
95  Localizer();
96 
97  void init(rclcpp::Time& timestamp, double orientationRad);
98  bool is_empty();
99  void add_position_timepoint(rclcpp::Time& timestamp, galaxis::lina::Vector2f positionMillimeter, double speedMillimeterPerSec, double orientationRad);
100  void add_state(rclcpp::Time& timestamp, double speedMillimeterPerSec, double orientationRad);
101 
102  std::shared_ptr<PositionTimepoint> get_latest_position_timepoint();
103  std::shared_ptr<PositionTimepoint> get_position_timepoint_by_time(rclcpp::Time& timestamp);
104 
105 private:
107 };
108 
109 #endif // LOCALIZER_HPP
PositionTimepointBuffer::data
boost::circular_buffer< PositionTimepoint > data
Definition: Localizer.hpp:29
galaxis::utils::log_warning
void log_warning(const Args &... args)
Definition: logger.hpp:41
PositionTimepointBuffer::get_last
PositionTimepoint get_last()
Definition: Localizer.hpp:76
Localizer::m_positionHistory
PositionTimepointBuffer m_positionHistory
Definition: Localizer.hpp:106
Localizer
Definition: Localizer.hpp:93
PositionTimepointBuffer::PositionTimepointBuffer
PositionTimepointBuffer(unsigned int p_size=200)
Definition: Localizer.hpp:34
galaxis::lina::Vector2f
Eigen::Vector2f Vector2f
Definition: linatypes.hpp:14
linatypes.hpp
PositionTimepointBuffer
Definition: Localizer.hpp:27
PositionTimepointBuffer::get_last_by_time
PositionTimepoint get_last_by_time(rclcpp::Time &timestamp)
Definition: Localizer.hpp:48
PositionTimepoint::timestamp
rclcpp::Time timestamp
Definition: Localizer.hpp:20
logger.hpp
PositionTimepointBuffer::add
void add(PositionTimepoint const &element)
Definition: Localizer.hpp:37
PositionTimepointBuffer::is_empty
bool is_empty()
Definition: Localizer.hpp:84
galaxis::utils
Definition: clock.hpp:5
PositionTimepointBuffer::m_mutex
std::shared_mutex m_mutex
Definition: Localizer.hpp:30
PositionTimepoint
Definition: Localizer.hpp:19