lidar_mapping.cpp
Go to the documentation of this file.
1 
3 
4 // Original Author of FLOAM: Wang Han
5 // Email wh200720041@gmail.com
6 // Homepage https://wanghan.pro
8 
9 #include <iostream>
10 
11 namespace floam
12 {
13 namespace lidar
14 {
15 
17 {
18  // constructor
19 }
20 
21 void LidarMapping::init(const double & map_resolution)
22 {
23  //init map
24  //init can have real object, but future added block does not need
25  for(int i=0; i < CELL_RANGE_HORIZONTAL; i++) {
26  std::vector<std::vector<pcl::PointCloud<pcl::PointXYZL>::Ptr>> m_mapHeight_temp;
27  for(int j=0; j < CELL_RANGE_HORIZONTAL; j++) {
28  std::vector<pcl::PointCloud<pcl::PointXYZL>::Ptr> m_mapDepth_temp;
29  for(int k=0; k < CELL_RANGE_VERTICAL; k++) {
30  pcl::PointCloud<pcl::PointXYZL>::Ptr point_cloud_temp(new pcl::PointCloud<pcl::PointXYZL>);
31  m_mapDepth_temp.push_back(point_cloud_temp);
32  }
33  m_mapHeight_temp.push_back(m_mapDepth_temp);
34  }
35  m_map.push_back(m_mapHeight_temp);
36  }
37 
44 
45  //downsampling size
46  m_downSizeFilter.setLeafSize(map_resolution, map_resolution, map_resolution);
47 }
48 
50 {
51  std::vector<std::vector<pcl::PointCloud<pcl::PointXYZL>::Ptr>> m_mapHeight_temp;
52  for(int j=0; j < m_mapHeight; j++) {
53  std::vector<pcl::PointCloud<pcl::PointXYZL>::Ptr> m_mapDepth_temp;
54  for(int k=0; k < m_mapDepth; k++) {
55  pcl::PointCloud<pcl::PointXYZL>::Ptr point_cloud_temp(new pcl::PointCloud<pcl::PointXYZL>());
56  m_mapDepth_temp.push_back(point_cloud_temp);
57  }
58  m_mapHeight_temp.push_back(m_mapDepth_temp);
59  }
60  m_map.insert(m_map.begin(), m_mapHeight_temp);
61 
63  m_mapWidth++;
64 }
65 
67 {
68  std::vector<std::vector<pcl::PointCloud<pcl::PointXYZL>::Ptr>> m_mapHeight_temp;
69 
70  for(int j=0; j < m_mapHeight; j++) {
71  std::vector<pcl::PointCloud<pcl::PointXYZL>::Ptr> m_mapDepth_temp;
72 
73  for(int k=0; k < m_mapDepth; k++) {
74  pcl::PointCloud<pcl::PointXYZL>::Ptr point_cloud_temp(new pcl::PointCloud<pcl::PointXYZL>());
75  m_mapDepth_temp.push_back(point_cloud_temp);
76  }
77  m_mapHeight_temp.push_back(m_mapDepth_temp);
78  }
79  m_map.push_back(m_mapHeight_temp);
80  m_mapWidth++;
81 }
83 {
84  for(int i=0; i < m_mapWidth; i++) {
85  std::vector<pcl::PointCloud<pcl::PointXYZL>::Ptr> m_mapDepth_temp;
86 
87  for(int k=0; k < m_mapDepth; k++) {
88  pcl::PointCloud<pcl::PointXYZL>::Ptr point_cloud_temp(new pcl::PointCloud<pcl::PointXYZL>());
89  m_mapDepth_temp.push_back(point_cloud_temp);
90  }
91  m_map[i].insert(m_map[i].begin(), m_mapDepth_temp);
92  }
94  m_mapHeight++;
95 }
97 {
98  for(int i=0; i < m_mapWidth; i++) {
99  std::vector<pcl::PointCloud<pcl::PointXYZL>::Ptr> m_mapDepth_temp;
100 
101  for(int k=0; k < m_mapDepth; k++) {
102  pcl::PointCloud<pcl::PointXYZL>::Ptr point_cloud_temp(new pcl::PointCloud<pcl::PointXYZL>());
103  m_mapDepth_temp.push_back(point_cloud_temp);
104  }
105  m_map[i].push_back(m_mapDepth_temp);
106  }
107  m_mapHeight++;
108 }
110 {
111  for(int i = 0; i < m_mapWidth; i++) {
112  for(int j = 0; j < m_mapHeight; j++) {
113  pcl::PointCloud<pcl::PointXYZL>::Ptr point_cloud_temp(new pcl::PointCloud<pcl::PointXYZL>());
114  m_map[i][j].insert(m_map[i][j].begin(), point_cloud_temp);
115  }
116  }
117  m_originInMapZ++;
118  m_mapDepth++;
119 }
121 {
122  for(int i=0; i < m_mapWidth; i++) {
123  for(int j=0; j < m_mapHeight; j++) {
124  pcl::PointCloud<pcl::PointXYZL>::Ptr point_cloud_temp(new pcl::PointCloud<pcl::PointXYZL>());
125  m_map[i][j].push_back(point_cloud_temp);
126  }
127  }
128  m_mapDepth++;
129 }
130 
131 //extend map is points exceed size
132 void LidarMapping::checkPoints(int& x, int& y, int& z)
133 {
134  while(x + CELL_RANGE_HORIZONTAL > m_mapWidth) {
136  }
137  while(x - CELL_RANGE_HORIZONTAL<0) {
139  x++;
140  }
141  while(y + CELL_RANGE_HORIZONTAL > m_mapHeight) {
143  }
144  while(y - CELL_RANGE_HORIZONTAL < 0) {
146  y++;
147  }
148  while(z + CELL_RANGE_VERTICAL > m_mapDepth) {
150  }
151  while(z - CELL_RANGE_VERTICAL < 0) {
153  z++;
154  }
155 
156  //initialize
157  //create object if area is null
158  for(int i = (x - CELL_RANGE_HORIZONTAL); i < (x + CELL_RANGE_HORIZONTAL); i++) {
159  for(int j = (y - CELL_RANGE_HORIZONTAL); j < (y + CELL_RANGE_HORIZONTAL); j++) {
160  for(int k = (z - CELL_RANGE_VERTICAL); k < (z + CELL_RANGE_VERTICAL); k++) {
161  if(m_map[i][j][k] == NULL) {
162  pcl::PointCloud<pcl::PointXYZL>::Ptr point_cloud_temp(new pcl::PointCloud<pcl::PointXYZL>());
163  m_map[i][j][k] = point_cloud_temp;
164  }
165  }
166  }
167  }
168 }
169 
170 //update points to map
172  const pcl::PointCloud<pcl::PointXYZL>::Ptr & pc_in,
173  const Eigen::Isometry3d & pose_current)
174 {
175  int currentPosIdX = int(std::floor(pose_current.translation().x() / CELL_WIDTH + 0.5)) + m_originInMapX;
176  int currentPosIdY = int(std::floor(pose_current.translation().y() / CELL_HEIGHT + 0.5)) + m_originInMapY;
177  int currentPosIdZ = int(std::floor(pose_current.translation().z() / CELL_DEPTH + 0.5)) + m_originInMapZ;
178 
179  //check is submap is null
180  checkPoints(currentPosIdX, currentPosIdY, currentPosIdZ);
181 
182  pcl::PointCloud<pcl::PointXYZL>::Ptr transformed_pc(new pcl::PointCloud<pcl::PointXYZL>());
183  pcl::transformPointCloud(*pc_in, *transformed_pc, pose_current.cast<float>());
184 
185  //save points
186  for (int i = 0; i < (int)transformed_pc->points.size(); i++) {
187  pcl::PointXYZL point_temp = transformed_pc->points[i];
188 
189  //for visualization only
190  int currentPointIdX = int(std::floor(point_temp.x / CELL_WIDTH + 0.5)) + m_originInMapX;
191  int currentPointIdY = int(std::floor(point_temp.y / CELL_HEIGHT + 0.5)) + m_originInMapY;
192  int currentPointIdZ = int(std::floor(point_temp.z / CELL_DEPTH + 0.5)) + m_originInMapZ;
193 
194  m_map[currentPointIdX][currentPointIdY][currentPointIdZ]->push_back(point_temp);
195  }
196 
197  //filtering points
198  for(int i = currentPosIdX - CELL_RANGE_HORIZONTAL; i < currentPosIdX + CELL_RANGE_HORIZONTAL; i++) {
199  for(int j = currentPosIdY - CELL_RANGE_HORIZONTAL; j < currentPosIdY + CELL_RANGE_HORIZONTAL; j++) {
200  for(int k = currentPosIdZ - CELL_RANGE_VERTICAL; k < currentPosIdZ + CELL_RANGE_VERTICAL; k++) {
201  m_downSizeFilter.setInputCloud(m_map[i][j][k]);
202  m_downSizeFilter.filter(*(m_map[i][j][k]));
203  }
204  }
205  }
206 }
207 
208 pcl::PointCloud<pcl::PointXYZL>::Ptr LidarMapping::getMap(void)
209 {
210  pcl::PointCloud<pcl::PointXYZL>::Ptr LidarCloudMap(new pcl::PointCloud<pcl::PointXYZL>());
211  for (int i = 0; i < m_mapWidth; i++) {
212  for (int j = 0; j < m_mapHeight; j++) {
213  for (int k = 0; k < m_mapDepth; k++) {
214  if(m_map[i][j][k]!=NULL){
215  *LidarCloudMap += *(m_map[i][j][k]);
216  }
217  }
218  }
219  }
220  return LidarCloudMap;
221 }
222 
223 } // namespace lidar
224 } // namespace floam
225 
floam::lidar::LidarMapping::getMap
pcl::PointCloud< pcl::PointXYZL >::Ptr getMap(void)
Definition: lidar_mapping.cpp:208
HALF_CELL_RANGE_VERTICAL
#define HALF_CELL_RANGE_VERTICAL
Definition: lidar_mapping.hpp:35
floam::lidar::LidarMapping::addHeightCellNegative
void addHeightCellNegative(void)
Definition: lidar_mapping.cpp:82
floam::lidar::LidarMapping::addDepthCellPositive
void addDepthCellPositive(void)
Definition: lidar_mapping.cpp:120
floam::lidar::LidarMapping::m_downSizeFilter
pcl::VoxelGrid< pcl::PointXYZL > m_downSizeFilter
Definition: lidar_mapping.hpp:57
CELL_DEPTH
#define CELL_DEPTH
Definition: lidar_mapping.hpp:30
floam::lidar::LidarMapping::m_map
std::vector< std::vector< std::vector< pcl::PointCloud< pcl::PointXYZL >::Ptr > > > m_map
Definition: lidar_mapping.hpp:56
CELL_RANGE_HORIZONTAL
#define CELL_RANGE_HORIZONTAL
Definition: lidar_mapping.hpp:32
floam::lidar::LidarMapping::m_originInMapY
int m_originInMapY
Definition: lidar_mapping.hpp:54
CELL_WIDTH
#define CELL_WIDTH
Major rewrite Author: Evan Flynn.
Definition: lidar_mapping.hpp:28
floam::lidar::LidarMapping::LidarMapping
LidarMapping()
Definition: lidar_mapping.cpp:16
CELL_HEIGHT
#define CELL_HEIGHT
Definition: lidar_mapping.hpp:29
floam::lidar::LidarMapping::addWidthCellNegative
void addWidthCellNegative(void)
Definition: lidar_mapping.cpp:49
floam::lidar::LidarMapping::m_originInMapZ
int m_originInMapZ
Definition: lidar_mapping.hpp:54
floam::lidar::LidarMapping::m_originInMapX
int m_originInMapX
Definition: lidar_mapping.hpp:54
floam::lidar::LidarMapping::checkPoints
void checkPoints(int &x, int &y, int &z)
Definition: lidar_mapping.cpp:132
floam::lidar::LidarMapping::m_mapWidth
int m_mapWidth
Definition: lidar_mapping.hpp:55
CELL_RANGE_VERTICAL
#define CELL_RANGE_VERTICAL
Definition: lidar_mapping.hpp:33
floam::lidar::LidarMapping::addDepthCellNegative
void addDepthCellNegative(void)
Definition: lidar_mapping.cpp:109
floam::lidar::LidarMapping::m_mapDepth
int m_mapDepth
Definition: lidar_mapping.hpp:55
lidar_mapping.hpp
floam::lidar::LidarMapping::init
void init(const double &map_resolution)
Definition: lidar_mapping.cpp:21
floam::lidar::LidarMapping::addWidthCellPositive
void addWidthCellPositive(void)
Definition: lidar_mapping.cpp:66
floam::lidar::LidarMapping::addHeightCellPositive
void addHeightCellPositive(void)
Definition: lidar_mapping.cpp:96
floam::lidar::LidarMapping::updateCurrentPointsToMap
void updateCurrentPointsToMap(const pcl::PointCloud< pcl::PointXYZL >::Ptr &pc_in, const Eigen::Isometry3d &pose_current)
Definition: lidar_mapping.cpp:171
floam
Major rewrite Author: Evan Flynn.
Definition: lidar.hpp:15
HALF_CELL_RANGE_HORIZONTAL
#define HALF_CELL_RANGE_HORIZONTAL
Definition: lidar_mapping.hpp:34
floam::lidar::LidarMapping::m_mapHeight
int m_mapHeight
Definition: lidar_mapping.hpp:55


floam
Author(s): Han Wang
autogenerated on Wed Mar 2 2022 00:23:09