예제 #1
0
 def subscribe_topic(self, predicate_name, predicate_info):
     params_loaded = self.load_params(
         predicate_name,
         predicate_info)  # If parameters found, add 1 to the indexes
     if not params_loaded[0]:
         return False
     if len(predicate_info) < 2 + int(params_loaded[1]):
         rospy.logerr("Error: Wrong configuration file for predicate %s" %
                      predicate_name)
         return False
     try:
         msg_type = predicate_info['msg_type']
     except KeyError:
         rospy.logerr("Error: msg_type was not specified for predicate %s" %
                      predicate_name)
         return False
     self.import_msg(msg_type)
     try:
         if isinstance(predicate_info['topic'], list):
             for topic in predicate_info['topic']:
                 pred_info = predicate_info.copy()
                 pred_info['publisher'] = topic
                 rospy.Subscriber(str(topic),
                                  eval(msg_type[msg_type.rfind('/') + 1:]),
                                  self.subs_callback,
                                  (predicate_name, pred_info))
         else:
             rospy.Subscriber(predicate_info['topic'],
                              eval(msg_type[msg_type.rfind('/') + 1:]),
                              self.subs_callback,
                              (predicate_name, predicate_info))
     except KeyError:
         rospy.logerr("Error: topic was not specified for predicate %s" %
                      predicate_name)
         return False
     # self.sensed_topics[predicate_name] = (None, False)
     try:  # Update KB to inform about the sensed predicates
         sensed_srv_req = SetNamedBoolRequest()
         sensed_srv_req.name = predicate_name
         sensed_srv_req.value = True
         self.set_sensed_predicate_srv.call(sensed_srv_req)
     except Exception as e:
         rospy.logerr(
             'KCL: (RosplanSensing) Could not update sensing information in Knowledge Base for proposition %s',
             predicate_name)
     rospy.loginfo(
         'KCL: (RosplanSensing) Predicate %s: Subscribed to topic %s of type %s',
         predicate_name, predicate_info['topic'], msg_type)
     return True
예제 #2
0
    def create_service_client(self, predicate_name, predicate_info):
        params_loaded = self.load_params(
            predicate_name,
            predicate_info)  # If parameters found, add 1 to the indexes
        if not params_loaded[0]:
            return False
        if len(predicate_info) < 2 + int(params_loaded[1]):
            rospy.logerr("Error: Wrong configuration file for predicate %s" %
                         predicate_name)
            return False
        try:
            srv_type = predicate_info['srv_type']
        except KeyError:
            rospy.logerr("Error: service was not specified for predicate %s" %
                         predicate_name)
            return False
        srv_typename = self.import_srv(srv_type)
        self.service_type_names.append(srv_typename)
        self.clients_sub_idx.append(predicate_info['sub_idx'])
        try:
            self.service_clients.append(
                rospy.ServiceProxy(predicate_info['service'],
                                   eval(srv_typename)))
            self.service_names.append(predicate_info['service'])
        except KeyError:
            rospy.logerr("Error: service was not specified for predicate %s" %
                         predicate_name)
            return False
        self.service_predicate_names.append(predicate_name)
        self.last_called_time.append(rospy.Time(0))

        try:
            self.time_between_calls.append(
                predicate_info['time_between_calls'])
        except:
            rospy.logerr(
                "Error: time_between_calls was not specified for predicate %s"
                % predicate_name)
            return False

        # Gets the request creation
        if 'request' in predicate_info:
            self.request_src.append(predicate_info['request'])
        else:
            self.request_src.append(None)

        # Gets the result processing
        if 'operation' in predicate_info:
            self.response_process_src.append(predicate_info['operation'])
        else:
            self.response_process_src.append(None)

        try:  # Update KB to inform about the sensed predicates
            sensed_srv_req = SetNamedBoolRequest()
            sensed_srv_req.name = predicate_name
            sensed_srv_req.value = True
            self.set_sensed_predicate_srv.call(sensed_srv_req)
        except Exception as e:
            rospy.logerr(
                'KCL: (RosplanSensing) Could not update sensing information in Knowledge Base for proposition %s',
                predicate_name)
        rospy.loginfo(
            'KCL: (RosplanSensing) Predicate %s: Client for service %s of type %s is ready',
            predicate_name, predicate_info['service'], srv_type)
        return True
