Galaxis Codebase  1.0.0
Team Galaxis software stack for the Carolo Cup 2023 - ROS2 based software
MapDataLayer.cpp
Go to the documentation of this file.
1 #include "Map/MapDataLayer.hpp"
2 
3 #include "Map/MapUtils.hpp"
4 
5 #include <cassert>
6 
7 #include <utils/logger.hpp>
8 
9 using namespace galaxis::utils;
10 using namespace galaxis::autopilot;
11 
12 MapDataLayer::MapDataLayer(int amountOfThreads = 4) :
13  m_threadPool(amountOfThreads), m_amountOfThreads(amountOfThreads), m_obstacleKeepDuration(1, 0) {
14  assert(m_amountOfThreads > 0);
15  init();
16 }
17 
19  m_threadPool(4), m_obstacleKeepDuration(1, 0) {
21  init();
22 }
23 
25  m_threadPool.join();
26 }
27 
29  log("MapDataLayer:\n - Threads ", m_amountOfThreads, "\n - Map Size ", MAP_SIZE, "x", MAP_SIZE);
30 
33 
34  m_linesObjectSPtr = std::make_shared<LinesObject<int16_t>>();
35 
36  m_staticObstacleVecSPtr = std::make_shared<std::vector<StaticObstacle>>();
37 
38  clear();
39 }
40 
42  for(ColumnMapArray& columnArray: m_data) {
43  columnArray.fill(MapCell());
44  }
45 }
46 
47 // ############## Settings ##############
49  m_simulationMode = true;
50 }
53 }
56 }
57 // void MapDataLayer::setLookupLookBehindCarCM(int value) {
58 // m_lookupLookBehindCarCM = value;
59 // }
62 }
64  m_cellThresholdExtract = value;
65 }
68 }
71 }
74 }
77 }
79  m_obstacleKeepDuration = rclcpp::Duration(sec, nsec);
80 }
81 
82 
83 void MapDataLayer::updateMap(const sensor_msgs::msg::Image::ConstSharedPtr& laneDetectionSPtr, Vector2f currentAbsoluteCarPositionCM, double currentAbsoluteOrientation) {
84  // TODO: check update rate of vision (MapContentsType); maybe check at runtime
85  m_mapMutex.lock();
86  // Increment Update Step
87  m_updateStep++;
88 
89  int pixelLengthInBytes = laneDetectionSPtr->step / laneDetectionSPtr->width;
90 
91  int arrayStartIndex = 0;
92  int arrayWindowSizePerThread = (laneDetectionSPtr->height * laneDetectionSPtr->step) / m_amountOfThreads;
93  arrayWindowSizePerThread -= arrayWindowSizePerThread % pixelLengthInBytes;
94  int arrayEndIndex = arrayStartIndex + arrayWindowSizePerThread;
95  // split message and run preprocessPoints function on multiple threads in pool
96  for(int i = 0; i < m_amountOfThreads; ++i) {
97  if(i == m_amountOfThreads - 1) {
98  arrayEndIndex = (laneDetectionSPtr->height * laneDetectionSPtr->step) - 1;
99  } else {
100  arrayEndIndex = arrayStartIndex + arrayWindowSizePerThread;
101  }
102 
103  m_sharedThreadMutex.lock_shared();
104  boost::asio::post(m_threadPool, std::bind(&MapDataLayer::preprocessPoints, this, laneDetectionSPtr, currentAbsoluteCarPositionCM, arrayStartIndex, arrayEndIndex, currentAbsoluteOrientation));
105  arrayStartIndex = arrayEndIndex;
106  }
107 
108  // wait for threads to complete
109  m_sharedThreadMutex.lock();
110  m_sharedThreadMutex.unlock();
111 
112  m_mapMutex.unlock();
113 }
114 
115 bool MapDataLayer::isInImageIgnoreField(Vector2f p_position, unsigned int p_maxImageX) {
116  // check if in left ignore triangle
117  // y = m*x + n
118  float mLeftTriangle = static_cast<float>((imageIgnoreFieldArray[2] - imageIgnoreFieldArray[0])) / static_cast<float>(imageIgnoreFieldArray[1]);
119  float nLeftTriangle = imageIgnoreFieldArray[0];
120 
121  if(p_position[1] > mLeftTriangle * p_position[0] + nLeftTriangle) {
122  return true;
123  }
124 
125  // check if in ignore box
126  if(p_position[1] > imageIgnoreFieldArray[2] || p_position[1] > imageIgnoreFieldArray[4]) {
127  return true;
128  }
129 
130  // check if in right ignore triangle
131  // y = m*x + n
132  float mRightTriangle = static_cast<float>((imageIgnoreFieldArray[5] - imageIgnoreFieldArray[4])) / static_cast<float>((p_maxImageX - imageIgnoreFieldArray[3]));
133  float nRightTriangle = mRightTriangle * imageIgnoreFieldArray[3] - imageIgnoreFieldArray[4];
134 
135  if(p_position[1] > mRightTriangle * p_position[0] + nRightTriangle) {
136  return true;
137  }
138 
139  return false;
140 }
141 
142 void MapDataLayer::preprocessPoints(const sensor_msgs::msg::Image::ConstSharedPtr& laneDetectionSPtr, Vector2f const& currentPositionCM, int arrayOffsetStartIndex, int arrayOffsetEndIndex, double currentAbsoluteOrientation) {
143  // TODO: position and orientation of car at recorded MapContents Message (history)
144 
145  Eigen::Rotation2Df rotationMatrix(-currentAbsoluteOrientation);
146 
147  // num of rows == height == Y, num of columns == width == X
148 
149  int pixelLengthInBytes = laneDetectionSPtr->step / laneDetectionSPtr->width;
150  for(int index = arrayOffsetStartIndex; index < arrayOffsetEndIndex; index += pixelLengthInBytes) {
151  int posXOriginal = (index % laneDetectionSPtr->step) / pixelLengthInBytes;
152  int posYOriginal = static_cast<int>(index / laneDetectionSPtr->step);
153 
154  // image position conversion to map positions
155  int posX = posXOriginal - laneDetectionSPtr->width / 2;
156  int posY = laneDetectionSPtr->height - posYOriginal;
157  Vector2f absoluteCellPosition = Vector2f(posX, posY) * m_laneImagePixelToPositionConversionFactor;
158  absoluteCellPosition = rotationMatrix * absoluteCellPosition;
159  absoluteCellPosition += currentPositionCM + m_absoluteCarPositionOffset;
160 
161  MapCell cellUpdate;
162  cellUpdate.leftLine = laneDetectionSPtr->data[index + galaxis::autopilot::imageLLinePixelByteIndex];
163  cellUpdate.centerLine = laneDetectionSPtr->data[index + galaxis::autopilot::imageCLinePixelByteIndex];
164  cellUpdate.rightLine = laneDetectionSPtr->data[index + galaxis::autopilot::imageRLinePixelByteIndex];
165 
166  Vector2i absoluteCellPositionOnGrid = Vector2i(std::round(absoluteCellPosition[0]), std::round(absoluteCellPosition[1]));
167 
168 
169  // skip Image Ignore Fields
170  if (!m_simulationMode && isInImageIgnoreField(Vector2f(posXOriginal, posYOriginal), laneDetectionSPtr->width)) {
171  m_data[absoluteCellPositionOnGrid[0]][absoluteCellPositionOnGrid[1]].imageIgnoreField = true;
172  }
173  else {
174  updateCell(cellUpdate, absoluteCellPositionOnGrid);
175  }
176  }
177 
178  m_sharedThreadMutex.unlock_shared();
179 }
180 
181 void MapDataLayer::updateCell(MapCell const& cellUpdate, Vector2i position) {
182  if(position[0] < 0 || position[0] >= m_mapSize[0] || position[1] < 0 || position[1] >= m_mapSize[1]) {
183  log_warning("MapDataLayer::updateCell: cannot update Cell (out of bounds) at Position (", position[0], ",", position[1], ")");
184  return;
185  }
186 
187  MapCell* cellPtr = &m_data[position[0]][position[1]];
188 
189  // decrease
190  // decreaseStepCell(cellPtr);
191 
192  // increase
193  if(cellUpdate.leftLine > m_cellThresholdRGBValue) {
194  // int value = cellPtr->leftLine;
195  // value += m_cellLineIncreasePerView;
196  // cellPtr->leftLine = value > MAPCELL_MAXVALUE ? MAPCELL_MAXVALUE : value;
197  cellPtr->leftLine = 255;
198  }
199  else {
200  cellPtr->leftLine = 0;
201  }
202  if(cellUpdate.centerLine > m_cellThresholdRGBValue) {
203  // int value = cellPtr->centerLine;
204  // value += m_cellLineIncreasePerView;
205  // cellPtr->centerLine = value > MAPCELL_MAXVALUE ? MAPCELL_MAXVALUE : value;
206  cellPtr->centerLine = 255;
207  }
208  else {
209  cellPtr->centerLine = 0;
210  }
211  if(cellUpdate.rightLine > m_cellThresholdRGBValue) {
212  // int value = cellPtr->rightLine;
213  // value += m_cellLineIncreasePerView;
214  // cellPtr->rightLine = value > MAPCELL_MAXVALUE ? MAPCELL_MAXVALUE : value;
215  cellPtr->rightLine = 255;
216  }
217  else {
218  cellPtr->rightLine = 0;
219  }
220 
221  cellPtr->imageIgnoreField = false;
222 
223  cellPtr->lastUpdateStep = m_updateStep;
224 }
225 
227  // return; // TODO: remove
228  uint32_t updateDiff = m_updateStep - cellPtr->lastUpdateStep;
229  int decreaseValue = updateDiff * m_cellLineDecreasePerView;
230 
231  // decrease
232  if(decreaseValue < cellPtr->leftLine)
233  cellPtr->leftLine = cellPtr->leftLine - decreaseValue;
234  else
235  cellPtr->leftLine = 0;
236 
237  if(decreaseValue < cellPtr->centerLine)
238  cellPtr->centerLine = cellPtr->centerLine - decreaseValue;
239  else
240  cellPtr->centerLine = 0;
241 
242  if(decreaseValue < cellPtr->rightLine)
243  cellPtr->rightLine = cellPtr->rightLine - decreaseValue;
244  else
245  cellPtr->rightLine = 0;
246 
247  cellPtr->lastUpdateStep = m_updateStep;
248 }
249 
250 std::shared_ptr<LinesObject<int16_t>> MapDataLayer::getLineObject(Vector2f absolutePositionCM, float lookBehindPosOffsetCM, double absoluteOrientation, Vector2i windowSize) {
251  m_mapMutex.lock();
252 
253  Eigen::Rotation2Df rotationMatrix(-absoluteOrientation);
254  Eigen::Rotation2Df reverseRotationMatrix(absoluteOrientation);
255 
256  Vector2f lookBehindVector = rotationMatrix * Vector2f(0.f, galaxis::autopilot::lookupLookBehindCarCM);
257 
258  m_linesObjectSPtr->clear();
259  m_linesObjectSPtr->rotationMatrix = rotationMatrix;
260  m_linesObjectSPtr->reverseRotationMatrix = reverseRotationMatrix;
261  m_linesObjectSPtr->rotateOrientation = -absoluteOrientation;
262 
263  absolutePositionCM += m_absoluteCarPositionOffset;
264  Vector2i absolutePositionInteger = Vector2i(std::round(absolutePositionCM[0]), std::round(absolutePositionCM[1]));
265 
266  // put larger rectangle above window for map iteration
267  Vector2f marginX = Vector2f(windowSize[0] / 2, 0);
268  Vector2f marginY = Vector2f(0, windowSize[1]);
269  marginX = rotationMatrix * marginX;
270  marginY = rotationMatrix * marginY;
271 
272  std::array<Vector2f, 4> windowEdges;
273  windowEdges[0] = absolutePositionCM - lookBehindVector - marginX; // left lower
274  windowEdges[1] = absolutePositionCM - lookBehindVector + marginX; // right lower
275  windowEdges[2] = windowEdges[0] + marginY; // left upper
276  windowEdges[3] = windowEdges[1] + marginY; // right upper
277 
278  Vector2i largerWindowBottomLeftCorner = Vector2i(std::round(map::utils::getMin(windowEdges, 0)), std::round(map::utils::getMin(windowEdges, 1)));
279  Vector2i largerWindowTopRightCorner = Vector2i(std::round(map::utils::getMax(windowEdges, 0)), std::round(map::utils::getMax(windowEdges, 1)));
280 
281  // check if lookup (axis aligned) window (larger window) inside of map
282  if(largerWindowBottomLeftCorner[0] < 0) {
283  log_warning("MapDataLayer::getLineObject: lookup (axis aligned) window size out of map size (X smaller than 0)");
284  largerWindowBottomLeftCorner[1] = 0;
285  }
286  if(largerWindowTopRightCorner[0] >= m_mapSize[0]) {
287  log_warning("MapDataLayer::getLineObject: lookup (axis aligned) window size out of map size (X larger than map)");
288  largerWindowTopRightCorner[0] = m_mapSize[0] - 1;
289  }
290  if(largerWindowBottomLeftCorner[1] < 0) {
291  log_warning("MapDataLayer::getLineObject: lookup (axis aligned) window size out of map size (Y smaller than 0)");
292  largerWindowBottomLeftCorner[1] = 0;
293  }
294  if(largerWindowTopRightCorner[1] >= m_mapSize[1]) {
295  log_warning("MapDataLayer::getLineObject: lookup (axis aligned) window size out of map size (Y larger than map)");
296  largerWindowTopRightCorner[1] = m_mapSize[1] - 1;
297  }
298 
299  int largerWindowStepsPerThread = (largerWindowTopRightCorner[0] - largerWindowBottomLeftCorner[0]) / m_amountOfThreads;
300 
301  int arrayStartX = largerWindowBottomLeftCorner[0];
302  int arrayEndX = arrayStartX + largerWindowStepsPerThread;
303  int arrayStartY = largerWindowBottomLeftCorner[1];
304  int arrayEndY = largerWindowTopRightCorner[1];
305 
306  for(int i = 0; i < m_amountOfThreads; ++i) {
307  if(i == m_amountOfThreads - 1) {
308  arrayEndX = largerWindowTopRightCorner[0] + 1;
309  } else {
310  arrayEndX = arrayStartX + largerWindowStepsPerThread;
311  }
312 
313  m_sharedThreadMutex.lock_shared();
314  boost::asio::post(m_threadPool, std::bind(&MapDataLayer::iterateThroughMap, this, arrayStartX, arrayEndX, arrayStartY, arrayEndY, absolutePositionInteger, windowEdges));
315  arrayStartX = arrayEndX;
316  }
317 
318  // wait for threads to complete
319  m_sharedThreadMutex.lock();
320  m_sharedThreadMutex.unlock();
321 
322  m_linesObjectSPtr->windowSize = Vector2i(largerWindowTopRightCorner[0] - largerWindowBottomLeftCorner[0], largerWindowTopRightCorner[1] - largerWindowBottomLeftCorner[1]);
323 
324  m_mapMutex.unlock();
325  return m_linesObjectSPtr;
326 }
327 
328 float MapDataLayer::checkPositionRelativeToEdge(int x1, int y1, int x2, int y2, int xp, int yp) {
329  // Edge: (x1,y1) and (x2,y2) [counterclockwise]
330  // https://stackoverflow.com/questions/2752725/finding-whether-a-point-lies-inside-a-rectangle-or-not
331  return (x2 - x1) * (yp - y1) - (xp - x1) * (y2 - y1);
332 }
333 
334 void MapDataLayer::iterateThroughMap(int arrayStartX, int arrayEndX, int arrayStartY, int arrayEndY, Vector2i const& absoluteCarPosition, std::array<Vector2f, 4> const& windowEdges) {
335  MapCell* cellPtr = nullptr;
336  for(int x = arrayStartX; x < arrayEndX; ++x) {
337  for(int y = arrayStartY; y <= arrayEndY; ++y) {
338  // check if point lies in smaller/real window NOT only in larger Window
339  if ( checkPositionRelativeToEdge(windowEdges[0][0], windowEdges[0][1], windowEdges[2][0], windowEdges[2][1], x, y) > 0 // left edge
340  || checkPositionRelativeToEdge(windowEdges[2][0], windowEdges[2][1], windowEdges[3][0], windowEdges[3][1], x, y) > 0 // upper edge
341  || checkPositionRelativeToEdge(windowEdges[3][0], windowEdges[3][1], windowEdges[1][0], windowEdges[1][1], x, y) > 0 // right edge
342  || checkPositionRelativeToEdge(windowEdges[1][0], windowEdges[1][1], windowEdges[0][0], windowEdges[0][1], x, y) > 0 // lower edge
343  ){
344  continue;
345  }
346 
347  // append cell information to linesObject
348  cellPtr = &m_data[x][y];
349 
350  // clean
351  // decreaseStepCell(cellPtr);
352  if(m_updateStep - cellPtr->lastUpdateStep > 20) { //&& (!cellPtr->imageIgnoreField || m_updateStep - cellPtr->lastUpdateStep > 5)) {
353  cellPtr->leftLine = 0;
354  cellPtr->centerLine = 0;
355  cellPtr->rightLine = 0;
356  continue;
357  }
358 
359  if(cellPtr->leftLine > m_cellThresholdExtract) {
360  m_linesObjectSPtr->leftLine.insert(x - absoluteCarPosition[0], y - absoluteCarPosition[1]);
361  }
362  if(cellPtr->centerLine > m_cellThresholdExtract) {
363  m_linesObjectSPtr->centerLine.insert(x - absoluteCarPosition[0], y - absoluteCarPosition[1]);
364  }
365  if(cellPtr->rightLine > m_cellThresholdExtract) {
366  m_linesObjectSPtr->rightLine.insert(x - absoluteCarPosition[0], y - absoluteCarPosition[1]);
367  }
368  }
369  }
370 
371  m_sharedThreadMutex.unlock_shared();
372 }
373 
374 // obstacle functions
375 std::shared_ptr<std::vector<StaticObstacle>> MapDataLayer::getObstacles(rclcpp::Time const& timestamp, bool removeOld) {
376  if(removeOld) {
377  // rm old obstacles
378  for(std::vector<StaticObstacle>::iterator it = m_staticObstacleVecSPtr->begin(); it != m_staticObstacleVecSPtr->end(); /* noop */) {
379  if (timestamp - it->get_last_update() > m_obstacleKeepDuration) {
380  it = m_staticObstacleVecSPtr->erase(it);
381  }
382  else {
383  ++it;
384  }
385  }
386  }
387 
389 }
390 
391 void MapDataLayer::addOrUpdateStaticObstacle(ObstacleType const& p_obstacle, Vector2f absolutePositionCM, double currentOrientation, rclcpp::Time const& timestamp) {
392  Vector2f obsPosition = Vector2f(p_obstacle.pos_x * 100, p_obstacle.pos_y * 100);
393  Eigen::Rotation2Df rotationMat(-currentOrientation);
394  obsPosition = rotationMat * obsPosition;
395  obsPosition += absolutePositionCM;
396 
397  bool obstacleUpdated = false;
398  for(StaticObstacle& obstacleStatic : *m_staticObstacleVecSPtr) {
399  Vector2f distanceDiff = obsPosition - obstacleStatic.get_position_now();
400  // TODO: also check dimensions
401  if(distanceDiff.norm() < m_obstaclePositionDiffForRerecognitionCM) { // obstacle already inserted -> update
402  obstacleStatic.update_position(timestamp, obsPosition);
403  obstacleUpdated = true;
404  break;
405  }
406  }
407 
408  if(obstacleUpdated == false) { // add new static obstacle
409  StaticObstacle newObstacle(timestamp, obsPosition, p_obstacle.width * 100);
410  m_staticObstacleVecSPtr->push_back(newObstacle);
411  }
412 }
MapDataLayer::getObstacles
std::shared_ptr< std::vector< StaticObstacle > > getObstacles(rclcpp::Time const &timestamp, bool removeOld=true)
Definition: MapDataLayer.cpp:375
MapDataLayer::m_amountOfThreads
int m_amountOfThreads
Definition: MapDataLayer.hpp:63
MapDataLayer::setLookupWindowSizeCMWidth
void setLookupWindowSizeCMWidth(int value)
Definition: MapDataLayer.cpp:51
MapDataLayer::m_staticObstacleVecSPtr
std::shared_ptr< std::vector< StaticObstacle > > m_staticObstacleVecSPtr
Definition: MapDataLayer.hpp:89
ObstacleType
messages::msg::Obstacle ObstacleType
Definition: messages.hpp:59
MapDataLayer::~MapDataLayer
~MapDataLayer()
Definition: MapDataLayer.cpp:24
MapDataLayer::iterateThroughMap
void iterateThroughMap(int arrayStartX, int arrayEndX, int arrayStartY, int arrayEndY, Vector2i const &absoluteCarPosition, std::array< Vector2f, 4 > const &windowEdges)
Definition: MapDataLayer.cpp:334
MapDataLayer::m_laneImagePixelToPositionConversionFactor
float m_laneImagePixelToPositionConversionFactor
Definition: MapDataLayer.hpp:85
galaxis::autopilot::imageCLinePixelByteIndex
constexpr int imageCLinePixelByteIndex
Definition: AutopilotSettings.hpp:30
galaxis::autopilot::lookupLookBehindCarCM
constexpr int lookupLookBehindCarCM
Definition: AutopilotSettings.hpp:38
MapCell::centerLine
uint8_t centerLine
Definition: MapDataLayer.hpp:47
MapUtils.hpp
galaxis::utils::log_warning
void log_warning(const Args &... args)
Definition: logger.hpp:41
MapDataLayer::setCellLineIncreasePerView
void setCellLineIncreasePerView(uint8_t value)
Definition: MapDataLayer.cpp:69
MapDataLayer::clear
void clear()
Definition: MapDataLayer.cpp:41
MapDataLayer::getLineObject
std::shared_ptr< LinesObject< int16_t > > getLineObject(Vector2f absolutePositionCM, float lookBehindPosOffsetCM, double absoluteOrientation, Vector2i windowSize)
Definition: MapDataLayer.cpp:250
MapDataLayer::setLookupWindowSizeCMHeight
void setLookupWindowSizeCMHeight(int value)
Definition: MapDataLayer.cpp:54
MapDataLayer::checkPositionRelativeToEdge
float checkPositionRelativeToEdge(int x1, int y1, int x2, int y2, int xp, int yp)
Definition: MapDataLayer.cpp:328
MapDataLayer::decreaseStepCell
void decreaseStepCell(MapCell *cellPtr)
Definition: MapDataLayer.cpp:226
MapCell::lastUpdateStep
uint32_t lastUpdateStep
Definition: MapDataLayer.hpp:50
MapDataLayer::updateCell
void updateCell(MapCell const &cellUpdate, Vector2i position)
Definition: MapDataLayer.cpp:181
MapDataLayer::m_mapSize
Vector2f m_mapSize
Definition: MapDataLayer.hpp:68
MapDataLayer::setCellThresholdExtract
void setCellThresholdExtract(uint8_t value)
Definition: MapDataLayer.cpp:63
MapDataLayer::preprocessPoints
void preprocessPoints(const sensor_msgs::msg::Image::ConstSharedPtr &laneDetectionSPtr, Vector2f const &currentPositionCM, int arrayOffsetStartIndex, int arrayOffsetEndIndex, double currentAbsoluteOrientation)
Definition: MapDataLayer.cpp:142
map::utils::getMin
float getMin(std::array< galaxis::lina::Vector2f, 4 > const &array, int index)
Definition: MapUtils.hpp:10
MapDataLayer::m_simulationMode
bool m_simulationMode
Definition: MapDataLayer.hpp:60
MapDataLayer::updateMap
void updateMap(const sensor_msgs::msg::Image::ConstSharedPtr &laneDetectionSPtr, Vector2f currentAbsoluteCarPositionCM, double currentAbsoluteOrientation)
Definition: MapDataLayer.cpp:83
MapDataLayer::setLaneImageConversionFactor
void setLaneImageConversionFactor(float factor)
Definition: MapDataLayer.cpp:72
MapDataLayer::isInImageIgnoreField
bool isInImageIgnoreField(Vector2f p_position, unsigned int p_maxImageX)
Definition: MapDataLayer.cpp:115
MapCell::leftLine
uint8_t leftLine
Definition: MapDataLayer.hpp:46
MapCell::rightLine
uint8_t rightLine
Definition: MapDataLayer.hpp:48
MapDataLayer::MapDataLayer
MapDataLayer()
Definition: MapDataLayer.cpp:18
galaxis::autopilot
Definition: AutopilotSettings.hpp:12
map::utils::getMax
float getMax(std::array< galaxis::lina::Vector2f, 4 > const &array, int index)
Definition: MapUtils.hpp:20
MapDataLayer::enableSimulationMode
void enableSimulationMode()
Definition: MapDataLayer.cpp:48
MapDataLayer::setObstacleTrackTimeDuration
void setObstacleTrackTimeDuration(int sec, int nsec)
Definition: MapDataLayer.cpp:78
MapDataLayer::m_data
MapArray m_data
Definition: MapDataLayer.hpp:67
MapDataLayer.hpp
MapDataLayer::m_linesObjectSPtr
std::shared_ptr< LinesObject< int16_t > > m_linesObjectSPtr
Definition: MapDataLayer.hpp:74
MapDataLayer::m_updateStep
std::atomic< uint32_t > m_updateStep
Definition: MapDataLayer.hpp:70
MapDataLayer::m_absoluteCarPositionOffset
Vector2f m_absoluteCarPositionOffset
Definition: MapDataLayer.hpp:72
galaxis::autopilot::imageLLinePixelByteIndex
constexpr int imageLLinePixelByteIndex
Definition: AutopilotSettings.hpp:29
MapCell
Definition: MapDataLayer.hpp:45
MAP_SIZE
constexpr int MAP_SIZE
Definition: MapDataLayer.hpp:53
galaxis::autopilot::imageIgnoreFieldArray
constexpr std::array< unsigned int, 6 > imageIgnoreFieldArray
Definition: AutopilotSettings.hpp:35
galaxis::lina::Vector2f
Eigen::Vector2f Vector2f
Definition: linatypes.hpp:14
MapCell::imageIgnoreField
bool imageIgnoreField
Definition: MapDataLayer.hpp:49
MapDataLayer::m_sharedThreadMutex
std::shared_mutex m_sharedThreadMutex
Definition: MapDataLayer.hpp:64
MapDataLayer::setObstaclePositionDiffForRerecognition
void setObstaclePositionDiffForRerecognition(float diff)
Definition: MapDataLayer.cpp:75
MapDataLayer::m_cellThresholdRGBValue
uint8_t m_cellThresholdRGBValue
Definition: MapDataLayer.hpp:81
MapDataLayer::setCellThresholdRGBValue
void setCellThresholdRGBValue(uint8_t value)
Definition: MapDataLayer.cpp:60
MapDataLayer::m_mapMutex
std::mutex m_mapMutex
Definition: MapDataLayer.hpp:69
galaxis::autopilot::imageRLinePixelByteIndex
constexpr int imageRLinePixelByteIndex
Definition: AutopilotSettings.hpp:31
map::classes::StaticObstacle
Definition: MapClasses.hpp:107
MapDataLayer::ColumnMapArray
std::array< MapCell, MAP_SIZE > ColumnMapArray
Definition: MapDataLayer.hpp:56
logger.hpp
MapDataLayer::m_lookupWindowSizeCMHeight
int m_lookupWindowSizeCMHeight
Definition: MapDataLayer.hpp:79
galaxis::utils
Definition: clock.hpp:5
galaxis::lina::Vector2i
Eigen::Vector2i Vector2i
Definition: linatypes.hpp:13
MapDataLayer::m_obstacleKeepDuration
rclcpp::Duration m_obstacleKeepDuration
Definition: MapDataLayer.hpp:90
MapDataLayer::m_cellLineIncreasePerView
uint8_t m_cellLineIncreasePerView
Definition: MapDataLayer.hpp:84
MapDataLayer::init
void init()
Definition: MapDataLayer.cpp:28
MapDataLayer::m_obstaclePositionDiffForRerecognitionCM
float m_obstaclePositionDiffForRerecognitionCM
Definition: MapDataLayer.hpp:86
galaxis::utils::log
void log(const Args &... args)
Definition: logger.hpp:33
MapDataLayer::m_threadPool
boost::asio::thread_pool m_threadPool
Definition: MapDataLayer.hpp:62
MapDataLayer::m_cellThresholdExtract
uint8_t m_cellThresholdExtract
Definition: MapDataLayer.hpp:82
MapDataLayer::setCellLineDecreasePerView
void setCellLineDecreasePerView(uint8_t value)
Definition: MapDataLayer.cpp:66
MapDataLayer::m_lookupWindowSizeCMWidth
int m_lookupWindowSizeCMWidth
Definition: MapDataLayer.hpp:78
MapDataLayer::m_cellLineDecreasePerView
uint8_t m_cellLineDecreasePerView
Definition: MapDataLayer.hpp:83
MapDataLayer::addOrUpdateStaticObstacle
void addOrUpdateStaticObstacle(ObstacleType const &p_obstacle, Vector2f absolutePositionCM, double currentOrientation, rclcpp::Time const &timestamp)
Definition: MapDataLayer.cpp:391