26 #include <SimoxUtility/algorithm/apply.hpp>
27 #include <SimoxUtility/algorithm/vector.hpp>
28 #include <SimoxUtility/color/cmaps/colormaps.h>
35 #include <RobotAPI/interface/ArViz/Elements.h>
55 const std::string Component::defaultName =
"dynamic_distance_to_obstacle_costmap_provider";
79 def->optional(properties.updatePeriodMs,
"p.updatePeriodMs",
"");
80 def->optional(properties.staticCostmap.name,
"p.staticCostmap.name",
"");
81 def->required(properties.staticCostmap.providerName,
"p.staticCostmap.providerName",
"");
83 def->optional(properties.laserScannerFeatures.name,
"p.laserScannerFeatures.name",
"");
84 def->optional(properties.laserScannerFeatures.providerName,
85 "p.laserScannerFeatures.providerName",
88 def->optional(properties.robot.name,
"p.robot.name",
"");
99 robotReader(), costmapReader(), costmapWriter(), laserScannerFeaturesReader()
151 ARMARX_INFO <<
"Connecting to laser scanner features segment";
159 updateCostmapTask->start();
170 .name = properties.staticCostmap.name,
173 const auto result = costmapReader.
query(query);
175 if (result.costmap.has_value())
177 staticCostmap.emplace(result.costmap.value());
188 fillCostmap(
const std::vector<memory::LaserScannerFeatures>& features,
192 std::vector<util::geometry::polygon_type> obstacles;
194 for (
const auto& f : features)
196 const auto& global_T_sens = f.frameGlobalPose;
197 for (
const auto& ff : f.features)
200 std::vector<Eigen::Vector2f> hull = ff.convexHull;
210 ARMARX_VERBOSE <<
"Found " << obstacles.size() <<
" obstacles/polygons.";
213 for (
int r = 0; r < costmap.
getGrid().rows(); r++)
215 for (
int c = 0;
c < costmap.
getGrid().cols();
c++)
230 constexpr
float robotRadius = 500;
236 if (costmap.
getMask().has_value())
252 const std::string& name,
253 const float heightOffset)
255 const auto cmap = simox::color::cmaps::viridis();
256 const float vmax = costmap.
getGrid().maxCoeff();
262 const auto color = cmap.at(
distance, 0.
F, vmax);
263 return {color.a, color.r, color.g, color.b};
270 const std::int64_t cols = costmap.
getGrid().cols();
271 const std::int64_t rows = costmap.
getGrid().rows();
275 const Eigen::Vector3f heightOffsetV = Eigen::Vector3f::UnitZ() * heightOffset;
277 std::vector<std::vector<Eigen::Vector3f>> vertices;
278 std::vector<std::vector<armarx::viz::data::Color>> colors;
280 for (
int r = 0; r < rows; r++)
282 auto& verticesRow = vertices.emplace_back(cols);
283 auto& colorsRow = colors.emplace_back(cols);
284 for (
int c = 0;
c < cols;
c++)
290 colorsRow.at(
c) = [&]()
294 return asColor(costmap.
getGrid()(r,
c));
302 mesh.grid2D(vertices, colors);
318 .
providerName = properties.laserScannerFeatures.providerName,
319 .name = properties.laserScannerFeatures.name,
320 .timestamp = timestamp};
322 const auto result = laserScannerFeaturesReader.
queryData(query);
324 if (result.status != result.Success)
330 for (
const auto& e : result.features)
332 ARMARX_VERBOSE <<
"Number of laser scanner clusters for sensor " << e.frame <<
": "
333 << e.features.size();
337 auto dynamicCostmap = staticCostmap.value();
346 << (end - start).toMilliSecondsDouble() <<
" milliseconds";
350 costmapWriter.
store(dynamicCostmap,
"dynamic_distance_to_obstacles",
getName(), timestamp);
357 << (timestamp2 - timestamp1).toMilliSecondsDouble() <<
"ms";
361 drawCostmap(dynamicCostmap,
"dynamic_costmap", 10);
362 drawCostmap(navigationCostmap,
"navigation_costmap", 20);
374 const Eigen::Vector2f globalRobotPosition = globalPose->translation().head<2>();
380 obstacleDistancesCostmap, spfaParams);
383 spfa.
spfa(globalRobotPosition);
390 obstacleDistancesCostmap.
params(),
394 return navigationPlanningCostmap;
410 return Component::defaultName;
416 return Component::defaultName;