Esempio n. 1
0
def _make_predicate(type_name, parameters):

    new_type_name, is_negative = _is_predicate_negative(type_name)
    kb_item = KnowledgeItem()
    kb_item.knowledge_type = KB_ITEM_FACT
    kb_item.is_negative = is_negative
    kb_item.attribute_name = new_type_name
    kb_item.values = dict_to_keyval(parameters)
    return kb_item
Esempio n. 2
0
def predicate_maker(attr_name, attr_key, attr_value, is_negative=None):
    ki = KnowledgeItem()
    ki.knowledge_type = 1
    ki.attribute_name = attr_name
    ki_values = []
    if type(attr_key) == list:
        for key, value in zip(attr_key, attr_value):
            kv = KeyValue()
            kv.key = key
            kv.value = value
            ki_values.append(kv)
    else:
        kv = KeyValue()
        kv.key = attr_key
        kv.value = attr_value
        ki_values.append(kv)
    ki.values = ki_values
    if is_negative:
        ki.is_negative = is_negative
    return ki
Esempio n. 3
0
    def generate_knowledge_base(self):

        # Remove earlier entries from knowledge database
        self.clear_knowledge()

        empty_waypoints = []
        valid_occupants =  self.objects['drone'] + self.objects['turtlebot']
        for loc in self.objects['waypoint'] + self.objects['airwaypoint']:
            valid = False
            if loc in self.at:
                for o in self.at[loc]:
                    valid = True if (o in valid_occupants) else valid

            if not valid:
                empty_waypoints.append(loc)

       # Set up waypoint distances
        for wp1 in self.objects['waypoint']:
            for wp2 in self.objects['waypoint']:
                kitem = KnowledgeItem()
                kitem.knowledge_type = KnowledgeItem.FUNCTION
                kitem.attribute_name = "move-duration"
                kitem.values = [KeyValue('from', wp1), KeyValue('to', wp2)]
                kitem.function_value = self.waypoint_distance(wp1,wp2)
                self.update_knowledge(update_type=KnowledgeUpdateServiceEnum.ADD_KNOWLEDGE, knowledge=kitem)

        for wp1 in self.objects['airwaypoint']:
            for wp2 in self.objects['airwaypoint']:
                kitem = KnowledgeItem()
                kitem.knowledge_type = KnowledgeItem.FUNCTION
                kitem.attribute_name = "move-duration"
                kitem.values = [KeyValue('from', wp1), KeyValue('to', wp2)]
                kitem.function_value = self.waypoint_distance(wp1,wp2)
                self.update_knowledge(update_type=KnowledgeUpdateServiceEnum.ADD_KNOWLEDGE, knowledge=kitem)

        # Set empty for agents and waypoints
        for obj in self.objects['drone'] + self.objects['turtlebot'] + empty_waypoints:
            kitem = KnowledgeItem()
            kitem.knowledge_type = KnowledgeItem.FACT
            kitem.values = [KeyValue('aw_object', obj)]
            kitem.attribute_name = 'empty'
            self.update_knowledge(update_type=KnowledgeUpdateServiceEnum.ADD_KNOWLEDGE, knowledge=kitem)

        # Add agents
        for key, items in self.objects.iteritems():
            for item in items:
                kitem = KnowledgeItem()
                kitem.knowledge_type = KnowledgeItem.INSTANCE
                kitem.instance_type = key
                kitem.instance_name = item
                self.update_knowledge(update_type=KnowledgeUpdateServiceEnum.ADD_KNOWLEDGE, knowledge=kitem)

        # Add locations for agents and boxes
        for key, values in self.at.iteritems():
            for value in values:
                kitem = KnowledgeItem()
                kitem.knowledge_type = KnowledgeItem.FACT
                kitem.values = [KeyValue('object', value), KeyValue('waypoint', key)]
                kitem.attribute_name = 'at'
                self.update_knowledge(update_type=KnowledgeUpdateServiceEnum.ADD_KNOWLEDGE, knowledge=kitem)
        
        # Add state airborne to drones at air waypoints
        for air_wp in self.objects['airwaypoint']:
            for drone in self.objects['drone']:
                if drone in self.at[air_wp]:
                    kitem = KnowledgeItem()
                    kitem.knowledge_type = KnowledgeItem.FACT
                    kitem.values = [KeyValue('drone', drone)]
                    kitem.attribute_name = 'airborne'
                    self.update_knowledge(update_type=KnowledgeUpdateServiceEnum.ADD_KNOWLEDGE, knowledge=kitem)

        # Set relation between air and ground waypoints
        for air, ground in zip(self.objects['airwaypoint'], self.objects['waypoint']):
            kitem = KnowledgeItem()
            kitem.knowledge_type = KnowledgeItem.FACT
            kitem.values = [KeyValue('airwaypoint', air), KeyValue('waypoint', ground)]
            kitem.attribute_name = 'over'
            self.update_knowledge(update_type=KnowledgeUpdateServiceEnum.ADD_KNOWLEDGE, knowledge=kitem)

        # Set rescued persons
        for person in self.rescued:
            kitem = KnowledgeItem()
            kitem.knowledge_type = KnowledgeItem.FACT
            kitem.values = [KeyValue('person', person)]
            kitem.attribute_name = 'handled'
            self.update_knowledge(update_type=KnowledgeUpdateServiceEnum.ADD_KNOWLEDGE, knowledge=kitem)

        # Set goals, each person should be handled
        for person in self.objects['person']:
            kitem = KnowledgeItem()
            kitem.knowledge_type = KnowledgeItem.FACT
            kitem.values = [KeyValue('person', person)]
            kitem.attribute_name = 'handled'
            self.update_knowledge(update_type=KnowledgeUpdateServiceEnum.ADD_GOAL, knowledge=kitem)
    def make_srv_req_to_KB(
        knowledge_type_is_instance=True,
        instance_type="",
        instance_name="",
        attribute_name="",
        values=[],
        update_type_is_knowledge=True,
    ):
        """
        make a service call to ``rosplan_knowledge_base`` (mongodb)

        :param knowledge_type_is_instance: type of knowledge
        :type knowledge_type_is_instance: bool
        :param instance_type: type of instance
        :type instance_type: str
        :param instance_name: name of instance
        :type instance_name: str
        :param attribute_name: name of attribute
        :type attribute_name: str
        :param values: values for attribute
        :type value: list (tuple (str, str))
        :param update_type_is_knowledge: type of update to be performed
        :type update_type_is_knowledge: bool
        :return: success
        :rtype: bool

        example 1:
        **upload instance**: youbot has one ``dynamixel`` ``gripper``.

        .. code-block:: bash

            rosservice call /rosplan_knowledge_base/update "update_type: 0
                knowledge:
                knowledge_type: 0
                instance_type: 'gripper'
                instance_name: 'dynamixel'
                attribute_name: ''
                values: {}
                function_value: 0.0";

        To perform the following using this function

        .. code-block:: python

            ProblemUploader.make_srv_req_to_KB(knowledge_type_is_instance=True,
                                               instance_type='gripper',
                                               instance_name='dynamixel')

        example 2:
        **upload fact**: object ``o4`` is on location ``S3``

        .. code-block:: bash

            rosservice call /rosplan_knowledge_base/update "update_type: 0
                knowledge:
                knowledge_type: 1
                instance_type: ''
                instance_name: ''
                attribute_name: 'on'
                values:
                - {key: 'o', value: 'o4'}
                - {key: 'l', value: 'S3'}
                function_value: 0.0";

        To perform the following using this function

        .. code-block:: python

            ProblemUploader.make_srv_req_to_KB(knowledge_type_is_instance=False,
                                               attribute_name='on',
                                               values=[('o', 'o4'),
                                                       ('l', 'S3')])

        """
        msg = KnowledgeItem()
        if knowledge_type_is_instance:
            msg.knowledge_type = KnowledgeItem.INSTANCE
            msg.instance_type = instance_type
            msg.instance_name = instance_name.upper()
        else:
            msg.knowledge_type = KnowledgeItem.FACT
            msg.attribute_name = attribute_name
            msg.values = [KeyValue(i[0], i[1].upper()) for i in values]

        update_kb_topic = "/rosplan_knowledge_base/update"
        rospy.loginfo("Waiting for " + update_kb_topic)
        rospy.wait_for_service(update_kb_topic)

        try:
            update_kb = rospy.ServiceProxy(update_kb_topic,
                                           KnowledgeUpdateService)
            if update_type_is_knowledge:
                response = update_kb(Req.ADD_KNOWLEDGE, msg)
            else:
                response = update_kb(Req.ADD_GOAL, msg)

        except rospy.ServiceException as e:
            rospy.logerr("Service call failed: %s" % e)

        if response.success:
            rospy.loginfo("KB updated successfully.")
            return True
        else:
            rospy.logerror("KB update failed.")
            return False