Пример #1
0
def main():

    mujoco = e.Mujoco(model="cartpole", )
    compiler = e.Compiler(
        coordinate="local",
        inertiafromgeom="true",
    )
    custom = e.Custom()
    default = e.Default()
    option = e.Option(
        gravity="1e-5 0 -9.81",
        integrator="RK4",
        timestep="0.01",
    )
    size = e.Size(nstack="3000", )
    worldbody = e.Worldbody()
    actuator = e.Actuator()
    mujoco.add_children([
        compiler,
        custom,
        default,
        option,
        size,
        worldbody,
        actuator,
    ])
    frame_skip = e.Numeric(
        data="2",
        name="frame_skip",
    )
    custom.add_children([
        frame_skip,
    ])
    joint = e.Joint(damping="0.05", )
    geom = e.Geom(
        contype="0",
        friction="1 0.1 0.1",
        rgba="0.7 0.7 0 1",
    )
    default.add_children([
        joint,
        geom,
    ])
    floor = e.Geom(
        name="floor",
        pos="0 0 -3.0",
        rgba="0.8 0.9 0.8 1",
        size="40 40 40",
        type="plane",
    )
    rail = e.Geom(
        name="rail",
        pos="0 0 0",
        quat="0.707 0 0.707 0",
        rgba="0.3 0.3 0.7 1",
        size="0.02 1",
        type="capsule",
    )
    cart = e.Body(
        name="cart",
        pos="0 0 0",
    )
    worldbody.add_children([
        floor,
        rail,
        cart,
    ])
    slide = e.Motor(
        ctrllimited="true",
        ctrlrange="-1 1",
        gear="500",
        joint="slider",
        name="slide",
    )
    actuator.add_children([
        slide,
    ])
    slider = e.Joint(
        axis="1 0 0",
        limited="true",
        margin="0.01",
        name="slider",
        pos="0 0 0",
        range="-1 1",
        type="slide",
    )
    cart_1 = e.Geom(
        name="cart",
        pos="0 0 0",
        quat="0.707 0 0.707 0",
        size="0.1 0.1",
        type="capsule",
    )
    pole = e.Body(
        name="pole",
        pos="0 0 0",
    )
    cart.add_children([
        slider,
        cart_1,
        pole,
    ])
    hinge = e.Joint(
        axis="0 1 0",
        name="hinge",
        pos="0 0 0",
        type="hinge",
    )
    cpole = e.Geom(
        fromto="0 0 0 0 0 0.6",
        name="cpole",
        rgba="0 0.7 0.7 1",
        size="0.045 0.3",
        type="capsule",
    )
    pole2 = e.Body(
        name="pole2",
        pos="0 0 0.6",
    )
    pole.add_children([
        hinge,
        cpole,
        pole2,
    ])
    hinge2 = e.Joint(
        axis="0 1 0",
        name="hinge2",
        pos="0 0 0",
        type="hinge",
    )
    cpole2 = e.Geom(
        fromto="0 0 0 0 0 0.6",
        name="cpole2",
        rgba="0 0.7 0.7 1",
        size="0.045 0.3",
        type="capsule",
    )
    tip = e.Site(
        name="tip",
        pos="0 0 .6",
        size="0.01 0.01",
    )
    pole2.add_children([
        hinge2,
        cpole2,
        tip,
    ])

    model_xml = mujoco.xml()

    # Output
    with open('inverted_double_pendulum_gen.xml', 'w') as fh:
        fh.write(model_xml)
