diff --git a/source/armarx/navigation/components/navigator/Component.cpp b/source/armarx/navigation/components/navigator/Component.cpp index 40f41ce28de7d2e0dcbb2d1eee057fae55c3ad2a..4cf2854911ac53fbcf20c1cae6854f9419072c6a 100644 --- a/source/armarx/navigation/components/navigator/Component.cpp +++ b/source/armarx/navigation/components/navigator/Component.cpp @@ -56,7 +56,7 @@ #include <ArmarXCore/libraries/DecoupledSingleComponent/Decoupled.h> #include <ArmarXCore/util/CPPUtility/trace.h> -#include "ArmarXGui/libraries/RemoteGui/Client/Widgets.h" +#include <ArmarXGui/libraries/RemoteGui/Client/Widgets.h> #include <RobotAPI/components/ArViz/Client/Client.h> #include <RobotAPI/components/units/RobotUnit/NJointControllers/NJointControllerRegistry.h> @@ -66,8 +66,9 @@ #include <RobotAPI/libraries/armem_vision/client/occupancy_grid/Reader.h> #include <RobotAPI/libraries/core/remoterobot/RemoteRobot.h> -#include "armarx/navigation/server/execution/ExecutorInterface.h" -#include "armarx/navigation/server/scene_provider/SceneProvider.h" +#include <armarx/navigation/memory/client/costmap/Reader.h> +#include <armarx/navigation/server/execution/ExecutorInterface.h> +#include <armarx/navigation/server/scene_provider/SceneProvider.h> #include <armarx/navigation/algorithms/Costmap.h> #include <armarx/navigation/algorithms/CostmapBuilder.h> #include <armarx/navigation/algorithms/astar/util.h> @@ -123,6 +124,7 @@ namespace armarx::navigation::components::navigator addPlugin(resultsWriterPlugin); addPlugin(graphReaderPlugin); addPlugin(costmapReaderPlugin); + addPlugin(humanReaderPlugin); addPlugin(virtualRobotReaderPlugin); @@ -164,6 +166,7 @@ namespace armarx::navigation::components::navigator .graphReader = &graphReaderPlugin->get(), .costmapReader = &costmapReaderPlugin->get(), .virtualRobotReader = &virtualRobotReaderPlugin->get(), + .humanReader = &humanReaderPlugin->get(), .objectPoseClient = ObjectPoseClientPluginUser::getClient()}; const std::string robotName = getControlComponentPlugin() @@ -190,7 +193,7 @@ namespace armarx::navigation::components::navigator // memoryIntrospector = server::MemoryIntrospector(resultsWriterPlugin->get(), ); - navRemoteGui = std::make_unique<navigator::RemoteGui>(remoteGui, *this); + navRemoteGui.emplace(remoteGui, *this); navRemoteGui->enable(); initialized = true; diff --git a/source/armarx/navigation/components/navigator/Component.h b/source/armarx/navigation/components/navigator/Component.h index 8b2b34677076c560e6d37b889a0d8d6ee61122ff..316e4da539d2c35021bcc9e1f325f0af72a1de22 100644 --- a/source/armarx/navigation/components/navigator/Component.h +++ b/source/armarx/navigation/components/navigator/Component.h @@ -50,6 +50,8 @@ #include <RobotAPI/libraries/armem_vision/client/occupancy_grid/Reader.h> #include <armarx/control/client/ComponentPlugin.h> + +#include <armarx/navigation/memory/client/human/Reader.h> #include <armarx/navigation/components/navigator/RemoteGui.h> #include <armarx/navigation/core/types.h> #include <armarx/navigation/memory/client/graph/Reader.h> @@ -174,9 +176,7 @@ namespace armarx::navigation::components::navigator std::mutex propertiesMutex; - // TODO maybe as optional, but requires some effort - std::unique_ptr<armarx::navigation::components::navigator::RemoteGui> navRemoteGui; - + std::optional<armarx::navigation::components::navigator::RemoteGui> navRemoteGui; // unique_ptr to avoid dangling refs std::vector<std::unique_ptr<server::MemoryIntrospector>> memoryIntrospectors; @@ -194,6 +194,8 @@ namespace armarx::navigation::components::navigator graphReaderPlugin = nullptr; armem::client::plugins::ReaderWriterPlugin<memory::client::costmap::Reader>* costmapReaderPlugin = nullptr; + armem::client::plugins::ReaderWriterPlugin<memory::client::human::Reader>* + humanReaderPlugin = nullptr; // armem::vision::occupancy_grid::client::Reader occupancyGridReader; @@ -217,4 +219,4 @@ namespace armarx::navigation::components::navigator Parameters params; }; -} // namespace armarx::navigation::components::navigator +} // namespace armarx::navigation::components::navigator diff --git a/source/armarx/navigation/core/DynamicScene.h b/source/armarx/navigation/core/DynamicScene.h index 05f211a9a6a4d40e243ab560a437814d3eb02b94..172957d00e1adb5b42a1bb47ca9fea7f80083b17 100644 --- a/source/armarx/navigation/core/DynamicScene.h +++ b/source/armarx/navigation/core/DynamicScene.h @@ -23,17 +23,14 @@ #pragma once +#include <armarx/navigation/human/types.h> + namespace armarx::navigation::core { struct DynamicScene { - - // TODO(SALt): Implement - - public: - protected: - private: + human::Humans humans; }; } // namespace armarx::navigation::core diff --git a/source/armarx/navigation/local_planning/TebObstacleManager.cpp b/source/armarx/navigation/local_planning/TebObstacleManager.cpp index 6adb56142ff59a87a2110066df1ab519f1440ed4..1e395628f619f218d3c5721e5d71fb68e9462658 100644 --- a/source/armarx/navigation/local_planning/TebObstacleManager.cpp +++ b/source/armarx/navigation/local_planning/TebObstacleManager.cpp @@ -39,7 +39,7 @@ namespace armarx::navigation::local_planning obst->finalizePolygon(); container.push_back(obst); - if (visLayer) + if (visLayer != nullptr) { const Eigen::Vector3f min3d = conv::fromRos(min); const Eigen::Vector3f max3d = conv::fromRos(max); @@ -58,7 +58,7 @@ namespace armarx::navigation::local_planning { auto proxemicZones = proxemics.createProxemicZones(human); - for (auto& proxemicZone : proxemicZones) + for (const auto& proxemicZone : proxemicZones) { auto pose = conv::toRos(proxemicZone.pose); auto shape = conv::toRos(proxemicZone.shape); @@ -67,7 +67,7 @@ namespace armarx::navigation::local_planning auto obst = boost::make_shared<teb_local_planner::extension::EllipseObstacle>( pose.position(), pose.theta(), shape.a, shape.b); - auto& penalty = proxemicZone.penalty; + const auto& penalty = proxemicZone.penalty; obst->setPenaltyModel(boost::make_shared<teb_local_planner::ExponentialPenaltyModel>( teb_local_planner::LinearPenaltyModel(penalty.minDistance, penalty.epsilon), @@ -83,7 +83,7 @@ namespace armarx::navigation::local_planning container.push_back(obst); - if (visLayer) + if (visLayer != nullptr) { const Eigen::Vector3f axisLength(proxemicZone.shape.a, proxemicZone.shape.b, 0); const core::Pose pose3d = conv::to3D(human.pose); diff --git a/source/armarx/navigation/local_planning/TimedElasticBands.cpp b/source/armarx/navigation/local_planning/TimedElasticBands.cpp index 54c9700c29599ad4698eef95134986e1e435af80..b9a9d0b3abefe7ec13ac6b185feb2da0495c2627 100644 --- a/source/armarx/navigation/local_planning/TimedElasticBands.cpp +++ b/source/armarx/navigation/local_planning/TimedElasticBands.cpp @@ -145,7 +145,7 @@ namespace armarx::navigation::local_planning viz::Layer* visPtr = nullptr; viz::Layer visLayer; - if (arviz) + if (arviz != nullptr) { visLayer = arviz->layer("local_planner_obstacles"); visPtr = &visLayer; @@ -154,6 +154,7 @@ namespace armarx::navigation::local_planning if (scene.staticScene) { + ARMARX_CHECK(scene.staticScene.has_value()); for (const auto& obst : scene.staticScene.value().objects->getCollisionModels()) { obstManager.addBoxObstacle(obst->getGlobalBoundingBox(), visPtr); @@ -161,14 +162,14 @@ namespace armarx::navigation::local_planning } if (scene.dynamicScene) { - //TODO include humans in dynamic scene - //for (const auto& obst : scene.dynamicScene.value().humans) - //{ - // obstManager.addHumanObstacle(obst, visPtr); - //} + ARMARX_CHECK(scene.dynamicScene.has_value()); + for (const auto& obst : scene.dynamicScene.value().humans) + { + obstManager.addHumanObstacle(obst, visPtr); + } } - if (arviz) + if (arviz != nullptr) { arviz->commit(visLayer); } diff --git a/source/armarx/navigation/server/scene_provider/SceneProvider.cpp b/source/armarx/navigation/server/scene_provider/SceneProvider.cpp index 6ab93b8fa535db0a94e98160f6b6d3c1dcd4d5ba..26d9cd41fbe72fc72082b7d9ffc5d08e06e78d02 100644 --- a/source/armarx/navigation/server/scene_provider/SceneProvider.cpp +++ b/source/armarx/navigation/server/scene_provider/SceneProvider.cpp @@ -2,17 +2,20 @@ #include <VirtualRobot/SceneObjectSet.h> -#include "ArmarXCore/core/exceptions/local/ExpressionException.h" -#include "ArmarXCore/core/logging/Logging.h" -#include "ArmarXCore/core/time/Clock.h" +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> +#include <ArmarXCore/core/logging/Logging.h> +#include <ArmarXCore/core/time/Clock.h> -#include "RobotAPI/libraries/armem_robot/types.h" +#include <RobotAPI/libraries/armem_robot/types.h> -#include "armarx/navigation/core/types.h" -#include "armarx/navigation/memory/client/costmap/Reader.h" #include <armarx/navigation/algorithms/CostmapBuilder.h> +#include <armarx/navigation/core/types.h> +#include <armarx/navigation/memory/client/costmap/Reader.h> +#include <armarx/navigation/memory/client/graph/Reader.h> +#include <armarx/navigation/memory/client/human/Reader.h> #include <armarx/navigation/util/util.h> + namespace armarx::navigation::server::scene_provider { @@ -113,7 +116,10 @@ namespace armarx::navigation::server::scene_provider core::DynamicScene SceneProvider::getDynamicScene(const DateTime& timestamp) const { - return {}; // FIXME implement + const memory::client::human::Reader::Query query{.providerName = config.humanProviderName, + .timestamp = timestamp}; + + return {.humans = srv.humanReader->queryHumans(query).humans}; } core::SceneGraph diff --git a/source/armarx/navigation/server/scene_provider/SceneProvider.h b/source/armarx/navigation/server/scene_provider/SceneProvider.h index a71a958fd5f3e1997ee8defc2a95142e9ed281be..1f21e85ead9be31ca561a925e2bcceff0be53567 100644 --- a/source/armarx/navigation/server/scene_provider/SceneProvider.h +++ b/source/armarx/navigation/server/scene_provider/SceneProvider.h @@ -31,12 +31,28 @@ #include <armarx/navigation/core/DynamicScene.h> #include <armarx/navigation/core/StaticScene.h> -#include <armarx/navigation/memory/client/costmap/Reader.h> -#include <armarx/navigation/memory/client/graph/Reader.h> #include <armarx/navigation/core/types.h> +#include <armarx/navigation/memory/client/human/Reader.h> #include <armarx/navigation/server/scene_provider/SceneProviderInterface.h> +namespace armarx::navigation::memory::client +{ + namespace graph + { + class Reader; + } + namespace costmap + { + class Reader; + } + namespace human + { + class Reader; + } +} // namespace armarx::navigation::memory::client + + namespace armarx::navigation::server::scene_provider { @@ -54,6 +70,8 @@ namespace armarx::navigation::server::scene_provider // `robot_state` memory reader and writer armem::robot_state::VirtualRobotReader* virtualRobotReader; + memory::client::human::Reader* humanReader; + objpose::ObjectPoseClient objectPoseClient; }; @@ -63,6 +81,8 @@ namespace armarx::navigation::server::scene_provider std::string staticCostmapProviderName = "distance_to_obstacle_costmap_provider"; std::string staticCostmapName = "distance_to_obstacles"; + + std::string humanProviderName = "dynamic_scene_provider"; }; SceneProvider(const InjectedServices& srv, const Config& config);