コード例 #1
0
ファイル: controllers.py プロジェクト: Amudtogal/phobos
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
コード例 #2
0
ファイル: smurf.py プロジェクト: brendanaaa/Learnbgame
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
コード例 #3
0
ファイル: smurf.py プロジェクト: Amudtogal/phobos
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
コード例 #4
0
ファイル: motors.py プロジェクト: brendanaaa/Learnbgame
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
コード例 #5
0
ファイル: motors.py プロジェクト: Amudtogal/phobos
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
コード例 #6
0
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 '')
コード例 #7
0
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
コード例 #8
0
ファイル: primitive.py プロジェクト: brendanaaa/Learnbgame
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
コード例 #9
0
ファイル: primitive.py プロジェクト: Amudtogal/phobos
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
コード例 #10
0
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
コード例 #11
0
ファイル: primitive.py プロジェクト: mwopus/phobos
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
コード例 #12
0
ファイル: sensors.py プロジェクト: Amudtogal/phobos
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
コード例 #13
0
ファイル: entities.py プロジェクト: Amudtogal/phobos
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 ''
    )
コード例 #14
0
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
コード例 #15
0
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