Пример #2
0
def main():

    mujoco = e.Mujoco(model="arm", )
    compiler = e.Compiler(
        angle="degree",
        coordinate="local",
        inertiafromgeom="true",
    )
    default = e.Default()
    option = e.Option(
        integrator="RK4",
        timestep="0.002",
    )
    visual = e.Visual()
    worldbody = e.Worldbody()
    tendon = e.Tendon()
    sensor = e.Sensor()
    actuator = e.Actuator()
    asset = e.Asset()
    mujoco.add_children([
        compiler,
        default,
        option,
        visual,
        worldbody,
        tendon,
        sensor,
        actuator,
        asset,
    ])

    # Standard assets
    utils.populated_ma_asset(asset)

    # Standard floor and lighting
    utils.populate_ma_worldbody(worldbody)

    geom = e.Geom(
        conaffinity="1",
        condim="1",
        contype="1",
        margin="0.001",
        material="geom",
        rgba="0.8 0.6 .4 1",
        solimp=".8 .8 .01",
        solref=".02 1",
    )
    motor = e.Motor(
        ctrllimited="true",
        ctrlrange="-.4 .4",
    )
    default.add_children([
        geom,
        motor,
    ])
    map = e.visual.Map(znear="0.02", )
    visual.add_children([
        map,
    ])
    # light = e.Light(
    #     cutoff="100",
    #     diffuse="1 1 1",
    #     dir="-0 0 -1.3",
    #     directional="true",
    #     exponent="1",
    #     pos="0 0 1.3",
    #     specular=".1 .1 .1",
    # )
    # floor = e.Geom(
    #     conaffinity="1",
    #     condim="3",
    #     material="MatPlane",
    #     name="floor",
    #     pos="0 0 0",
    #     rgba="0.8 0.9 0.8 1",
    #     size="20 20 .125",
    #     type="plane",
    # )
    block_body = e.Body(
        name="block_body",
        pos="0.0 0.0 3.0",
    )
    worldbody.add_children([
        # light,
        # floor,
        block_body,
    ])
    string = e.Spatial(
        name="string",
        width="0.02",
        rgba=".95 .3 .3 1",
        limited="false",
        range="0.5 2",
        stiffness="3700.0",
        damping="100.0",
    )
    tendon.add_children([
        string,
    ])
    ball_sensor = e.sensor.Force(
        name="ball_sensor",
        site="ball_site",
    )
    sensor.add_children([
        ball_sensor,
    ])
    string_actuator = e.General(
        name="string_actuator",
        tendon="string",
        ctrllimited="true",
        gainprm="2000",
        ctrlrange="-2 0",
    )
    actuator.add_children([
        string_actuator,
    ])
    # texture = e.Texture(
    #     builtin="gradient",
    #     height="100",
    #     rgb1=".4 .5 .6",
    #     rgb2="0 0 0",
    #     type="skybox",
    #     width="100",
    # )
    # texgeom = e.Texture(
    #     builtin="flat",
    #     height="1278",
    #     mark="cross",
    #     markrgb="1 1 1",
    #     name="texgeom",
    #     random="0.01",
    #     rgb1="0.8 0.6 0.4",
    #     rgb2="0.8 0.6 0.4",
    #     type="cube",
    #     width="127",
    # )
    # texplane = e.Texture(
    #     builtin="checker",
    #     height="100",
    #     name="texplane",
    #     rgb1="0 0 0",
    #     rgb2="0.8 0.8 0.8",
    #     type="2d",
    #     width="100",
    # )
    # MatPlane = e.Material(
    #     name="MatPlane",
    #     reflectance="0.5",
    #     shininess="1",
    #     specular="1",
    #     texrepeat="60 60",
    #     texture="texplane",
    # )
    # geom_1 = e.Material(
    #     name="geom",
    #     texture="texgeom",
    #     texuniform="true",
    # )
    # asset.add_children([
    #     texture,
    #     texgeom,
    #     texplane,
    #     MatPlane,
    #     geom_1,
    # ])
    block_geom = e.Geom(
        name="block_geom",
        size="0.2 0.2 0.2",
        type="box",
    )
    box_site = e.Site(
        name="box_site",
        pos="0.0 0.0 -0.2",
        size="0.05",
    )
    ball = e.Body(
        name="ball",
        pos="0.0 0.0 -1.0",
    )
    block_body.add_children([
        block_geom,
        box_site,
        ball,
    ])
    site = e.spatial.Site(site="box_site", )
    site_1 = e.spatial.Site(site="ball_site", )
    string.add_children([
        site,
        site_1,
    ])
    ball_joint = e.Joint(
        name="ball_joint",
        pos="0.0 0.0 -0.2",
        type="ball",
        damping="2.0",
    )
    joint = e.Joint(
        type="slide",
        axis="0 0 1",
        damping="2.0",
    )
    joint_1 = e.Joint(
        type="slide",
        axis="0 1 0",
        damping="2.0",
    )
    joint_2 = e.Joint(
        type="slide",
        axis="1 0 0",
        damping="2.0",
    )
    geom_2 = e.Geom(
        pos="0.0 0.0 0.0",
        size="0.2",
        type="sphere",
    )
    ball_site = e.Site(
        name="ball_site",
        pos="0.0 0.0 0.2",
        size="0.05",
    )
    ball.add_children([
        ball_joint,
        joint,
        joint_1,
        joint_2,
        geom_2,
        ball_site,
    ])

    model_xml = mujoco.xml()

    # Output
    out_path = os.path.join("..", "muscledagents", "envs", "mujoco", "assets",
                            "ballonstring.xml")
    with open(out_path, 'w') as fh:
        fh.write(model_xml)
