diff --git a/source/armarx/manipulation/action_planning/planning_steps/filtering/ReachabilityFilter.cpp b/source/armarx/manipulation/action_planning/planning_steps/filtering/ReachabilityFilter.cpp index 6f2045c7a097c4527cf1293e45c88d099140074f..09a3acae18dfafaa90e11c7a55ebf31fc437ac7e 100644 --- a/source/armarx/manipulation/action_planning/planning_steps/filtering/ReachabilityFilter.cpp +++ b/source/armarx/manipulation/action_planning/planning_steps/filtering/ReachabilityFilter.cpp @@ -43,14 +43,15 @@ namespace armarx::manipulation::planning::steps { - ReachabilityFilter::ReachabilityFilter(const std::string& name, - std::shared_ptr<VirtualRobot::Robot> robot, - const arondto::config::ReachabilityFilter& config, - const std::optional<viz::Client>& arvizClient) : + ReachabilityFilter::ReachabilityFilter( + const std::string& name, + std::shared_ptr<VirtualRobot::Robot> robot, + const arondto::config::ReachabilityFilter& config, + const std::experimental::observer_ptr<util::VisualizationHelper>& vizHelper) : AsyncPlanningStep(name), robot_(std::move(robot)), diffIkParameters_{}, - arvizClient_(arvizClient) + arvizHelper_(vizHelper) { diffIkParameters_.ikStepLengthInitial = config.diffIkParams.ikStepLengthInitial; diffIkParameters_.ikStepLengthFineTune = config.diffIkParams.ikStepLengthFineTune; @@ -72,9 +73,9 @@ namespace armarx::manipulation::planning::steps ARMARX_VERBOSE << "Action is not reachable, discarding it"; action.markDiscarded(); } - if (arvizClient_.has_value()) + if (arvizHelper_ != nullptr) { - arvizClient_->commitDeleteLayer("reachability_filter"); + arvizHelper_->clearLayer("Robot"); } } @@ -117,8 +118,8 @@ namespace armarx::manipulation::planning::steps { return pose.toGlobalEigen(robotCopy); }; std::size_t current_pose = 0; - auto isPoseReachable = - [robotCopy, rnsName, tcpName, ikParams, ¤t_pose, this](const Eigen::Matrix4f& globalPose) -> bool + auto isPoseReachable = [robotCopy, rnsName, tcpName, ikParams, ¤t_pose, this]( + const Eigen::Matrix4f& globalPose) -> bool { // Calculate the IK of the target in the local frame of the robot_ at the platform pose auto localRobotCopy = robotCopy->clone(); @@ -128,16 +129,10 @@ namespace armarx::manipulation::planning::steps localRobotCopy->getRobotNodeSet(rnsName), localRobotCopy->getRobotNode(tcpName), ikParams); - if (arvizClient_.has_value()) + if (arvizHelper_ != nullptr) { - viz::Robot robot(std::to_string(current_pose++)); - // TODO: create convenience function for this in ArViz - robot.file("", localRobotCopy->getFilename()) - .pose(localRobotCopy->getGlobalPose()) - .joints(localRobotCopy->getJointValues()) - .overrideColor(result.reached ? armarx::viz::Color::green() - : armarx::viz::Color::red()); - arvizClient_->commitLayerContaining(getName(), robot); + arvizHelper_->visualizeRobot( + localRobotCopy, result.reached ? simox::Color::green() : simox::Color::red()); } return result.reached; }; @@ -153,14 +148,15 @@ namespace armarx::manipulation::planning::steps return ranges::all_of(globalPoses, isPoseReachable); } - ReachabilityFilter::ReachabilityFilter(const std::string& name, - std::shared_ptr<VirtualRobot::Robot> robot, - const SimpleDiffIK::Parameters& diffIkParameters, - const std::optional<viz::Client>& arvizClient) : + ReachabilityFilter::ReachabilityFilter( + const std::string& name, + std::shared_ptr<VirtualRobot::Robot> robot, + const SimpleDiffIK::Parameters& diffIkParameters, + const std::experimental::observer_ptr<util::VisualizationHelper>& vizHelper) : AsyncPlanningStep(name), robot_(std::move(robot)), diffIkParameters_(diffIkParameters), - arvizClient_(arvizClient) + arvizHelper_(vizHelper) { } } // namespace armarx::manipulation::planning::steps diff --git a/source/armarx/manipulation/action_planning/planning_steps/filtering/ReachabilityFilter.h b/source/armarx/manipulation/action_planning/planning_steps/filtering/ReachabilityFilter.h index 74fea6a174bbc55f9cca5ea7fba8500e2a46d452..0de81b8b0507ceebb1ec1c6e38bbcfe4e35b98cb 100644 --- a/source/armarx/manipulation/action_planning/planning_steps/filtering/ReachabilityFilter.h +++ b/source/armarx/manipulation/action_planning/planning_steps/filtering/ReachabilityFilter.h @@ -28,6 +28,7 @@ #include <armarx/manipulation/action_planning/PlanningStep.h> #include <armarx/manipulation/action_planning/planning_steps/aron/ReachabilityFilterConfig.aron.generated.h> #include <armarx/manipulation/core/forward_declarations.h> +#include <armarx/manipulation/util/VisualizationHelper.h> namespace armarx::manipulation::planning::steps { @@ -38,11 +39,11 @@ namespace armarx::manipulation::planning::steps ReachabilityFilter(const std::string& name, std::shared_ptr<VirtualRobot::Robot> robot, const arondto::config::ReachabilityFilter& diffIkParameters, - const std::optional<viz::Client>& arvizClient = std::nullopt); + const std::experimental::observer_ptr<util::VisualizationHelper>& vizHelper = nullptr); ReachabilityFilter(const std::string& name, std::shared_ptr<VirtualRobot::Robot> robot, const armarx::SimpleDiffIK::Parameters& diffIkParameters, - const std::optional<viz::Client>& arvizClient = std::nullopt); + const std::experimental::observer_ptr<util::VisualizationHelper>& vizHelper = nullptr); void execute(core::ExecutableAction& action) const override; @@ -55,6 +56,6 @@ namespace armarx::manipulation::planning::steps const std::shared_ptr<VirtualRobot::Robot> robot_; armarx::SimpleDiffIK::Parameters diffIkParameters_; - mutable std::optional<viz::Client> arvizClient_; + std::experimental::observer_ptr<util::VisualizationHelper> arvizHelper_; }; } // namespace armarx::manipulation::planning::steps diff --git a/source/armarx/manipulation/util/VisualizationHelper.cpp b/source/armarx/manipulation/util/VisualizationHelper.cpp index 96cce8a634ebea8de840c3da33c892507be9cd71..5044b48b6574a8019ab104b86d51b64a9dbee7d7 100644 --- a/source/armarx/manipulation/util/VisualizationHelper.cpp +++ b/source/armarx/manipulation/util/VisualizationHelper.cpp @@ -97,14 +97,18 @@ namespace armarx::manipulation::util } void - VisualizationHelper::visualizeRobot(const VirtualRobot::RobotPtr& robot) + VisualizationHelper::visualizeRobot(const VirtualRobot::RobotPtr& robot, + const std::optional<simox::Color>& colorOverride) { const auto& config = configPlugin_->config_.getUpToDateReadBuffer(); auto vis_robot = armarx::viz::Robot("Robot") .file(config.robot_project_dir, config.robot_path) .joints(robot->getConfig()->getRobotNodeJointValueMap()) - .pose(robot->getGlobalPose()) - .overrideColor(simox::Color::blue()); + .pose(robot->getGlobalPose()); + if (colorOverride) + { + vis_robot.overrideColor(colorOverride.value()); + } arviz_.commitLayerContaining("Robot", vis_robot); } @@ -132,7 +136,6 @@ namespace armarx::manipulation::util void VisualizationHelper::clearVisualizationLayers() { - arviz_.commitDeleteLayer("MovementInstructions"); arviz_.commitDeleteLayer("Robot"); arviz_.commitDeleteLayer("Hypotheses"); arviz_.commitDeleteLayer("Trajectory"); @@ -174,6 +177,28 @@ namespace armarx::manipulation::util } } + void + VisualizationHelper::clearLayer(const std::string& layerName) + { + if (std::equal(layerName.begin(), layerName.end(), "Hypotheses")) + { + arviz_.commitDeleteLayer("Hypotheses"); + } + else if (std::equal(layerName.begin(), layerName.end(), "Trajectory")) + { + arviz_.commitDeleteLayer("Trajectory"); + } + else if (std::equal(layerName.begin(), layerName.end(), "Robot")) + { + arviz_.commitDeleteLayer("Robot"); + } + else + { + // do nothing + return; + } + } + template <typename PluginT, typename... ParamsT> void VisualizationHelper::addPluginAndDependency(std::experimental::observer_ptr<PluginT>& plugin, diff --git a/source/armarx/manipulation/util/VisualizationHelper.h b/source/armarx/manipulation/util/VisualizationHelper.h index 255661921fcddee6c56f2186854a2998590c1cf4..9d13d917873f40fc9f24add76f1e087d0b873f36 100644 --- a/source/armarx/manipulation/util/VisualizationHelper.h +++ b/source/armarx/manipulation/util/VisualizationHelper.h @@ -74,7 +74,8 @@ namespace armarx::manipulation::util /** * \brief Visualizes the local robot clone (with commiting the Layer) */ - void visualizeRobot(const VirtualRobot::RobotPtr& robot); + void visualizeRobot(const VirtualRobot::RobotPtr& robot, + const std::optional<simox::Color>& colorOverride = std::nullopt); /**! * \brief visualize the trajectoy without synching the robot first @@ -88,6 +89,7 @@ namespace armarx::manipulation::util void clearVisualizationLayers(); + void clearLayer(const std::string& layerName); armarx::viz::Client& getArvizClient();