33#include <Ice/LocalException.h>
35#include <range/v3/range/conversion.hpp>
36#include <range/v3/view/enumerate.hpp>
37#include <range/v3/view/filter.hpp>
38#include <range/v3/view/transform.hpp>
40#include <SimoxUtility/color/Color.h>
41#include <SimoxUtility/color/GlasbeyLUT.h>
61#include <RobotAPI/libraries/armem_locations/aron/Location.aron.generated.h>
66#include <armarx/navigation/algorithms/aron/Room.aron.generated.h>
72#include <armarx/navigation/core/aron/Graph.aron.generated.h>
75#include <armarx/navigation/human/aron/Human.aron.generated.h>
78#include <armarx/navigation/memory/aron/LaserScannerFeatures.aron.generated.h>
109 const std::vector<ObjectInfo>& info,
113 std::map<armem::MemoryID, location::arondto::Location> raw;
123 location::arondto::Location dto;
124 dto.fromAron(instance->data());
125 raw[entity.
id()] = dto;
131 for (
const auto& [
id, location] : raw)
134 FramedPose framedPose;
135 fromAron(location.framedPose, framedPose);
138 if (res.pose.has_value())
140 visu->vertex->draw(layer,
id.
str(), res.pose.value());
147 const std::vector<ObjectInfo>& info,
148 std::vector<viz::Layer>& layers)
151 std::map<armem::MemoryID, navigation::core::arondto::Graph> raw;
155 using namespace armem::server;
157 [&](
const wm::Entity& entity)
161 navigation::core::arondto::Graph dto;
162 dto.fromAron(instance->data());
163 raw[entity.
id()] = dto;
169 for (
auto& [
id, dto] : raw)
171 viz::Layer& layer = layers.emplace_back(
arviz.layer(
id.str()));
175 visu->draw(layer, graph, {.objects=objects, .info=info});
184 const std::vector<ObjectInfo> info;
201 const std::vector<ObjectInfo> info = objectFinder.findAllObjects();
205 catch (const ::Ice::NotRegisteredException& e)
207 ARMARX_VERBOSE <<
"Failed to retrieve objects from ObjectMemory: " << e.what();
216 const std::vector<ObjectInfo> info;
232 const std::vector<ObjectInfo> info = objectFinder.findAllObjects();
236 catch (const ::Ice::NotRegisteredException& e)
238 ARMARX_VERBOSE <<
"Failed to retrieve objects from ObjectMemory: " << e.what();
253 std::vector<RawCostmap> raw;
264 const std::string entityIdStr = instance->id().getEntityID().str();
265 const auto it = lastCostmapVisualization_.find(entityIdStr);
266 if (it == lastCostmapVisualization_.end() ||
267 it->second < instance->id().timestamp)
272 lastCostmapVisualization_[entityIdStr] = instance->id().timestamp;
279 for (
auto& [
id, costmap] : raw)
283 arviz.layer(
"costmaps_" +
id.providerSegmentName +
"_" +
id.entityName));
290 const bool visuTransparent,
295 std::string providerName;
297 navigation::human::arondto::Human dto;
300 std::set<std::string> providerNames;
301 std::vector<RawHuman> raw;
320 navigation::human::arondto::Human::FromAron(
327 std::map<std::string, navigation::human::Humans> namedProviderHumans;
328 for (
const auto& providerName : providerNames)
330 namedProviderHumans[providerName];
333 for (
const auto& entry : raw)
336 if (dtToNow < maxAge and dtToNow.
isPositive())
340 namedProviderHumans[entry.providerName].emplace_back(std::move(
human));
344 for (
const auto& [providerName, humans] : namedProviderHumans)
346 viz::Layer& layer = layers.emplace_back(
arviz.layer(
"humans_" + providerName));
347 drawHumansInLayer(humans, layer, visuTransparent);
355 std::map<armem::MemoryID, std::optional<navigation::algorithms::arondto::Room>> raw;
363 std::optional<navigation::algorithms::arondto::Room> dto;
366 auto& d = dto.emplace();
367 d.fromAron(instance->data());
369 raw[entity.
id()] = dto;
375 for (
const auto& [
id, dto] : raw)
382 drawRoom(layer, room, simox::color::GlasbeyLUT::at(i));
392 static const std::string globalEntityName =
"global";
395 layers.emplace_back(
arviz.layer(
"laser_scanner_features_convex_hulls"));
396 viz::Layer& chainLayer = layers.emplace_back(
arviz.layer(
"laser_scanner_features_chains"));
398 struct RawLaserScannerFeatures
401 memory::arondto::LaserScannerFeatures dto;
405 std::vector<RawLaserScannerFeatures> raw;
415 auto& entry = raw.emplace_back();
416 entry.id = instance->id();
417 entry.dto.fromAron(instance->data());
429 static constexpr float zOffset = 20.F;
434 static constexpr float providerZSpacing = 10.F;
436 namespace rv = ranges::views;
437 const auto globalFeatures =
440 [](
const RawLaserScannerFeatures& r)
441 -> std::pair<armem::MemoryID, memory::LaserScannerFeatures>
445 return {r.id, features};
447 rv::filter([](
const auto& p)
noexcept
453 std::map<std::string, std::size_t> providerIndices;
454 for (
const auto& [
id, features] : globalFeatures)
456 providerIndices.emplace(
id.providerSegmentName, 0);
459 std::size_t nextProviderIndex = 0;
460 for (
auto& [providerSegmentName,
index] : providerIndices)
462 index = nextProviderIndex++;
466 for (
const auto& [
id, features] : globalFeatures)
468 const std::string idStr =
id.str();
470 const std::size_t provider = providerIndices.at(
id.providerSegmentName);
471 const float z = zOffset +
static_cast<float>(provider) * providerZSpacing;
472 const simox::Color providerColor = simox::color::GlasbeyLUT::at(provider);
475 <<
"Drawing laser scanner features of provider "
476 <<
QUOTED(
id.providerSegmentName) <<
" at z " << z <<
" mm";
478 for (
const auto& [
index, feature] : ranges::views::enumerate(features.features))
481 if (not feature.convexHull.empty())
484 for (
const Eigen::Vector2f& pt : feature.convexHull)
486 polygon.
addPoint(Eigen::Vector3f(pt.x(), pt.y(), z));
488 polygon.
color(providerColor.with_alpha(80));
491 convexHullLayer.
add(polygon);
494 if (feature.chain.size() >= 2)
496 std::vector<Eigen::Vector3f> pts3d;
497 pts3d.reserve(feature.chain.size());
498 for (
const Eigen::Vector2f& pt : feature.chain)
500 pts3d.emplace_back(pt.x(), pt.y(), z);
505 .color(providerColor));
517 for (
const auto& point : room.
polygon)
526 polygon.color(color.with_alpha(50));
527 polygon.lineColor(simox::Color::black());
528 polygon.lineWidth(0);
541 const bool visuTransparent)
543 const Eigen::Translation3f human_T_mmm(Eigen::Vector3f{0, 0, 1000});
546 for (
const auto& [i, human] : ranges::views::enumerate(humans))
548 const std::string idx = std::to_string(i);
552 mmm.file(
"RobotAPI",
"RobotAPI/robots/MMM/mmm.xml");
555 mmm.overrideColor(viz::Color::orange(255, visuTransparent ? 100 : 255));
558 if (human.linearVelocity != Eigen::Vector2f::Zero())
561 vel3d.translation().head<2>() += human.linearVelocity * 2;
563 .fromTo(human3d.translation(), vel3d.translation())
564 .
color(simox::Color::red()));
SpamFilterDataPtr deactivateSpam(SpamFilterDataPtr const &spamFilter, float deactivationDurationSec, const std::string &identifier, bool deactivate)
static DateTime Now()
Current time on the virtual clock.
void setLogObjectDiscoveryError(bool logEnabled)
std::string providerSegmentName
auto * findLatestInstance(int instanceIndex=0)
const DataT & data() const
auto doLocked(FunctionT &&function) const
Execute function under shared (read) lock.
Client-side working entity instance.
Represents a point in time.
bool isPositive() const
Tests whether the duration is positive (value in µs > 0).
void drawLaserScannerFeatures(std::vector< viz::Layer > &layers)
std::unique_ptr< navigation::graph::GraphVisu > visu
const armem::server::wm::CoreSegment & costmapSegment
const armem::server::wm::CoreSegment & graphSegment
const armem::server::wm::CoreSegment & roomsSegment
void drawRooms(std::vector< viz::Layer > &layers)
const armem::server::wm::CoreSegment & humanSegment
const armem::server::wm::CoreSegment & locSegment
void drawLocations(std::vector< viz::Layer > &layers)
const armem::server::wm::CoreSegment & laserScannerFeaturesSegment
void drawCostmaps(std::vector< viz::Layer > &layers, float zOffset)
void drawGraphs(std::vector< viz::Layer > &layers)
Visu(viz::Client &arviz, const armem::server::wm::CoreSegment &locSegment, const armem::server::wm::CoreSegment &graphSegment, const armem::server::wm::CoreSegment &costmapSegment, const armem::server::wm::CoreSegment &humanSegment, const armem::server::wm::CoreSegment &roomsSegment, const armem::server::wm::CoreSegment &laserScannerFeaturesSegment)
void drawHumans(std::vector< viz::Layer > &layers, bool visuTransparent, Duration maxAge)
Provides access to the armarx::objpose::ObjectPoseStorageInterface (aka the object memory).
const ObjectFinder & getObjectFinder() const
Get the internal object finder.
bool isConnected() const
Indicate whether this client is connected to an object pose storage.
ObjectPoseMap fetchObjectPosesAsMap() const
Fetch all known object poses.
DerivedT & color(Color color)
DerivedT & position(float x, float y, float z)
DerivedT & scale(Eigen::Vector3f scale)
#define ARMARX_VERBOSE
The logging level for verbose information.
std::string const GlobalFrame
Variable of the global coordinate system.
armem::wm::EntityInstance EntityInstance
Costmap costmapFromAron(const aron::data::DictPtr &dto)
void visualize(const algorithms::Costmap &costmap, viz::Layer &layer, const std::string &name, const float zOffset)
std::vector< Eigen::Vector3f > to3D(const std::vector< Eigen::Vector2f > &v)
void resolveLocation(Graph::Vertex &vertex, const aron::data::DictPtr &locationData)
void resolveLocations(Graph &graph, const MemoryContainerT &locationContainer)
This file is part of ArmarX.
This file is part of ArmarX.
std::vector< Human > Humans
void fromAron(const arondto::Circle &dto, Circle &bo)
std::map< ObjectID, ObjectPose > ObjectPoseMap
bool forEachEntity(FunctionT &&func)
auto & getLatestSnapshot(int snapshotIndex=0)
Retrieve the latest entity snapshot.
std::vector< Eigen::Vector2f > polygon
Eigen::Vector2f center() const
void add(ElementT const &element)
Polygon & lineWidth(float w)
Polygon & addPoint(Eigen::Vector3f p)
Polygon & lineColor(Color color)
Text & text(std::string const &t)