Пример #3
0
def main():

    mujoco = e.Mujoco(model="reacher", )
    compiler = e.Compiler(
        angle="degree",
        inertiafromgeom=True,
    )
    default = e.Default()
    option = e.Option(
        gravity="0 0 -9.81",
        integrator="RK4",
        timestep="0.01",
    )
    worldbody = e.Worldbody()
    tendon = e.Tendon()
    actuator = e.Actuator()
    asset = e.Asset()
    mujoco.add_children(
        [compiler, default, option, worldbody, tendon, actuator, asset])

    # Standard assets
    utils.populated_ma_asset(asset)

    # Standard floor and lighting
    utils.populate_ma_worldbody(worldbody)

    default_joint = e.Joint(
        armature=1,
        damping=1,
        limited=True,
    )

    default_geom = e.Geom(
        contype="0",
        friction="1 0.1 0.1",
        rgba="0.7 0.7 0 1",
    )
    default.add_children([
        default_joint,
        default_geom,
    ])

    sideS, sideE, sideN, sideW = get_sides()

    shoulder_body = e.Body(name="shoulder_body", pos=[0, 0, 0])

    target_body = e.Body(
        name="target_body",
        pos=[0, 0, .1],
    )

    worldbody.add_children([
        sideS,
        sideE,
        sideN,
        sideW,
        shoulder_body,
        target_body,
    ])

    # ARM

    # Shoulder (central pole)
    pole_radius = 0.18
    pole_height = 0.2
    shoulder_geom = e.Geom(
        conaffinity="0",
        contype="0",
        fromto=[0, 0, 0, 0, 0, pole_height],
        name="shoulder_geom",
        rgba="0.9 0.4 0.6 1",
        size=pole_radius,
        type="cylinder",
    )

    upper_arm_radius = 0.05
    side_site_radius = 0.005
    pole_site_offset = pole_radius * 1.2
    left_flex_shoulder_insertion = e.Site(
        name="left_flex_shoulder_insertion",
        pos=[-pole_radius, pole_site_offset, pole_height / 2],
        size=upper_arm_radius / 2)
    right_flex_shoulder_insertion = e.Site(
        name="right_flex_shoulder_insertion",
        pos=[-pole_radius, -pole_site_offset, pole_height / 2],
        size=upper_arm_radius / 2)

    left_flex_shoulder_side = e.Site(
        name="left_flex_shoulder_side",
        pos=[0.0, pole_site_offset, pole_height / 2],
        size=side_site_radius)
    right_flex_shoulder_side = e.Site(
        name="right_flex_shoulder_side",
        pos=[0.0, -pole_site_offset, pole_height / 2],
        size=side_site_radius)

    upper_arm_body = e.Body(
        name="upper_arm_body",
        pos="0 0 .1",
    )

    shoulder_body.add_children([
        shoulder_geom, left_flex_shoulder_insertion, left_flex_shoulder_side,
        right_flex_shoulder_insertion, right_flex_shoulder_side, upper_arm_body
    ])

    upper_arm_len = 1.0
    upper_arm_geom = e.Geom(
        fromto=[0, 0, 0, upper_arm_len, 0, 0],
        name="upper_arm_geom",
        rgba="0.0 0.2 0.4 1",
        size=upper_arm_radius,
        type="capsule",
    )

    shoulder_joint = e.Joint(
        axis=[0, 0, 1],
        limited=True,
        range=[-100, 100],
        name="shoulder_joint",
        pos=[0, 0, 0],
        type="hinge",
    )

    left_flex_ua_insertion = e.Site(
        name="left_flex_ua_insertion",
        pos=[upper_arm_len / 4, upper_arm_radius, 0.0],
        size=upper_arm_radius / 2)
    right_flex_ua_insertion = e.Site(
        name="right_flex_ua_insertion",
        pos=[upper_arm_len / 4, -upper_arm_radius, 0.0],
        size=upper_arm_radius / 2)

    left_curl_ua_insertion = e.Site(
        name="left_curl_ua_insertion",
        pos=[upper_arm_len / 2, upper_arm_radius, 0.0],
        size=upper_arm_radius / 2)
    right_curl_ua_insertion = e.Site(
        name="right_curl_ua_insertion",
        pos=[upper_arm_len / 2, -upper_arm_radius, 0.0],
        size=upper_arm_radius / 2)

    elbow_body = e.Body(name="elbow_body", pos=[upper_arm_len, 0, 0])

    lower_arm_radius = 0.05
    lower_arm = e.Body(
        name="lower_arm",
        pos="1 0 0",
    )

    upper_arm_body.add_children([
        upper_arm_geom,
        shoulder_joint,
        left_flex_ua_insertion,
        right_flex_ua_insertion,
        left_curl_ua_insertion,
        right_curl_ua_insertion,
        elbow_body,
        lower_arm,
    ])

    joint_geom_radius = upper_arm_radius * 1.1
    joint_geom_color = [0.3, 0.9, 0.3, 0.4]  # Translucent green
    elbow_geom = e.Geom(
        conaffinity="0",
        contype="0",
        fromto=[0, 0, -upper_arm_radius, 0, 0, upper_arm_radius],
        name="elbow_geom",
        rgba=joint_geom_color,
        size=joint_geom_radius,
        type="cylinder",
    )

    elbow_left_side = e.Site(name="elbow_left_side",
                             pos=[0, joint_geom_radius * 1.1, 0.0],
                             size=side_site_radius)
    elbow_right_side = e.Site(name="elbow_right_side",
                              pos=[0, -joint_geom_radius * 1.1, 0.0],
                              size=side_site_radius)

    elbow_body.add_children([
        elbow_geom,
        elbow_left_side,
        elbow_right_side,
    ])

    elbow_joint = e.Joint(
        axis="0 0 1",
        limited="true",
        name="elbow_joint",
        pos="0 0 0",
        range=[-172, 172],
        type="hinge",
    )

    lower_arm_len = 1.0
    lower_arm_geom = e.Geom(
        fromto=[0, 0, 0, lower_arm_len, 0, 0],
        name="lower_arm_geom",
        rgba="0.0 0.4 0.6 1",
        size=lower_arm_radius,
        type="capsule",
    )

    left_curl_la_insertion = e.Site(
        name="left_curl_la_insertion",
        pos=[lower_arm_len / 4, lower_arm_radius, 0.0],
        size=lower_arm_radius / 2)
    right_curl_la_insertion = e.Site(
        name="right_curl_la_insertion",
        pos=[lower_arm_len / 4, -lower_arm_radius, 0.0],
        size=lower_arm_radius / 2)

    fingertip_body = e.Body(
        name="fingertip_body",
        pos="1.1 0 0",
    )

    lower_arm.add_children([
        elbow_joint,
        lower_arm_geom,
        left_curl_la_insertion,
        right_curl_la_insertion,
        fingertip_body,
    ])

    fingertip_geom = e.Geom(
        contype="0",
        name="fingertip_geom",
        pos="0 0 0",
        rgba="0.0 0.8 0.6 1",
        size=".1",
        type="sphere",
    )

    fingertip_body.add_children([
        fingertip_geom,
    ])

    # Tendons
    tendon_width = 0.02
    tendon_color = [0.95, 0.3, 0.3, 1]
    tendon_stiffness = 100

    left_flex_tendon = e.Spatial(name="left_flex_tendon",
                                 width=tendon_width,
                                 rgba=tendon_color,
                                 stiffness=tendon_stiffness)
    lfs1 = e.spatial.Site(site=left_flex_shoulder_insertion.name)
    lf_geom = e.spatial.Geom(geom=shoulder_geom.name,
                             sidesite=left_flex_shoulder_side.name)
    lfs2 = e.spatial.Site(site=left_flex_ua_insertion.name)
    left_flex_tendon.add_children([lfs1, lf_geom, lfs2])

    right_flex_tendon = e.Spatial(name="right_flex_tendon",
                                  width=tendon_width,
                                  rgba=tendon_color,
                                  stiffness=tendon_stiffness)
    rfs1 = e.spatial.Site(site=right_flex_shoulder_insertion.name)
    rf_geom = e.spatial.Geom(geom=shoulder_geom.name,
                             sidesite=right_flex_shoulder_side.name)
    rfs2 = e.spatial.Site(site=right_flex_ua_insertion.name)
    right_flex_tendon.add_children([rfs1, rf_geom, rfs2])

    left_curl_tendon = e.Spatial(name="left_curl_tendon",
                                 width=tendon_width,
                                 rgba=tendon_color,
                                 stiffness=tendon_stiffness)
    lcs1 = e.spatial.Site(site=left_curl_ua_insertion.name)
    lc_geom = e.spatial.Geom(geom=elbow_geom.name,
                             sidesite=elbow_left_side.name)
    lcs2 = e.spatial.Site(site=left_curl_la_insertion.name)
    left_curl_tendon.add_children([lcs1, lc_geom, lcs2])

    right_curl_tendon = e.Spatial(name="right_curl_tendon",
                                  width=tendon_width,
                                  rgba=tendon_color,
                                  stiffness=tendon_stiffness)
    rcs1 = e.spatial.Site(site=right_curl_ua_insertion.name)
    rc_geom = e.spatial.Geom(geom=elbow_geom.name,
                             sidesite=elbow_right_side.name)
    rcs2 = e.spatial.Site(site=right_curl_la_insertion.name)
    right_curl_tendon.add_children([rcs1, rc_geom, rcs2])

    tendon.add_children([
        left_flex_tendon,
        right_flex_tendon,
        left_curl_tendon,
        right_curl_tendon,
    ])

    # Target Puck / Ball

    # How is the ball/puck allowed to move?
    target_joint_x = e.Joint(
        armature="0",
        axis="1 0 0",
        damping="0",
        limited=False,
        name="target_joint_x",
        pos="0 0 0",
        stiffness="0",
        type="slide",
    )
    target_joint_y = e.Joint(
        armature="0",
        axis="0 1 0",
        damping="0",
        limited=False,
        name="target_joint_y",
        pos="0 0 0",
        stiffness="0",
        type="slide",
    )
    target_geom = e.Geom(
        conaffinity="0",
        contype="0",
        name="target_geom",
        pos="0 0 0",
        rgba="0.9 0.2 0.2 1",
        size=".09",
        type="sphere",
    )
    target_body.add_children([
        target_joint_x,
        target_joint_y,
        target_geom,
    ])

    # Actuators
    # TODO: Replace with Muscles once 2.0 is released
    act_gain = 100  # Max 100N output
    act_ctrl_range = [-1.0, 0.0]
    ctrllimited = "true"

    left_flex_act = e.General(name="left_flex_act",
                              tendon=left_flex_tendon.name,
                              ctrllimited=ctrllimited,
                              gainprm=act_gain,
                              ctrlrange=act_ctrl_range)
    right_flex_act = e.General(name="right_flex_act",
                               tendon=right_flex_tendon.name,
                               ctrllimited=ctrllimited,
                               gainprm=act_gain,
                               ctrlrange=act_ctrl_range)

    left_curl_act = e.General(name="left_curl_act",
                              tendon=left_curl_tendon.name,
                              ctrllimited=ctrllimited,
                              gainprm=act_gain,
                              ctrlrange=act_ctrl_range)
    right_curl_act = e.General(name="right_curl_act",
                               tendon=right_curl_tendon.name,
                               ctrllimited=ctrllimited,
                               gainprm=act_gain,
                               ctrlrange=act_ctrl_range)

    actuator.add_children([
        left_flex_act,
        right_flex_act,
        left_curl_act,
        right_curl_act,
    ])

    model_xml = mujoco.xml()

    # Output
    filename = "muscled-reacher.xml"
    utils.save_model(model_xml, filename)