예제 #3
0
    def __init__(self):
        self.mutex = Lock()
        self.srv_mutex = Lock()

        ################################################################################################################
        # Init clients and publishers
        rospy.wait_for_service('/rosplan_knowledge_base/update_array')
        self.update_kb_srv = rospy.ServiceProxy(
            '/rosplan_knowledge_base/update_array',
            KnowledgeUpdateServiceArray)
        rospy.wait_for_service(
            '/rosplan_knowledge_base/domain/predicate_details')
        self.get_predicates_srv = rospy.ServiceProxy(
            '/rosplan_knowledge_base/domain/predicate_details',
            GetDomainPredicateDetailsService)
        rospy.wait_for_service('/rosplan_knowledge_base/domain/functions')
        self.get_functions_srv = rospy.ServiceProxy(
            '/rosplan_knowledge_base/domain/functions',
            GetDomainAttributeService)
        rospy.wait_for_service('/rosplan_knowledge_base/state/instances')
        self.get_instances_srv = rospy.ServiceProxy(
            '/rosplan_knowledge_base/state/instances', GetInstanceService)
        rospy.wait_for_service('/rosplan_knowledge_base/state/propositions')
        self.get_state_propositions_srv = rospy.ServiceProxy(
            '/rosplan_knowledge_base/state/propositions', GetAttributeService)
        rospy.wait_for_service('/rosplan_knowledge_base/state/functions')
        self.get_state_functions_srv = rospy.ServiceProxy(
            '/rosplan_knowledge_base/state/functions', GetAttributeService)

        set_sensed_predicate_srv = rospy.ServiceProxy(
            '/rosplan_knowledge_base/update_sensed_predicates', SetNamedBool)

        ################################################################################################################
        # Get cfg
        self.cfg_topics = self.cfg_service = {}
        self.functions_path = None
        found_config = False
        if rospy.has_param('~topics'):
            self.cfg_topics = rospy.get_param('~topics')
            found_config = True
        if rospy.has_param('~services'):
            self.cfg_service = rospy.get_param('~services')
            found_config = True
        if rospy.has_param('~functions'):
            self.functions_path = rospy.get_param('~functions')[0]
            regexp = re.compile('\$\(find (.*)\)')
            groups = regexp.match(self.functions_path).groups()
            if len(groups):
                try:
                    ros_pkg_path = rospkg.RosPack().get_path(groups[0])
                    self.functions_path = regexp.sub(ros_pkg_path,
                                                     self.functions_path)
                except:
                    rospy.logerr(
                        'KCL: (RosplanSensing) Error: Package %s was not found! Fix configuration file and retry.'
                        % groups[0])
                    rospy.signal_shutdown('Wrong path in cfg file')
                    return
        if not found_config:
            rospy.logerr(
                'KCL: (RosplanSensing) Error: configuration file is not defined!'
            )
            rospy.signal_shutdown('Config not found')
            return

        ################################################################################################################
        # Load scripts
        if self.functions_path:
            self.scripts = imp.load_source('sensing_scripts',
                                           self.functions_path)
            # Declare tools in the scripts module:
            self.scripts.get_kb_attribute = self.get_kb_attribute
            self.scripts.rospy = rospy

        ################################################################################################################
        # Init variables
        self.sensed_topics = {}
        self.sensed_services = {}
        self.params = {}  # Params defined for each predicate

        ######
        # Subscribe to all the topics
        self.offset = {}  # Offset for reading cfg
        for predicate_name, predicate_info in self.cfg_topics.iteritems():
            params_loaded = self.load_params(
                predicate_name,
                predicate_info)  # If parameters found, add 1 to the indexes
            if not params_loaded[0]:
                continue
            if len(predicate_info) < 2 + int(params_loaded[1]):
                rospy.logerr(
                    "Error: Wrong configuration file for predicate %s" %
                    predicate_name)
                continue
            try:
                msg_type = predicate_info['msg_type']
            except KeyError:
                rospy.logerr(
                    "Error: msg_type was not specified for predicate %s" %
                    predicate_name)
                continue
            self.import_msg(msg_type)
            try:
                rospy.Subscriber(predicate_info['topic'],
                                 eval(msg_type[msg_type.rfind('/') + 1:]),
                                 self.subs_callback, predicate_name)
            except KeyError:
                rospy.logerr(
                    "Error: topic was not specified for predicate %s" %
                    predicate_name)
                continue
            # self.sensed_topics[predicate_name] = (None, False)
            try:  # Update KB to inform about the sensed predicates
                sensed_srv_req = SetNamedBoolRequest()
                sensed_srv_req.name = predicate_name
                sensed_srv_req.value = True
                set_sensed_predicate_srv.call(sensed_srv_req)
            except Exception as e:
                rospy.logerr(
                    'KCL: (RosplanSensing) Could not update sensing information in Knowledge Base for proposition %s',
                    predicate_name)
            rospy.loginfo(
                'KCL: (RosplanSensing) Predicate %s: Subscribed to topic %s of type %s',
                predicate_name, predicate_info['topic'], msg_type)

        ############
        # Create clients for all the services
        self.service_clients = []
        self.service_names = []
        self.service_type_names = []
        self.service_predicate_names = []
        self.last_called_time = []
        self.time_between_calls = []
        self.request_src = []
        self.response_process_src = []
        for predicate_name, predicate_info in self.cfg_service.iteritems():
            params_loaded = self.load_params(
                predicate_name,
                predicate_info)  # If parameters found, add 1 to the indexes
            if not params_loaded[0]:
                continue
            if len(predicate_info) < 2 + int(params_loaded[1]):
                rospy.logerr(
                    "Error: Wrong configuration file for predicate %s" %
                    predicate_name)
                continue
            try:
                srv_type = predicate_info['srv_type']
            except KeyError:
                rospy.logerr(
                    "Error: service was not specified for predicate %s" %
                    predicate_name)
                continue
            srv_typename = self.import_srv(srv_type)
            self.service_type_names.append(srv_typename)
            try:
                self.service_clients.append(
                    rospy.ServiceProxy(predicate_info['service'],
                                       eval(srv_typename)))
                self.service_names.append(predicate_info['service'])
            except KeyError:
                rospy.logerr(
                    "Error: service was not specified for predicate %s" %
                    predicate_name)
                continue
            self.service_predicate_names.append(predicate_name)
            self.last_called_time.append(rospy.Time(0))

            try:
                self.time_between_calls.append(
                    predicate_info['time_between_calls'])
            except:
                rospy.logerr(
                    "Error: time_between_calls was not specified for predicate %s"
                    % predicate_name)
                continue

            # Gets the request creation
            if 'request' in predicate_info:
                self.request_src.append(predicate_info['request'])
            else:
                self.request_src.append(None)

            # Gets the result processing
            if 'operation' in predicate_info:
                self.response_process_src.append(predicate_info['operation'])
            else:
                self.response_process_src.append(None)

            try:  # Update KB to inform about the sensed predicates
                sensed_srv_req = SetNamedBoolRequest()
                sensed_srv_req.name = predicate_name
                sensed_srv_req.value = True
                set_sensed_predicate_srv.call(sensed_srv_req)
            except Exception as e:
                rospy.logerr(
                    'KCL: (RosplanSensing) Could not update sensing information in Knowledge Base for proposition %s',
                    predicate_name)
            rospy.loginfo(
                'KCL: (RosplanSensing) Predicate %s: Client for service %s of type %s is ready',
                predicate_name, predicate_info['service'], srv_type)