21 if (mapActionHandler ==
nullptr) {
22 ROS_ERROR_STREAM (
"[RosServiceHandler " << __func__ <<
" ] the mapActionHandler in not initialized");
38 std::string graspingActionsSrvName, actionInfoServiceName,
39 selectablePairInfoServiceName, handInfoServiceName, newGraspingActionServiceName;
41 _nh->
param<std::string>(
"/rosee/grasping_action_srv_name", graspingActionsSrvName,
"grasping_actions_available");
42 _nh->
param<std::string>(
"/rosee/primitive_aggregated_srv_name", actionInfoServiceName,
"primitives_aggregated_available");
43 _nh->
param<std::string>(
"/rosee/selectable_finger_pair_info", selectablePairInfoServiceName,
"selectable_finger_pair_info");
44 _nh->
param<std::string>(
"/rosee/hand_info", handInfoServiceName,
"hand_info");
45 _nh->
param<std::string>(
"/rosee/new_grasping_action_srv_name", newGraspingActionServiceName,
"new_generic_grasping_action");
66 rosee_msg::GraspingActionsAvailable::Request& request,
67 rosee_msg::GraspingActionsAvailable::Response& response) {
69 switch (request.action_type) {
75 if (request.primitive_type == 0) {
77 if (request.action_name.size() == 0 ) {
81 for (
auto primitive : primitiveContainers.second) {
87 if (request.elements_involved.size() == 0) {
95 auto primitive =
_mapActionHandler->getPrimitive(request.action_name, request.elements_involved);
102 if (request.elements_involved.size() == 0) {
106 static_cast<ROSEE::ActionPrimitive::Type>(request.primitive_type-1))) {
108 for (
auto primitive : primitives) {
116 static_cast<ROSEE::ActionPrimitive::Type>(request.primitive_type-1), request.elements_involved)) {
129 if (request.action_name.size() == 0) {
141 if (request.action_name.size() == 0) {
153 ROS_ERROR_STREAM (
"[RosServiceHandler " << __func__ <<
" ] request.actionType can only be 0(ALL), 1(PRIMITIVE), " 154 <<
"2(GENERIC_and_COMPOSED), or 3(TIMED); I have received " << request.action_type);
165 rosee_msg::GraspingAction primitiveMsg;
167 if (primitive ==
nullptr) {
173 primitiveMsg.primitive_type = primitive->getPrimitiveType();
175 auto elements = primitive->getKeyElements();
183 rosee_msg::GraspingAction genericActionMsg;
184 if (
generic ==
nullptr) {
185 return genericActionMsg;
190 genericActionMsg.primitive_type = genericActionMsg.PRIMITIVE_NONE;
193 if ( composedCasted !=
nullptr) {
197 return genericActionMsg;
202 rosee_msg::GraspingAction timedActionMsg;
203 if (timed ==
nullptr) {
204 return timedActionMsg;
209 timedActionMsg.primitive_type = timedActionMsg.PRIMITIVE_NONE;
211 timedActionMsg.inner_actions = timed->getInnerActionsNames();
213 for (
auto innerMargin : timed->getAllActionMargins()){
214 timedActionMsg.before_time_margins.push_back(innerMargin.first);
215 timedActionMsg.after_time_margins.push_back(innerMargin.second);
218 return timedActionMsg;
222 rosee_msg::GraspingAction* graspingMsg) {
224 graspingMsg->action_type = action->getType();
225 graspingMsg->action_name = action->getName();
228 for (
auto motorCount : action->getJointsInvolvedCount()) {
229 motorCountMsg.name.push_back(motorCount.first);
230 motorCountMsg.count.push_back(motorCount.second);
232 graspingMsg->action_motor_count = motorCountMsg;
234 for (
auto motorPosMultiple : action->getAllJointPos()) {
237 rosee_msg::MotorPosition motorPosMsg;
238 for (
auto motorPos : motorPosMultiple) {
239 motorPosMsg.name.push_back(motorPos.first);
240 motorPosMsg.position.push_back(motorPos.second.at(0));
243 graspingMsg->action_motor_positions.push_back(motorPosMsg);
246 for (
auto elementInvolved : action->getFingersInvolved()) {
247 graspingMsg->elements_involved.push_back(elementInvolved);
252 rosee_msg::GraspingPrimitiveAggregatedAvailable::Request& request,
253 rosee_msg::GraspingPrimitiveAggregatedAvailable::Response& response) {
255 if (request.primitive_type == 0) {
257 if (request.action_name.size() == 0 ) {
266 if (request.elements_involved.size() == 0) {
274 auto primitive =
_mapActionHandler->getPrimitive(request.action_name, request.elements_involved);
281 if (request.elements_involved.size() == 0) {
285 static_cast<ROSEE::ActionPrimitive::Type>(request.primitive_type-1))) {
294 static_cast<ROSEE::ActionPrimitive::Type>(request.primitive_type-1), request.elements_involved)) {
307 rosee_msg::GraspingPrimitiveAggregated primitiveMsg;
309 primitiveMsg.action_name = primitiveMap.begin()->second->getName();
310 primitiveMsg.primitive_type = primitiveMap.begin()->second->getPrimitiveType();
314 primitiveMsg.max_selectable = primitiveMap.begin()->first.size();
316 primitiveMsg.selectable_names =
325 rosee_msg::GraspingPrimitiveAggregated primitiveMsg;
326 primitiveMsg.action_name = primitive->getName();
327 primitiveMsg.primitive_type = primitive->getPrimitiveType();
329 auto elements = primitive->getKeyElements();
330 primitiveMsg.max_selectable =
elements.size();
338 rosee_msg::SelectablePairInfo::Request& request,
339 rosee_msg::SelectablePairInfo::Response& response) {
341 std::set<std::string> companionFingers;
342 if (request.action_name.compare (
"pinchTight") == 0) {
345 ROSEE::ActionPrimitive::Type::PinchTight) ;
347 }
else if (request.action_name.compare (
"pinchLoose") == 0) {
350 ROSEE::ActionPrimitive::Type::PinchLoose) ;
354 "a recognizible action name to look for finger companions" );
358 if (companionFingers.size() == 0) {
363 for (
auto fing : companionFingers ) {
364 response.pair_elements.push_back (fing);
371 rosee_msg::HandInfo::Request& request,
372 rosee_msg::HandInfo::Response& response) {
380 rosee_msg::HandInfo handInfoMsg;
383 handInfoMsg.request = request;
384 if (handInfoClient.
call(handInfoMsg)) {
386 response = handInfoMsg.response;
398 rosee_msg::NewGenericGraspingActionSrv::Request& request,
399 rosee_msg::NewGenericGraspingActionSrv::Response& response){
401 response.accepted =
false;
402 response.emitted =
false;
404 if (request.newAction.action_name.empty()) {
406 response.error_msg =
"action_name can not be empty";
407 ROS_ERROR_STREAM (
"[RosServiceHandler " << __func__ <<
" ] " << response.error_msg);
411 if (request.newAction.action_motor_position.name.size() == 0 ||
412 request.newAction.action_motor_position.position.size() == 0 ||
413 request.newAction.action_motor_position.position.size() != request.newAction.action_motor_position.name.size()) {
415 response.error_msg =
"action_motor_position is empty or badly formed";
416 ROS_ERROR_STREAM (
"[RosServiceHandler " << __func__ <<
" ] " << response.error_msg);
421 if (request.newAction.action_motor_count.name.size() != request.newAction.action_motor_count.count.size()) {
423 response.error_msg =
"action_motor_count is badly formed, name and count have different sizes";
424 ROS_ERROR_STREAM (
"[RosServiceHandler " << __func__ <<
" ] " << response.error_msg);
432 if (
_mapActionHandler->getGeneric(request.newAction.action_name,
false) !=
nullptr) {
434 response.error_msg =
"A generic action with name '" + request.newAction.action_name +
"' already exists";
435 ROS_ERROR_STREAM (
"[RosServiceHandler " << __func__ <<
" ] " << response.error_msg);
444 std::set<std::string> elementInvolved;
446 for (
int i = 0; i < request.newAction.action_motor_position.name.size(); i++){
448 std::vector<double> one_dof{request.newAction.action_motor_position.position.at(i)};
449 jp.insert(std::make_pair(request.newAction.action_motor_position.name.at(i),
453 for (
int i = 0; i < request.newAction.action_motor_count.name.size(); i++){
455 jic.insert(std::make_pair(request.newAction.action_motor_count.name.at(i),
456 request.newAction.action_motor_count.count.at(i)));
459 for (
int i = 0; i< request.newAction.elements_involved.size(); i++) {
461 elementInvolved.insert(request.newAction.elements_involved.at(i));
465 try { newAction = std::make_shared<ROSEE::ActionGeneric>(request.newAction.action_name,
472 response.error_msg =
"action_motor_position and action_motor_count have different names element. They must be the same because they refer to actuator of the end-effector";
473 ROS_ERROR_STREAM (
"[RosServiceHandler " << __func__ <<
" ] " << response.error_msg);
482 response.error_msg =
"error by mapActionHandler when inserting the new generic action";
483 ROS_ERROR_STREAM (
"[RosServiceHandler " << __func__ <<
" ] " << response.error_msg);
488 ROS_INFO_STREAM (
"[RosServiceHandler " << __func__ <<
" ] The new action '"<< newAction->getName() <<
"' is inserted in the system");
491 if (request.emitYaml) {
495 ROS_INFO_STREAM (
"[RosServiceHandler " << __func__ <<
" ] The received new action '"<< newAction->getName() <<
"' has been stored in " << path);
496 response.emitted =
true;
499 response.accepted =
true;
ServiceClient serviceClient(const std::string &service_name, bool persistent=false, const M_string &header_values=M_string())
std::map< std::string, std::vector< double > > JointPos
The map to describe the position of all actuated joints. The key is the name of the string...
bool graspingActionsCallback(rosee_msg::GraspingActionsAvailable::Request &request, rosee_msg::GraspingActionsAvailable::Response &response)
std::map< std::string, unsigned int > JointsInvolvedCount
The map to describe, how many times a joint is set by the action. An ActionPrimitive and an ActionCom...
std::shared_ptr< ActionComposed > Ptr
bool handInfoCallback(rosee_msg::HandInfo::Request &request, rosee_msg::HandInfo::Response &response)
RosServiceHandler(ros::NodeHandle *nh, ROSEE::MapActionHandler::Ptr, std::string path2saveYamlGeneric)
bool newGraspingActionCallback(rosee_msg::NewGenericGraspingActionSrv::Request &request, rosee_msg::NewGenericGraspingActionSrv::Response &response)
bool call(MReq &req, MRes &res)
ros::ServiceServer _serverNewGraspingAction
A ActionComposed, which is formed by one or more Primitives (or even other composed). It is useful for example to create an action that grasp only with bending the tips (e.g. to take a dish from above) If the ActionComposed has the boolean value independent to true, it means that include indipendent sub-actions, so, each joint is used by at maximum by ONLY ONE of the sub-action inside. In this case the jointsInvolvedCount will contain only 0 or 1 values. If the ActionComposed is not independent, each joint position is calculated as the mean of all the joint position of the contained sub-actions that uses that joint. So each mean can include different primitives, so we used the jointsInvolvedCount vector to store the number of sub action that use each joint.
ServiceServer advertiseService(const std::string &service, bool(T::*srv_func)(MReq &, MRes &), T *obj)
static std::vector< std::string > extract_keys_merged(std::map< std::set< std::string >, T > const &input_map, unsigned int max_string_number=0)
Extract all the string in the set keys of a map. All string are put togheter so the original meaning ...
MapActionHandler::Ptr _mapActionHandler
std::shared_ptr< ActionGeneric > Ptr
void fillCommonInfoGraspingActionMsg(ROSEE::Action::Ptr action, rosee_msg::GraspingAction *msg)
Internal function called by each of the fillGraspingActionMsg, it fills the GraspingAction message wi...
std::shared_ptr< ActionPrimitive > Ptr
std::string _path2saveYamlGeneric
bool param(const std::string ¶m_name, T ¶m_val, const T &default_val) const
std::shared_ptr< MapActionHandler > Ptr
rosee_msg::GraspingAction fillGraspingActionMsg(ROSEE::ActionPrimitive::Ptr primitive)
std::shared_ptr< ActionTimed > Ptr
std::shared_ptr< Action > Ptr
bool init(unsigned int nFinger)
ros::ServiceServer _serverPrimitiveAggregated
#define ROS_INFO_STREAM(args)
rosee_msg::GraspingPrimitiveAggregated fillPrimitiveAggregatedMsg(ROSEE::MapActionHandler::ActionPrimitiveMap primitiveMap)
ros::ServiceServer _serverHandInfo
std::vector< std::string > getInnerActionsNames() const
ros::ServiceServer _server_selectablePairInfo
std::map< std::set< std::string >, ROSEE::ActionPrimitive::Ptr > ActionPrimitiveMap
ros::ServiceServer _serverGraspingActions
bool primitiveAggregatedCallback(rosee_msg::GraspingPrimitiveAggregatedAvailable::Request &request, rosee_msg::GraspingPrimitiveAggregatedAvailable::Response &response)
ROSCPP_DECL bool exists(const std::string &service_name, bool print_failure_reason)
#define ROS_ERROR_STREAM(args)
std::string createYamlFile(const std::map< std::set< std::string >, ActionPrimitive * > mapOfActions, const std::string actionName, std::string pathFolder)
Create/overwrite yaml file and emit info on it about each ActionPrimitive inside the given mapOfActio...
bool selectablePairInfoCallback(rosee_msg::SelectablePairInfo::Request &request, rosee_msg::SelectablePairInfo::Response &response)