33 #include <pdal/io/BufferReader.hpp>
34 #include <pdal/StageFactory.hpp>
35 #include <pdal/PluginManager.hpp>
37 #ifdef RTABMAP_PDAL_16
38 #include <pdal/pdal_defines.h>
40 #include <pdal/pdal_features.hpp>
49 #if PDAL_VERSION_MAJOR>1 || (PDAL_VERSION_MAJOR == 1 && PDAL_VERSION_MINOR > 7) || (PDAL_VERSION_MAJOR == 1 && PDAL_VERSION_MINOR == 7 && PDAL_VERSION_MINOR>=1)
51 pdal::PluginManager<pdal::Stage>::loadAll();
52 pdal::StringList stages = pdal::PluginManager<pdal::Stage>::names();
54 pdal::StageFactory
f(
false);
55 pdal::StringList stages = pdal::PluginManager::names(PF_PluginType_Writer);
57 for(pdal::StringList::iterator
iter=stages.begin();
iter!=stages.end(); ++
iter)
63 if(
iter->compare(
"writers.null") == 0)
67 if(
iter!=stages.begin())
77 const pcl::PointCloud<pcl::PointXYZ> & cloud,
78 const std::vector<int> & cameraIds,
81 UASSERT_MSG(cameraIds.empty() || cameraIds.size() == cloud.size(),
82 uFormat(
"cameraIds=%d cloud=%d", (
int)cameraIds.size(), (
int)cloud.size()).c_str());
84 pdal::PointTable
table;
86 if(!cameraIds.empty())
88 table.layout()->registerDims({
89 pdal::Dimension::Id::X,
90 pdal::Dimension::Id::Y,
91 pdal::Dimension::Id::Z,
92 pdal::Dimension::Id::PointSourceId});
96 table.layout()->registerDims({
97 pdal::Dimension::Id::X,
98 pdal::Dimension::Id::Y,
99 pdal::Dimension::Id::Z});
101 pdal::BufferReader bufferReader;
103 pdal::PointViewPtr
view(
new pdal::PointView(
table));
104 for(
size_t i=0;
i<cloud.size(); ++
i)
106 view->setField(pdal::Dimension::Id::X,
i, cloud.at(
i).x);
107 view->setField(pdal::Dimension::Id::Y,
i, cloud.at(
i).y);
108 view->setField(pdal::Dimension::Id::Z,
i, cloud.at(
i).z);
109 if(!cameraIds.empty())
111 view->setField(pdal::Dimension::Id::PointSourceId,
i, cameraIds.at(
i));
114 bufferReader.addView(
view);
118 pdal::Stage *writer =
factory.createStage(
"writers." + (ext.compare(
"laz")==0?
"las":ext));
121 pdal::Options writerOps;
122 writerOps.add(
"filename", filePath);
123 if(ext.compare(
"ply")==0) writerOps.add(
"storage_mode",
binary?
"little endian":
"ascii");
124 if(ext.compare(
"pcd")==0) writerOps.add(
"compression",
binary?
"binary":
"ascii");
125 if(ext.compare(
"laz")==0) writerOps.add(
"compression",
"lazperf");
127 writer->setOptions(writerOps);
128 writer->setInput(bufferReader);
130 writer->prepare(
table);
131 writer->execute(
table);
135 UERROR(
"PDAL: cannot find writer for extension \"%s\". Available extensions: \"%s\"",
145 const pcl::PointCloud<pcl::PointXYZRGB> & cloud,
146 const std::vector<int> & cameraIds,
148 const std::vector<float> & intensities)
150 UASSERT_MSG(cameraIds.empty() || cameraIds.size() == cloud.size(),
151 uFormat(
"cameraIds=%d cloud=%d", (
int)cameraIds.size(), (
int)cloud.size()).c_str());
152 UASSERT_MSG(intensities.empty() || intensities.size() == cloud.size(),
153 uFormat(
"intensities=%d cloud=%d", (
int)intensities.size(), (
int)cloud.size()).c_str());
155 pdal::PointTable
table;
157 if(!intensities.empty() && !cameraIds.empty())
159 table.layout()->registerDims({
160 pdal::Dimension::Id::X,
161 pdal::Dimension::Id::Y,
162 pdal::Dimension::Id::Z,
163 pdal::Dimension::Id::Red,
164 pdal::Dimension::Id::Green,
165 pdal::Dimension::Id::Blue,
166 pdal::Dimension::Id::PointSourceId,
167 pdal::Dimension::Id::Intensity});
169 else if(!intensities.empty())
171 table.layout()->registerDims({
172 pdal::Dimension::Id::X,
173 pdal::Dimension::Id::Y,
174 pdal::Dimension::Id::Z,
175 pdal::Dimension::Id::Red,
176 pdal::Dimension::Id::Green,
177 pdal::Dimension::Id::Blue,
178 pdal::Dimension::Id::Intensity});
180 else if(!cameraIds.empty())
182 table.layout()->registerDims({
183 pdal::Dimension::Id::X,
184 pdal::Dimension::Id::Y,
185 pdal::Dimension::Id::Z,
186 pdal::Dimension::Id::Red,
187 pdal::Dimension::Id::Green,
188 pdal::Dimension::Id::Blue,
189 pdal::Dimension::Id::PointSourceId});
193 table.layout()->registerDims({
194 pdal::Dimension::Id::X,
195 pdal::Dimension::Id::Y,
196 pdal::Dimension::Id::Z,
197 pdal::Dimension::Id::Red,
198 pdal::Dimension::Id::Green,
199 pdal::Dimension::Id::Blue});
201 pdal::BufferReader bufferReader;
203 pdal::PointViewPtr
view(
new pdal::PointView(
table));
204 for(
size_t i=0;
i<cloud.size(); ++
i)
206 view->setField(pdal::Dimension::Id::X,
i, cloud.at(
i).x);
207 view->setField(pdal::Dimension::Id::Y,
i, cloud.at(
i).y);
208 view->setField(pdal::Dimension::Id::Z,
i, cloud.at(
i).z);
209 view->setField(pdal::Dimension::Id::Red,
i, cloud.at(
i).r);
210 view->setField(pdal::Dimension::Id::Green,
i, cloud.at(
i).g);
211 view->setField(pdal::Dimension::Id::Blue,
i, cloud.at(
i).b);
212 if(!cameraIds.empty())
214 view->setField(pdal::Dimension::Id::PointSourceId,
i, cameraIds.at(
i));
216 if(!intensities.empty())
218 view->setField(pdal::Dimension::Id::Intensity,
i, (
unsigned short)intensities.at(
i));
221 bufferReader.addView(
view);
225 pdal::Stage *writer =
factory.createStage(
"writers." + (ext.compare(
"laz")==0?
"las":ext));
228 pdal::Options writerOps;
229 writerOps.add(
"filename", filePath);
230 if(ext.compare(
"ply")==0) writerOps.add(
"storage_mode",
binary?
"little endian":
"ascii");
231 if(ext.compare(
"pcd")==0) writerOps.add(
"compression",
binary?
"binary":
"ascii");
232 if(ext.compare(
"laz")==0) writerOps.add(
"compression",
"lazperf");
234 writer->setOptions(writerOps);
235 writer->setInput(bufferReader);
237 writer->prepare(
table);
238 writer->execute(
table);
242 UERROR(
"PDAL: cannot find writer for extension \"%s\". Available extensions: \"%s\"",
252 const pcl::PointCloud<pcl::PointXYZRGBNormal> & cloud,
253 const std::vector<int> & cameraIds,
255 const std::vector<float> & intensities)
257 UASSERT_MSG(cameraIds.empty() || cameraIds.size() == cloud.size(),
258 uFormat(
"cameraIds=%d cloud=%d", (
int)cameraIds.size(), (
int)cloud.size()).c_str());
259 UASSERT_MSG(intensities.empty() || intensities.size() == cloud.size(),
260 uFormat(
"intensities=%d cloud=%d", (
int)intensities.size(), (
int)cloud.size()).c_str());
262 pdal::PointTable
table;
264 if(!intensities.empty() && !cameraIds.empty())
266 table.layout()->registerDims({
267 pdal::Dimension::Id::X,
268 pdal::Dimension::Id::Y,
269 pdal::Dimension::Id::Z,
270 pdal::Dimension::Id::Red,
271 pdal::Dimension::Id::Green,
272 pdal::Dimension::Id::Blue,
273 pdal::Dimension::Id::NormalX,
274 pdal::Dimension::Id::NormalY,
275 pdal::Dimension::Id::NormalZ,
276 pdal::Dimension::Id::PointSourceId,
277 pdal::Dimension::Id::Intensity});
279 else if(!intensities.empty())
281 table.layout()->registerDims({
282 pdal::Dimension::Id::X,
283 pdal::Dimension::Id::Y,
284 pdal::Dimension::Id::Z,
285 pdal::Dimension::Id::Red,
286 pdal::Dimension::Id::Green,
287 pdal::Dimension::Id::Blue,
288 pdal::Dimension::Id::NormalX,
289 pdal::Dimension::Id::NormalY,
290 pdal::Dimension::Id::NormalZ,
291 pdal::Dimension::Id::Intensity});
293 else if(!cameraIds.empty())
295 table.layout()->registerDims({
296 pdal::Dimension::Id::X,
297 pdal::Dimension::Id::Y,
298 pdal::Dimension::Id::Z,
299 pdal::Dimension::Id::Red,
300 pdal::Dimension::Id::Green,
301 pdal::Dimension::Id::Blue,
302 pdal::Dimension::Id::NormalX,
303 pdal::Dimension::Id::NormalY,
304 pdal::Dimension::Id::NormalZ,
305 pdal::Dimension::Id::PointSourceId});
309 table.layout()->registerDims({
310 pdal::Dimension::Id::X,
311 pdal::Dimension::Id::Y,
312 pdal::Dimension::Id::Z,
313 pdal::Dimension::Id::Red,
314 pdal::Dimension::Id::Green,
315 pdal::Dimension::Id::Blue,
316 pdal::Dimension::Id::NormalX,
317 pdal::Dimension::Id::NormalY,
318 pdal::Dimension::Id::NormalZ});
320 pdal::BufferReader bufferReader;
322 pdal::PointViewPtr
view(
new pdal::PointView(
table));
323 for(
size_t i=0;
i<cloud.size(); ++
i)
325 view->setField(pdal::Dimension::Id::X,
i, cloud.at(
i).x);
326 view->setField(pdal::Dimension::Id::Y,
i, cloud.at(
i).y);
327 view->setField(pdal::Dimension::Id::Z,
i, cloud.at(
i).z);
328 view->setField(pdal::Dimension::Id::Red,
i, cloud.at(
i).r);
329 view->setField(pdal::Dimension::Id::Green,
i, cloud.at(
i).g);
330 view->setField(pdal::Dimension::Id::Blue,
i, cloud.at(
i).b);
331 view->setField(pdal::Dimension::Id::NormalX,
i, cloud.at(
i).normal_x);
332 view->setField(pdal::Dimension::Id::NormalY,
i, cloud.at(
i).normal_y);
333 view->setField(pdal::Dimension::Id::NormalZ,
i, cloud.at(
i).normal_z);
334 if(!cameraIds.empty())
336 view->setField(pdal::Dimension::Id::PointSourceId,
i, cameraIds.at(
i));
338 if(!intensities.empty())
340 view->setField(pdal::Dimension::Id::Intensity,
i, (
unsigned short)intensities.at(
i));
343 bufferReader.addView(
view);
347 pdal::Stage *writer =
factory.createStage(
"writers." + (ext.compare(
"laz")==0?
"las":ext));
350 pdal::Options writerOps;
351 writerOps.add(
"filename", filePath);
352 if(ext.compare(
"ply")==0) writerOps.add(
"storage_mode",
binary?
"little endian":
"ascii");
353 if(ext.compare(
"pcd")==0) writerOps.add(
"compression",
binary?
"binary":
"ascii");
354 if(ext.compare(
"laz")==0) writerOps.add(
"compression",
"lazperf");
356 writer->setOptions(writerOps);
357 writer->setInput(bufferReader);
359 writer->prepare(
table);
360 writer->execute(
table);
364 UERROR(
"PDAL: cannot find writer for extension \"%s\". Available extensions: \"%s\"",
374 const pcl::PointCloud<pcl::PointXYZI> & cloud,
375 const std::vector<int> & cameraIds,
378 UASSERT_MSG(cameraIds.empty() || cameraIds.size() == cloud.size(),
379 uFormat(
"cameraIds=%d cloud=%d", (
int)cameraIds.size(), (
int)cloud.size()).c_str());
381 pdal::PointTable
table;
383 if(!cameraIds.empty())
385 table.layout()->registerDims({
386 pdal::Dimension::Id::X,
387 pdal::Dimension::Id::Y,
388 pdal::Dimension::Id::Z,
389 pdal::Dimension::Id::Intensity,
390 pdal::Dimension::Id::PointSourceId});
394 table.layout()->registerDims({
395 pdal::Dimension::Id::X,
396 pdal::Dimension::Id::Y,
397 pdal::Dimension::Id::Z,
398 pdal::Dimension::Id::Intensity});
400 pdal::BufferReader bufferReader;
402 pdal::PointViewPtr
view(
new pdal::PointView(
table));
403 for(
size_t i=0;
i<cloud.size(); ++
i)
405 view->setField(pdal::Dimension::Id::X,
i, cloud.at(
i).x);
406 view->setField(pdal::Dimension::Id::Y,
i, cloud.at(
i).y);
407 view->setField(pdal::Dimension::Id::Z,
i, cloud.at(
i).z);
408 view->setField(pdal::Dimension::Id::Intensity,
i, (
unsigned short)cloud.at(
i).intensity);
409 if(!cameraIds.empty())
411 view->setField(pdal::Dimension::Id::PointSourceId,
i, cameraIds.at(
i));
414 bufferReader.addView(
view);
418 pdal::Stage *writer =
factory.createStage(
"writers." + (ext.compare(
"laz")==0?
"las":ext));
421 pdal::Options writerOps;
422 writerOps.add(
"filename", filePath);
423 if(ext.compare(
"ply")==0) writerOps.add(
"storage_mode",
binary?
"little endian":
"ascii");
424 if(ext.compare(
"pcd")==0) writerOps.add(
"compression",
binary?
"binary":
"ascii");
425 if(ext.compare(
"laz")==0) writerOps.add(
"compression",
"lazperf");
427 writer->setOptions(writerOps);
428 writer->setInput(bufferReader);
430 writer->prepare(
table);
431 writer->execute(
table);
435 UERROR(
"PDAL: cannot find writer for extension \"%s\". Available extensions: \"%s\"",
445 const pcl::PointCloud<pcl::PointXYZINormal> & cloud,
446 const std::vector<int> & cameraIds,
449 UASSERT_MSG(cameraIds.empty() || cameraIds.size() == cloud.size(),
450 uFormat(
"cameraIds=%d cloud=%d", (
int)cameraIds.size(), (
int)cloud.size()).c_str());
452 pdal::PointTable
table;
454 if(!cameraIds.empty())
456 table.layout()->registerDims({
457 pdal::Dimension::Id::X,
458 pdal::Dimension::Id::Y,
459 pdal::Dimension::Id::Z,
460 pdal::Dimension::Id::Intensity,
461 pdal::Dimension::Id::NormalX,
462 pdal::Dimension::Id::NormalY,
463 pdal::Dimension::Id::NormalZ,
464 pdal::Dimension::Id::PointSourceId});
468 table.layout()->registerDims({
469 pdal::Dimension::Id::X,
470 pdal::Dimension::Id::Y,
471 pdal::Dimension::Id::Z,
472 pdal::Dimension::Id::Intensity,
473 pdal::Dimension::Id::NormalX,
474 pdal::Dimension::Id::NormalY,
475 pdal::Dimension::Id::NormalZ});
477 pdal::BufferReader bufferReader;
479 pdal::PointViewPtr
view(
new pdal::PointView(
table));
480 for(
size_t i=0;
i<cloud.size(); ++
i)
482 view->setField(pdal::Dimension::Id::X,
i, cloud.at(
i).x);
483 view->setField(pdal::Dimension::Id::Y,
i, cloud.at(
i).y);
484 view->setField(pdal::Dimension::Id::Z,
i, cloud.at(
i).z);
485 view->setField(pdal::Dimension::Id::Intensity,
i, (
unsigned short)cloud.at(
i).intensity);
486 view->setField(pdal::Dimension::Id::NormalX,
i, cloud.at(
i).normal_x);
487 view->setField(pdal::Dimension::Id::NormalY,
i, cloud.at(
i).normal_y);
488 view->setField(pdal::Dimension::Id::NormalZ,
i, cloud.at(
i).normal_z);
489 if(!cameraIds.empty())
491 view->setField(pdal::Dimension::Id::PointSourceId,
i, cameraIds.at(
i));
494 bufferReader.addView(
view);
498 pdal::Stage *writer =
factory.createStage(
"writers." + (ext.compare(
"laz")==0?
"las":ext));
501 pdal::Options writerOps;
502 writerOps.add(
"filename", filePath);
503 if(ext.compare(
"ply")==0) writerOps.add(
"storage_mode",
binary?
"little endian":
"ascii");
504 if(ext.compare(
"pcd")==0) writerOps.add(
"compression",
binary?
"binary":
"ascii");
505 if(ext.compare(
"laz")==0) writerOps.add(
"compression",
"lazperf");
507 writer->setOptions(writerOps);
508 writer->setInput(bufferReader);
510 writer->prepare(
table);
511 writer->execute(
table);
515 UERROR(
"PDAL: cannot find writer for extension \"%s\". Available extensions: \"%s\"",