Apollo  6.0
Open source self driving car software
ndt_map_matrix.h
Go to the documentation of this file.
1 /******************************************************************************
2  * Copyright 2019 The Apollo Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *****************************************************************************/
16 
17 #pragma once
18 
19 #include <limits>
20 #include <memory>
21 #include <unordered_map>
22 #include <vector>
23 
24 #include "Eigen/Eigenvalues"
25 
28 
29 namespace apollo {
30 namespace localization {
31 namespace msf {
32 namespace pyramid_map {
33 
36  public:
40  void Reset();
44  size_t LoadBinary(const unsigned char* buf);
49  size_t CreateBinary(unsigned char* buf, size_t buf_size) const;
51  size_t GetBinarySize() const;
54 
56  static void Reduce(NdtMapSingleCell* cell, const NdtMapSingleCell& cell_new);
57 
59  void AddSample(const float intensity, const float altitude,
60  const Eigen::Vector3f& centroid, bool is_road = false);
61 
63  void MergeCell(const float intensity, const float intensity_var,
64  const unsigned int road_pt_count, const unsigned int count,
65  const Eigen::Vector3f& centroid,
66  const Eigen::Matrix3f& centroid_cov);
67 
68  void MergeCell(const NdtMapSingleCell& cell_new);
69 
70  void CentroidEigenSolver(const Eigen::Matrix3f& centroid_cov);
71 
72  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
73 
74  public:
76  float intensity_ = 0;
78  float intensity_var_ = 0;
80  unsigned int road_pt_count_ = 0;
82  unsigned int count_ = 0;
83 
91  unsigned char is_icov_available_ = 0;
93  const unsigned int minimum_points_threshold_ = 6;
94 };
95 
97 class NdtMapCells {
98  public:
100  NdtMapCells();
102  void Reset();
104  int AddSample(const float intensity, const float altitude,
105  const float resolution, const Eigen::Vector3f& centroid,
106  bool is_road = false);
107 
111  size_t LoadBinary(const unsigned char* buf);
116  size_t CreateBinary(unsigned char* buf, size_t buf_size) const;
118  size_t GetBinarySize() const;
119 
121  static int CalAltitudeIndex(const float resolution, const float altitude);
122 
124  static float CalAltitude(const float resolution, const int altitude_index);
125 
127  static void Reduce(NdtMapCells* cell, const NdtMapCells& cell_new);
128 
129  public:
131  std::unordered_map<int, NdtMapSingleCell> cells_;
137  std::vector<int> road_cell_indices_;
138 };
139 
141 class NdtMapMatrix : public BaseMapMatrix {
142  public:
144  NdtMapMatrix();
146  ~NdtMapMatrix();
148  NdtMapMatrix(const NdtMapMatrix& cells);
149 
151  virtual void Init(const BaseMapConfig& config);
153  virtual void Reset();
154 
156  void Init(unsigned int rows, unsigned int cols);
158  void Reset(unsigned int rows, unsigned int cols);
162  virtual size_t LoadBinary(const unsigned char* buf);
167  virtual size_t CreateBinary(unsigned char* buf, size_t buf_size) const;
169  virtual size_t GetBinarySize() const;
170 
171  virtual bool GetIntensityImg(cv::Mat* intensity_img) const;
172 
174  inline const NdtMapCells& GetMapCell(unsigned int row,
175  unsigned int col) const {
176  assert(row < rows_);
177  assert(col < cols_);
178  return map3d_cells_[row * cols_ + col];
179  }
181  inline NdtMapCells& GetMapCell(unsigned int row, unsigned int col) {
182  assert(row < rows_);
183  assert(col < cols_);
184  return map3d_cells_[row * cols_ + col];
185  }
187  unsigned int GetRows() const { return rows_; }
189  unsigned int GetCols() const { return cols_; }
190 
192  static void Reduce(NdtMapMatrix* cells, const NdtMapMatrix& cells_new);
193 
194  private:
196  unsigned int rows_;
198  unsigned int cols_;
200  std::unique_ptr<NdtMapCells[]> map3d_cells_;
201 };
202 
203 } // namespace pyramid_map
204 } // namespace msf
205 } // namespace localization
206 } // namespace apollo
unsigned char is_icov_available_
the inverse covariance available flag.
Definition: ndt_map_matrix.h:91
std::vector< int > road_cell_indices_
The indices of road surface.
Definition: ndt_map_matrix.h:137
float intensity_
The average intensity value.
Definition: ndt_map_matrix.h:76
int min_altitude_index_
The index of smallest altitude.
Definition: ndt_map_matrix.h:135
Eigen::Vector3f Vector3f
Definition: base_map_fwd.h:29
float intensity_var_
The variance intensity value.
Definition: ndt_map_matrix.h:78
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
The data structure of ndt Map cell.
Definition: ndt_map_matrix.h:97
apollo::localization::msf::pyramid_map::NdtMapMatrix NdtMapMatrix
Definition: lidar_locator_ndt.h:71
Eigen::Matrix3f centroid_average_cov_
the pose covariance of the cell.
Definition: ndt_map_matrix.h:87
Eigen::Matrix3f Matrix3f
Definition: base_map_fwd.h:27
const NdtMapCells & GetMapCell(unsigned int row, unsigned int col) const
Get a const map cell.
Definition: ndt_map_matrix.h:174
void MergeCell(const float intensity, const float intensity_var, const unsigned int road_pt_count, const unsigned int count, const Eigen::Vector3f &centroid, const Eigen::Matrix3f &centroid_cov)
Merge two cells.
The data structure of the map cells in a map node.
Definition: base_map_matrix.h:30
Eigen::Matrix3f centroid_icov_
the pose inverse covariance of the cell.
Definition: ndt_map_matrix.h:89
void AddSample(const float intensity, const float altitude, const Eigen::Vector3f &centroid, bool is_road=false)
Add an sample to the single 3d map cell.
unsigned int road_pt_count_
The number of samples belonging to road surface.
Definition: ndt_map_matrix.h:80
unsigned int GetCols() const
Get the size of cols.
Definition: ndt_map_matrix.h:189
unsigned int GetRows() const
Get the size of row.
Definition: ndt_map_matrix.h:187
bool Init(const char *binary_name)
std::unordered_map< int, NdtMapSingleCell > cells_
The multiple altitudes of the cell.
Definition: ndt_map_matrix.h:131
static void Reduce(NdtMapSingleCell *cell, const NdtMapSingleCell &cell_new)
Combine two NdtMapSingleCell instances (Reduce).
size_t LoadBinary(const unsigned char *buf)
Load the map cell from a binary chunk.
unsigned int count_
The number of samples in the cell.
Definition: ndt_map_matrix.h:82
The options of the reflectance map.
Definition: base_map_config.h:42
void CentroidEigenSolver(const Eigen::Matrix3f &centroid_cov)
NdtMapSingleCell & operator=(const NdtMapSingleCell &ref)
Overloading the assign operator.
int max_altitude_index_
The index of biggest altitude.
Definition: ndt_map_matrix.h:133
const unsigned int minimum_points_threshold_
minimum number of points needed.
Definition: ndt_map_matrix.h:93
The data structure of a single ndt map cell.
Definition: ndt_map_matrix.h:35
The data structure of ndt Map matrix.
Definition: ndt_map_matrix.h:141
apollo::localization::msf::pyramid_map::NdtMapCells NdtMapCells
Definition: lidar_locator_ndt.h:69
Eigen::Vector3f centroid_
the centroid of the cell.
Definition: ndt_map_matrix.h:85
size_t GetBinarySize() const
Get the binary size of the object.
NdtMapCells & GetMapCell(unsigned int row, unsigned int col)
Get a map cell.
Definition: ndt_map_matrix.h:181
size_t CreateBinary(unsigned char *buf, size_t buf_size) const
Create the binary. Serialization of the object.