/skill/hand_grasp¶
Caution
This documentation page has been auto-generated.
It may be missing some details.
/skill/hand_grasp Quick Facts
- Category
 - Message type
 
Open/close a robot gripper or hand. See hand_grasp for details.
Quick snippets¶
Send a goal from the command-line¶
$ ros2 action send_goal /skill/hand_grasp manipulation_skills/action/HandGrasp # press Tab to complete the message prototype
How to use in your code¶
Call the action from a Python script¶
#!/usr/bin/env python
import rclpy
from rclpy.action import ActionClient
from rclpy.node import Node
from manipulation_skills.action import HandGrasp
class HandGraspActionClient(Node):
    def __init__(self):
        super().__init__('skill_hand_grasp_client')
        self._action_client = ActionClient(self, HandGrasp, '/skill/hand_grasp')
    def send_goal(self, a, b):
        goal_msg = HandGrasp.Goal()
        # TODO: adapt to the action's parameters
        # check https://github.com/pal-robotics/manipulation_skills/tree/main/action/HandGrasp.action
        # for the possible goal parameters
        # goal_msg.a = a
        # goal_msg.b = b
        self._action_client.wait_for_server()
        return self._action_client.send_goal_async(goal_msg)
if __name__ == '__main__':
    rclpy.init(args=args)
    action_client = HandGraspActionClient()
    # TODO: adapt to your action's parameters
    future = action_client.send_goal(a, b)
    rclpy.spin_until_future_complete(action_client, future)
    rclpy.shutdown()
Call the action from a C++ program¶
#include <functional>
#include <future>
#include <memory>
#include <string>
#include <sstream>
#include <chrono>
#include "manipulation_skills/action/hand_grasp.hpp"
#include "rclcpp/rclcpp.hpp"
#include "rclcpp_action/rclcpp_action.hpp"
#include "rclcpp_components/register_node_macro.hpp"
using namespace std::chrono_literals;
using namespace std;
class HandGraspActionClient : public rclcpp::Node
{
public:
  using HandGrasp = manipulation_skills::action::HandGrasp;
  using GoalHandleHandGrasp = rclcpp_action::ClientGoalHandle<HandGrasp>;
  explicit HandGraspActionClient(const rclcpp::NodeOptions & options)
  : Node("skill_hand_grasp_action_client", options)
  {
    this->client_ptr_ = rclcpp_action::create_client<HandGrasp>(
            this,
            "/skill/hand_grasp");
    this->timer_ = this->create_wall_timer(
            500ms,
            bind(&HandGraspActionClient::send_goal, this));
  }
  void send_goal()
  {
    using namespace std::placeholders;
    this->timer_->cancel();
    if (!this->client_ptr_->wait_for_action_server()) {
      RCLCPP_ERROR(this->get_logger(), "Action server not available after waiting");
      rclcpp::shutdown();
    }
    auto goal_msg = HandGrasp::Goal();
    // check https://github.com/pal-robotics/manipulation_skills/tree/main/action/HandGrasp.action
    // for the possible goal parameters
    // goal_msg.... = ...;
    RCLCPP_INFO(this->get_logger(), "Sending goal");
    auto send_goal_options = rclcpp_action::Client<HandGrasp>::SendGoalOptions();
    send_goal_options.goal_response_callback =
        bind(&HandGraspActionClient::goal_response_callback, this, _1);
    send_goal_options.feedback_callback =
        bind(&HandGraspActionClient::feedback_callback, this, _1, _2);
    send_goal_options.result_callback =
        bind(&HandGraspActionClient::result_callback, this, _1);
    this->client_ptr_->async_send_goal(goal_msg, send_goal_options);
  }
private:
  rclcpp_action::Client<HandGrasp>::SharedPtr client_ptr_;
  rclcpp::TimerBase::SharedPtr timer_;
  void goal_response_callback(const GoalHandleHandGrasp::SharedPtr & goal_handle)
  {
    if (!goal_handle) {
      RCLCPP_ERROR(this->get_logger(), "Goal was rejected by server");
    } else {
      RCLCPP_INFO(this->get_logger(), "Goal accepted by server, waiting for result");
    }
  }
  void feedback_callback(
      GoalHandleHandGrasp::SharedPtr,
      const shared_ptr<const HandGrasp::Feedback> feedback)
  {
    stringstream ss;
    ss << "Next number in sequence received: ";
    for (auto number : feedback->partial_sequence) {
      ss << number << " ";
    }
    RCLCPP_INFO(this->get_logger(), ss.str().c_str());
  }
  void result_callback(const GoalHandleHandGrasp::WrappedResult & result)
  {
    switch (result.code) {
      case rclcpp_action::ResultCode::SUCCEEDED:
          break;
      case rclcpp_action::ResultCode::ABORTED:
          RCLCPP_ERROR(this->get_logger(), "Goal was aborted");
          return;
      case rclcpp_action::ResultCode::CANCELED:
          RCLCPP_ERROR(this->get_logger(), "Goal was canceled");
          return;
      default:
          RCLCPP_ERROR(this->get_logger(), "Unknown result code");
          return;
    }
    stringstream ss;
    ss << "Result received: ";
    for (auto number : result.result->sequence) {
      ss << number << " ";
    }
    RCLCPP_INFO(this->get_logger(), ss.str().c_str());
    rclcpp::shutdown();
  }
};  // class HandGraspActionClient
RCLCPP_COMPONENTS_REGISTER_NODE(HandGraspActionClient)