Skip to content
Snippets Groups Projects
robots_loader.py 18.6 KiB
Newer Older
from os.path import dirname, exists, join

Guilhem Saurel's avatar
Guilhem Saurel committed
import numpy as np
import pinocchio as pin
from pinocchio.robot_wrapper import RobotWrapper

Fabian Schramm's avatar
Fabian Schramm committed
try:
    from .path import EXAMPLE_ROBOT_DATA_MODEL_DIR, EXAMPLE_ROBOT_DATA_SOURCE_DIR
except ImportError:
    pass
Guilhem Saurel's avatar
Guilhem Saurel committed
def getModelPath(subpath, verbose=False):
    source = dirname(dirname(dirname(__file__)))  # top level source directory
Guilhem Saurel's avatar
Guilhem Saurel committed
        # function called from "make release" in build/ dir
        join(dirname(dirname(dirname(source))), "robots"),
        # function called from a build/ dir inside top level source
        join(dirname(source), "robots"),
        # function called from top level source dir
        join(source, "robots"),
Fabian Schramm's avatar
Fabian Schramm committed
        EXAMPLE_ROBOT_DATA_MODEL_DIR
Guilhem Saurel's avatar
Guilhem Saurel committed

Guilhem Saurel's avatar
Guilhem Saurel committed
        # function called from installed project
        paths.append(EXAMPLE_ROBOT_DATA_MODEL_DIR)
        # function called from off-tree build dir
        paths.append(EXAMPLE_ROBOT_DATA_SOURCE_DIR)
Fabian Schramm's avatar
Fabian Schramm committed
    except NameError:
Guilhem Saurel's avatar
Guilhem Saurel committed
    paths += [join(p, "../../../share/example-robot-data/robots") for p in sys.path]
    for path in paths:
Guilhem Saurel's avatar
Guilhem Saurel committed
        if exists(join(path, subpath.strip("/"))):
Guilhem Saurel's avatar
Guilhem Saurel committed
            if verbose:
                print("using %s as modelPath" % path)
Guilhem Saurel's avatar
Guilhem Saurel committed
    raise IOError("%s not found" % subpath)
Guilhem Saurel's avatar
Guilhem Saurel committed
def readParamsFromSrdf(
    model,
    SRDF_PATH,
    verbose=False,
    has_rotor_parameters=True,
    referencePose="half_sitting",
):
    if has_rotor_parameters:
        pin.loadRotorParameters(model, SRDF_PATH, verbose)
Guilhem Saurel's avatar
Guilhem Saurel committed
    model.armature = np.multiply(
        model.rotorInertia.flat, np.square(model.rotorGearRatio.flat)
    )
    pin.loadReferenceConfigurations(model, SRDF_PATH, verbose)
    q0 = pin.neutral(model)
    if referencePose is not None:
        q0 = model.referenceConfigurations[referencePose].copy()
Guilhem Saurel's avatar
Guilhem Saurel committed
class RobotLoader(object):
Guilhem Saurel's avatar
Guilhem Saurel committed
    path = ""
    urdf_filename = ""
    srdf_filename = ""
    sdf_filename = ""
    sdf_root_link_name = ""
Guilhem Saurel's avatar
Guilhem Saurel committed
    urdf_subpath = "robots"
    srdf_subpath = "srdf"
    sdf_subpath = ""
    ref_posture = "half_sitting"
Guilhem Saurel's avatar
Guilhem Saurel committed
    has_rotor_parameters = False
    free_flyer = False
    model_path = None
Guilhem Saurel's avatar
Guilhem Saurel committed

Guilhem Saurel's avatar
Guilhem Saurel committed
    def __init__(self, verbose=False):
        self.verbose = verbose
        if self.urdf_filename:
            if self.sdf_filename:
                raise AttributeError("Please choose between URDF *or* SDF")
            df_path = join(self.path, self.urdf_subpath, self.urdf_filename)
            builder = RobotWrapper.BuildFromURDF
            if self.model_path is None:
                self.model_path = getModelPath(df_path, self.verbose)
            self.df_path = join(self.model_path, df_path)
