From 872c4c50c2ef3100cd85f61f1b7a076c2f40f163 Mon Sep 17 00:00:00 2001 From: Fabian Reister <fabian.reister@kit.edu> Date: Wed, 17 Aug 2022 09:27:21 +0200 Subject: [PATCH] navigation memory: new core segments + visu --- .../NavigationMemory/CMakeLists.txt | 1 + .../NavigationMemory/NavigationMemory.cpp | 12 +++- .../NavigationMemory/NavigationMemory.h | 1 + .../components/NavigationMemory/Visu.cpp | 68 ++++++++++++++++++- .../components/NavigationMemory/Visu.h | 6 +- 5 files changed, 85 insertions(+), 3 deletions(-) diff --git a/source/armarx/navigation/components/NavigationMemory/CMakeLists.txt b/source/armarx/navigation/components/NavigationMemory/CMakeLists.txt index 3f8da95e..5f88e9cf 100644 --- a/source/armarx/navigation/components/NavigationMemory/CMakeLists.txt +++ b/source/armarx/navigation/components/NavigationMemory/CMakeLists.txt @@ -18,6 +18,7 @@ armarx_add_component(navigation_memory armarx_navigation::graph armarx_navigation::location armarx_navigation::algorithms + armarx_navigation::teb_human SOURCES NavigationMemory.cpp diff --git a/source/armarx/navigation/components/NavigationMemory/NavigationMemory.cpp b/source/armarx/navigation/components/NavigationMemory/NavigationMemory.cpp index a18764b0..97d8fa36 100644 --- a/source/armarx/navigation/components/NavigationMemory/NavigationMemory.cpp +++ b/source/armarx/navigation/components/NavigationMemory/NavigationMemory.cpp @@ -48,6 +48,7 @@ #include <armarx/navigation/core/aron/Location.aron.generated.h> #include <armarx/navigation/core/aron/Trajectory.aron.generated.h> #include <armarx/navigation/core/aron/Twist.aron.generated.h> +#include <armarx/navigation/human/aron/Human.aron.generated.h> #include <armarx/navigation/graph/constants.h> #include <armarx/navigation/location/constants.h> @@ -127,6 +128,11 @@ namespace armarx::navigation workingMemory().addCoreSegment(navigation::graph::coreSegmentID.coreSegmentName, navigation::core::arondto::Graph::ToAronType()); + workingMemory().addCoreSegment(memory::constants::HumanCoreSegmentName, + navigation::human::arondto::Human::ToAronType()); + + // workingMemory().addCoreSegment(memory::constants::HumanGroupCoreSegmentName, + // navigation::human::arondto::Human::ToAronType()); if (not properties.snapshotToLoad.empty()) { @@ -432,7 +438,8 @@ namespace armarx::navigation memory::Visu visu{arviz, workingMemory().getCoreSegment(navigation::location::coreSegmentID), workingMemory().getCoreSegment(navigation::graph::coreSegmentID), - workingMemory().getCoreSegment(memory::constants::CostmapCoreSegmentName)}; + workingMemory().getCoreSegment(memory::constants::CostmapCoreSegmentName), + workingMemory().getCoreSegment(memory::constants::HumanCoreSegmentName)}; Properties::LocationGraph p; @@ -462,6 +469,9 @@ namespace armarx::navigation // Costmaps visu.drawCostmaps(layers, p.visuCostmaps); + // Humans + visu.drawHumans(layers, p.visuHumans); + arviz.commit(layers); metronome.waitForNextTick(); diff --git a/source/armarx/navigation/components/NavigationMemory/NavigationMemory.h b/source/armarx/navigation/components/NavigationMemory/NavigationMemory.h index c67da7fc..e34aa21e 100644 --- a/source/armarx/navigation/components/NavigationMemory/NavigationMemory.h +++ b/source/armarx/navigation/components/NavigationMemory/NavigationMemory.h @@ -97,6 +97,7 @@ namespace armarx::navigation bool visuLocations = true; bool visuGraphEdges = true; bool visuCostmaps = true; + bool visuHumans = true; float visuFrequency = 2; }; diff --git a/source/armarx/navigation/components/NavigationMemory/Visu.cpp b/source/armarx/navigation/components/NavigationMemory/Visu.cpp index 73df72de..f3ae9cbc 100644 --- a/source/armarx/navigation/components/NavigationMemory/Visu.cpp +++ b/source/armarx/navigation/components/NavigationMemory/Visu.cpp @@ -22,18 +22,24 @@ #include "Visu.h" +#include <SimoxUtility/color/Color.h> #include <SimoxUtility/color/cmaps/colormaps.h> +#include "RobotAPI/components/ArViz/Client/Elements.h" #include "RobotAPI/components/ArViz/Client/Layer.h" #include <RobotAPI/libraries/armem/server/wm/memory_definitions.h> #include "armarx/navigation/conversions/eigen.h" +#include "armarx/navigation/human/aron/Human.aron.generated.h" +#include "armarx/navigation/human/aron_conversions.h" +#include "armarx/navigation/human/types.h" #include <armarx/navigation/algorithms/aron/Costmap.aron.generated.h> #include <armarx/navigation/algorithms/aron_conversions.h> #include <armarx/navigation/core/Graph.h> #include <armarx/navigation/core/aron/Graph.aron.generated.h> #include <armarx/navigation/core/aron/Location.aron.generated.h> #include <armarx/navigation/graph/Visu.h> +#include <armarx/navigation/human/aron/Human.aron.generated.h> namespace armarx::navigation::memory @@ -42,11 +48,13 @@ namespace armarx::navigation::memory Visu::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& costmapSegment, + const armem::server::wm::CoreSegment& humanSegment) : arviz(arviz), locSegment(locSegment), graphSegment(graphSegment), costmapSegment(costmapSegment), + humanSegment(humanSegment), visu(std::make_unique<graph::GraphVisu>()) { } @@ -165,6 +173,24 @@ namespace armarx::navigation::memory layer.add(mesh); } + void + visualize(const human::Humans& humans, viz::Layer& layer) + { + ARMARX_INFO << "Visualizing " << humans.size() << " humans"; + for (const auto& human : humans) + { + viz::Cylinder cylinder(std::to_string(layer.size())); + cylinder.fromTo(conv::to3D(human.pose.translation()), + conv::to3D(human.pose.translation()) + Eigen::Vector3f{0, 0, 10}); + + + cylinder.color(simox::Color::orange()); + cylinder.radius(300); + + layer.add(cylinder); + } + } + } // namespace void @@ -207,5 +233,45 @@ namespace armarx::navigation::memory } } + void + Visu::drawHumans(std::vector<viz::Layer>& layers, bool enabled) + { + if (not enabled) + { + return; + } + + std::map<std::string, navigation::human::Humans> namedProviderHumans; + + humanSegment.doLocked( + [&]() + { + using namespace armem::server; + + humanSegment.forEachEntity( + [&](const wm::Entity& entity) + { + entity.getLatestSnapshot().forEachInstance( + [&namedProviderHumans](const armarx::armem::wm::EntityInstance& instance) + { + const auto dto = + navigation::human::arondto::Human::FromAron(instance.data()); + + navigation::human::Human human; + fromAron(dto, human); + + namedProviderHumans[instance.id().providerSegmentName] + .emplace_back(std::move(human)); + }); + }); + }); + + for (const auto& [providerName, humans] : namedProviderHumans) + { + viz::Layer& layer = layers.emplace_back(arviz.layer("humans_" + providerName)); + visualize(humans, layer); + } + } + } // namespace armarx::navigation::memory diff --git a/source/armarx/navigation/components/NavigationMemory/Visu.h b/source/armarx/navigation/components/NavigationMemory/Visu.h index cfd732ad..123a865d 100644 --- a/source/armarx/navigation/components/NavigationMemory/Visu.h +++ b/source/armarx/navigation/components/NavigationMemory/Visu.h @@ -28,6 +28,7 @@ #include "RobotAPI/libraries/armem/server/wm/memory_definitions.h" #include <RobotAPI/components/ArViz/Client/Client.h> #include <RobotAPI/libraries/armem/core/forward_declarations.h> + #include "armarx/navigation/algorithms/Costmap.h" @@ -45,13 +46,15 @@ namespace armarx::navigation::memory 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& costmapSegment, + const armem::server::wm::CoreSegment& humanSegment); ~Visu(); void drawLocations(std::vector<viz::Layer>& layers, bool enabled); void drawGraphs(std::vector<viz::Layer>& layers, bool enabled); void drawCostmaps(std::vector<viz::Layer>& layers, bool enabled); + void drawHumans(std::vector<viz::Layer>& layers, bool enabled); public: @@ -60,6 +63,7 @@ namespace armarx::navigation::memory const armem::server::wm::CoreSegment& locSegment; const armem::server::wm::CoreSegment& graphSegment; const armem::server::wm::CoreSegment& costmapSegment; + const armem::server::wm::CoreSegment& humanSegment; std::unique_ptr<navigation::graph::GraphVisu> visu; }; -- GitLab