#include "behaviortree_ros2/bt_service_node.hpp" #include "behaviortree_ros2/plugins.hpp" #include // #include #include "rbs_skill_interfaces/srv/get_pick_place_poses.hpp" #include "rbs_utils_interfaces/srv/get_relative_named_pose.hpp" #include #include #include #include #include #include using GetRelativeNamedPose = rbs_utils_interfaces::srv::GetRelativeNamedPose; using namespace BT; class GetNamedPose : public RosServiceNode { public: GetNamedPose(const std::string &name, const NodeConfig &conf, const RosNodeParams ¶ms) : RosServiceNode(name, conf, params) { RCLCPP_INFO(this->logger(), "Starting GetNamedPose"); } static PortsList providedPorts() { return providedBasicPorts( {InputPort("pose_name"), InputPort("relative_to"), OutputPort>("output_pose")}); } bool setRequest(Request::SharedPtr &request) override { RCLCPP_INFO(this->logger(), "[%s] Starting send request for: [%s]", name().c_str(), this->service_name_.c_str()); if (!getInput("pose_name", request->pose_name)) { RCLCPP_ERROR(this->node_.lock()->get_logger(), "[%s] Failed to get pose_name from input port", name().c_str()); return false; } if (!getInput("pose_name", request->pose_name)) { RCLCPP_ERROR(this->node_.lock()->get_logger(), "[%s] Failed to get pose_name from input port", name().c_str()); return false; } if (!getInput("relative_to", request->relative_to)) { RCLCPP_ERROR(this->node_.lock()->get_logger(), "[%s] Failed to get pose_name from input port", name().c_str()); return false; } return true; } NodeStatus onResponseReceived(const Response::SharedPtr &response) override { if (!response->ok) { RCLCPP_ERROR(this->logger(), "[%s] Response indicates failure.", name().c_str()); return NodeStatus::FAILURE; } RCLCPP_INFO(this->logger(), "[%s] Response received successfully with pose name [%s]", name().c_str(), response->named_pose.name.c_str()); auto pose = std::make_shared(); *pose = response->named_pose.pose; setOutput("output_pose", pose); return NodeStatus::SUCCESS; } }; CreateRosNodePlugin(GetNamedPose, "GetNamedPose");