Guilhem Saurel's avatar
Guilhem Saurel committed
            self.robot = builder(
                self.df_path,
                [join(self.model_path, "../..")],
                pin.JointModelFreeFlyer() if self.free_flyer else None,
            )
        else:
            df_path = join(self.path, self.sdf_subpath, self.sdf_filename)
            try:
                builder = RobotWrapper.BuildFromSDF
                if self.model_path is None:
                    self.model_path = getModelPath(df_path, self.verbose)
                self.df_path = join(self.model_path, df_path)
Guilhem Saurel's avatar
Guilhem Saurel committed
                if tuple(int(i) for i in pin.__version__.split(".")) > (2, 9, 1):
                    self.robot = builder(
                        self.df_path,
                        package_dirs=[join(self.model_path, "../..")],
                        root_joint=(
                            pin.JointModelFreeFlyer() if self.free_flyer else None
                        ),
Guilhem Saurel's avatar
Guilhem Saurel committed
                        root_link_name=self.sdf_root_link_name,
                        parent_guidance=self.sdf_parent_guidance,
                    )
Guilhem Saurel's avatar
Guilhem Saurel committed
                    self.robot = builder(
                        self.df_path,
                        package_dirs=[join(self.model_path, "../..")],
                        root_joint=(
                            pin.JointModelFreeFlyer() if self.free_flyer else None
                        ),
Guilhem Saurel's avatar
Guilhem Saurel committed
                    )
            except AttributeError:
                raise ImportError("Building SDF models require pinocchio >= 3.0.0")
Guilhem Saurel's avatar
Guilhem Saurel committed

        if self.srdf_filename:
Guilhem Saurel's avatar
Guilhem Saurel committed
            self.srdf_path = join(
                self.model_path, self.path, self.srdf_subpath, self.srdf_filename
            )
            self.robot.q0 = readParamsFromSrdf(
                self.robot.model,
                self.srdf_path,
                self.verbose,
                self.has_rotor_parameters,
                self.ref_posture,
            )

            if pin.WITH_HPP_FCL and pin.WITH_HPP_FCL_BINDINGS:
                # Add all collision pairs
                self.robot.collision_model.addAllCollisionPairs()

                # Remove collision pairs per SRDF
Guilhem Saurel's avatar
Guilhem Saurel committed
                pin.removeCollisionPairs(
                    self.robot.model, self.robot.collision_model, self.srdf_path, False
                )

                # Recreate collision data since the collision pairs changed
                self.robot.collision_data = self.robot.collision_model.createData()
Guilhem Saurel's avatar
Guilhem Saurel committed
        else:
            self.srdf_path = None
            self.robot.q0 = pin.neutral(self.robot.model)
        root = getModelPath(self.path)
        self.robot.urdf = join(root, self.path, self.urdf_subpath, self.urdf_filename)
Guilhem Saurel's avatar
Guilhem Saurel committed

        if self.free_flyer:
            self.addFreeFlyerJointLimits()

    def addFreeFlyerJointLimits(self):
        ub = self.robot.model.upperPositionLimit
        ub[:7] = 1
        self.robot.model.upperPositionLimit = ub
        lb = self.robot.model.lowerPositionLimit
        lb[:7] = -1
        self.robot.model.lowerPositionLimit = lb


Sergim96's avatar
Sergim96 committed
class B1Loader(RobotLoader):
    path = "b1_description"
    urdf_filename = "b1.urdf"
    urdf_subpath = "urdf"
    srdf_filename = "b1.srdf"
    ref_posture = "standing"
    free_flyer = True

Sergim96's avatar
Sergim96 committed
class Go1Loader(RobotLoader):
    path = "go1_description"
    urdf_filename = "go1.urdf"
    urdf_subpath = "urdf"
    srdf_filename = "go1.srdf"
    ref_posture = "standing"
    free_flyer = True
Guilhem Saurel's avatar
Guilhem Saurel committed

