Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 #include <ros/ros.h>
00019 #include <actionlib/server/action_server.h>
00020 
00021 #include <object_manipulation_msgs/GraspHandPostureExecutionAction.h>
00022 #include <object_manipulation_msgs/GraspHandPostureExecutionGoal.h>
00023 #include <simple_message/socket/tcp_client.h>
00024 #include <simple_message/smpl_msg_connection.h>
00025 #include <simple_message/simple_message.h>
00026 #include <mtconnect_grasp_action/gripper_message.h>
00027 
00028 using namespace object_manipulation_msgs;
00029 using namespace actionlib;
00030 using namespace industrial::smpl_msg_connection;
00031 using namespace industrial::simple_message;
00032 using namespace mtconnect_cnc_robot_example::gripper_message;
00033 
00034 static const std::string PARAM_IP_ADDRESS = "ip_address";
00035 static const std::string PARAM_PORT_NUMBER = "port_number";
00036 
00037 class GraspExecutionAction
00038 {
00039 private:
00040   typedef ActionServer<GraspHandPostureExecutionAction> GEAS;
00041   typedef GEAS::GoalHandle GoalHandle;
00042 public:
00043   GraspExecutionAction(ros::NodeHandle &n, SmplMsgConnection *robot) :
00044     node_(n),
00045     action_server_(node_, "grasp_execution_action",
00046                    boost::bind(&GraspExecutionAction::goalCB, this, _1),
00047                    boost::bind(&GraspExecutionAction::cancelCB, this, _1),
00048                    false)
00049   {
00050     ros::NodeHandle pn("~");
00051 
00052     robot_ = robot;
00053     robot_->makeConnect();
00054     action_server_.start();
00055     
00056     ROS_INFO("Grasp execution action node started");
00057 
00058     
00059 
00060 
00061 
00062 
00063 
00064 
00065 
00066 
00067 
00068 
00069 
00070 
00071 
00072 
00073 
00074 
00075 
00076 
00077 
00078 
00079   }
00080 
00081   ~GraspExecutionAction()
00082   {
00083   }
00084 
00085 private:
00086 
00087 
00088   void goalCB(GoalHandle gh)
00089   {
00090     GripperMessage gMsg;
00091     SimpleMessage request;
00092     SimpleMessage reply;
00093 
00094     ROS_DEBUG("Received grasping goal");
00095 
00096     while (!(robot_->isConnected()))
00097     {
00098       ROS_DEBUG("Reconnecting");
00099       robot_->makeConnect();
00100     }
00101       
00102 
00103     switch(gh.getGoal()->goal)
00104     {
00105       case GraspHandPostureExecutionGoal::PRE_GRASP:
00106 
00107         gh.setAccepted();
00108         ROS_WARN("Pre-grasp is not supported by this gripper");
00109         gh.setSucceeded();
00110         break;
00111 
00112       case GraspHandPostureExecutionGoal::GRASP:
00113       case GraspHandPostureExecutionGoal::RELEASE:
00114 
00115         gh.setAccepted();
00116         switch(gh.getGoal()->goal)
00117         {
00118           case GraspHandPostureExecutionGoal::GRASP:
00119             ROS_INFO("Executing a gripper grasp");
00120             gMsg.init(GripperOperationTypes::CLOSE);
00121             break;
00122           case GraspHandPostureExecutionGoal::RELEASE:
00123             ROS_INFO("Executing a gripper release");
00124             gMsg.init(GripperOperationTypes::OPEN);
00125             break;
00126         }
00127         gMsg.toRequest(request);
00128         this->robot_->sendAndReceiveMsg(request, reply);
00129 
00130         switch(reply.getReplyCode())
00131         {
00132           case ReplyTypes::SUCCESS:
00133             ROS_INFO("Robot gripper returned success");
00134             gh.setSucceeded();
00135             break;
00136           case ReplyTypes::FAILURE:
00137             ROS_ERROR("Robot gripper returned failure");
00138             gh.setCanceled();
00139             break;
00140         }
00141         break;
00142 
00143           default:
00144             gh.setRejected();
00145             break;
00146 
00147     }
00148   }
00149 
00150   void cancelCB(GoalHandle gh)
00151   {
00152     ROS_ERROR("Action cancel not supported for grasp execution action");
00153     gh.setRejected();
00154   }
00155 
00156 
00157   ros::NodeHandle node_;
00158   GEAS action_server_;
00159 
00160   industrial::smpl_msg_connection::SmplMsgConnection *robot_;
00161 
00162 };
00163 
00164 int main(int argc, char** argv)
00165 {
00166         ros::init(argc, argv, "grasp_execution_action_node");
00167         ros::NodeHandle nh("~");
00168         std::string ip_address;
00169         int port_number;
00170 
00171         
00172         if(nh.getParam(PARAM_IP_ADDRESS,ip_address) && nh.getParam(PARAM_PORT_NUMBER,port_number))
00173         {
00174                 ROS_INFO("Grasp action connecting to IP address: %s and port: %i", ip_address.c_str(),port_number);
00175                 industrial::tcp_client::TcpClient robot;
00176 
00177                 robot.init(const_cast<char*>(ip_address.c_str()), port_number);
00178                 GraspExecutionAction ge(nh, &robot);
00179 
00180                 ros::spin();
00181         }
00182         else
00183         {
00184                 ROS_ERROR("Missing 'ip_address' and 'port_number' private parameters");
00185         }
00186 
00187 
00188   return 0;
00189 }
00190 
00191 
00192 
00193