Пример #4
0
def get_leg(
    name,
    hip_width=0.2,
    hip_angle=0.0,
    thigh_length=0.4,
    shin_length=0.6,
    leg_radius=0.08
):

    joint_geom_radius = leg_radius * 1.1  # For tendons
    joint_geom_color = [0.3, 0.9, 0.3, 0.4]  # Translucent green

    hip = e.Body(
        name=name,
        pos=[0, 0, 0],
        euler=[0, 0, hip_angle]
    )
    hip_geom = e.Geom(
        fromto=[0, 0, 0, hip_width, 0, 0],
        name="hip_geom_"+name,
        size=leg_radius,
        type="capsule"
    )
    hip_insertion_x = hip_width * 0.1
    left_flex_hip_insertion = e.Site(
        name="left_flex_hip_insertion_"+name,
        pos=[hip_insertion_x, leg_radius, 0.0],
        size=leg_radius / 2
    )
    right_flex_hip_insertion = e.Site(
        name="right_flex_hip_insertion_"+name,
        pos=[hip_insertion_x, -leg_radius, 0.0],
        size=leg_radius / 2
    )
    hip_joint_geom = e.Geom(
        name="hip_joint_geom_"+name,
        fromto=[hip_width, 0.0, leg_radius, hip_width, 0.0, -leg_radius],
        type="cylinder",
        size=joint_geom_radius,
        rgba=joint_geom_color
    )
    thigh_body = e.Body(
        name="thigh_body_"+name,
        pos=[hip_width, 0, 0]
    )
    hip.add_children([
        hip_geom,
        left_flex_hip_insertion,
        right_flex_hip_insertion,
        hip_joint_geom,
        thigh_body
    ])

    # thigh_body
    hip_joint = e.Joint(
        axis=[0, 0, 1],
        name="hip_joint_"+name,
        pos=[0.0, 0.0, 0.0],
        range=[-30, 30],
        type="hinge"
    )
    thigh_geom = e.Geom(
        fromto=[0.0, 0.0, 0.0, thigh_length, 0.0, 0.0],
        name="thigh_geom_"+name,
        size=leg_radius,
        type="capsule"
    )
    upper_insertion_x = thigh_length * 0.3
    flex_thigh_insert_x = thigh_length * 0.8
    quad_u_insertion = e.Site(
        name="quad_u_insertion_"+name,
        pos=[upper_insertion_x, 0.0, leg_radius],
        size=leg_radius / 2
    )
    hamstring_u_insertion = e.Site(
        name="hamstring_u_insertion_"+name,
        pos=[upper_insertion_x, 0.0, -leg_radius],
        size=leg_radius / 2
    )
    left_flex_thigh_insertion = e.Site(
        name="left_flex_thigh_insertion_"+name,
        pos=[flex_thigh_insert_x, leg_radius, 0.0],
        size=leg_radius / 2
    )
    right_flex_thigh_insertion = e.Site(
        name="right_flex_thigh_insertion_"+name,
        pos=[flex_thigh_insert_x, -leg_radius, 0.0],
        size=leg_radius / 2
    )
    knee_geom = e.Geom(
        name="knee_geom_"+name,
        fromto=[thigh_length, leg_radius, 0.0, thigh_length, -leg_radius, 0.0],
        type="cylinder",
        size=joint_geom_radius,
        rgba=joint_geom_color
    )
    knee_top_side = e.Site(
        name="knee_top_side_"+name,
        pos=[thigh_length, 0.0, leg_radius * 2],
        rgba=[0, 0, 0, 0],
        size=leg_radius / 8
    )
    shin_body = e.Body(
        name="shin_body_"+name,
        pos=[thigh_length, 0.0, 0]
    )
    thigh_body.add_children([
        hip_joint,
        thigh_geom,
        left_flex_thigh_insertion,
        right_flex_thigh_insertion,
        quad_u_insertion,
        hamstring_u_insertion,
        knee_geom,
        knee_top_side,
        shin_body
    ])

    # shin_body
    knee_joint = e.Joint(
        axis=[0, 1, 0],
        name="knee_joint_"+name,
        pos=[0.0, 0.0, 0.0],
        range=[30, 70],
        type="hinge"
    )
    shin_geom = e.Geom(
        fromto=[0.0, 0.0, 0.0, shin_length, 0.0, 0.0],
        name="shin_geom_"+name,
        size=leg_radius,
        type="capsule"
    )
    lower_insertion_x = shin_length * 0.2
    quad_l_insertion = e.Site(
        name="quad_l_insertion_"+name,
        pos=[lower_insertion_x, 0.0, leg_radius],
        size=leg_radius / 2
    )
    hamstring_l_insertion = e.Site(
        name="hamstring_l_insertion_"+name,
        pos=[lower_insertion_x, 0.0, -leg_radius],
        size=leg_radius / 2
    )
    shin_body.add_children([
        knee_joint,
        shin_geom,
        quad_l_insertion,
        hamstring_l_insertion
    ])

    # Tendons
    tendons = []
    tendon_width = 0.04
    tendon_color = [0.95, 0.3, 0.3, 1]
    tendon_stiffness = 100
    left_hip_flex = e.Spatial(
        name="left_hip_flex_"+name,
        width=tendon_width,
        rgba=tendon_color,
        stiffness=tendon_stiffness
    )
    lhs1 = e.spatial.Site(site=left_flex_hip_insertion.name)
    lh_geom = e.spatial.Geom(geom=hip_joint_geom.name)
    lhs2 = e.spatial.Site(site=left_flex_thigh_insertion.name)
    left_hip_flex.add_children([
        lhs1,
        lh_geom,
        lhs2
    ])
    right_hip_flex = e.Spatial(
        name="right_hip_flex_"+name,
        width=tendon_width,
        rgba=tendon_color,
        stiffness=tendon_stiffness
    )
    rhs1 = e.spatial.Site(site=right_flex_hip_insertion.name)
    rh_geom = e.spatial.Geom(geom=hip_joint_geom.name)
    rhs2 = e.spatial.Site(site=right_flex_thigh_insertion.name)
    right_hip_flex.add_children([
        rhs1,
        rh_geom,
        rhs2
    ])
    quad = e.Spatial(
        name="quad_"+name,
        width=tendon_width,
        rgba=tendon_color,
        stiffness=tendon_stiffness
    )
    qs1 = e.spatial.Site(site=quad_u_insertion.name)
    q_geom = e.spatial.Geom(
        geom=knee_geom.name,
        sidesite=knee_top_side.name
    )
    qs2 = e.spatial.Site(site=quad_l_insertion.name)
    quad.add_children([
        qs1,
        q_geom,
        qs2
    ])
    hamstring = e.Spatial(
        name="hamstring_"+name,
        width=tendon_width,
        rgba=tendon_color,
        stiffness=tendon_stiffness
    )
    hs1 = e.spatial.Site(site=hamstring_u_insertion.name)
    h_geom = e.spatial.Geom(geom=knee_geom.name)
    hs2 = e.spatial.Site(site=hamstring_l_insertion.name)
    hamstring.add_children([
        hs1,
        h_geom,
        hs2
    ])
    tendons.extend([
        left_hip_flex,
        right_hip_flex,
        quad,
        hamstring
    ])

    # Actuators
    # TODO: Replace with Muscles once 2.0 is released
    actuators = []
    act_gain = 50  # Max 100N output
    act_ctrl_range = [-1.0, 0.0]
    ctrllimited = "true"
    quad_act = e.General(
        name="quad_act_"+name,
        tendon=quad.name,
        ctrllimited=ctrllimited,
        gainprm=act_gain,
        ctrlrange=act_ctrl_range
    )
    hamstring_act = e.General(
        name="hamstring_act_"+name,
        tendon=hamstring.name,
        ctrllimited=ctrllimited,
        gainprm=act_gain,
        ctrlrange=act_ctrl_range
    )
    right_hip_flex_act = e.General(
        name="right_hip_flex_act_"+name,
        tendon=right_hip_flex.name,
        ctrllimited=ctrllimited,
        gainprm=act_gain,
        ctrlrange=act_ctrl_range
    )
    left_hip_flex_act = e.General(
        name="left_hip_flex_act_"+name,
        tendon=left_hip_flex.name,
        ctrllimited=ctrllimited,
        gainprm=act_gain,
        ctrlrange=act_ctrl_range
    )
    actuators.extend([
        quad_act,
        hamstring_act,
        right_hip_flex_act,
        left_hip_flex_act
    ])

    return hip, tendons, actuators
