6 #include <Eigen/Geometry>
8 #include <opencv2/core.hpp>
9 #include <opencv2/core/mat.hpp>
10 #include <opencv2/opencv.hpp>
15 #include <cartographer/mapping/2d/grid_2d.h>
16 #include <cartographer/mapping/2d/probability_grid.h>
17 #include <cartographer/mapping/2d/submap_2d.h>
18 #include <cartographer/mapping/2d/xy_index.h>
19 #include <cartographer/mapping/internal/2d/tsdf_2d.h>
26 colors(numCells.
x(),
std::vector<
Color>(numCells.y(),
Color::Zero()))
35 vertices.at(idx.x()).at(idx.y()) = position;
36 colors.at(idx.x()).at(idx.y()) = color;
40 toMeshGrid(const ::cartographer::mapping::ProbabilityGrid& grid)
42 const auto resolution =
static_cast<float>(grid.limits().resolution());
44 Eigen::Array2i offset;
45 ::cartographer::mapping::CellLimits mapLimits;
46 grid.ComputeCroppedLimits(&offset, &mapLimits);
48 ::cartographer::mapping::XYIndexRangeIterator iter(mapLimits);
50 ColoredMeshGrid meshGrid({mapLimits.num_x_cells, mapLimits.num_y_cells});
52 constexpr uint8_t transparency{255};
54 ColoredMeshGrid::Color::Zero();
56 std::for_each(iter.begin(),
58 [&](
const Eigen::Array2i& cellIndexCropped)
60 const auto cellIndex = cellIndexCropped + offset;
62 const float probability = grid.GetProbability(cellIndex);
63 const bool isKnown = grid.IsKnown(cellIndex);
65 const ColoredMeshGrid::Color color = [&]() -> ColoredMeshGrid::Color
69 const auto c = static_cast<uint8_t>((1 - probability) * 255);
70 return {c, c, c, transparency};
73 return colorCellUnknown;
79 position.y() = -cellIndex.x() * resolution;
80 position.x() = -cellIndex.y() * resolution;
82 meshGrid.setColoredVertex(cellIndexCropped, position, color);
87 const double maxX = grid.limits().max().x();
88 const double maxY = grid.limits().max().y();
90 meshGrid.innerSlicePosition = Eigen::Vector3f(maxX, maxY, 0.);
98 const auto resolution =
static_cast<float>(grid.limits().resolution());
100 Eigen::Array2i offset = Eigen::Array2i::Zero();
101 ::cartographer::mapping::CellLimits mapLimits = grid.limits().cell_limits();
102 grid.ComputeCroppedLimits(&offset, &mapLimits);
106 ::cartographer::mapping::XYIndexRangeIterator iter(mapLimits);
108 std::for_each(iter.begin(),
110 [&](
const Eigen::Array2i& cellIndexCropped)
112 const auto cellIndex = cellIndexCropped + offset;
114 const float probability = grid.GetProbability(cellIndex);
115 const bool isKnown = grid.IsKnown(cellIndex);
118 occGrid(mapLimits.num_y_cells - 1 - cellIndexCropped.y(),
119 mapLimits.num_x_cells - 1 - cellIndexCropped.x()) =
120 isKnown ? probability : 0.F;
126 const int inner_shift_x =
127 grid.limits().cell_limits().num_x_cells - (offset.x() + mapLimits.num_x_cells);
128 const int inner_shift_y =
129 grid.limits().cell_limits().num_y_cells - (offset.y() + mapLimits.num_y_cells);
131 const float maxY = resolution - grid.limits().max().y() + resolution * inner_shift_y;
132 const float maxX = resolution - grid.limits().max().x() + resolution * inner_shift_x;
138 .pose = Eigen::Isometry3f(Eigen::Translation3f(maxY, maxX, 0.F)),
145 const auto* probGrid =
dynamic_cast<const ::cartographer::mapping::ProbabilityGrid*
>(&grid);
146 if (probGrid !=
nullptr)
152 throw InvalidArgumentException();
158 const auto* probGrid =
dynamic_cast<const ::cartographer::mapping::ProbabilityGrid*
>(&grid);
160 if (probGrid !=
nullptr)
172 throw InvalidArgumentException();
176 toImage(const ::cartographer::mapping::ProbabilityGrid& grid)
178 Eigen::Array2i offset;
179 ::cartographer::mapping::CellLimits mapLimits;
180 grid.ComputeCroppedLimits(&offset, &mapLimits);
182 ::cartographer::mapping::XYIndexRangeIterator iter(mapLimits);
184 cv::Mat1f outputMap(mapLimits.num_x_cells, mapLimits.num_y_cells);
185 cv::Mat1b outputMapMask(mapLimits.num_x_cells, mapLimits.num_y_cells);
187 std::for_each(iter.begin(),
189 [&](const ::Eigen::Array2i& cellIndexCropped)
191 const auto cellIndex = cellIndexCropped + offset;
192 const cv::Point idx{cellIndexCropped[1], cellIndexCropped[0]};
194 outputMap.at<
float>(idx) = grid.GetProbability(cellIndex);
195 outputMapMask.at<uint8_t>(idx) =
196 static_cast<uint8_t
>(grid.IsKnown(cellIndex));
203 outputMap.convertTo(out, CV_8UC1);
206 outputMapMask.convertTo(outMask, CV_8UC1);
209 cv::Mat2b outWithMask;
210 cv::merge(std::vector({out, outMask}), outWithMask);
216 toImage(const ::cartographer::mapping::TSDF2D& tsdf)
218 const ::cartographer::mapping::CellLimits& mapLimits = tsdf.limits().cell_limits();
220 ::cartographer::mapping::XYIndexRangeIterator iter(mapLimits);
222 cv::Mat1f outputMap(mapLimits.num_x_cells, mapLimits.num_y_cells);
223 cv::Mat1f outputMapMask(mapLimits.num_x_cells, mapLimits.num_y_cells);
225 std::for_each(iter.begin(),
227 [&](const ::Eigen::Array2i& cellIndex)
229 const cv::Point idx{cellIndex[1], cellIndex[0]};
231 outputMap.at<
float>(idx) = tsdf.GetTSD(cellIndex);
232 outputMapMask.at<
bool>(idx) = tsdf.IsKnown(cellIndex);
238 outputMap.convertTo(out, CV_8UC1);
241 outputMapMask.convertTo(outMask, CV_8UC1);
244 cv::Mat2b outWithMask;
245 cv::merge(std::vector({out, outMask}), outWithMask);
251 toImage(const ::cartographer::mapping::Grid2D& grid)
253 const auto* probGrid =
dynamic_cast<const ::cartographer::mapping::ProbabilityGrid*
>(&grid);
255 if (probGrid !=
nullptr)
260 const auto* tsdf =
dynamic_cast<const ::cartographer::mapping::TSDF2D*
>(&grid);