class A1Loader(RobotLoader):
Guilhem Saurel's avatar
Guilhem Saurel committed
    path = "a1_description"
    urdf_filename = "a1.urdf"
    urdf_subpath = "urdf"
    srdf_filename = "a1.srdf"
    ref_posture = "standing"
    free_flyer = True

class Z1Loader(RobotLoader):
    path = "z1_description"
    urdf_filename = "z1.urdf"
    urdf_subpath = "urdf"
    srdf_filename = "z1.srdf"
    ref_posture = "arm_up"
class B1Z1Loader(B1Loader):
    urdf_filename = "b1-z1.urdf"
    srdf_filename = "b1-z1.srdf"
    ref_posture = "standing_with_arm_home"

Guilhem Saurel's avatar
Guilhem Saurel committed
class ANYmalLoader(RobotLoader):
Guilhem Saurel's avatar
Guilhem Saurel committed
    path = "anymal_b_simple_description"
Guilhem Saurel's avatar
Guilhem Saurel committed
    urdf_filename = "anymal.urdf"
    srdf_filename = "anymal.srdf"
    ref_posture = "standing"
    free_flyer = True

Rohan Budhiraja's avatar
Rohan Budhiraja committed

class ANYmalCLoader(RobotLoader):
    path = "anymal_c_simple_description"
    urdf_subpath = "urdf"
    urdf_filename = "anymal.urdf"
    srdf_filename = "anymal.srdf"
    ref_posture = "standing"
    free_flyer = True


class LaikagoLoader(RobotLoader):
Guilhem Saurel's avatar
Guilhem Saurel committed
    path = "laikago_description"
    urdf_subpath = "urdf"
    urdf_filename = "laikago.urdf"
    free_flyer = True

Guilhem Saurel's avatar
Guilhem Saurel committed

class ANYmalKinovaLoader(ANYmalLoader):
    urdf_filename = "anymal-kinova.urdf"
    srdf_filename = "anymal-kinova.srdf"
    ref_posture = "standing_with_arm_up"
Guilhem Saurel's avatar
Guilhem Saurel committed
class BaxterLoader(RobotLoader):
    path = "baxter_description"
    urdf_filename = "baxter.urdf"
    urdf_subpath = "urdf"


class CassieLoader(RobotLoader):
Guilhem Saurel's avatar
Guilhem Saurel committed
    path = "cassie_description"
    if tuple(int(i) for i in pin.__version__.split(".")) > (2, 9, 1):
        sdf_filename = "cassie.sdf"
    else:
        sdf_filename = "cassie_v2.sdf"
