def _associate_child_to_robot(obj, robot_instance, unset_default): """ Reference the link of all obj to their associated robot_instance. If it is an external robot_instance, unset default_action """ # Create an empty list for the components of this robot robot_instance.components = [] for child in obj.childrenRecursive: try: # Look for the components tagged as such child["Component_Tag"] except KeyError: continue robot_instance.components.append(child) if not "classpath" in child: logger.error( "No 'classpath' in child %s\n Please make sure you " "are using the new builder classes" % str(child.name) ) return False # Create an instance of the component class # and add it to the component list of persistantstorage() instance = create_instance_level(child["classpath"], child.get("abstraction_level"), child, robot_instance) if instance: persistantstorage.componentDict[child.name] = instance else: logger.error( "INITIALIZATION ERROR: the component '%s'" " could not be properly initialized. Error when " "creating the class instance", obj.name, ) return False # Unset the default action of components of external robots if unset_default: instance.default_action = no_op logger.info("Component " + child.name + " disabled: parent " + obj.name + " is an External robot.") else: logger.info( "Component %s %s added to %s" % ( child.name, "(level: %s)" % child.get("abstraction_level") if child.get("abstraction_level") else "", obj.name, ) ) return True
def _associate_child_to_robot(obj, robot_instance, unset_default): """ Reference the link of all obj to their associated robot_instance. If it is an external robot_instance, unset default_action """ # Create an empty list for the components of this robot robot_instance.components = [] for child in obj.childrenRecursive: try: # Look for the components tagged as such child['Component_Tag'] except KeyError: continue robot_instance.components.append(child) if not 'classpath' in child: logger.error("No 'classpath' in child %s\n Please make sure you " "are using the new builder classes" % str(child.name)) return False # Create an instance of the component class # and add it to the component list of persistantstorage() instance = create_instance_level(child['classpath'], child.get('abstraction_level'), child, robot_instance) if instance: persistantstorage.componentDict[child.name] = instance else: logger.error(""" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! INITIALIZATION ERROR: the component '""" + obj.name + """' could not be properly initialized. There was an error when creating the class instance. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! """) return False # Unset the default action of components of external robots if unset_default: instance.default_action = no_op logger.info("Component " + child.name + " disabled: parent " \ + obj.name + " is an External robot.") else: logger.info( "Component %s %s added to %s" % (child.name, "(level: %s)" % child.get("abstraction_level") if child.get("abstraction_level") else "", obj.name)) return True
def create_dictionaries (): """Creation of a list of all the robots and components in the scene. Uses the properties of the objects to determine what they are.""" # Create a dictionary that stores initial positions of all objects # in the simulation, used to reset the simulation. persistantstorage.blender_objects = {} # Create a dictionary of the components in the scene persistantstorage.componentDict = {} # Create a dictionary of the robots in the scene persistantstorage.robotDict = {} # Create a dictionary of the external robots in the scene # Used for the multi-node simulation persistantstorage.externalRobotDict = {} # Create a dictionnary with the passive, but interactive (ie, with an # 'Object' property) objects in the scene. persistantstorage.passiveObjectsDict = {} # Create a dictionary with the modifiers persistantstorage.modifierDict = {} # Create a dictionary with the datastream interfaces used persistantstorage.datastreamDict = {} # this dictionary stores, for each components, the direction and the # configured datastream interfaces. Direction is 'IN' for streams # that are read by MORSE (typically, for actuators), and 'OUT' # for streams published by MORSE (typically, for sensors) persistantstorage.datastreams = {} # Create a dictionnary with the overlaid used persistantstorage.overlayDict = {} # Create a dictionnary for the 'service object', such as supervision persistantstorage.serviceObjectDict = {} # Create the 'request managers' manager persistantstorage.morse_services = MorseServices() scene = morse.core.blenderapi.scene() # Store the position and orientation of all objects for obj in scene.objects: if obj.parent is None: import mathutils pos = mathutils.Vector(obj.worldPosition) ori = mathutils.Matrix(obj.worldOrientation) persistantstorage.blender_objects[obj] = [pos, ori] # Get the list of passive interactive objects. # These objects have a 'Object' property set to true # (plus several other optional properties). # See the documentation for the up-to-date list # (doc/morse/user/others/passive_objects.rst) -- or read the code below :-) for obj in scene.objects: # Check the object has an 'Object' property set to true if 'Object' in obj and obj['Object']: details = { 'label': obj['Label'] if 'Label' in obj else str(obj), 'description': obj['Description'] if 'Description' in obj else "", 'type': obj['Type'] if 'Type' in obj else "Object", 'graspable': obj['Graspable'] if 'Graspable' in obj else False } persistantstorage.passiveObjectsDict[obj] = details logger.info("Added {name} as a {graspable}active object".format( name = details['label'], graspable = "graspable " if details['graspable'] else "")) if not persistantstorage.passiveObjectsDict: logger.info("No passive objects in the scene.") # Get the robots for obj in scene.objects: if 'Robot_Tag' in obj or 'External_Robot_Tag' in obj: if not 'classpath' in obj: logger.error("No 'classpath' in %s\n Please make sure you are " "using the new builder classes"%str(obj.name)) return False # Create an object instance and store it instance = create_instance_level(obj['classpath'], obj.get('abstraction_level'), obj) if not instance: logger.error("Could not create %s"%str(obj['classpath'])) return False # store instance in persistant storage dictionary if 'Robot_Tag' in obj: persistantstorage.robotDict[obj] = instance else: persistantstorage.externalRobotDict[obj] = instance if not (persistantstorage.robotDict or persistantstorage.externalRobotDict): # No robot! logger.error("INITIALIZATION ERROR: no robot in your simulation!" "Do not forget that components _must_ belong to a" "robot (you can not have free objects)") return False # Get the robot and its instance for obj, robot_instance in persistantstorage.robotDict.items(): if not _associate_child_to_robot(obj, robot_instance, False): return False # Get the external robot and its instance for obj, robot_instance in persistantstorage.externalRobotDict.items(): if not _associate_child_to_robot(obj, robot_instance, True): return False # Check we have no 'free' component (they all must belong to a robot) for obj in scene.objects: try: obj['Component_Tag'] if obj.name not in persistantstorage.componentDict.keys(): logger.error("INITIALIZATION ERROR: the component '%s' " "does not belong to any robot: you need to fix " "that by parenting it to a robot." % obj.name) return False except KeyError as detail: pass # Will return true always (for the moment) return True
def create_dictionaries (): """Creation of a list of all the robots and components in the scene. Uses the properties of the objects to determine what they are.""" # Create a dictionary that stores initial positions of all objects # in the simulation, used to reset the simulation. persistantstorage.blender_objects = {} # Create a dictionary of the components in the scene persistantstorage.componentDict = {} # Create a dictionary of the robots in the scene persistantstorage.robotDict = {} # Create a dictionary of the external robots in the scene # Used for the multi-node simulation persistantstorage.externalRobotDict = {} # Create a dictionnary with the passive, but interactive (ie, with an # 'Object' property) objects in the scene. persistantstorage.passiveObjectsDict = {} # Create a dictionary with the modifiers persistantstorage.modifierDict = {} # Create a dictionary with the datastream interfaces used persistantstorage.datastreamDict = {} # this dictionary stores, for each components, the direction and the # configured datastream interfaces. Direction is 'IN' for streams # that are read by MORSE (typically, for actuators), and 'OUT' # for streams published by MORSE (typically, for sensors) persistantstorage.datastreams = {} # Create a dictionnary with the overlaid used persistantstorage.overlayDict = {} # Create the 'request managers' manager persistantstorage.morse_services = MorseServices() scene = morse.core.blenderapi.scene() # Store the position and orientation of all objects for obj in scene.objects: if obj.parent == None: import mathutils pos = mathutils.Vector(obj.worldPosition) ori = mathutils.Matrix(obj.worldOrientation) persistantstorage.blender_objects[obj] = [pos, ori] # Get the list of passive interactive objects. # These objects have a 'Object' property set to true # (plus several other optional properties). # See the documentation for the up-to-date list # (doc/morse/user/others/passive_objects.rst) -- or read the code below :-) for obj in scene.objects: # Check the object has an 'Object' property set to true if 'Object' in obj and obj['Object']: details = { 'label': obj['Label'] if 'Label' in obj else str(obj), 'description': obj['Description'] if 'Description' in obj else "", 'type': obj['Type'] if 'Type' in obj else "Object", 'graspable': obj['Graspable'] if 'Graspable' in obj else False } persistantstorage.passiveObjectsDict[obj] = details logger.info("Added {name} as a {graspable}active object".format( name = details['label'], graspable = "graspable " if details['graspable'] else "")) if not persistantstorage.passiveObjectsDict: logger.info("No passive objects in the scene.") # Get the robots for obj in scene.objects: if 'Robot_Tag' in obj or 'External_Robot_Tag' in obj: if not 'classpath' in obj: logger.error("No 'classpath' in %s\n Please make sure you are " "using the new builder classes"%str(obj.name)) return False # Create an object instance and store it instance = create_instance_level(obj['classpath'], obj.get('abstraction_level'), obj) if not instance: logger.error("Could not create %s"%str(obj['classpath'])) return False # store instance in persistant storage dictionary if 'Robot_Tag' in obj: persistantstorage.robotDict[obj] = instance else: persistantstorage.externalRobotDict[obj] = instance if not (persistantstorage.robotDict or \ persistantstorage.externalRobotDict): # No robot! logger.error("INITIALIZATION ERROR: no robot in your simulation!" "Do not forget that components _must_ belong to a" "robot (you can not have free objects)") return False # Get the robot and its instance for obj, robot_instance in persistantstorage.robotDict.items(): if not _associate_child_to_robot(obj, robot_instance, False): return False # Get the external robot and its instance for obj, robot_instance in persistantstorage.externalRobotDict.items(): if not _associate_child_to_robot(obj, robot_instance, True): return False # Check we have no 'free' component (they all must belong to a robot) for obj in scene.objects: try: obj['Component_Tag'] if obj.name not in persistantstorage.componentDict.keys(): logger.error("INITIALIZATION ERROR: the component '%s' " "does not belong to any robot: you need to fix " "that by parenting it to a robot." % obj.name) return False except KeyError as detail: pass # Will return true always (for the moment) return True