Пример #5
0
def main():
    #########################
    # Level 1
    mujoco = e.Mujoco(model="tendon")

    #########################
    # Level 2
    compiler = e.Compiler(coordinate="global", )
    default = e.Default()
    visual = e.Visual()
    worldbody = e.Worldbody()
    tendon = e.Tendon()

    mujoco.add_children([compiler, default, visual, worldbody, tendon])

    ######################
    # Level 3

    # Default
    d_geom = e.Geom(rgba=[0.9, 0.7, 0.1, 1], size=0.01)
    d_site = e.Site(type="sphere", rgba=[0.9, 0.9, 0.9, 1], size=0.005)
    d_joint = e.Joint(type="hinge",
                      axis=[0, 1, 0],
                      limited=True,
                      range=[0, 60],
                      solimplimit=[0.95, 0.95, 0.1])

    default.add_children([d_geom, d_site, d_joint])

    # Visual
    headlight = e.visual.Headlight(diffuse=[0.7, 0.7, 0.7])
    visual.add_child(headlight)

    # Worldbody
    b1 = e.Body()
    s2 = e.Site(name="s2", pos=[-0.03, 0, 0.32])
    b2 = e.Body()
    worldbody.add_children([b1, s2, b2])

    # Tendon
    spatial_tendon = e.Spatial(width=0.002,
                               rgba=[.95, .3, .3, 1],
                               limited=True,
                               range=[0, 0.33])
    tendon.add_child(spatial_tendon)

    ######################
    # Level 4

    # b1
    b1_geom = e.Geom(type="cylinder",
                     fromto=[-0.03, 0, 0.2, -0.03, 0, 0.15],
                     size=0.03,
                     rgba=[.2, .2, .5, 1],
                     density=5000)
    b1_joint = e.Joint(
        type="slide",
        pos=[-0.03, 0, 0.2],
        axis=[0, 0, 1],
        limited=False,
    )
    s1 = e.Site(name="s1", pos=[-0.03, 0, 0.2])
    b1.add_children([b1_geom, b1_joint, s1])

    # b2

    b2_geom_1 = e.Geom(type="capsule", fromto=[0, 0, 0.3, 0.1, 0, 0.3])
    g1 = e.Geom(name="g1",
                type="cylinder",
                fromto=[0.0, 0.015, 0.3, 0.0, -0.015, 0.3],
                size=0.02,
                rgba=[.3, .9, .3, .4])
    b2_joint = e.Joint(pos=[0, 0, 0.3])
    s3 = e.Site(name="s3", pos=[0.02, 0, 0.32], size=None)
    b3 = e.Body()
    b2.add_children([b2_geom_1, g1, b2_joint, s3, b3])

    # spatial_tendon
    ss1 = e.spatial.Site(site="s1")
    ss2 = e.spatial.Site(site="s2")
    sg1 = e.spatial.Geom(geom="g1")
    ss3 = e.spatial.Site(site="s3")
    sp1 = e.spatial.Pulley(divisor=2)
    sg2 = e.spatial.Geom(geom="g2", sidesite="side2")
    ss4 = e.spatial.Site(site="s4")
    sp2 = e.spatial.Pulley(divisor=2)
    ss5 = e.spatial.Site(site="s5")
    sg3 = e.spatial.Geom(geom="g3", sidesite="side3")
    ss6 = e.spatial.Site(site="s6")

    spatial_tendon.add_children(
        [ss1, ss2, sg1, ss3, sp1, ss3, sg2, ss4, sp2, ss3, sg2, ss5, sg3, ss6])

    ######################
    # Level 5

    # b3

    b3_geom_1 = e.Geom(type="capsule", fromto=[0.1, 0, 0.3, 0.2, 0, 0.3])
    g2 = e.Geom(name="g2",
                type="cylinder",
                fromto=[0.1, 0.015, 0.3, 0.1, -0.015, 0.3],
                size=0.02,
                rgba=[.3, .9, .3, .4])
    b3_joint = e.Joint(pos=[0.1, 0, 0.3])
    s4 = e.Site(name="s4", pos=[0.13, 0, 0.31], size=None)
    s5 = e.Site(name="s5", pos=[0.15, 0, 0.32])
    side2 = e.Site(name="side2", pos=[0.1, 0, 0.33])
    b4 = e.Body()

    b3.add_children([b3_geom_1, g2, b3_joint, s4, s5, side2, b4])

    ######################
    # Level 6

    # b4

    b4_geom_1 = e.Geom(type="capsule", fromto=[0.2, 0, 0.3, 0.27, 0, 0.3])
    g3 = e.Geom(name="g3",
                type="cylinder",
                fromto=[0.2, 0.015, 0.3, 0.2, -0.015, 0.3],
                size=0.02,
                rgba=[.3, .9, .3, .4])
    b4_joint = e.Joint(pos=[0.2, 0, 0.3])
    s6 = e.Site(name="s6", pos=[0.23, 0, 0.31])
    side3 = e.Site(name="side3", pos=[0.2, 0, 0.33])

    b4.add_children([b4_geom_1, g3, b4_joint, s6, side3])
    model_xml = mujoco.xml()

    # Output
    with open('tendon-gen.xml', 'w') as fh:
        fh.write(model_xml)