Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Integrate dmcontrol updated #55

Merged
merged 39 commits into from
Jul 1, 2022
Merged
Changes from 1 commit
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
383e271
Add dm_control to requirements
May 25, 2022
05f5058
Add/transform dm_control/Mujoco into CARLEnv
May 25, 2022
594eff6
adapt observations and render rgb
sebidoe Jun 7, 2022
1efa11e
change dmc load, simplify wrapper
sebidoe Jun 7, 2022
dcbdecc
dmc initializations
sebidoe Jun 8, 2022
4c486dc
refactor, load context into dmc cartpole
sebidoe Jun 8, 2022
268843d
remove print
sebidoe Jun 9, 2022
3a9ce8e
update cartpole context
sebidoe Jun 9, 2022
cf756bd
general dmc env
sebidoe Jun 10, 2022
b06ded7
add walker
sebidoe Jun 13, 2022
bf21bb6
fix load dmc
sebidoe Jun 13, 2022
f3aac23
update walker context
sebidoe Jun 13, 2022
d71b2d1
camera id in render
sebidoe Jun 13, 2022
cf977e4
dmc test function
sebidoe Jun 13, 2022
c74aece
add more context tasks to walker
sebidoe Jun 13, 2022
1d130d7
add quadruped
sebidoe Jun 13, 2022
3ff0cec
add dmc fish
sebidoe Jun 13, 2022
ea53c3c
walker context defaults, adapt context utils
sebidoe Jun 20, 2022
af96a0b
update adapt context function
sebidoe Jun 20, 2022
f711123
quadruped adapt context utils
sebidoe Jun 20, 2022
f18c799
update dmc context parameters
sebidoe Jun 20, 2022
12f6ea6
rename utils->loader
sebidoe Jun 21, 2022
f148fb9
add masking to dmc envs
sebidoe Jun 21, 2022
0073f29
remove cartpole env
sebidoe Jun 21, 2022
af93320
formatting
sebidoe Jun 21, 2022
d236bd0
dmc env less duplicate code
sebidoe Jun 22, 2022
f1c2ddd
Rename/move file
Jun 24, 2022
433fa0e
Fix tests
Jun 24, 2022
84de6bd
Merge remote-tracking branch 'origin/main' into integrate_dmcontrol
Jun 27, 2022
8b951a5
Change default tasks
Jun 27, 2022
5d9f994
Adjust episode lengths to 1000
Jun 27, 2022
037b2e9
add docstring
sebidoe Jul 1, 2022
2d23f17
update readme
sebidoe Jul 1, 2022
f5c6557
flake8 formatting
sebidoe Jul 1, 2022
47254f5
dmc dict observation space
sebidoe Jul 1, 2022
ebe8ea3
import list
sebidoe Jul 1, 2022
4e6833c
Merge branch 'main' into integrate_dmcontrol
sebidoe Jul 1, 2022
484087b
formatting
sebidoe Jul 1, 2022
9f0b2c4
black and isort formatting
sebidoe Jul 1, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
walker context defaults, adapt context utils
sebidoe committed Jun 20, 2022

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
commit ea53c3c0b8b8b9926d635e740d97c1e6a9f7600a
43 changes: 19 additions & 24 deletions carl/envs/dmc/carl_dm_walker.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from ast import JoinedStr
from typing import Any, Dict, List, Optional, Union

import numpy as np
@@ -10,40 +11,34 @@


DEFAULT_CONTEXT = {
# "joint_stiffness": 5000, # TODO where to find this
"gravity_x": 0.,
"gravity_y": 0.,
"gravity_z": -9.81,
"gravity": -9.81,
"friction_tangential": 0.7,
"friction_torsional": 0.1,
"friction_rolling": 0.1,
"actuator_strength": 1, # scale all actuators by this factor
"joint_damping": 0.1,
# "torso_mass": 10, # TODO find out if mass can be modified
"timestep": 0.0025, # Seconds between updates
"magnetic_x": 0., # TODO decide if this is useful
"magnetic_y": -0.5,
"magnetic_z": 0.,
"wind_x": 0., # TODO decide if this is useful
"joint_damping": 0.1,
"joint_stiffness": 0.,
"actuator_strength": 1, # scaling factor for all actuators in the model
"density": 0.,
"viscosity": 0.,
"geom_density": 1, # scaling factor for all geom (objects) densities
"wind_x": 0.,
"wind_y": 0.,
"wind_z": 0.,
}

