Galaxis Codebase  1.0.0
Team Galaxis software stack for the Carolo Cup 2023 - ROS2 based software
main_test.cpp
Go to the documentation of this file.
1 #include <unistd.h>
2 
4 
5 #include <Decision/AutoPilot.hpp>
7 
8 #include <utils/poly.hpp>
9 
10 // Test Localizer
11 // int main(int argc, char* argv[]) {
12 // rclcpp::Clock clock;
13 
14 // Localizer loc;
15 // loc.init();
16 
17 // // first
18 // // add_state(rclcpp::Time& timestamp, double speedMillimeterPerSec, double orientationRad)
19 // loc.add_state(clock.now(), 1000.f, 0.f);
20 
21 // sleep(1);
22 
23 // loc.add_state(clock.now(), 1000.f, 0.f);
24 
25 // auto tp = loc.get_latest_position_timepoint();
26 
27 // std::cout << tp.to_string() << std::endl;
28 
29 // return 0;
30 // }
31 
32 double eval_poly(DynamicPolynom p_polynom, double p_x) {
33  double value = 0.0;
34  double iValue;
35  for(size_t i = 0; i < p_polynom->size(); ++i) {
36  iValue = 1;
37  // x^i
38  for(size_t j = 0; j < i; ++j) {
39  iValue *= p_x;
40  }
41  value += p_polynom->at(i) * iValue;
42  }
43  return value;
44 }
45 
46 int main() {
47  std::vector<double> m_polynomPointsXVector;
48  std::vector<double> m_polynomPointsYVector;
49 
50  std::shared_ptr<DriveInformation_t> m_lastDriveInformationSPtr = std::make_shared<DriveInformation_t>();
51  rclcpp::Clock time;
52  m_lastDriveInformationSPtr->polynom = std::make_shared<std::vector<double>>();
53  m_lastDriveInformationSPtr->polynom->push_back(0);
54  m_lastDriveInformationSPtr->polynom->push_back(0);
55  m_lastDriveInformationSPtr->polynom->push_back(0);
56  m_lastDriveInformationSPtr->polynom->push_back(0.1);
57  m_lastDriveInformationSPtr->positionTimepoint.timestamp = time.now();
58  m_lastDriveInformationSPtr->positionTimepoint.speed = 1e9;
59  m_lastDriveInformationSPtr->positionTimepoint.orientation = 0;
60 
61  sleep(1);
62  std::shared_ptr<PositionTimepoint> positionTimepoint = std::make_shared<PositionTimepoint>();
63  positionTimepoint->timestamp = time.now();
64  positionTimepoint->speed = 1e9;
65  positionTimepoint->orientation = 0;
66 
67  // eval poly at estimated position // get time diff and multiply with velocity
68  // eval poly at estimated position // get time diff and multiply with velocity
69  auto timestamp = positionTimepoint->timestamp - m_lastDriveInformationSPtr->positionTimepoint.timestamp;
70  float drivenDistanceM = (m_lastDriveInformationSPtr->velocityReference * 1e9) / timestamp.nanoseconds(); // velocityReference is m/s (m/s * 1e9 = nm/s)
71 
72  // use drivenDistance as approximation of x-shift in polynom
73  Vector2f newPosition = Vector2f(drivenDistanceM, eval_poly(m_lastDriveInformationSPtr->polynom, drivenDistanceM)); // nm / 1e9 = m
74 
75  float gradient = static_cast<float>(galaxis::utils::calculate_gradient(m_lastDriveInformationSPtr->polynom, newPosition[0]));
76  float rotationClockwise = std::atan(gradient);
77  Eigen::Rotation2Df rotationMat(-rotationClockwise); // because Eigen is CC
78 
79  // get points of last polynom
80  // polynom is in meter => we want to get cm precision for new poly
81  for(float x = 0.01; x < 150 / 100.f; x += 0.01) {
82  // eval poly and direct shift
83  // calulate pos on polynom + shift to new position
84  Vector2f newPoint = Vector2f(x, eval_poly(m_lastDriveInformationSPtr->polynom, x)) - newPosition;
85  newPoint = rotationMat * newPoint;
86 
87  m_polynomPointsXVector.push_back(newPoint[0]);
88  m_polynomPointsYVector.push_back(newPoint[1]);
89  }
90 
91  // TODO reenable
92  std::cout << m_lastDriveInformationSPtr->polynom->at(0) << " + " << m_lastDriveInformationSPtr->polynom->at(1) << "x + " << m_lastDriveInformationSPtr->polynom->at(2) << "x^2 + " << m_lastDriveInformationSPtr->polynom->at(3) << "x^3" <<std::endl;
93 
94  m_lastDriveInformationSPtr->polynom = galaxis_polyfit(m_polynomPointsXVector, m_polynomPointsYVector, m_polynomPointsXVector.size() * 0.9, 20, 3);
95  std::cout << m_lastDriveInformationSPtr->polynom->at(0) << " + " << m_lastDriveInformationSPtr->polynom->at(1) << "x + " << m_lastDriveInformationSPtr->polynom->at(2) << "x^2 + " << m_lastDriveInformationSPtr->polynom->at(3) << "x^3" <<std::endl;
96 
97  return 0;
98 }
DynamicPolynom
std::shared_ptr< std::vector< double > > DynamicPolynom
Definition: poly.hpp:16
galaxis_polyfit.h
AutoPilot.hpp
poly.hpp
main
int main()
Definition: main_test.cpp:46
galaxis::lina::Vector2f
Eigen::Vector2f Vector2f
Definition: linatypes.hpp:14
galaxis::utils::calculate_gradient
float calculate_gradient(std::vector< float > const &p_polynomRef, float p_x)
Definition: poly.cpp:60
Localizer.hpp
eval_poly
double eval_poly(DynamicPolynom p_polynom, double p_x)
Definition: main_test.cpp:32