UFO 1.0.0
An Efficient Probabilistic 3D Mapping Framework That Embraces the Unknown
Loading...
Searching...
No Matches
fix_pcd.cpp
1// UFO
2#include <ufo/map/integration/integration.hpp>
3#include <ufo/map/integration/integration_parameters.hpp>
4#include <ufo/map/node.hpp>
5#include <ufo/map/point_cloud.hpp>
6#include <ufo/map/points/points_predicate.hpp>
7#include <ufo/map/predicate/satisfies.hpp>
8#include <ufo/map/predicate/spatial.hpp>
9#include <ufo/map/types.hpp>
10#include <ufo/map/ufomap.hpp>
11#include <ufo/numeric/pose6.hpp>
12#include <ufo/util/timing.hpp>
13
14// STL
15#include <cstdio>
16#include <filesystem>
17#include <fstream>
18#include <ios>
19#include <iostream>
20#include <limits>
21#include <random>
22#include <string>
23#include <vector>
24
25#include "ufo/map/point.hpp"
26
27// STL parallel
28#ifdef UFO_TBB
29#include <execution>
30#endif
31
32bool stob(std::string s, bool throw_on_error = true)
33{
34 auto result = false; // failure to assert is false
35
36 std::istringstream is(s);
37 // first try simple integer conversion
38 is >> result;
39
40 if (is.fail()) {
41 // simple integer failed; try boolean
42 is.clear();
43 is >> std::boolalpha >> result;
44 }
45
46 if (is.fail() && throw_on_error) {
47 throw std::invalid_argument(s.append(" is not convertable to bool"));
48 }
49
50 return result;
51}
52
53void doStuff(std::filesystem::path folder, bool should_transform)
54{
55 if (std::filesystem::exists(folder / "original")) {
56 std::ifstream poses_file(folder / "original/poses.csv", std::ios::binary);
57 if (std::string line; std::getline(poses_file, line)) {
58 std::cout << line << '\n';
59 } else {
60 std::cerr << "Error processing " << (folder / "original/poses.csv") << '\n';
61 return; // TODO: Handle error
62 }
63
64 std::unordered_map<std::size_t, ufo::Pose6d> poses;
65
66 std::size_t index;
67 double timestamp;
68 ufo::Pose6d pose;
69 char t;
70 while (poses_file) {
71 poses_file >> index >> t >> timestamp >> t >> pose.x() >> t >> pose.y() >> t >>
72 pose.z() >> t >> pose.qx() >> t >> pose.qy() >> t >> pose.qz() >> t >>
73 pose.qw();
74 poses[index] = pose;
75 }
76
77 std::vector<std::filesystem::path> pcds;
78 for (auto const& entry : std::filesystem::directory_iterator(folder / "original")) {
79 if (".pcd" == entry.path().extension()) {
80 pcds.push_back(entry.path().stem());
81 }
82 }
83 std::sort(std::begin(pcds), std::end(pcds));
84
85#ifdef UFO_TBB
86 std::for_each(
87 std::execution::seq, std::cbegin(pcds), std::cend(pcds),
88 [&](std::string filename) {
89 std::cout << (filename + '\n');
90 pose = poses[std::stoull(filename)];
91
93 ufo::readPointCloudPCD(folder / "original" / (filename + ".pcd"), cloud);
94
95 if (should_transform) {
96 // std::cout << "Applying transformation\n";
97 ufo::applyTransform(cloud, pose);
98 }
99
100 ufo::writePointCloudPCD(folder / "pcd" / (filename + ".pcd"), cloud, pose);
101 });
102#else
103 for (std::string filename : pcds) {
104 std::cout << filename << '\n';
105 pose = poses[std::stoull(filename)];
106 std::cout << pose << '\n';
107
109 ufo::readPointCloudPCD(folder / "original" / (filename + ".pcd"), cloud);
110
111 if (should_transform) {
112 ufo::applyTransform(cloud, pose);
113 }
114
115 ufo::writePointCloudPCD(folder / "pcd" / (filename + ".pcd"), cloud, pose);
116 }
117#endif
118 } else {
119 // Continue searching in subfolders
120 for (auto const& entry : std::filesystem::directory_iterator(folder)) {
121 if (std::filesystem::is_directory(entry)) {
122 doStuff(entry, should_transform);
123 }
124 }
125 }
126}
127
128int main(int argc, char* argv[])
129{
130 if (3 != argc) {
131 std::cout << "Usage: fix_pcd SHOULD_TRANSFORM FOLDER_PATH\n";
132 return 0;
133 }
134
135 bool should_transform = stob(argv[1]);
136
137 std::filesystem::path folder(argv[2]);
138
139 doStuff(folder, should_transform);
140
141 return 0;
142}
STL namespace.