CONTEXT_BOUNDS = {
# "joint_stiffness": (1, np.inf, float),
"gravity_x": (-0.1, -np.inf, float),
"gravity_y": (-0.1, -np.inf, float),
"gravity_z": (-0.1, -np.inf, float),
"friction_tangential": (-np.inf, np.inf, float), # TODO can friction be negative here?
"friction_torsional": (-np.inf, np.inf, float),
"friction_rolling": (-np.inf, np.inf, float),
"actuator_strength": (-np.inf, np.inf, float),
"gravity": (-0.1, -np.inf, float),
"friction_tangential": (0, np.inf, float),
"friction_torsional": (0, np.inf, float),
"friction_rolling": (0, np.inf, float),
"timestep": (0.001, 0.1, float,),
"joint_damping": (0, np.inf, float),
# "torso_mass": (0.1, np.inf, float),
"timestep": (0.001, 0.1, float,), # TODO not sure how much it should be varied
"magnetic_x": (-np.inf, np.inf, float),
"magnetic_y": (-np.inf, np.inf, float),
"magnetic_z": (-np.inf, np.inf, float),
"joint_stiffness": (0, np.inf, float),
"actuator_strength": (0, np.inf, float),
"density": (0, np.inf, float),
"viscosity": (0, np.inf, float),
"geom_density": (0, np.inf, float),
"wind_x": (-np.inf, np.inf, float),
"wind_y": (-np.inf, np.inf, float),
"wind_z": (-np.inf, np.inf, float),
10 changes: 3 additions & 7 deletions carl/envs/dmc/dmc_tasks/cartpole.py
Original file line number Diff line number Diff line change
@@ -51,11 +51,11 @@ def swingup_context(context={}, time_limit=_DEFAULT_TIME_LIMIT, random=None,
cart = mjcf.find("./worldbody/body/geom")
cart.set("mass", str(context["masscart"]))
force = mjcf.find("./actuator/motor")
force.set("gear", str(context["force_magnifier"]))
gear = force.get("gear")
force.set("gear", str(int(float(gear) * context["actuator_strength"])))
keys = []
options = mjcf.findall("./option")
gravity = " ".join([str(context["gravity_x"]), str(context["gravity_y"]), str(context["gravity_z"])])
magnetic = " ".join([str(context["magnetic_x"]), str(context["magnetic_y"]), str(context["magnetic_z"])])
gravity = " ".join(["0", "0", str(context["gravity"])])
wind = " ".join([str(context["wind_x"]), str(context["wind_y"]), str(context["wind_z"])])
for option in options:
for k, v in option.items():
@@ -64,16 +64,12 @@ def swingup_context(context={}, time_limit=_DEFAULT_TIME_LIMIT, random=None,
option.set("gravity", gravity)
elif k == "timestep":
option.set("timestep", str(context["timestep"]))
elif k == "magnetic":
option.set("magnetic", magnetic)
elif k == "wind":
option.set("wind", wind)
if "gravity" not in keys:
mjcf.append(etree.Element("option", gravity=gravity))
if "timestep" not in keys:
mjcf.append(etree.Element("option", timestep=str(context["timestep"])))
if "magnetic" not in keys:
mjcf.append(etree.Element("option", magnetic=magnetic))
if "wind" not in keys:
mjcf.append(etree.Element("option", wind=wind))
xml_string = etree.tostring(mjcf, pretty_print=True)
54 changes: 54 additions & 0 deletions carl/envs/dmc/dmc_tasks/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
from lxml import etree


def adapt_context(xml_string, context):
"""Adapts and returns the xml_string of the model with the given context."""
print(context)
mjcf = etree.fromstring(xml_string)
damping = mjcf.find("./default/joint")
damping.set("damping", str(context["joint_damping"]))
geom = mjcf.find("./default/geom")
geom.set("friction", " ".join([
str(context["friction_tangential"]),
str(context["friction_torsional"]),
str(context["friction_rolling"])])
)
geom_density = geom.get("density")
if not geom_density:
geom_density = 1000
geom.set("density", str(geom_density * context["geom_density"]))
actuators = mjcf.findall("./actuator/motor")
for actuator in actuators:
gear = actuator.get("gear")
actuator.set("gear", str(int(float(gear) * context["actuator_strength"])))
keys = []
options = mjcf.findall("./option")
gravity = " ".join(["0", "0", str(context["gravity"])])
wind = " ".join([str(context["wind_x"]), str(context["wind_y"]), str(context["wind_z"])])
for option in options:
for k, _ in option.items():
keys.append(k)
if k == "gravity":
option.set("gravity", gravity)
elif k == "timestep":
option.set("timestep", str(context["timestep"]))
elif k == "density":
option.set("density", str(context["density"]))
elif k == "viscosity":
option.set("viscosity", str(context["viscosity"]))
elif k == "wind":
option.set("wind", wind)

if "gravity" not in keys:
mjcf.append(etree.Element("option", gravity=gravity))
if "timestep" not in keys:
mjcf.append(etree.Element("option", timestep=str(context["timestep"])))
if "wind" not in keys:
mjcf.append(etree.Element("option", wind=wind))
if "density" not in keys:
mjcf.append(etree.Element("option", density=str(context["density"])))
if "viscosity" not in keys:
mjcf.append(etree.Element("option", viscosity=str(context["viscosity"])))
xml_string = etree.tostring(mjcf, pretty_print=True)
print(xml_string.decode("utf-8"))
return xml_string
45 changes: 1 addition & 44 deletions carl/envs/dmc/dmc_tasks/walker.py
Original file line number Diff line number Diff line change
@@ -25,7 +25,7 @@
from dm_control.suite.utils import randomizers
from dm_control.utils import containers
from dm_control.utils import rewards
from lxml import etree
from carl.envs.dmc.dmc_tasks.utils import adapt_context


_DEFAULT_TIME_LIMIT = 25
@@ -47,49 +47,6 @@ def get_model_and_assets():
return common.read_model('walker.xml'), common.ASSETS


def adapt_context(xml_string, context):
"""Adapts and returns the xml_string of the model with the given context."""
mjcf = etree.fromstring(xml_string)
damping = mjcf.find("./default/joint")
damping.set("damping", str(context["joint_damping"]))
friction = mjcf.find("./default/geom")
friction.set("friction", " ".join([
str(context["friction_tangential"]),
str(context["friction_torsional"]),
str(context["friction_rolling"])])
)
actuators = mjcf.findall("./actuator/motor")
for actuator in actuators:
gear = actuator.get("gear")
actuator.set("gear", str(int(float(gear) * context["actuator_strength"])))
keys = []
options = mjcf.findall("./option")
gravity = " ".join([str(context["gravity_x"]), str(context["gravity_y"]), str(context["gravity_z"])])
magnetic = " ".join([str(context["magnetic_x"]), str(context["magnetic_y"]), str(context["magnetic_z"])])
wind = " ".join([str(context["wind_x"]), str(context["wind_y"]), str(context["wind_z"])])
for option in options:
for k, v in option.items():
keys.append(k)
if k == "gravity":
option.set("gravity", gravity)
elif k == "timestep":
option.set("timestep", str(context["timestep"]))
elif k == "magnetic":
option.set("magnetic", magnetic)
elif k == "wind":
option.set("wind", wind)
if "gravity" not in keys:
mjcf.append(etree.Element("option", gravity=gravity))
if "timestep" not in keys:
mjcf.append(etree.Element("option", timestep=str(context["timestep"])))
if "magnetic" not in keys:
mjcf.append(etree.Element("option", magnetic=magnetic))
if "wind" not in keys:
mjcf.append(etree.Element("option", wind=wind))
xml_string = etree.tostring(mjcf, pretty_print=True)
return xml_string


@SUITE.add('benchmarking')
def stand_context(context={}, time_limit=_DEFAULT_TIME_LIMIT, random=None, environment_kwargs=None):
"""Returns the Stand task with the adapted context."""
29 changes: 22 additions & 7 deletions test_dm_control.py
Original file line number Diff line number Diff line change
@@ -1,28 +1,43 @@
import imp
from carl.envs.dmc.carl_dm_cartpole import CARLDmcCartPoleEnv
from carl.envs.dmc.carl_dm_walker import CARLDmcWalkerEnv
from carl.envs.dmc.carl_dm_quadruped import CARLDmcQuadrupedEnv
from carl.envs.dmc.carl_dm_fish import CARLDmcFishEnv
from carl.envs.classic_control import CARLCartPoleEnv
from carl.envs import CARLDmcCartPoleEnv_defaults as cartpole_default
from carl.envs import CARLDmcWalkerEnv_defaults as walker_default
from carl.envs import CARLDmcQuadrupedEnv_defaults as quadruped_default
from carl.envs import CARLDmcFishEnv_defaults as fish_default
import matplotlib.pyplot as plt

if __name__ == "__main__":
# Load one task:

longer_pole = cartpole_default.copy()
longer_pole["pole_length"] = cartpole_default["pole_length"]*2
contexts = {0: longer_pole}
# longer_pole = cartpole_default.copy()
# longer_pole["pole_length"] = cartpole_default["pole_length"]*2
# contexts = {0: longer_pole}
# carl_env = CARLDmcCartPoleEnv(task="swingup_context", contexts=contexts, hide_context=False)

stronger_act = walker_default.copy()
stronger_act["actuator_strength"] = walker_default["actuator_strength"]*2
contexts = {0: stronger_act}
carl_env = CARLDmcWalkerEnv(task="stand_context", contexts=contexts, hide_context=False)

walker_default["actuator_strength"] = walker_default["actuator_strength"]*2
contexts = {0: walker_default}
# env = load_dmc_env("cartpole", "swingup")
carl_env = CARLDmcWalkerEnv(contexts=contexts, hide_context=False)
# stronger_act = walker_default.copy()
# stronger_act["actuator_strength"] = quadruped_default["actuator_strength"]*2
# contexts = {0: stronger_act}
# carl_env = CARLDmcQuadrupedEnv(task="walk_context", contexts=contexts, hide_context=False)

# contexts = {0: fish_default}
# carl_env = CARLDmcFishEnv(task="swim_context", contexts=contexts, hide_context=False)
render = lambda : plt.imshow(carl_env.render(mode='rgb_array'))
s = carl_env.reset()
render()
plt.savefig("asdf_dm.png")
action = carl_env.action_space.sample()
state, reward, done, info = carl_env.step(action=action)
print("state", state, type(state))
assert False

s = carl_env.reset()
done = False