26namespace localization {
28namespace pyramid_map {
43 void Init(
unsigned int rows,
unsigned int cols,
bool has_intensity =
true,
44 bool has_intensity_var =
true,
bool has_altitude =
true,
45 bool has_altitude_var =
true,
bool has_ground_altitude =
true,
46 bool has_count =
true,
bool has_ground_count =
true,
47 unsigned int resolution_num = 1,
unsigned int ratio = 2);
50 void Reset(
unsigned int level);
53 void ResetCells(
unsigned int start_id,
unsigned int end_id,
54 unsigned int level = 0);
56 void ResetCell(
unsigned int id,
unsigned int level = 0);
66 bool GetAltitudeImg(
unsigned int level, cv::Mat* altitude_img)
const;
80 unsigned int level = 0)
const;
83 unsigned int level = 0)
const;
86 unsigned int level = 0)
const;
89 unsigned int level = 0)
const;
92 unsigned int level = 0)
const;
94 const unsigned int*
GetCountSafe(
unsigned int row,
unsigned int col,
95 unsigned int level = 0)
const;
98 unsigned int level = 0)
const;
102 float** altitude,
float** altitude_var,
103 float** ground_altitude,
unsigned int** count,
104 unsigned int** ground_count,
unsigned int row,
105 unsigned int col,
unsigned int level = 0);
124 unsigned int start_index,
unsigned int level = 0);
126 unsigned int start_index,
unsigned int level = 0);
128 unsigned int start_index,
unsigned int level = 0);
130 unsigned int start_index,
unsigned int level = 0);
132 unsigned int start_index,
133 unsigned int level = 0);
135 unsigned int start_index,
unsigned int level = 0);
137 unsigned int start_index,
unsigned int level = 0);
146 unsigned int type,
unsigned int level = 0);
154 unsigned int type,
unsigned int level = 0);
158 unsigned int level = 0);
161 unsigned int col,
unsigned int level = 0);
163 void SetAltitudeSafe(
float altitude,
unsigned int row,
unsigned int col,
164 unsigned int level = 0);
167 unsigned int col,
unsigned int level = 0);
170 unsigned int col,
unsigned int level = 0);
172 void SetCountSafe(
unsigned int count,
unsigned int row,
unsigned int col,
173 unsigned int level = 0);
176 unsigned int col,
unsigned int level = 0);
182 void SetValueSafe(
unsigned char intensity,
float altitude,
unsigned int row,
183 unsigned int col,
unsigned int level = 0);
186 void MergeCellSafe(
const float* intensity,
const float* intensity_var,
187 const float* altitude,
const float* altitude_var,
188 const float* ground_altitude,
const unsigned int* count,
189 const unsigned int* ground_count,
unsigned int row,
190 unsigned int col,
unsigned int level);
193 void AddSampleSafe(
float intensity,
float altitude,
unsigned int row,
194 unsigned int col,
unsigned int level);
198 unsigned int col,
unsigned int level = 0);
204 static void Reduce(std::shared_ptr<PyramidMapMatrix> cells,
206 unsigned int new_level = 0);
217 inline unsigned int GetRowsSafe(
unsigned int level = 0)
const;
220 inline unsigned int GetColsSafe(
unsigned int level = 0)
const;
223 inline unsigned int GetRows(
unsigned int level = 0)
const;
226 inline unsigned int GetCols(
unsigned int level = 0)
const;
237 inline void AddSampleBase(
float intensity,
float altitude,
unsigned int row,
238 unsigned int col,
unsigned int level);
243 inline void MergeCellBase(
const float* intensity,
const float* intensity_var,
244 const float* altitude,
const unsigned int* count,
245 unsigned int row,
unsigned int col,
251 inline void GetMapCellBase(
float** intensity,
float** intensity_var,
252 float** altitude,
unsigned int** count,
253 unsigned int row,
unsigned int col,
254 unsigned int level = 0);
257 inline const float*
GetIntensity(
unsigned int row,
unsigned int col,
258 unsigned int level = 0)
const;
260 inline const float*
GetIntensityVar(
unsigned int row,
unsigned int col,
261 unsigned int level = 0)
const;
263 inline const float*
GetAltitude(
unsigned int row,
unsigned int col,
264 unsigned int level = 0)
const;
266 inline const float*
GetAltitudeVar(
unsigned int row,
unsigned int col,
267 unsigned int level = 0)
const;
270 unsigned int level = 0)
const;
272 inline const unsigned int*
GetCount(
unsigned int row,
unsigned int col,
273 unsigned int level = 0)
const;
275 inline const unsigned int*
GetGroundCount(
unsigned int row,
unsigned int col,
276 unsigned int level = 0)
const;
291 unsigned int level = 0)
const;
297 bool CheckLegalityForGetData(
unsigned int row,
unsigned int col,
298 unsigned int level)
const;
300 bool CheckLegalityForSetData(
unsigned int level,
unsigned int start_id,
301 unsigned int size)
const;
302 bool CheckLegalityForSetDataRoi(
unsigned int level,
303 unsigned int source_matrix_rows,
304 unsigned int source_matrix_cols,
310 unsigned int resolution_num_ = 1;
312 unsigned int ratio_ = 2;
314 std::vector<unsigned int> rows_mr_;
316 std::vector<unsigned int> cols_mr_;
318 std::vector<unsigned int> ratio_multiplier_;
320 std::vector<FloatMatrix> intensity_matrixes_;
321 std::vector<FloatMatrix> intensity_var_matrixes_;
322 std::vector<FloatMatrix> altitude_matrixes_;
323 std::vector<FloatMatrix> altitude_var_matrixes_;
324 std::vector<FloatMatrix> ground_altitude_matrixes_;
325 std::vector<UIntMatrix> count_matrixes_;
326 std::vector<UIntMatrix> ground_count_matrixes_;
329 bool has_intensity_ =
false;
331 bool has_intensity_var_ =
false;
333 bool has_altitude_ =
false;
335 bool has_altitude_var_ =
false;
337 bool has_ground_altitude_ =
false;
339 bool has_count_ =
false;
341 bool has_ground_count_ =
false;
347 return has_intensity_var_;
353 return has_altitude_var_;
357 return has_ground_altitude_;
363 return has_ground_count_;
367 if (level >= resolution_num_) {
368 std::cerr <<
"PyramidMapMatrix: [GetRows] The level id is illegal."
373 return rows_mr_[level];
377 if (level >= resolution_num_) {
378 std::cerr <<
"PyramidMapMatrix: [GetCols] The level id is illegal."
383 return cols_mr_[level];
387 return rows_mr_[level];
391 return cols_mr_[level];
395 return resolution_num_;
403 unsigned int row,
unsigned int col,
404 unsigned int level) {
405 ++count_matrixes_[level][row][col];
411 v1 = intensity - intensity_matrixes_[level][row][col];
412 value = v1 /
static_cast<float>(count_matrixes_[level][row][col]);
413 intensity_matrixes_[level][row][col] += value;
415 v2 = intensity - intensity_matrixes_[level][row][col];
416 intensity_var_matrixes_[level][row][col] =
417 (
static_cast<float>(count_matrixes_[level][row][col] - 1) *
418 intensity_var_matrixes_[level][row][col] +
420 static_cast<float>(count_matrixes_[level][row][col]);
422 v1 = altitude - altitude_matrixes_[level][row][col];
423 value = v1 /
static_cast<float>(count_matrixes_[level][row][col]);
424 altitude_matrixes_[level][row][col] += value;
428 const float* intensity_var,
429 const float* altitude,
430 const unsigned int* count,
431 unsigned int row,
unsigned int col,
432 unsigned int level) {
433 unsigned int new_count = count_matrixes_[level][row][col] + *count;
434 float p0 =
static_cast<float>(count_matrixes_[level][row][col]) /
435 static_cast<float>(new_count);
436 float p1 =
static_cast<float>(*count) /
static_cast<float>(new_count);
438 float intensity_diff = 0.0f;
439 intensity_diff = intensity_matrixes_[level][row][col] - *intensity;
440 intensity_matrixes_[level][row][col] =
441 intensity_matrixes_[level][row][col] * p0 + *intensity * p1;
443 intensity_var_matrixes_[level][row][col] =
444 intensity_var_matrixes_[level][row][col] * p0 + *intensity_var * p1 +
445 intensity_diff * intensity_diff * p0 * p1;
447 altitude_matrixes_[level][row][col] =
448 altitude_matrixes_[level][row][col] * p0 + *altitude * p1;
450 count_matrixes_[level][row][col] = new_count;
454 float** intensity_var,
456 unsigned int** count,
457 unsigned int row,
unsigned int col,
458 unsigned int level) {
459 *intensity = &intensity_matrixes_[level][row][col];
460 *intensity_var = &intensity_var_matrixes_[level][row][col];
461 *altitude = &altitude_matrixes_[level][row][col];
462 *count = &count_matrixes_[level][row][col];
467 unsigned int level)
const {
468 return &intensity_matrixes_[level][row][col];
472 unsigned int row,
unsigned int col,
unsigned int level)
const {
473 return &intensity_var_matrixes_[level][row][col];
478 unsigned int level)
const {
479 return &altitude_matrixes_[level][row][col];
484 unsigned int level)
const {
485 return &altitude_var_matrixes_[level][row][col];
489 unsigned int row,
unsigned int col,
unsigned int level)
const {
490 return &ground_altitude_matrixes_[level][row][col];
494 unsigned int row,
unsigned int col,
unsigned int level)
const {
495 return &count_matrixes_[level][row][col];
499 unsigned int row,
unsigned int col,
unsigned int level)
const {
500 return &ground_count_matrixes_[level][row][col];
504 return &intensity_matrixes_[level];
508 unsigned int level) {
509 return &intensity_var_matrixes_[level];
513 return &altitude_matrixes_[level];
517 return &altitude_var_matrixes_[level];
521 unsigned int level) {
522 return &ground_altitude_matrixes_[level];
526 return &count_matrixes_[level];
530 return &ground_count_matrixes_[level];
534 unsigned int level)
const {
535 return &intensity_matrixes_[level];
539 unsigned int level)
const {
540 return &intensity_var_matrixes_[level];
544 unsigned int level)
const {
545 return &altitude_matrixes_[level];
549 unsigned int level)
const {
550 return &altitude_var_matrixes_[level];
554 unsigned int level)
const {
555 return &ground_altitude_matrixes_[level];
559 unsigned int level)
const {
560 return &count_matrixes_[level];
564 unsigned int level)
const {
565 return &ground_count_matrixes_[level];
The options of the reflectance map.
The data structure of the map cells in a map node.
const unsigned int * GetGroundCountSafe(unsigned int row, unsigned int col, unsigned int level=0) const
Get a ground count value by check.
UIntMatrix * GetGroundCountMatrix(unsigned int level=0)
void SetValueSafe(unsigned char intensity, float altitude, unsigned int row, unsigned int col, unsigned int level=0)
Set the several values by check.
virtual bool GetAltitudeImg(cv::Mat *altitude_img) const
get altitude image of node.
void SetUintMatrixRoi(const UIntMatrix *source_matrix, const Rect2D< unsigned int > &source_roi, const Rect2D< unsigned int > &target_roi, unsigned int type, unsigned int level=0)
set unsigned int matrix with a ROI.
PyramidMapMatrix & operator=(const PyramidMapMatrix &map_matrix)
const float * GetGroundAltitude(unsigned int row, unsigned int col, unsigned int level=0) const
Get an altitude ground value without check.
bool HasGroundCount() const
const float * GetIntensityVarSafe(unsigned int row, unsigned int col, unsigned int level=0) const
Get an intensity variance value by check.
const float * GetIntensitySafe(unsigned int row, unsigned int col, unsigned int level=0) const
Get an intensity value by check.
void SetGroundAltitudeSafe(float ground_altitude, unsigned int row, unsigned int col, unsigned int level=0)
Set an altitude ground value by check.
virtual bool GetIntensityImg(cv::Mat *intensity_img) const
get intensity image of node.
void BottomUpSafe()
Propagate the data from fine level to the coarse resolution by check.
void BottomUpBase()
Propagate the data from fine level to the coarse resolution by check.
unsigned int GetRows(unsigned int level=0) const
Get row number given the resolution.
FloatMatrix * GetIntensityMatrix(unsigned int level=0)
const float * GetAltitudeSafe(unsigned int row, unsigned int col, unsigned int level=0) const
Get an altitude value by check.
void SetAltitudeVarMatrix(const float *input, unsigned int size, unsigned int start_index, unsigned int level=0)
void SetIntensityMatrix(const float *input, unsigned int size, unsigned int start_index, unsigned int level=0)
void GetMapCellBase(float **intensity, float **intensity_var, float **altitude, unsigned int **count, unsigned int row, unsigned int col, unsigned int level=0)
Get cell values.
bool HasIntensity() const
FloatMatrix * GetIntensityVarMatrix(unsigned int level=0)
double ComputeMeanIntensity(unsigned int level=0)
Compute mean intensity.
void SetAltitudeSafe(float altitude, unsigned int row, unsigned int col, unsigned int level=0)
Set an altitude value by check.
void SetCountSafe(unsigned int count, unsigned int row, unsigned int col, unsigned int level=0)
Set a count value by check.
void SetGroundCountMatrix(const unsigned int *input, unsigned int size, unsigned int start_index, unsigned int level=0)
void Clear()
Release all memory in PyramidMapMatrix.
const unsigned int * GetGroundCount(unsigned int row, unsigned int col, unsigned int level=0) const
Get a ground count value without check.
void MergeCellBase(const float *intensity, const float *intensity_var, const float *altitude, const unsigned int *count, unsigned int row, unsigned int col, unsigned int level)
Merge the data from another map cell.
const unsigned int * GetCountSafe(unsigned int row, unsigned int col, unsigned int level=0) const
Get a count value by check.
void SetIntensityVarSafe(float intensity_var, unsigned int row, unsigned int col, unsigned int level=0)
Set an intensity variance value by check.
const float * GetAltitudeVarSafe(unsigned int row, unsigned int col, unsigned int level=0) const
Get an altitude variance value by check.
void SetFloatMatrixRoi(const FloatMatrix *source_matrix, const Rect2D< unsigned int > &source_roi, const Rect2D< unsigned int > &target_roi, unsigned int type, unsigned int level=0)
set float matrix with a ROI.
FloatMatrix * GetIntensityVarMatrixSafe(unsigned int level=0)
void SetAltitudeMatrix(const float *input, unsigned int size, unsigned int start_index, unsigned int level=0)
void ResetCell(unsigned int id, unsigned int level=0)
Reset a map cell in a specific resolution level.
static void Reduce(std::shared_ptr< PyramidMapMatrix > cells, const PyramidMapMatrix &new_cells, unsigned int level=0, unsigned int new_level=0)
Combine two PyramidMapMatrix instances (Reduce).
bool HasAltitudeVar() const
void SetIntensityVarMatrix(const float *input, unsigned int size, unsigned int start_index, unsigned int level=0)
const float * GetAltitude(unsigned int row, unsigned int col, unsigned int level=0) const
Get an altitude value without check.
FloatMatrix * GetAltitudeVarMatrix(unsigned int level=0)
void SetGroundAltitudeMatrix(const float *input, unsigned int size, unsigned int start_index, unsigned int level=0)
void AddSampleBase(float intensity, float altitude, unsigned int row, unsigned int col, unsigned int level)
Add sample to the map cell.
bool HasGroundAltitude() const
UIntMatrix * GetCountMatrix(unsigned int level=0)
FloatMatrix * GetAltitudeMatrix(unsigned int level=0)
unsigned int GetResolutionNum() const
Get number of resolution.
UIntMatrix * GetCountMatrixSafe(unsigned int level=0)
unsigned int GetColsSafe(unsigned int level=0) const
Get column number given the resolution by check.
virtual void Reset()
Reset map cells data.
FloatMatrix * GetGroundAltitudeMatrixSafe(unsigned int level=0)
const float * GetGroundAltitudeSafe(unsigned int row, unsigned int col, unsigned int level=0) const
Get an altitude ground value by check.
const float * GetAltitudeVar(unsigned int row, unsigned int col, unsigned int level=0) const
Get an altitude variance value without check.
FloatMatrix * GetGroundAltitudeMatrix(unsigned int level=0)
void AddGroundSample(float ground_altitude, unsigned int row, unsigned int col, unsigned int level=0)
Add ground sample to the map cell.
UIntMatrix * GetGroundCountMatrixSafe(unsigned int level=0)
void AddSampleSafe(float intensity, float altitude, unsigned int row, unsigned int col, unsigned int level)
Add sample to the map cell with check.
void SetGroundCountSafe(unsigned int ground_count, unsigned int row, unsigned int col, unsigned int level=0)
Set a ground count value by check.
void SetIntensitySafe(float intensity, unsigned int row, unsigned int col, unsigned int level=0)
Set an intensity value by check.
void SetCountMatrix(const unsigned int *input, unsigned int size, unsigned int start_index, unsigned int level=0)
const float * GetIntensity(unsigned int row, unsigned int col, unsigned int level=0) const
Get an intensity value without check.
unsigned int GetCols(unsigned int level=0) const
Get column number given the resolution.
virtual void Init(const BaseMapConfig &config)
Initialize the map matrix.
void ResetCells(unsigned int start_id, unsigned int end_id, unsigned int level=0)
Reset map cells data from start_id to end_id in a specific resolution level
const float * GetIntensityVar(unsigned int row, unsigned int col, unsigned int level=0) const
Get an intensity variance value by check.
FloatMatrix * GetAltitudeVarMatrixSafe(unsigned int level=0)
bool HasIntensityVar() const
FloatMatrix * GetIntensityMatrixSafe(unsigned int level=0)
void SetAltitudeVarSafe(float altitude_var, unsigned int row, unsigned int col, unsigned int level=0)
Set an altitude variance value by check.
unsigned int GetRowsSafe(unsigned int level=0) const
Get row number given the resolution by check.
void GetMapCellSafe(float **intensity, float **intensity_var, float **altitude, float **altitude_var, float **ground_altitude, unsigned int **count, unsigned int **ground_count, unsigned int row, unsigned int col, unsigned int level=0)
Get cell values by check.
unsigned int GetResolutionRatio() const
Get the resolution ratio.
FloatMatrix * GetAltitudeMatrixSafe(unsigned int level=0)
const unsigned int * GetCount(unsigned int row, unsigned int col, unsigned int level=0) const
Get a count value without check.
void MergeCellSafe(const float *intensity, const float *intensity_var, const float *altitude, const float *altitude_var, const float *ground_altitude, const unsigned int *count, const unsigned int *ground_count, unsigned int row, unsigned int col, unsigned int level)
Merge the data from another map cell by check.
AlignedMatrix< float > FloatMatrix
AlignedMatrix< unsigned int > UIntMatrix