mae_envs/util/transforms.py (42 lines of code) (raw):
import numpy as np
from collections import OrderedDict
from mujoco_worldgen.transforms import closure_transform
def add_weld_equality_constraint_transform(name, body_name1, body_name2):
'''
Creates a weld constraint that maintains relative position and orientation between
two objects
'''
def fun(xml_dict):
if 'equality' not in xml_dict:
xml_dict['equality'] = OrderedDict()
xml_dict['equality']['weld'] = []
constraint = OrderedDict()
constraint['@name'] = name
constraint['@body1'] = body_name1
constraint['@body2'] = body_name2
constraint['@active'] = False
xml_dict['equality']['weld'].append(constraint)
return xml_dict
return fun
def set_joint_damping_transform(damping, joint_name):
''' Set joints damping to a single value.
Args:
damping (float): damping to set
joint_name (string): partial name of joint. Any joint with joint_name
as a substring will be affected.
'''
def closure(node):
for joint in node.get('joint', []):
if joint_name in joint['@name']:
joint['@damping'] = damping
return closure_transform(closure)
def remove_hinge_axis_transform(axis):
''' Removes specific hinge axis from the body. '''
def fun(xml_dict):
def closure(node):
if 'joint' in node:
node["joint"] = [j for j in node["joint"]
if j["@type"] != "hinge"
or np.linalg.norm(j["@axis"] - axis) >= 1e-5]
return closure_transform(closure)(xml_dict)
return fun