Guilhem Saurel's avatar
Guilhem Saurel committed
    sdf_subpath = "robots"
    srdf_filename = "cassie_v2.srdf"
    ref_posture = "standing"
    free_flyer = True
    sdf_root_link_name = "pelvis"
    sdf_parent_guidance = [
Guilhem Saurel's avatar
Guilhem Saurel committed
        "left-roll-op",
        "left-yaw-op",
        "left-pitch-op",
        "left-knee-op",
        "left-tarsus-spring-joint",
        "left-foot-op",
        "right-roll-op",
        "right-yaw-op",
        "right-pitch-op",
        "right-knee-op",
        "right-tarsus-spring-joint",
        "right-foot-op",
Guilhem Saurel's avatar
Guilhem Saurel committed
class TalosLoader(RobotLoader):
Guilhem Saurel's avatar
Guilhem Saurel committed
    path = "talos_data"
Guilhem Saurel's avatar
Guilhem Saurel committed
    urdf_filename = "talos_reduced.urdf"
    srdf_filename = "talos.srdf"
    free_flyer = True
    has_rotor_parameters = True
class AsrTwoDofLoader(RobotLoader):
Guilhem Saurel's avatar
Guilhem Saurel committed
    path = "asr_twodof_description"
    urdf_filename = "TwoDofs.urdf"
    urdf_subpath = "urdf"


Guilhem Saurel's avatar
Guilhem Saurel committed
class TalosBoxLoader(TalosLoader):
    urdf_filename = "talos_reduced_box.urdf"
Guilhem Saurel's avatar
Guilhem Saurel committed
class TalosFullLoader(TalosLoader):
    urdf_filename = "talos_full_v2.urdf"
Guilhem Saurel's avatar
Guilhem Saurel committed
class TalosFullBoxLoader(TalosLoader):
    urdf_filename = "talos_full_v2_box.urdf"
Guilhem Saurel's avatar
Guilhem Saurel committed

class TalosArmLoader(TalosLoader):
    urdf_filename = "talos_left_arm.urdf"
    free_flyer = False


class TalosLegsLoader(TalosLoader):
Guilhem Saurel's avatar
Guilhem Saurel committed
    def __init__(self, verbose=False):
        super(TalosLegsLoader, self).__init__(verbose=verbose)
        legMaxId = 14
Guilhem Saurel's avatar
Guilhem Saurel committed
        m1 = self.robot.model
        m2 = pin.Model()
Guilhem Saurel's avatar
Guilhem Saurel committed
        for j, M, name, parent, Y in zip(
            m1.joints, m1.jointPlacements, m1.names, m1.parents, m1.inertias
        ):
            if j.id < legMaxId:
                jid = m2.addJoint(parent, getattr(pin, j.shortname())(), M, name)
                idx_q, idx_v = m2.joints[jid].idx_q, m2.joints[jid].idx_v
Guilhem Saurel's avatar
Guilhem Saurel committed
                m2.upperPositionLimit[idx_q : idx_q + j.nq] = m1.upperPositionLimit[
                    j.idx_q : j.idx_q + j.nq
                ]
                m2.lowerPositionLimit[idx_q : idx_q + j.nq] = m1.lowerPositionLimit[
                    j.idx_q : j.idx_q + j.nq
                ]
                m2.velocityLimit[idx_v : idx_v + j.nv] = m1.velocityLimit[
                    j.idx_v : j.idx_v + j.nv
                ]
                m2.effortLimit[idx_v : idx_v + j.nv] = m1.effortLimit[
                    j.idx_v : j.idx_v + j.nv
                ]
                assert jid == j.id
                m2.appendBodyToJoint(jid, Y, pin.SE3.Identity())

        upperPos = m2.upperPositionLimit
        upperPos[:7] = 1
        m2.upperPositionLimit = upperPos
        lowerPos = m2.lowerPositionLimit
        lowerPos[:7] = -1
        m2.lowerPositionLimit = lowerPos
        effort = m2.effortLimit
        effort[:6] = np.inf
        m2.effortLimit = effort

Guilhem Saurel's avatar
Guilhem Saurel committed
        # q2 = self.robot.q0[:19]
        for f in m1.frames:
            if f.parent < legMaxId:
                m2.addFrame(f)

        g2 = pin.GeometryModel()
Guilhem Saurel's avatar
Guilhem Saurel committed
        for g in self.robot.visual_model.geometryObjects:
            if g.parentJoint < 14:
                g2.addGeometryObject(g)

Guilhem Saurel's avatar
Guilhem Saurel committed
        self.robot.model = m2
        self.robot.data = m2.createData()
        self.robot.visual_model = g2
        # self.robot.q0=q2
        self.robot.visual_data = pin.GeometryData(g2)
Guilhem Saurel's avatar
Guilhem Saurel committed
        self.robot.q0 = readParamsFromSrdf(
            self.robot.model,
            self.srdf_path,
            self.verbose,
            self.has_rotor_parameters,
            self.ref_posture,
        )

        assert (m2.armature[:6] == 0.0).all()
        # Add the free-flyer joint limits to the new model
Guilhem Saurel's avatar
Guilhem Saurel committed
        self.addFreeFlyerJointLimits()
Guilhem Saurel's avatar
Guilhem Saurel committed

class HyQLoader(RobotLoader):
    path = "hyq_description"
    urdf_filename = "hyq_no_sensors.urdf"
    srdf_filename = "hyq.srdf"
    ref_posture = "standing"
    free_flyer = True


Julian Viereck's avatar
Julian Viereck committed
class BoltLoader(RobotLoader):
Guilhem Saurel's avatar
Guilhem Saurel committed
    path = "bolt_description"
Julian Viereck's avatar
Julian Viereck committed
    urdf_filename = "bolt.urdf"
    srdf_filename = "bolt.srdf"
    ref_posture = "standing"
    free_flyer = True


class BorinotLoader(RobotLoader):
    path = "borinot_description"
    urdf_subpath = "urdf"
    srdf_subpath = "srdf"
    urdf_filename = "borinot_flying_arm_2.urdf"
    srdf_filename = "borinot_flying_arm_2.srdf"
    ref_posture = "home"
class Solo8Loader(RobotLoader):
Guilhem Saurel's avatar
Guilhem Saurel committed
    path = "solo_description"
Guilhem Saurel's avatar
Guilhem Saurel committed
    urdf_filename = "solo.urdf"
    srdf_filename = "solo.srdf"
    ref_posture = "standing"
    free_flyer = True


class Solo12Loader(Solo8Loader):
Guilhem Saurel's avatar
Guilhem Saurel committed
    urdf_filename = "solo12.urdf"
Julian Viereck's avatar
Julian Viereck committed
class FingerEduLoader(RobotLoader):
Guilhem Saurel's avatar
Guilhem Saurel committed
    path = "finger_edu_description"
Julian Viereck's avatar
Julian Viereck committed
    urdf_filename = "finger_edu.urdf"
    srdf_filename = "finger_edu.srdf"
    ref_posture = "hanging"
    free_flyer = False

Guilhem Saurel's avatar
Guilhem Saurel committed

class KinovaLoader(RobotLoader):
    path = "kinova_description"
    urdf_filename = "kinova.urdf"
    srdf_filename = "kinova.srdf"
    ref_posture = "arm_up"
Guilhem Saurel's avatar
Guilhem Saurel committed
class TiagoLoader(RobotLoader):
    path = "tiago_description"
    urdf_filename = "tiago.urdf"


class TiagoDualLoader(TiagoLoader):
    urdf_filename = "tiago_dual.urdf"


Guilhem Saurel's avatar
Guilhem Saurel committed
class TiagoNoHandLoader(TiagoLoader):
    urdf_filename = "tiago_no_hand.urdf"
Guilhem Saurel's avatar
Guilhem Saurel committed
class ICubLoader(RobotLoader):
    path = "icub_description"
    urdf_filename = "icub.urdf"
    srdf_filename = "icub.srdf"
    free_flyer = True


class ICubReducedLoader(ICubLoader):
    urdf_filename = "icub_reduced.urdf"


class PandaLoader(RobotLoader):
    path = "panda_description"
    urdf_filename = "panda.urdf"
    urdf_subpath = "urdf"
    srdf_filename = "panda.srdf"
    ref_posture = "default"
class AllegroRightHandLoader(RobotLoader):
    path = "allegro_hand_description"
    urdf_filename = "allegro_right_hand.urdf"
    urdf_subpath = "urdf"


class AllegroLeftHandLoader(RobotLoader):
    path = "allegro_hand_description"
    urdf_filename = "allegro_left_hand.urdf"
    urdf_subpath = "urdf"


Guilhem Saurel's avatar
Guilhem Saurel committed
class UR3Loader(RobotLoader):
    path = "ur_description"
    urdf_filename = "ur3_robot.urdf"
    urdf_subpath = "urdf"
    ref_posture = None


class UR3GripperLoader(UR3Loader):
    urdf_filename = "ur3_gripper.urdf"
    srdf_filename = "ur3_gripper.srdf"


class UR3LimitedLoader(UR3Loader):
    urdf_filename = "ur3_joint_limited_robot.urdf"


class UR5Loader(UR3Loader):
    urdf_filename = "ur5_robot.urdf"
    srdf_filename = "ur5.srdf"


class UR5GripperLoader(UR5Loader):
    urdf_filename = "ur5_gripper.urdf"
    srdf_filename = "ur5_gripper.srdf"


class UR5LimitedLoader(UR5Loader):
    urdf_filename = "ur5_joint_limited_robot.urdf"

Guilhem Saurel's avatar
Guilhem Saurel committed
class UR10Loader(UR3Loader):
    urdf_filename = "ur10_robot.urdf"


class UR10LimitedLoader(UR10Loader):
    urdf_filename = "ur10_joint_limited_robot.urdf"


class HectorLoader(RobotLoader):
    path = "hector_description"
    urdf_filename = "quadrotor_base.urdf"
    free_flyer = True
class HextiltLoader(RobotLoader):
    path = "hextilt_description"
    urdf_subpath = "urdf"
    srdf_subpath = "srdf"
    urdf_filename = "hextilt_flying_arm_5.urdf"
    srdf_filename = "hextilt_flying_arm_5.srdf"
    ref_posture = "home"
Guilhem Saurel's avatar
Guilhem Saurel committed
class DoublePendulumLoader(RobotLoader):
    path = "double_pendulum_description"
    urdf_filename = "double_pendulum.urdf"
    urdf_subpath = "urdf"
class DoublePendulumContinuousLoader(DoublePendulumLoader):
    urdf_filename = "double_pendulum_continuous.urdf"


class DoublePendulumSimpleLoader(DoublePendulumLoader):
    urdf_filename = "double_pendulum_simple.urdf"


class QuadrupedLoader(RobotLoader):
    path = "quadruped_description"
    urdf_subpath = "urdf"
    urdf_filename = "quadruped.urdf"
    free_flyer = True


Guilhem Saurel's avatar
Guilhem Saurel committed
class RomeoLoader(RobotLoader):
    path = "romeo_description"
    urdf_filename = "romeo.urdf"
    urdf_subpath = "urdf"
    free_flyer = True
class SimpleHumanoidLoader(RobotLoader):
Guilhem Saurel's avatar
Guilhem Saurel committed
    path = "simple_humanoid_description"
    urdf_subpath = "urdf"
    urdf_filename = "simple_humanoid.urdf"
    srdf_filename = "simple_humanoid.srdf"
    free_flyer = True


class SimpleHumanoidClassicalLoader(SimpleHumanoidLoader):
Guilhem Saurel's avatar
Guilhem Saurel committed
    urdf_filename = "simple_humanoid_classical.urdf"
    srdf_filename = "simple_humanoid_classical.srdf"
Guilhem Saurel's avatar
Guilhem Saurel committed
class IrisLoader(RobotLoader):
    path = "iris_description"
    urdf_filename = "iris_simple.urdf"
    free_flyer = True
Florent Lamiraux's avatar
Florent Lamiraux committed
class PR2Loader(RobotLoader):
    path = "pr2_description"
    urdf_filename = "pr2.urdf"
    urdf_subpath = "urdf"
    srdf_filename = "pr2.srdf"
    free_flyer = True
    ref_posture = "tuck_left_arm"


Sergim96's avatar
Sergim96 committed
    "b1": B1Loader,
Sergim96's avatar
Sergim96 committed
    "go1": Go1Loader,
Guilhem Saurel's avatar
Guilhem Saurel committed
    "a1": A1Loader,
    "z1": Z1Loader,
    "b1_z1": B1Z1Loader,
Guilhem Saurel's avatar
Guilhem Saurel committed
    "anymal": ANYmalLoader,
    "anymal_c": ANYmalCLoader,
Guilhem Saurel's avatar
Guilhem Saurel committed
    "anymal_kinova": ANYmalKinovaLoader,
    "asr_twodof": AsrTwoDofLoader,
    "baxter": BaxterLoader,
    "cassie": CassieLoader,
    "double_pendulum": DoublePendulumLoader,
    "double_pendulum_continuous": DoublePendulumContinuousLoader,
    "double_pendulum_simple": DoublePendulumSimpleLoader,
    "hector": HectorLoader,
    "hextilt": HextiltLoader,
Guilhem Saurel's avatar
Guilhem Saurel committed
    "hyq": HyQLoader,
    "icub": ICubLoader,
    "icub_reduced": ICubReducedLoader,
    "iris": IrisLoader,
    "kinova": KinovaLoader,
    "laikago": LaikagoLoader,
    "panda": PandaLoader,
    "allegro_right_hand": AllegroRightHandLoader,
    "allegro_left_hand": AllegroLeftHandLoader,
    "quadruped": QuadrupedLoader,
Guilhem Saurel's avatar
Guilhem Saurel committed
    "romeo": RomeoLoader,
    "simple_humanoid": SimpleHumanoidLoader,
    "simple_humanoid_classical": SimpleHumanoidClassicalLoader,
    "bolt": BoltLoader,
    "borinot": BorinotLoader,
Guilhem Saurel's avatar
Guilhem Saurel committed
    "solo8": Solo8Loader,
    "solo12": Solo12Loader,
    "finger_edu": FingerEduLoader,
Florent Lamiraux's avatar
Florent Lamiraux committed
    "pr2": PR2Loader,
Guilhem Saurel's avatar
Guilhem Saurel committed
    "talos": TalosLoader,
    "talos_box": TalosBoxLoader,
    "talos_arm": TalosArmLoader,
    "talos_legs": TalosLegsLoader,
    "talos_full": TalosFullLoader,
    "talos_full_box": TalosFullBoxLoader,
    "tiago": TiagoLoader,
    "tiago_dual": TiagoDualLoader,
    "tiago_no_hand": TiagoNoHandLoader,
    "ur3": UR5Loader,
    "ur3_gripper": UR3GripperLoader,
    "ur3_limited": UR3LimitedLoader,
    "ur5": UR5Loader,
    "ur5_gripper": UR5GripperLoader,
    "ur5_limited": UR5LimitedLoader,
    "ur10": UR10Loader,
    "ur10_limited": UR10LimitedLoader,
Guilhem Saurel's avatar
Guilhem Saurel committed
def loader(name, display=False, rootNodeName="", verbose=False):
Wolfgang Merkt's avatar
Wolfgang Merkt committed
    """Load a robot by its name, and optionally display it in a viewer."""
Guilhem Saurel's avatar
Guilhem Saurel committed
    if name not in ROBOTS:
        robots = ", ".join(sorted(ROBOTS.keys()))
Guilhem Saurel's avatar
Guilhem Saurel committed
        raise ValueError(
            "Robot '%s' not found. Possible values are %s" % (name, robots)
        )
Guilhem Saurel's avatar
Guilhem Saurel committed
    inst = ROBOTS[name](verbose=verbose)
        if rootNodeName:
            inst.robot.initViewer()
            inst.robot.viz.loadViewerModel(rootNodeName=rootNodeName)
        else:
            inst.robot.initViewer(loadModel=True)
        inst.robot.display(inst.robot.q0)
Guilhem Saurel's avatar
Guilhem Saurel committed
    return inst


Guilhem Saurel's avatar
Guilhem Saurel committed
def load(name, display=False, rootNodeName="", verbose=False):
Guilhem Saurel's avatar
Guilhem Saurel committed
    """Load a robot by its name, and optionnaly display it in a viewer."""
Guilhem Saurel's avatar
Guilhem Saurel committed
    return loader(name, display, rootNodeName, verbose).robot
Guilhem Saurel's avatar
Guilhem Saurel committed
def load_full(name, display=False, rootNodeName="", verbose=False):
Guilhem Saurel's avatar
Guilhem Saurel committed
    """Load a robot by its name, optionnaly display it in a viewer,
    and provide its q0 and paths."""
Guilhem Saurel's avatar
Guilhem Saurel committed
    inst = loader(name, display, rootNodeName, verbose)
    return inst.robot, inst.robot.q0, inst.df_path, inst.srdf_path