def deriveController(obj): """ Args: obj: Returns: """ import phobos.model.models as models props = models.initObjectProperties(obj, phobostype='controller') # return None if no controller is found (there will always be at least a name in the props) if len(props) < 2: return None if not obj.parent or obj.parent.phobostype not in defs.controllabletypes: log( ( "Can not derive controller from {}. " + "Insufficient requirements from parent object!" ).format(obj.name), 'ERROR', ) return None props['target'] = nUtils.getObjectName(obj.parent) log( " Derived controller '{}' for target '{}'.".format(props['name'], props['target']), 'DEBUG' ) return props
def deriveEntity(root, outpath): """Derives the dictionary for a SMURF entity from the phobos model dictionary. # TODO savetosubfolder is not a parameter Args: root(bpy.types.Object): The smurf root object. outpath(str): The path to export the smurf to. savetosubfolder(bool): If True the export path has a subfolder for this smurf entity. Returns: : dict - An entry for the scenes entitiesList """ entitypose = models.deriveObjectPose(root) entity = models.initObjectProperties(root, 'entity', ['link', 'joint', 'motor']) if 'parent' not in entity and 'joint/type' in root and root[ 'joint/type'] == 'fixed': entity['parent'] = 'world' entity["position"] = entitypose["translation"] entity["rotation"] = entitypose["rotation_quaternion"] # check model data if entity is a reference # FIXME: this part is broken but not used at the moment anyways if "isReference" in entity: entity.pop("isReference") bpy.ops.scene.reload_models_and_poses_operator() modelsPosesColl = bUtils.getPhobosPreferences().models_poses for robot_model in modelsPosesColl: if (root["model/name"] == robot_model.robot_name) and (root["entity/pose"] == robot_model.label): pass entity['file'] = os.path.join( os.path.relpath(robot_model.path, outpath), root["name"] + ".smurf") """ with open(os.path.join(os.path.dirname(defs.__file__), "RobotLib.yml"), "r") as f: robots = yaml.load(f.read()) sourcepath = robots[smurf["model/name"]] for filename in os.listdir(sourcepath): fullpath = os.path.join(sourcepath, filename) if os.path.isfile(fullpath): shutil.copy2(fullpath, os.path.join(smurf_outpath, filename)) else: # remove old folders to prevent errors in copytree shutil.rmtree(os.path.join(smurf_outpath, filename), True) shutil.copytree(fullpath, os.path.join(smurf_outpath, filename)) """ else: modelpath = os.path.join(outpath, root['model/name'], 'smurf') # TODO why the spacing between the paths? log("Scene paths: " + outpath + ' ' + modelpath, "DEBUG") entity['file'] = os.path.join( os.path.relpath(modelpath, os.path.dirname(outpath)), root['model/name'] + ".smurf") return entity
def deriveEntity(root, outpath): """Derives the dictionary for a SMURF entity from the phobos model dictionary. # TODO savetosubfolder is not a parameter Args: root(bpy.types.Object): The smurf root object. outpath(str): The path to export the smurf to. savetosubfolder(bool): If True the export path has a subfolder for this smurf entity. Returns: : dict - An entry for the scenes entitiesList """ entitypose = models.deriveObjectPose(root) entity = models.initObjectProperties(root, 'entity', ['link', 'joint', 'motor']) if 'parent' not in entity and 'joint/type' in root and root['joint/type'] == 'fixed': entity['parent'] = 'world' entity["position"] = entitypose["translation"] entity["rotation"] = entitypose["rotation_quaternion"] # check model data if entity is a reference # FIXME: this part is broken but not used at the moment anyways if "isReference" in entity: entity.pop("isReference") bpy.ops.scene.reload_models_and_poses_operator() modelsPosesColl = bUtils.getPhobosPreferences().models_poses for robot_model in modelsPosesColl: if (root["model/name"] == robot_model.robot_name) and ( root["entity/pose"] == robot_model.label ): pass entity['file'] = os.path.join( os.path.relpath(robot_model.path, outpath), root["name"] + ".smurf" ) """ with open(os.path.join(os.path.dirname(defs.__file__), "RobotLib.yml"), "r") as f: robots = yaml.load(f.read()) sourcepath = robots[smurf["model/name"]] for filename in os.listdir(sourcepath): fullpath = os.path.join(sourcepath, filename) if os.path.isfile(fullpath): shutil.copy2(fullpath, os.path.join(smurf_outpath, filename)) else: # remove old folders to prevent errors in copytree shutil.rmtree(os.path.join(smurf_outpath, filename), True) shutil.copytree(fullpath, os.path.join(smurf_outpath, filename)) """ else: modelpath = os.path.join(outpath, root['model/name'], 'smurf') # TODO why the spacing between the paths? log("Scene paths: " + outpath + ' ' + modelpath, "DEBUG") entity['file'] = os.path.join( os.path.relpath(modelpath, os.path.dirname(outpath)), root['model/name'] + ".smurf" ) return entity
def deriveMotor(obj, jointdict=None): """Derives motor information from an object. Args: obj(bpy_types.Object): Blender object to derive the motor from jointdict(dict, optional): phobos representation of the respective joint (Default value = None) Returns: : dict -- phobos representation of a motor """ import phobos.model.models as models import phobos.model.controllers as controllermodel props = models.initObjectProperties(obj, phobostype='motor') # return None if no motor is attached (there will always be at least a name in the props) if len(props) < 2: return None # make sure the parent is a joint if not obj.parent or obj.parent.phobostype != 'link' or 'joint/type' not in obj.parent: log( "Can not derive motor from {}. Insufficient requirements from parent object!" .format(obj.name), 'ERROR', ) return None props['joint'] = nUtils.getObjectName(obj.parent, phobostype='joint') # try to derive the motor controller controllerobjs = [ control for control in obj.children if control.phobostype == 'controller' ] if controllerobjs: controller = controllermodel.deriveController(controllerobjs[0]) else: controller = None # assign the derived controller if controller: props['controller'] = controller['name'] else: del props['controller'] return props
def deriveMotor(obj, jointdict=None): """Derives motor information from an object. Args: obj(bpy_types.Object): Blender object to derive the motor from jointdict(dict, optional): phobos representation of the respective joint (Default value = None) Returns: : dict -- phobos representation of a motor """ import phobos.model.models as models import phobos.model.controllers as controllermodel props = models.initObjectProperties(obj, phobostype='motor') # return None if no motor is attached (there will always be at least a name in the props) if len(props) < 2: return None # make sure the parent is a joint if not obj.parent or obj.parent.phobostype != 'link' or 'joint/type' not in obj.parent: log( "Can not derive motor from {}. Insufficient requirements from parent object!".format( obj.name ), 'ERROR', ) return None props['joint'] = nUtils.getObjectName(obj.parent, phobostype='joint') # try to derive the motor controller controllerobjs = [control for control in obj.children if control.phobostype == 'controller'] if controllerobjs: controller = controllermodel.deriveController(controllerobjs[0]) else: controller = None # assign the derived controller if controller: props['controller'] = controller['name'] else: del props['controller'] return props
def deriveGenericEntity(entityobj, outpath=None): """This function handles an entity of unknown type by simply exporting its custom properties. :param entityobj: The object representing the entity. :type entityobj: bpy.types.Object :param outpath: If True data will be exported into subfolders. :type outpath: str :return: dict - An entry for the scenes entitiesList """ log("Exporting " + nUtils.getObjectName(entityobj, 'entity') + " as entity of type 'generic", "INFO") entity = models.initObjectProperties(entityobj, 'entity', ['geometry']) return entity # write urdf urdf_path = "../urdf/" if structured else '' urdf_filename = model['name'] + ".urdf" exportModelToURDF(model, os.path.join(path, urdf_path, urdf_filename), '../meshes/' if structured else '')
def deriveSensor(obj, names=False, objectlist=[], logging=False): """This function derives a sensor from a given blender object Args: obj(bpy_types.Object): The blender object to derive the sensor from. names(bool, optional): return the l object name instead of an object link. (Default value = False) objectlist(list(bpy.types.Object, optional): objectlist to which possible parents are restricted (Default value = []) logging(bool, optional): whether to write log messages or not (Default value = False) Returns: : dict -- phobos representation of the sensor """ from phobos.model.models import initObjectProperties from phobos.model.poses import deriveObjectPose if logging: log( "Deriving sensor from object " + nUtils.getObjectName(obj, phobostype='sensor') + ".", 'DEBUG', ) try: props = initObjectProperties(obj, phobostype='sensor', ignoretypes=('pose')) if names: props['link'] = nUtils.getObjectName(sUtils.getEffectiveParent( obj, objectlist=objectlist), phobostype='link') else: props['link'] = sUtils.getEffectiveParent(obj, objectlist=objectlist) except KeyError: if logging: log("Missing data in sensor " + obj.name, "ERROR") return None props['pose'] = deriveObjectPose(obj) return props
def deriveEntity(primitive, outpath): """This function handles a primitive entity in a scene to export it # TODO is this even a heightmap? Args: smurf(bpy.types.Object): The heightmap root object. outpath(str): The path to export to. Not used for primitives savetosubfolder(bool): If True data will be exported into subfolders. Not used for primitives primitive: Returns: : dict - An entry for the scenes entitiesList """ entity = models.initObjectProperties(primitive, 'entity', ['geometry']) pose = deriveObjectPose(primitive) entity['geometry'] = deriveGeometry(primitive) entity['position'] = { 'x': pose['translation'][0], 'y': pose['translation'][1], 'z': pose['translation'][2], } entity['rotation'] = { 'w': pose['rotation_quaternion'][0], 'x': pose['rotation_quaternion'][1], 'y': pose['rotation_quaternion'][2], 'z': pose['rotation_quaternion'][3], } if 'radius' in entity['geometry']: entity['radius'] = entity['geometry']['radius'] # entity['extend'] = {'x': entity['geometry']['size'][0], # 'y': entity['geometry']['size'][1], # 'z': entity['geometry']['size'][2]} entity['extend'] = { 'x': primitive.dimensions[0], 'y': primitive.dimensions[1], 'z': primitive.dimensions[2], } return entity
def deriveEntity(entity, outpath, savetosubfolder): """This function handles a primitive entity in a scene to export it :param smurf: The heightmap root object. :type smurf: bpy.types.Object :param outpath: The path to export to. Not used for primitives :type outpath: str :param savetosubfolder: If True data will be exported into subfolders. Not used for primitives :type savetosubfolder: bool :return: dict - An entry for the scenes entitiesList """ primitive = entity log( "Exporting " + nUtils.getObjectName(primitive, 'entity') + " as entity of type 'primitive", "INFO") entity = models.initObjectProperties(primitive, 'entity', ['geometry']) pose = deriveObjectPose(primitive) entity['geometry'] = deriveGeometry(primitive) entity['position'] = { 'x': pose['translation'][0], 'y': pose['translation'][1], 'z': pose['translation'][2] } entity['rotation'] = { 'w': pose['rotation_quaternion'][0], 'x': pose['rotation_quaternion'][1], 'y': pose['rotation_quaternion'][2], 'z': pose['rotation_quaternion'][3] } entity['extend'] = { 'x': entity['geometry']['size'][0], 'y': entity['geometry']['size'][1], 'z': entity['geometry']['size'][2] } return entity
def deriveEntity(primitive, outpath): """This function handles a primitive entity in a scene to export it :param smurf: The heightmap root object. :type smurf: bpy.types.Object :param outpath: The path to export to. Not used for primitives :type outpath: str :param savetosubfolder: If True data will be exported into subfolders. Not used for primitives :type savetosubfolder: bool :return: dict - An entry for the scenes entitiesList """ entity = models.initObjectProperties(primitive, 'entity', ['geometry']) pose = deriveObjectPose(primitive) entity['geometry'] = deriveGeometry(primitive) entity['position'] = { 'x': pose['translation'][0], 'y': pose['translation'][1], 'z': pose['translation'][2] } entity['rotation'] = { 'w': pose['rotation_quaternion'][0], 'x': pose['rotation_quaternion'][1], 'y': pose['rotation_quaternion'][2], 'z': pose['rotation_quaternion'][3] } if 'radius' in entity['geometry']: entity['radius'] = entity['geometry']['radius'] #entity['extend'] = {'x': entity['geometry']['size'][0], # 'y': entity['geometry']['size'][1], # 'z': entity['geometry']['size'][2]} entity['extend'] = { 'x': primitive.dimensions[0], 'y': primitive.dimensions[1], 'z': primitive.dimensions[2] } return entity
def deriveSensor(obj, names=False, objectlist=[], logging=False): """This function derives a sensor from a given blender object Args: obj(bpy_types.Object): The blender object to derive the sensor from. names(bool, optional): return the l object name instead of an object link. (Default value = False) objectlist(list(bpy.types.Object, optional): objectlist to which possible parents are restricted (Default value = []) logging(bool, optional): whether to write log messages or not (Default value = False) Returns: : dict -- phobos representation of the sensor """ from phobos.model.models import initObjectProperties from phobos.model.poses import deriveObjectPose if logging: log( "Deriving sensor from object " + nUtils.getObjectName(obj, phobostype='sensor') + ".", 'DEBUG', ) try: props = initObjectProperties(obj, phobostype='sensor', ignoretypes=('pose')) if names: props['link'] = nUtils.getObjectName( sUtils.getEffectiveParent(obj, objectlist=objectlist), phobostype='link' ) else: props['link'] = sUtils.getEffectiveParent(obj, objectlist=objectlist) except KeyError: if logging: log("Missing data in sensor " + obj.name, "ERROR") return None props['pose'] = deriveObjectPose(obj) return props
def deriveGenericEntity(entityobj, outpath=None): """This function handles an entity of unknown type by simply exporting its custom properties. Args: entityobj(bpy.types.Object): The object representing the entity. outpath(str, optional): If True data will be exported into subfolders. (Default value = None) Returns: : dict - An entry for the scenes entitiesList """ log( "Exporting " + nUtils.getObjectName(entityobj, 'entity') + " as entity of type 'generic", "INFO", ) entity = models.initObjectProperties(entityobj, 'entity', ['geometry']) return entity # write urdf urdf_path = "../urdf/" if structured else '' urdf_filename = model['name'] + ".urdf" exportModelToURDF( model, os.path.join(path, urdf_path, urdf_filename), '../meshes/' if structured else '' )
def deriveMotor(obj, jointdict=None): """Derives motor information from an object. Args: obj(bpy_types.Object): Blender object to derive the motor from jointdict(dict, optional): phobos representation of the respective joint (Default value = None) Returns: : dict -- phobos representation of a motor """ import phobos.model.models as models import phobos.model.controllers as controllermodel props = models.initObjectProperties(obj, phobostype='motor') # return None if no motor is attached (there will always be at least a name in the props) if len(props) < 2: return None # make sure the parent is a joint if not obj.parent or obj.parent.phobostype != 'link' or 'joint/type' not in obj.parent: log( "Can not derive motor from {}. Insufficient requirements from parent object!" .format(obj.name), 'ERROR', ) return None props['joint'] = nUtils.getObjectName(obj.parent, phobostype='joint') # todo: transfer joint limits to motor properties # check for a mimic motor for k in (obj.parent).keys(): # Check for mimic motor if "mimic" in k: # Find the name mimic_driver = sUtils.getObjectByName( (obj.parent)['joint/mimic_joint'], phobostypes=['link']) c_motor = sUtils.getImmediateChildren(mimic_driver, phobostypes=['motor']) props['mimic_motor'] = nUtils.getObjectName(c_motor[0], phobostype='motor') props['mimic_multiplier'] = (obj.parent)['joint/mimic_multiplier'] props['mimic_offset'] = (obj.parent)['joint/mimic_offset'] break # try to derive the motor controller controllerobjs = [ control for control in obj.children if control.phobostype == 'controller' ] if controllerobjs: controller = controllermodel.deriveController(controllerobjs[0]) else: controller = None # assign the derived controller if controller: props['controller'] = controller['name'] else: del props['controller'] return props
def deriveEntity(entity, outpath, savetosubfolder): """Derives the dictionary for a SMURF entity from the phobos model dictionary. :param entity: The smurf root object. :type entity: bpy.types.Object :param outpath: The path to export the smurf to. :type outpath: str :param savetosubfolder: If True the export path has a subfolder for this smurf entity. :type savetosubfolder: bool :return: dict - An entry for the scenes entitiesList """ smurf = entity # determine outpath for the smurf export # differentiate between full model and baked reference if "entity/isReference" in smurf: bpy.ops.scene.reload_models_and_poses_operator() modelsPosesColl = bpy.context.user_preferences.addons[ "phobos"].preferences.models_poses for robot_model in modelsPosesColl: if (smurf["modelname"] == robot_model.robot_name) and (smurf["entity/pose"] == robot_model.label): entitypose = models.deriveObjectPose(smurf) entry = models.initObjectProperties(smurf, 'entity', ['link', 'joint', 'motor']) entry.pop("isReference") entry['file'] = os.path.join( os.path.relpath(robot_model.path, outpath), smurf["modelname"] + ".smurf") if 'parent' not in entry and 'joint/type' in smurf and smurf[ 'joint/type'] == 'fixed': entry['parent'] = 'world' entry["position"] = entitypose["translation"] entry["rotation"] = entitypose["rotation_quaternion"] ''' with open(os.path.join(os.path.dirname(defs.__file__), "RobotLib.yml"), "r") as f: robots = yaml.load(f.read()) sourcepath = robots[smurf["modelname"]] for filename in os.listdir(sourcepath): fullpath = os.path.join(sourcepath, filename) if os.path.isfile(fullpath): shutil.copy2(fullpath, os.path.join(smurf_outpath, filename)) else: # remove old folders to prevent errors in copytree shutil.rmtree(os.path.join(smurf_outpath, filename), True) shutil.copytree(fullpath, os.path.join(smurf_outpath, filename)) ''' else: smurf_outpath = securepath( os.path.join(outpath, entity["modelname"] ) if savetosubfolder else outpath) log("smurf_outpath: " + outpath, "DEBUG", "exportSMURFsScene") log( "Exporting " + smurf["entity/name"] + " as a smurf entity to " + smurf_outpath, "INFO", "deriveSMURFEntity", "\n\n") subfolder = smurf["modelname"] if savetosubfolder else "" sUtils.selectObjects(sUtils.getChildren(smurf), clear=True) # re-select for mesh export model, objectlist = models.buildModelDictionary(smurf) export( model, objectlist, smurf_outpath) # FIXME: this is the export function from entities! entitypose = models.deriveObjectPose(smurf) entry = models.initObjectProperties(smurf, 'entity', ['link', 'joint', 'motor']) entry['file'] = (os.path.join(subfolder, smurf["modelname"] + ".smurf") if os.path.isfile(smurf_outpath) else os.path.join( subfolder, "smurf", smurf["modelname"] + ".smurf")) if 'parent' not in entry and 'joint/type' in smurf and smurf[ 'joint/type'] == 'fixed': entry['parent'] = 'world' entry["position"] = entitypose["translation"] entry["rotation"] = entitypose["rotation_quaternion"] return entry