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)
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)
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)
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
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)